[2026-09-02 12:17:20] taiga-vault: resolve old committed merge-conflict markers (htpc-emulators-setup, switch-emulation-rom-infra, from 2026-06-18); add incident note

This commit is contained in:
Taiga
2026-09-02 12:17:20 +00:00
parent 5bdd673b8f
commit 4bcd09872e
3 changed files with 48 additions and 9 deletions
@@ -0,0 +1,48 @@
---
tags: [vault-sync, git, incident, safe-directory, taiga, merge-conflict]
created: 2026-09-02
updated: 2026-09-02
status: resolved 2026-09-02 — sync-vault.sh fixed (safe.directory /vault.git), sync работает, конфликты разрешены
---
# Incident 2026-09-02: hermes-taiga vault-sync молча падал (dubious ownership /vault.git) + разбор накопленных merge-конфликтов
**Контекст:** после crash-loop (см. [[2026-09-02-hermes-taiga-crashloop]]) агент поднялся, первый cron-sync в 12:13 отработал **молча и впустую** — все 3 фазы в логе: `Fetch failed (origin offline?) — skipping merge/push`. На вид graceful skip, по факту sync стоял.
## Корень: safe.directory без /vault.git
`sync-vault.sh` добавлял `safe.directory` только для `/vault` и `/obsidian-syncthing`, но **НЕ для `/vault.git`** — bare remote, из которого все три фазы делают `git fetch file:///vault.git`. Я (агент) работаю под root, а `/vault.git` принадлежит uid 950 (truenas_admin) → git отказывает: `fatal: detected dubious ownership in repository at '/vault.git'` (exit 128). `sync-vault-lib.sh` глушит ошибку fetch (`exit 0`) → каждый час: commit локально, push не происходит, изменений никто не видит. Тот же паттерн «молчаливой смерти sync» уже фиксировался для launchd на маке (см. [[2026-09-02-restore-privilege-scope]] §1).
**Фикс (в `/opt/data/sync-vault.sh`):** идемпотентный цикл вместо двух безусловных `--add` (которые к тому же дублировали записи в ~/.gitconfig при каждом запуске):
```bash
for d in /vault /obsidian-syncthing /vault.git; do
git config --global --get-all safe.directory 2>/dev/null | grep -qxF "$d" \
|| git config --global --add safe.directory "$d"
done
```
## Разбор мержа после фикса
Повторный прогон (12:14) прошёл: фаза 1 запушила телефонные изменения (новый файл `work/projects/cpm-extension-health-pixels-privacy-triage.md`), фаза 2 дала **merge-конфликт**, фаза 3 утащила конфликтную версию в телефонную копию.
### Конфликт 1 (сегодняшний): `family/how-to/truenas-sata-ports-and-zfs-pools.md`
- Локальная сторона (HEAD, коммит 811f807): правка сессии от 17.08 поверх базы 01.08 — агент был в crash-loop весь август, `/vault` отставал на месяц (база ceea848/01.08).
- Сторона origin/main: актуальная линия bare (правки до 24.08: падение HGST, спасение данных на IronWolf, пересоздание пула RED_2TB ONLINE).
- `sync-vault-lib.sh` закоммитил маркеры (`d5ede3f merge conflict — committed markers`) и запушил → маркеры ушли на телефон.
- **Разрешено:** взята версия origin/main (^2, 6807731) — локальная сторона полностью устаревшая/поглощённая, уникальных данных нет. Коммит `5bdd673` запушен.
### Конфликты 2 и 3 (старые, с 18.06.2026, маркеры `nas/main`)
Нашлись при проверке `git grep '^<<<<<<< '` — закоммичены ещё июньским инцидентом (`68090c8 [2026-06-18] taiga-vault: merge conflict — committed markers`), висели в контенте vault (и на телефоне) больше 2 месяцев:
- `family/how-to/switch-emulation-rom-infra.md` — различие только в плейсхолдере apikey (`JACKETT_KEY` vs `***`) → оставлен `JACKETT_KEY`.
- `family/how-to/htpc-emulators-setup.md` — блок Ryujinx: у nas/main детальная таблица (компоненты, 36 игр, symlink-схема), у HEAD более свежая дата статуса (22.06) → объединено: дата 22.06 + полный блок nas/main. Данные не потеряны.
- Разрешение в коммите вместе с заметкой; запушено в bare, фаза 3 донесёт до телефона.
## Уроки
1. **`/vault.git` должен быть в safe.directory** — скрипт теперь добавляет его сам, идемпотентно.
2. **`sync-vault-lib.sh` коммитит маркеры конфликта** (`git add -A && git commit "merge conflict — committed markers"`) и пушит их — маркеры уезжают на телефон. После любого sync желательна проверка `git grep '^<<<<<<< '`; сам скрипт — кандидат на улучшение (коммитить маркеры, но НЕ пушить до ручного разрешения, или помечать).
3. После crash-loop/долгого простоя агента merge локальной устаревшей копии с bare почти гарантированно даст конфликты — локальная сторона обычно устаревшая, истина в bare/маке.
## Связанные заметки
- [[2026-09-02-hermes-taiga-crashloop]] — родитель: почему sync стоял с августа
- [[2026-09-02-restore-privilege-scope]] — родитель: поломка прав после restore (решена), паттерн «молчаливый sync»
- [[vault-git-sync]] / [[obsidian-sync]] — архитектура sync
-5
View File
@@ -393,12 +393,8 @@ CACHE="$HOME/.var/app/org.libretro.RetroArch/config/retroarch/system/Mupen64plus
## Ryujinx (Nintendo Switch)
<<<<<<< HEAD
**Версия:** 1.3.3 (Ryubing fork, Flatpak `io.github.ryubing.Ryujinx`)
**Статус:** ✅ Работает (22.06.2026)
=======
**Версия:** 1.3.3 (Ryubing fork, Flatpak `io.github.ryubing.Ryujinx`)
**Статус:** ✅ Работает (10.06.2026)
**Компоненты:**
| Компонент | Статус | Путь |
@@ -450,7 +446,6 @@ CACHE="$HOME/.var/app/org.libretro.RetroArch/config/retroarch/system/Mupen64plus
**Transmission:** `/data/Switch Roms` (case-sensitive, с пробелом) мапится в `/run/media/system/Data/Switch Roms/` через mount `/data``/run/media/system/Data`
>>>>>>> nas/main
→ Подробно: [[switch-emulation-rom-infra]]
### Компоненты
@@ -204,11 +204,7 @@ Web UI: `http://192.168.1.15:9117`
### API — как Eagle ищет игру
```bash
# Поиск через Jackett Torznab API
<<<<<<< HEAD
curl "http://192.168.1.15:9117/api/v2.0/indexers/rutracker/results/torznab/?apikey=JACKETT_KEY&t=search&q=Donkey+Kong+Tropical+Freeze+Switch&cat=8000"
=======
curl "http://192.168.1.15:9117/api/v2.0/indexers/rutracker/results/torznab/?apikey=***&t=search&q=Donkey+Kong+Tropical+Freeze+Switch&cat=8000"
>>>>>>> nas/main
# Возвращает XML/JSON с magnet-ссылками и метаданными
```