[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/music-tags-repair-truenas.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 23:56:45 +06:00
1 parent e0e395dfcf
commit 36e127dca4
2 files changed
+207 -24

No files matched your search

+150 -23
View File
@@ -4,7 +4,7 @@ created: '2026-09-27'
updated: '2026-09-27'
type: plan
namespace: personal
status: ДИФФ-ОТ-БД-СОБРАН / ПРОГОН-v5-ЖДЁТ-АЛЕКСА / 215-ОДИНОЧЕК-ОТКРЫТО
status: ДИФФ-ОТ-БД-СВЕРЕН / ПРОГОН-v5-НЕ-ЗАПУСКАТЬ-БЕЗ-ПОДТВЕРЖДЕНИЯ / 56-ОДИНОЧЕК-ОТКРЫТО
tags:
- music
- metadata
@@ -35,22 +35,37 @@ related:
**Что делаем:** привести ID3-теги библиотеки `/mnt/RED_2TB/storage/Music` (7861 файл)
в порядок, чтобы Navidrome показывал правильные альбомы/исполнителей/жанры.
**Главный артефакт на сейчас (27 сен, сессия ~35):**
**Главный артефакт на сейчас (27 сен, сессия ~36):**
```
⚠️ ДИФФ ПЕРЕСОБРАН ОТ БАЗЫ (v3 был собран от КАНОНА — НЕВЕРНЫЙ ИСТОЧНИК!)
⚠️ ДИФФ ОТ БАЗЫ ГОТОВ, СВЕРЕН С ПЛАНОМ. ПРОГОН НЕ ЗАПУСКАТЬ БЕЗ ПОДТВЕРЖДЕНИЯ ALEX.
ДИФФ: ~/Downloads/music-tags/DIFF-db-to-fix.csv
91 строка (ПАПКА 26 · ТРЕК 65) — схлопнуто из 429 правок
16 857 B · 92 строки с заголовком = 91 ЗАПИСЬ (ПАПКА 26 · ТРЕК 65)
md5 a5f2b910826dcc46474b6e26513f414f
по полям: album 6 · albumartist 11 · artist 16 · track 58
⚠️ СЧЁТ: 91 запись ≠ 92 строки файла (заголовок) и ≠ 87
(2 файла с ДВОЙНОЙ правкой: Тема дороги album+artist,
Птаха album в одну сторону)
сортировка: по АЛФАВИТУ field (album → albumartist → artist → track)
источник цели: БД Navidrome (то, что РЕАЛЬНО в тегах), НЕ канон
План: ~/Downloads/music-tags/apply-plan-v5.csv (7861 строка)
План: ~/Downloads/music-tags/apply-plan-v5.csv (7861 строка, md5 d4392b11f143844c590a0a9c4a752208)
меняется 159 файлов · без изменений 7702
по полям: albumartist 157 · artist 154 · album 60 · track 58 · title 0 · genre 0
Сборщик: ~/Downloads/music-tags/build_diff_from_db.py
Канон: ~/Downloads/music-tags/APPLY-PLAN.csv (7861 строка — эталон ручных правок, НЕ ПЕРЕЗАПИСЫВАТЬ)
Канон: ~/Downloads/music-tags/APPLY-PLAN.csv (2 882 935 B — эталон ручных правок, НЕ ПЕРЕЗАПИСЫВАТЬ)
```
⚠️ **Сборщики диффа/плана писать СРАЗУ в `~/Downloads/music-tags/`, НЕ в `/tmp`.**
Alex: «какого хуя он в тмп» — артефакт в `/tmp` он не находит.
✅ **СВЕРКА ДИФФ ↔ ПЛАН (27 сен, сессия ~36) — СХОДИТСЯ.** Скрипт
`~/Downloads/music-tags/verify_v5_vs_diff.py`. Кажущееся расхождение (`albumartist` 11 в дифе
против 157 в плане) — **единица счёта**: дифф хранит ПАПКУ (11 папок Трофима × 14 файлов = 154),
план — ФАЙЛЫ. Итог по всем полям 1:1:
```
albumartist 11 ПАПКА-строк → 157 файлов ✅
artist 16 записей → 154 файла ✅ (11 ПАПКА + 4 ТРЕК-фита + Ленинград)
album 6 записей → 60 файлов ✅ (4 папки Трофима + Птаха + Ленинград)
track 58 записей → 58 файлов ✅
```
🔴 **ГЛАВНЫЙ УРОК СЕССИИ ~35: ДИФФ СТРОИТЬ ОТ БД, А НЕ ОТ КАНОНА.**
Первый дифф v4 был собран от `APPLY-PLAN.csv` (канон) — и **не содержал Птаху**,
@@ -59,14 +74,21 @@ Alex: «какого хуя он в тмп» — артефакт в `/tmp` он
Правило: источник истины = `media_file` из `navidrome.db`, канон — только эталон
ручных решений. Подробно → § ДИФФ ОТ БАЗЫ.
**Состояние (27 сен, сессия ~35):** ✅ **БОЕВОЙ ПРОГОН v3 выполнен** (7653/7653 ok, err=0,
**Состояние (27 сен, сессия ~36):** ✅ **БОЕВОЙ ПРОГОН v3 выполнен** (7653/7653 ok, err=0,
`TCON` 4359, БД Navidrome пересоздана, скан 4m13s, импортировано 7861).
✅ **50 дублей Трофима удалены с диска.** ⏳ **Прогон v5 НЕ сделан** — ждём решения Alex
по 1 вопросу (§ ОТКРЫТЫЙ ВОПРОС).
✅ **50 дублей Трофима удалены с диска.** ✅ **Дифф от БД сверен с планом v5 — 1:1.**
⏳ **Прогон v5 НЕ сделан. ЗАПУСКАТЬ ТОЛЬКО ПО ПРЯМОМУ «go» ALEX** — дословно:
«**без подтверждения никакого apply блядь**». Дифф и dry-run — можно без спроса.
**Порядок после ответа:** подтвердить диф `DIFF-db-to-fix.csv` → прогон v5 (`--apply`,
план `apply-plan-v5.csv` подложить как `apply-plan.csv`) → верификация чтением →
**пересоздать БД Navidrome** → приёмка Alex в UI.
**Открыто перед прогоном (2 пункта):**
1. 🔴 **`albumartist` для `rock_o_pop` / `Retro`** — `Various Artists` (как сейчас) или имя
папки? Прямые указания Alex противоречат данным БД (см. § ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК).
2. 🔴 **Однотрековые (56 папок) в план v5 не входят** — правило в `build_diff_from_db.py`
не написано, сборщик знает только 3 хардкод-пути. Дособирать ли дифф по ним.
**Порядок после «go»:** план `apply-plan-v5.csv` подложить как `apply-plan.csv` → dry-run
(`--dry-run`, сверить `count`/`err`) → прогон `--apply` → верификация чтением →
**пересоздать БД Navidrome** → приёмка Alex в UI. Приёмка = **видно в UI**, не «я прочитал обратно».
```
Navidrome БД: /mnt/RED_2TB/docker/navidrome/data/ ← БЕЗ storage/ (дока ранее врала)
@@ -117,7 +139,11 @@ compose: /mnt/RED_2TB/docker/navidrome
| 29 | 27 сен | 🔴 **ДИФФ v4 НЕВЕРЕН: собран от КАНОНА** — Птахи в нём нет, а дефект в базе есть | § ДИФФ ОТ БАЗЫ |
| 30 | 27 сен | ✅ **ДИФФ ПЕРЕСОБРАН ОТ БД** — источник истины = `media_file`, 91 строка из 429 правок | `DIFF-db-to-fix.csv` |
| 31 | 27 сен | 🔴 **ЛОЖНОЕ РАСХОЖДЕНИЕ ПО ЖАНРУ** — `media_file.genre` пуст у всех, жанр в `tags` jsonb | `build_diff_from_db.py` |
| 32 | 27 сен | 🔴 **ДЕФЕКТ «АЛЬБОМЫ-ОДИНОЧКИ»** — 215 альбомов из 1 трека, где `album != имя папки` | § АЛЬБОМЫ-ОДИНОЧКИ |
| 32 | 27 сен | 🔴 **ДЕФЕКТ «АЛЬБОМЫ-ОДИНОЧКИ»** — 215 (⚠️ ПОЗЖЕ УТОЧНЕНО: 56 папок) | § АЛЬБОМЫ-ОДИНОЧКИ |
| 33 | 27 сен | ✅ **СВЕРКА ДИФФ↔ПЛАН v5** — 91 запись ↔ 159 файлов, по полям 1:1 | `verify_v5_vs_diff.py` |
| 34 | 27 сен | 🔴 **ЦИФРА 215 НЕВЕРНА → 56 однотрековых папок**; `album == title` лишь у 11 | `diag_single_track.py` |
| 35 | 27 сен | 🔴 **ПРАВИЛО ОДИНОЧЕК ОТ ALEX** — `album` = имя папки-владельца, `artist` СОХРАНИТЬ | §§ ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК |
| 36 | 27 сен | 🔴 **ПРОГОН НЕ ЗАПУСКАТЬ БЕЗ ПОДТВЕРЖДЕНИЯ** — «без подтверждения никакого apply блядь» | § СТАРТ ЗДЕСЬ |
---
@@ -146,6 +172,36 @@ compose: /mnt/RED_2TB/docker/navidrome
### 5. Категории-контейнеры срезаются
`!Retro`, `!Rock&Folk`, `!Pop, Club, Любэ`, `!A Not sorted` — срезаются при разборе пути.
### 6. Однотрековая папка → `album` = имя папки-владельца (получено 27 сен, сессия ~36)
Папка, где лежит **один** файл, а `album` указывает на чужой сборник-источник:
`album` = **имя папки-владельца**, НЕ имя сборника.
```
!Rock&Folk/!rock_o_pop/*.mp3 album 'Бабло побеждает зло' → 'rock_o_pop'
!Retro/*.mp3 album 'Супер ДискотЭка…' → 'Retro'
9999 - Разное/Проекты/*.mp3 album 'Нечётный Воин 2' → 'Проекты'
```
🔴 **`artist` СОХРАНИТЬ** — это реальный исполнитель трека (Чайф, Би-2, Слот, Стрелки),
НЕ имя папки. Прямое указание Alex: «artist нужно сохранить».
🔴 **Для `9999 - Разное` `albumartist = 'Агата Кристи'`** — артист КАТЕГОРИИ, а не сборника.
⚠️ Для `rock_o_pop` / `Retro` значение `albumartist` **не определено** (в БД `Various Artists`).
### 🔑 ЕДИНИЦА СЧЁТА — называть вслух (урок 27 сен, сессия ~36)
Когда одно и то же изменение считают дифф/план/лог, числа НЕ совпадают by design:
```
дифф = ПАПКИ (схлопнуто) план = ФАЙЛЫ лог = ПОСТРОЧНО
11 папок Трофима → 157 файлов
6 записей album → 60 файлов
```
Alex читает расхождение как дефект. **Всегда писать единицу счёта** («91 ЗАПИСЬ»,
не «91 строка»; «159 ФАЙЛОВ», не «159 правок»).
### 🔑 ЛОВУШКА «ФАЙЛ ЕСТЬ, НО СОДЕРЖИМОГО НЕ ВИДНО» (27 сен, сессия ~36)
`read_file` вернул `{"status":"unchanged","dedup":true}` без содержимого — я повторил вызов
и получил то же самое **дважды**. Файл был в порядке, но `cat` через терминал пришлось
вызывать отдельно. **Правило: при `unchanged` НЕ повторять `read_file` — сразу читать
содержимое другим способом.** Alex в этот момент трижды спросил «где дифф» → выродилось
в конфликт. Причина была инструментальная, не содержательная.
---
## 🛠 КАК ЧТО ДЕЛАЕТСЯ
@@ -277,22 +333,34 @@ backup_raw
### Рабочие (Mac)
```
~/Downloads/music-tags/APPLY-PLAN.csv канон/ЭТАЛОН, 7861 стр, md5 bc20f2a49e364ecd5ed57d9fc97bfbcb
~/Downloads/music-tags/DIFF-canon-v4.csv 🔴 ТЕКУЩИЙ ДИФФ v4, 90 стр (ПАПКА 26 · ТРЕК 64)
~/Downloads/music-tags/apply-plan-v4.csv 🔴 ТЕКУЩИЙ ПЛАН v4, 7861 стр
~/Downloads/music-tags/APPLY-PLAN.csv канон/ЭТАЛОН, 2 882 935 B — НЕ ПЕРЕЗАПИСЫВАТЬ
~/Downloads/music-tags/DIFF-db-to-fix.csv ⭐ ТЕКУЩИЙ ДИФФ, 91 запись (ПАПКА 26 · ТРЕК 65)
md5 a5f2b910826dcc46474b6e26513f414f
~/Downloads/music-tags/apply-plan-v5.csv ⭐ ТЕКУЩИЙ ПЛАН, 7861 стр, 159 файлов меняется
md5 d4392b11f143844c590a0a9c4a752208
~/Downloads/music-tags/build_diff_from_db.py ⭐ СБОРЩИК (от БД); 3 хардкод-пути, однотрековых НЕТ
~/Downloads/music-tags/verify_v5_vs_diff.py сверка дифф↔план (единица счёта: папка vs файл)
~/Downloads/music-tags/diag_single_track.py 🔑 однотрековые: 56 папок, album==title у 11
~/Downloads/music-tags/sverka_4folders.py 🔑 4 папки Alex: rock_o_pop / Retro / 9999 - Разное
~/Downloads/music-tags/DIFF-canon-v4.csv 🔴 УСТАРЕЛ (от канона), 90 стр
~/Downloads/music-tags/apply-plan-v4.csv 🔴 УСТАРЕЛ (от канона)
~/Downloads/music-tags/DIFF-canon-v4-changes.csv лог v4, 428 строк построчно
~/Downloads/music-tags/DELETE-dup-trofim.csv 50 дублей Трофима (✅ уже удалены)
~/Downloads/music-tags/build_diff_canon_v4.py сборщик диффа v4 (сортировка+схлопывание В КОДЕ)
~/Downloads/music-tags/build_diff_canon_v4.py сборщик диффа v4 (от канона, устарел)
~/Downloads/music-tags/DIFF-base-vs-applyplan-v3.csv дифф v3 (устарел), 945 стр, md5 bdb20c6ae00e7dfab4da2f76653fe084
~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv лог v3 (устарел), 31 стр
~/Downloads/music-tags/APPLY-PLAN-v3-changes.csv лог v3, 31 стр, md5 2c6d2f0bb1d732d7e3e70ef1b210e7d8
~/Downloads/music-tags/REPORT-album-kept-all-folders.csv 559 стр (источник ошибочной цифры 215)
~/Downloads/music-tags/tag-fix-plan.csv 38-я волна, 7905 стр
~/Downloads/music-tags/ALBUM-FIX-306.csv скобочный прогон, 306 стр
~/Downloads/navidrome-db/navidrome-merged.db БД Navidrome (старая локальная копия)
~/Downloads/navidrome-db/navidrome-after-v3.db БД ПОСЛЕ прогона v3, 27586560 B — читать отсюда
```
⚠️ `/tmp`-копии: `DIFF-v3-to-v4.csv` (428 строк — ПЕРВЫЙ, несортированный/несхлопнутый, устарел),
`apply-plan-v4.csv`. **Не путать: правильный дифф — `DIFF-canon-v4.csv` в папке проекта.**
`apply-plan-v4.csv`. **Не путать: правильный дифф — `DIFF-db-to-fix.csv` в папке проекта.**
Бэкап канона перед сборкой v4: `/tmp/APPLY-PLAN.csv.bak-before-v4`.
Бэкап диффа перед сверкой: `DIFF-db-to-fix.csv.bak-20260927-234901` (md5 совпал с исходным).
⚠️ **Сборщики диффа/плана писать СРАЗУ в `~/Downloads/music-tags/`, НЕ в `/tmp`.**
Alex: «какого хуя он в тмп» — артефакт в `/tmp` он не находит.
### Скрипты
```
@@ -749,8 +817,67 @@ album='2000 и Одна Ночь' папка='!Retro' !Retro/Ари
**Правильная цель для `Кавер-версии и пародии`:** `album='Кавер-версии и пародии'`
для всех 24 файлов; `artist` сохранить реальных исполнителей (Чайф, Би-2, Слот, Стрелки).
⏳ **НЕ СДЕЛАНО:** разбор всех 215 — разделить на «мусор (чужой сборник)» /
«законный сингл». Требует решения Alex.
🔴 **УТОЧНЕНО 27 сен (сессия ~36) — ЦИФРА `215` НЕВЕРНА, ПРАВИЛЬНО `56`.**
`215` было посчитано по СТРОКАМ отчёта, а не по ПАПКАМ. Точный пересчёт по
`apply-plan-v5.csv`, скрипт `~/Downloads/music-tags/diag_single_track.py`:
```
папок всего 633 · ОДНОТРЕКОВЫХ 56 · многотрековых 577
из 56: album == title (настоящий дефект) 11
album != title 45
album == имя папки 15
однотрековых, которые меняет план v5 0
по категориям: !Pop, Club, Любэ 35 · !Rock&Folk 10 · !A Not sorted 3 ·
!Retro 3 · !Рэп 3 · !Барды 1 · !Детские 1
```
🔑 **ЕДИНИЦА СЧЁТА: считать ПАПКИ, а не строки отчёта.** Тот же класс ошибки,
что `awk -F','` (дал 33 вместо 117) и `7496`/`7649` (номера строк в
`manual_scan_out.txt`, не число правок).
### 🔴 ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК (получено 27 сен, сессия ~36)
Дословно: «**в `9999 - Разное` albumartist — Агата Кристи. в `rock_o_pop` — должен быть
альбом `rock_o_pop`. в `Retro` — `Retro`. в `Ария, Кипелов` — угадай блядь какой альбом
должен быть (и `albumartist`)**».
**→ `album` = имя ПАПКИ-ВЛАДЕЛЬЦА. `artist` СОХРАНИТЬ как есть** (прямое указание Alex:
«artist нужно сохранить» — это реальный исполнитель трека, Чайф/Би-2/Слот).
⚠️ **Про `albumartist` правило НЕ выведено — открыто.** Прямые указания противоречат данным:
- Alex: `9999 - Разное` → `albumartist = Агата Кристи` — **уже так** (24/9/12 файлов ✅),
т.е. к Разному правило «albumartist = имя папки» НЕ применяется;
- Alex: `rock_o_pop` / `Retro` → имя папки — но в БД там **`Various Artists` у 100%**
(57/57 и 158/158), и раньше `Various Artists` поверх одного артиста признавался дефектом.
**Текущее состояние трёх папок (из плана v5, `~/Downloads/music-tags/sverka_4folders.py`):**
```
!Rock&Folk/!rock_o_pop 57 файлов | album == 'rock_o_pop' 33 | albumartist == '!rock_o_pop' 0
| остальные 24 — чужой альбом ('МОЛОДЫЕ ВЕТРА' 5, 'В городе N' 2,
'Соль' 2, 'Зе Бест' 2, 'Попса' 2, …); albumartist = VA 57
!Retro 158 файлов | album == 'Retro' 112 | albumartist == '!Retro' 0
| чужие: 'Просвистела' 5, 'Супер ДискотЭка Радио Рекорд' 4,
'Опиум' 3, 'Улица любви' 2, 'Позорная звезда' 2, …; VA 158
9999 - Разное/
Кавер-версии и пародии 24 файлов | album == имени папки 10 | albumartist = 'Агата Кристи' 24 ✅
| чужие: 'Танец на цыпочках' 2, 'Симпатии', 'Slot 1', 'Песок', …
Неизданное 9 файлов | album == имени папки 5 | 'Агата Кристи' 9 ✅
Проекты 12 файлов | album == имени папки 0 | 'Агата Кристи' 12 ✅
(все чужие: 'Нечётный Воин 2' 3, '20-ая зима…' 3, …)
```
⚠️ `!Rock&Folk/Ария, Кипелов` из плана v5 **отсутствует** — правки по ней (3 записи album:
`Вавилон` · `Герой асфальта` · `На грани` → `Ария, Кипелов`) ушли в
`APPLY-PLAN-v3-changes.csv` и **уже применены** прогоном v3.
**Второй подтверждённый класс — 4 папки Трофима `01..04 Аристократия помойки`:** `album`
несёт **префикс НОМЕРА ДИСКА**, а не мусор (Alex: «в 01..04 префикс — номер ДИСКА, а не
мусор»). Правило то же: `album` = имя папки без префикса.
✅ **Правильная цель для `Кавер-версии и пародии`:** `album='Кавер-версии и пародии'`
для всех 24 файлов; `artist` сохранить реальных исполнителей (Чайф, Би-2, Слот, Стрелки).
⏳ **НЕ СДЕЛАНО:** правило для однотрековых в `build_diff_from_db.py` НЕ написано —
сейчас сборщик обрабатывает ровно 3 хардкод-пути (`!Рэп/Трофим/`, `!Рэп/Птаха…`,
`Тема дороги.mp3`). Разбор 56 — разделить «мусор (чужой сборник)» / «законный сингл».
Требует решения Alex по `albumartist`.
---
+57 -1
View File
@@ -100,7 +100,63 @@ related:
> Файлы в сборниках (`disk/`, `disk_v2/`) **удалять нельзя** — указание Alex:
> «они корректно живут в сборниках». Удаляем ТОЛЬКО дубли альбомов.
> ## 🔴 АКТУАЛЬНОЕ СОСТОЯНИЕ (2026-09-27, сессия ~30) — ЧИТАЙ ЭТО ПЕРВЫМ
> ## 🔴 АКТУАЛЬНОЕ СОСТОЯНИЕ (2026-09-27, сессия ~36) — ЧИТАЙ ЭТО ПЕРВЫМ
>
> 🔴🔴 **`apply` НЕ ЗАПУСКАТЬ БЕЗ ПРЯМОГО ПОДТВЕРЖДЕНИЯ ALEX.** Дословно 27 сен:
> «**без подтверждения никакого apply блядь**». Дифф и dry-run — можно, запись — только «go».
>
> ✅ **ДИФФ ОТ БД ГОТОВ И СВЕРЕН С ПЛАНОМ.** `DIFF-db-to-fix.csv` — 16 857 B, **91 запись**
> (ПАПКА 26 · ТРЕК 65), md5 `a5f2b910826dcc46474b6e26513f414f`. Поля: `album` 6 ·
> `albumartist` 11 · `artist` 16 · `track` 58. План `apply-plan-v5.csv` — 7861 стр,
> md5 `d4392b11f143844c590a0a9c4a752208`, **меняется 159 файлов**, 7702 без изменений.
> `title 0 · genre 0` — эти поля не трогаются.
>
> ⚠️ **ЕДИНИЦА СЧЁТА — главная ловушка этой сверки.** Одни и те же правки считаются так:
> ```
> DIFF-db-to-fix.csv 92 строки файла = 91 ЗАПИСЬ (91 + заголовок)
> 87 уникальных (файл,поле) (2 файла с двойной правкой:
> Тема дороги album+artist, Птаха album)
> план v5 159 ФАЙЛОВ, разбивка по ПОЛЯМ (albumartist 157 · artist 154 ·
> album 60 · track 58)
> дифф ПАПКИ, не файлы: 11 папок Трофима × 14 файлов = 154
> ```
> Сверка 1:1 по всем полям — скрипт `verify_v5_vs_diff.py`. Дифф↔план РАСХОЖДЕНИЙ НЕТ.
> **Называть единицу счёта вслух** (папки ≠ строки ≠ файлы) — иначе Alex видит
> противоречие там, где его нет.
>
> ✅ **ДИФФ v3 (`APPLY-PLAN-v3-changes.csv`) — СПРАВОЧНИК, НЕ источник правды В ЭТОМ ДИФФЕ.**
> 31 запись (album: Забугр, Руки вверх, Ария/Кипелов, Юрий Никулин, Дискотека Авария…),
> md5 `2c6d2f0bb1d732d7e3e70ef1b210e7d8`, **уже применена прогоном v3**. В v5 её нет:
> v5 — отдельная волна, 87 из 87 правок это Трофим + Ленинград + Птаха.
> ⚠️ **Не смешивать: v3-changes = journal ДО прогона (album), v5 = дифф ПОСЛЕ прогона
> от БД (4 поля).** Общего пересечения — 0.
>
> 🔴 **ЦИФРА «215 АЛЬБОМОВ-ОДИНОЧЕК» — НЕВЕРНА. ПРАВИЛЬНО `56`.** `215` посчитано по
> СТРОКАМ отчёта `REPORT-album-kept-all-folders.csv`, а не по папкам. Пересчёт по плану v5:
> **633 папки · однотрековых 56 · многотрековых 577**; `album == title` (настоящий дефект)
> лишь у **11**; `album != title` у 45; `album == имя папки` у 15.
> **В плане v5 однотрековых, которые меняются — 0** (сборщик их не знает).
>
> 🔴 **ПРАВИЛО ОДИНОЧЕК ОТ ALEX (27 сен):** `album` = **имя ПАПКИ-ВЛАДЕЛЬЦА**
> (`rock_o_pop` → `rock_o_pop`, `Retro` → `Retro`), **`artist` СОХРАНИТЬ** («artist нужно
> сохранить»). Про `albumartist` — **ОТКРЫТО**: по `9999 - Разное` он должен быть
> `Агата Кристи` (уже так), но по `rock_o_pop`/`Retro` в БД стоит `Various Artists`
> у 100% файлов. `!Rock&Folk/Ария, Кипелов` в v5 отсутствует — правки по ней уже в v3.
> Разбор — [[personal/plans/music-artist-albumartist-repair]] § ПРАВИЛО ALEX ДЛЯ ОДИНОЧЕК.
>
> ✅ **АРТЕФАКТ «КАК СТРОИЛСЯ APPLY-PLAN И ДИФФ» — ЗАПИСАН.** Zulip DB показала:
> `APPLY-PLAN.csv` собран в `/Users/admin/milestones/music-csv-2026-09-26/`
> (`tag-inventory3.csv` → `APPLY-PLAN-FINAL.csv` → `APPLY-PLAN-FINAL2.csv` → канон),
> **скрипта-сборщика как единого файла НЕТ** — сведение шло несколькими скриптами
> (`add_track.py`, `fix_track_and_selfcheck.py`) + ручные решения по 51 файлу.
> 🔴 **Папка `milestones/music-csv-2026-09-26/` БОЛЬШЕ НЕ СУЩЕСТВУЕТ** (`ls` → No such file).
> `build_fix_plan2.py` — **другой скрипт** (волна 38), канон НЕ писал, `albumartist` не умеет.
>
> 🔴 ПИТФОЛЛ ЗАПУСКА (без изменений): у образа `tagwriter:latest` в `CMD` прописан
> `--dry-run` → явно передавать `--apply`, иначе прогон молча уходит в dry-run.
> Два шага: `docker create` затем `docker start` (составная команда прерывается по таймауту).
> ## 🔴 АКТУАЛЬНОЕ СОСТОЯНИЕ (сессия ~29-35) — АРХИВ
>
> ✅ **БОЕВОЙ ПРОГОН ВЫПОЛНЕН:** 7653/7653 ok, err=0.
> `TCON 4359 · TPE2 7213 · TALB 2031 · TPE1 381 · TRCK 437 · TIT2 8`.