[2026-09-26] eagle: family/how-to/jellyfin-config.md family/plans/lidarr-taiga-deploy.md personal/plans/balda-mm-pr-plan.md personal/plans/music-tags-review/music-tags-review.md personal/projects/balda/balda-mattermost-connector.md personal/tech/balda-go-fx-pitfalls.md personal/tech/music-tags-repair-truenas.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-26 14:37:01 +06:00
1 parent 9778ea9289
commit 35dfecbe02
7 files changed
+281 -24

No files matched your search

+36 -4
View File
@@ -1155,10 +1155,42 @@ MM отвечал раз в 30 секунд, ровно на каждый пин
## 📌 Артефакты деплоя — вон из PR
`tools/mm-*.sh` (9 ops-скриптов) и `tools/deltas-*.json` (15 файлов дельта-групп)
— **локальный инструментарий**, в PR в апстрим не идут. Оставлять
незакоммиченными и явно перечислять в доке, чтобы не потерять.
В коммиты PR шли только: код транспорта, wiring, тесты, доки.
`tools/mm-*.sh` (9 ops-скриптов) и `tools/deltas-*.json` — **локальный инструментарий**,
в PR в апстрим не идут. В коммиты PR шли только: код транспорта, wiring, тесты, доки.
⚠️ **Поправка (та же сессия, позже):** я сначала написал, что `tools/` «оставлены
незакоммиченными». Это было **неверно** — проверка показала, что **16 файлов `tools/`
уже сидят в базовом коммите `004fda2f`** (из прошлой сессии), и в апстриме каталога
`tools/` **нет вообще** (`git ls-tree upstream/main tools/` → пусто). То есть в PR
уезжал мусор, а `git status` этого не показывал.
## 🔴 Проверять СОСТАВ PR, а не рабочее дерево
**Правило:** перед объявлением «готово к PR» смотреть содержимое коммитов, а не только
`git status`:
```bash
git diff --stat upstream/main...HEAD # ЧТО реально уедет в PR
git ls-tree --name-only upstream/main <dir> # есть ли этот dir в апстриме вообще
git log --oneline --name-only <mой_первый_коммит>^..HEAD -- '<dir>/' # не моё ли
```
Три команды отвечают на три разных вопроса, и **`git status` не отвечает ни на один**:
он показывает рабочее дерево, а не то, что уже закоммичено ранее (в т.ч. чужой рукой).
📌 **Симптом промаха:** «я всё вычистил, PR готов» → `git diff --stat` показывает
56 файлов вместо 40. Лишние пришли из **предыдущей** сессии, не из текущей.
📌 **Полезное следствие:** `git log --name-only <range> -- '<dir>/'` точно отделяет
**свой** мусор от **унаследованного** — без этого легко начать «чинить» не то.
## ⚠️ `git rm --cached` требует апрува — не повторять вслепую
`git rm -r --cached tools/` идёт на подтверждение; при таймауте **не применяется**
(безопасно — состояние целое, проверять `git status --short`). Не ретраить
автоматически: удаление из индекса — операция, требующая команды заказчика.
Альтернатива без «удаления»: оставить файлы untracked, а из индекса убрать одним
явным коммитом по команде Alex.
## Связанные заметки
+13 -1
View File
@@ -334,11 +334,15 @@ if cyr < 2: # одна буква — совпадение
|---|---|---|
| 1 | **Инвентаризация** read-only: `ffprobe` по 7906 файлам → CSV | ✅ **ГОТОВО (v2)** — `tag_inventory2.py`, `probe_failed`=0 |
| 2 | **CSV с предлагаемым исправлением** → Alex | ✅ **ГОТОВО (v2)** — `~/Downloads/music-tags/tag-fix-plan.csv` |
| 3 | **Апрув Alex по CSV** → только после этого правки | ⏳ **ЖДЁМ** (v1 отклонён, v2 отдан) |
| 2a | **Ноты для ревью в Obsidian** → Alex (запрос Alex 2026-09-26) | ✅ **ГОТОВО** — `personal/plans/music-tags-review/`, синкнуто (`Pushed ✓`, коммит `14e9f570`) |
| 3 | **Апрув Alex по CSV** → только после этого правки | ⏳ **ЖДЁМ** (v1 отклонён, v2 + ноты отданы) |
| 4 | **Бэкап** — копировать **только перезаписываемые** файлы в `Music/backup/` | ⏳ |
| 5 | **Ремонт** — перекодировка mojibake + восстановление из имён путей + чистка мусора | ⏳ |
| 6 | **Приёмка** — Alex слушает выборку | ⏳ |
> 📌 **Что именно ждёт апрува:** 4961 `fix` из 7906. Alex проходит по трём нотам ревью,
> отмечает чекбоксы. Ничего не применяется до его «go».
### Ключевые решения по плану (правки Alex)
- ❌ **НЕ** бэкапить всю библиотеку (48 ГБ) — только те файлы, которые будут перезаписаны.
@@ -390,6 +394,7 @@ if cyr < 2: # одна буква — совпадение
| **CSV-план правок v2** | `~/Downloads/music-tags/tag-fix-plan.csv` (Mac, 2.2 МБ) | **Отдан Alex 2026-09-26.** 4961 `fix` / 2945 `no_change` / 0 `probe_failed` |
| Копия БД Jellyfin | `/tmp/jf-copy.db` (Mac) | Для чтения API-ключа (см. `[[family/how-to/jellyfin-config]]`) |
| Копия плана на NAS | `/tmp/tag-fix-plan.csv` (NAS) | Для запуска `id3_direct.py`/`check_ddt_album.py` с хостовым Python |
| **Ноты ревью в vault** | `personal/plans/music-tags-review/` (4 файла) | Обзор + 3 блока по уверенности; **вход для апрува Alex**, синкнуто |
### Колонки `tag-fix-plan.csv`
@@ -418,6 +423,13 @@ if cyr < 2: # одна буква — совпадение
- 🔴 **`python3` НЕТ в контейнере `jellyfin`** — для скриптов поднимать отдельный `python:3-alpine`.
- 🔴 **`ffprobe` НЕТ на хосте TrueNAS** — только внутри контейнеров (в `jellyfin` путь `/usr/lib/jellyfin-ffmpeg/ffprobe`).
- ⚠️ **Генерация нот для Obsidian: сравнивать ОТРЕНДЕРЕННЫЕ значения, не сырые.** Сравнение
`new != cur` даёт ложные блоки, где различие (двойной пробел) схлопывается при выводе — файл
раздувается и выглядит так, будто правка ничего не меняет. Правильно: `esc(new) != esc(cur)`.
- ⚠️ **Нечитаемые байты в нотах рендерить как `⟨повреждено⟩`, а не как есть.** Управляющие
символы (`\x1d`, `\x10`) и U+FFFD дают в markdown нечитаемую кашу (`56=>ABL (:D"@8`).
- ⚠️ **Один markdown-файл на 5000 чекбоксов (~750 КБ) тормозит Obsidian.** Помогает группировка
по папкам + оглавление со ссылками вверху; при жалобах на лаги — разбивать по категориям.
- 🔴 **`sed -i` на удалённом хосте применять нельзя** (нарушение правил Alex). Правильно: правка локально → `scp` заново. Именно так и было исправлено (`FFPROBE` → `os.environ.get`).
- ⚠️ **Кириллица в inline `ssh`-командах** поднимает tirith `confusable_text` (HIGH). Команда проходит только через approval Alex. Митигация: пути с кириллицей собирать в файле-скрипте, а не в командной строке.
- ⚠️ `alpine` без `ffmpeg` → инвентарь падает молча. Ставить `apk add --no-cache ffmpeg` первой строкой.