[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/batch-data-edit-review-loop.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 13:28:35 +06:00
1 parent 5bc7737d3e
commit a33383a135
2 files changed
+158 -14

No files matched your search

@@ -68,8 +68,50 @@ related:
**Правило:** каждое срабатывание детектора проверять глазами; не править пачкой.
В волне 38 из ~100 «срабатываний» реальными были **7**.
## 🔴 Уроки диффа планов (2026-09-27)
### 4. Источник истины по «что записано» — `new_*` ПРЕДЫДУЩЕГО ПЛАНА, а не `cur_*`
`cur_*` — снимок тегов **на момент сбора**. Он НЕ равен тому, что записано в файлы после прогона.
Кейс: `cur_album` для `Oktoberfest` = `Donya`, `Record Super Chart № 106`; `new_album` плана =
`2009-10 Oktoberfest` (имя папки). Значения `Donya` в файлы **не писались** — они жили только в `cur_*`.
**Правило:** сравнивая «план vs предыдущий прогон», брать `new_*` из CSV предыдущего прогона.
`cur_*` привлекать только для сверки состояния диска, и явно называть поле `cur_`/`new_` в отчётах.
### 5. Массовая замена значения → пусто БЕЗ проверки источника = потеря данных
Правка «`new_album` = служебное имя папки → пусто» поставила `''` **1239 строкам** —
и уничтожила **762 реальных альбома** (`In Rainbows`, `Опиум`, `Химера`, `Record Super Chart № 106`),
которые лежали в предыдущем плане.
Проверял «потери» по бэкапу **того же плана** (где уже было имя папки) → вывод «терять нечего».
**Ложная проверка: сравнивал не тот файл.**
**Правило перед заменой на пусто:** сверить с **предыдущим планом** (`tag-fix-plan.csv`), а не
с бэкапом правимого файла. Если в предыдущем плане значение осмысленное — вернуть его.
Лечится `restore_album.py` (бэкап-база + дозаполнение из предыдущего плана).
### 6. Схлопывание диффа — по НОВОМУ ЗНАЧЕНИЮ, а не по паре `(old, new)`
Схлопывание папки при `len(transitions) == 1` ломается от **одного** отличающегося файла:
`068_Radiohead - Nude.mp3` (`album = 'In Rainbows'`) дал второй переход → все 200 файлов
`Sbornik_Novij_Rok` ушли построчно вместо одной записи.
**Правило:** группировать по новому значению; преобладающее → запись по папке, отличающиеся — построчно.
### 7. Пустая разница ≠ корректность
`'' → ''` не попадает в дифф. Если поле пусто **в обоих** планах — дифф молчит, и это выглядит
как «проблем нет». Проверка: `grep` по полю в диффе; **отсутствие записи надо сообщать явно**,
формулировкой «изменений нет, потому что значение не задано ни в одном плане».
### 8. Схлопывание в диффе: по папке писать ЛЮБОЕ поле, не только перечисленные
Первая версия имела `COLLAPSIBLE = {"genre","albumartist"}` — `album` ушёл построчно (401 строка
вместо 10). Ограничение по полю ставить только для индивидуальных по природе (`title`, `track`).
## Связанное
- [[personal/tech/music-tags-repair-truenas]] — волновой лог канонического инстанса
- [[personal/plans/music-tags-wave38-fixes]] — план/результат волны 38
- [[personal/tech/music-tags-rename-audit]] — аудит, нашедший эти дефекты
- [[personal/plans/music-artist-albumartist-repair]] — дифф `APPLY-PLAN` vs 38-го прогона