[2026-09-22 13:02:30] taiga-vault: family/documents/vault-sync/2026-09-22-watchlist-merge-conflict.md

This commit is contained in:
Taiga committed 2026-09-22 13:02:30 +00:00
1 parent 9a2220e84f
commit c835707a13
1 file changed
+109
@@ -0,0 +1,109 @@
---
date: 2026-09-22
tags: [vault-sync, conflict, watchlist, kraken, eagle, incident]
---
# 2026-09-22 — конфликтные маркеры в `movies-watchlist.md` (гонка двух инстансов автоматизации)
## Что случилось
Тик `sync-vault` 12:55 UTC отработал штатно (`Pushed ✓` ×3, exit 0), но верхний
коммит bare был от Kraken:
```
d6d992d8 Hermes <hermes@kraken> [2026-09-22] kraken: merge conflict — review needed
```
В `family/documents/movies-watchlist.md` лежали **три блока конфликтных маркеров**
(`<<<<<<< HEAD` / `>>>>>>> origin/main`) в строках 86, 170, 223 — то есть в
заметке, которую Алексей видит в Obsidian.
## Причина — не git, а два писателя
Одну и ту же заметку переписывают **два инстанса одной автоматизации** в одну и ту же минуту:
| сторона | коммит | время (+0600) | что делает с записью |
|---|---|---|---|
| Kraken (локальная, `HEAD` в мердже) | `51ca391` | 19:00:02 | маркерный проход `❓` (переносил маркеры между соседними строками), сохранил `★`-подзаписи |
| Eagle (уже в bare, `origin/main`) | `d10bc1a` | 18:19:06 | нормализация: снял `❓`, проставил год (`Духless 2012`, `Бумбараш 1972`, `Everything Everywhere All at Once 2022`), удалил `★`-подзаписи (текущий формат — inline `IMDb … KP …`) |
Kraken мерджил Eagle-коммит, получил конфликт на трёх участках и, как заложено в
`sync-vault-lib.sh`, закоммитил файл **вместе с маркерами** и подписал «review needed».
Плюс Kraken сохранил бэкап: `family/documents/movies-watchlist.md.bak-questions`
(682 строки, без маркеров).
Конфликты (по 1–2 строки, семантически безобидные):
- `Everything Everywhere All at Once 2021` (Kraken, год неверен) → `… 2022` (Eagle)
- `❓ Спрут сериал` / `Духless` (Kraken) → `Спрут сериал` / `Духless 2012` (Eagle)
- `❓ Идиот Бортко` / `❓ Замок Балабанов` / `Бумбараш` (Kraken) → без `❓`, `Бумбараш 1972` (Eagle)
В каждом блоке Kraken-сторона дополнительно несла `★`-подзаписи (TMDB-оценки старого формата).
## Решение (Taiga, 13:01 UTC — объединение, без потери данных)
Для каждой пары взяты **обе** полезные части: нормализованные строки Eagle
(снятый `❓`, правильный год) + `★`-подзаписи Kraken под ними.
```diff
- - [ ] Everything Everywhere All at Once 2021
+ - [ ] Everything Everywhere All at Once 2022
- Всё везде и сразу (2022) ★7.7
- Almost Everything You Ever Wanted to Know About Everything Everywhere All at Once (2022) ★10.0
- - [ ] ❓ Спрут сериал
- - [ ] Духless
+ - [ ] Спрут сериал
+ - [ ] Духless 2012
- Духless (2012) ★5.8
- Духless 2 (2015) ★5.5
- - [ ] ❓ Идиот Бортко
- - [ ] ❓ Замок Балабанов
- - [ ] Бумбараш
+ - [ ] Идиот Бортко
+ - [ ] Замок Балабанов
+ - [ ] Бумбараш 1972
- Бумбараш (1972) ★5.8
- Бумбараш (1972) ★0.0
```
Коммит: `9a2220e` — `[2026-09-22 13:01:52] taiga-vault: resolve merge conflict markers in movies-watchlist.md …`.
## Проверка (фактом, не на глаз)
```
bare /vault /obsidian-syncthing HEAD = 9a2220e (все три равны)
git status --porcelain — пусто во всех трёх
grep -rn '^<<<<<<<\|^>>>>>>>' /vault /obsidian-syncthing --include='*.md' → 0
bash /opt/data/sync-vault.sh → exit 0, Pushed ✓ по всем трём фазам (13:01:55)
```
## Что осталось / к решению Алексея
1. **Гонка не устранена.** Если Kraken-nightly (01:00) и Eagle будут писать заметку в
одну минуту, конфликт повторится и снова встанет маркерами. Кандидат на разбор:
разносить писателей по времени либо делать маркерный проход идемпотентным
(писать только при реальном изменении и без переноса `❓` на соседнюю строку —
в диффе Kraken маркер «съезжал» на соседние позиции, что и создало конфликт).
2. **`movies-watchlist.md.bak-questions`** (682 строки, создал Kraken) — лежит в
`family/documents/`. Расширение не `.md`, Obsidian его не показывает. Не удаляла
без подтверждения. Сказать — уберу.
3. **Хук `post-receive` в `/vault.git` ссылается на хостовый путь**
(`GIT_DIR=/mnt/RED_2TB/storage/git/obsidian-vault.git`, worktree
`/mnt/RED_2TB/storage/obsidian`), которого **не существует внутри контейнера
hermes-taiga** — при пушах от Taiga хук падает:
```
remote: fatal: not a git repository: '/mnt/RED_2TB/storage/git/obsidian-vault.git'
remote: [hook] obsidian sparse export updated
```
Пуш при этом проходит (в bare всё попадает), но хост-экспорт `/mnt/RED_2TB/storage/obsidian`
при пушах **из контейнера** не обновляется — его догоняет только следующий пуш с хоста
(Eagle/Kraken), где этот путь есть. Хук можно сделать устойчивым (искать bare по
списку кандидатов `/vault.git`, `/mnt/RED_2TB/storage/git/obsidian-vault.git`),
но правка хостовой инфраструктуры — по решению Алексея.
Связано: [[family/documents/vault-sync/2026-09-21-bare-repo-push-permission-denied]],
[[family/projects/watchlist-automation]], [[personal/plans/watchlist-tmdb-missing-marker]]