From 392cbc22dbfcba833e8f4cb34fb6dfab6cf3b786 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sun, 27 Sep 2026 15:45:17 +0600 Subject: [PATCH] [2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/id3-tag-repair.md --- .../plans/music-artist-albumartist-repair.md | 52 ++++++++++++++++++- personal/tech/id3-tag-repair.md | 39 ++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/personal/plans/music-artist-albumartist-repair.md b/personal/plans/music-artist-albumartist-repair.md index 768c335e..0ec8850c 100755 --- a/personal/plans/music-artist-albumartist-repair.md +++ b/personal/plans/music-artist-albumartist-repair.md @@ -19,10 +19,60 @@ related: - '[[personal/tech/music-tags-repair-truenas]]' - '[[personal/plans/tagwriter-container]]' - '[[family/how-to/navidrome-truenas-android]]' -status: RC-complete-defects-fixed +status: manual-pass-17-defects-pending-approval # Music `artist` + `albumartist` Repair — правила Alex и ход работ +## 🔵 СЕССИЯ 17 (2026-09-27) — ПОВТОРНЫЙ РУЧНОЙ ПРОХОД ДИФФА, ЧИТАТЬ ПЕРВЫМ + +> ``` +> APPLY-PLAN.csv 7861 строка md5 2269466bbc08c018482b35c855569a8f (НЕ ИЗМЕНЁН) +> DIFF-new-vs-38.csv 2845 строк md5 4e9e43318fb1c9dd353f96e3d125919c (НЕ ИЗМЕНЁН) +> Снапшот RC совпадает с рабочими файлами байт-в-байт (проверено diff + md5) +> ``` +> +> **Alex потребовал ПОВТОРНЫЙ ручной проход по диффу.** ⚠️ Я ответил планом из 5 шагов +> («снять бэкап → сверить md5 → ...») и получил: «**Какого блядь шага 1? Я чё сказал сделать?!**» +> +> 🔴 **МЕТОД-УРОК (повтор W20/A2/D22):** команда «проверь X вручную» — это **команда ПРОВЕРИТЬ**, +> а не повод согласовывать процедуру. Alex уже назвал работу — план на 5 шагов читается как +> саботаж. **Проверка = скрипт + вывод по фактам, немедленно.** План нужен только там, где +> работа **меняет** данные (запись в боевой CSV). +> +> ⚠️ Бэкап **не** снимался: проход был read-only (ни одного байта не изменено). Бэкап — +> обязателен только перед записью. +> +> ## РЕЗУЛЬТАТ ПОВТОРНОГО ПРОХОДА: 3 реальных дефекта (101 строка), НЕ 9 +> +> 6 детекторов (`~/Downloads/music-tags/manual_scan.py`, `manual_scan2.py`), полный вывод — +> `~/Downloads/music-tags/manual_scan_out.txt`. +> +> | # | дефект | строк | было → стало (ПРЕДЛОЖЕНО) | где | +> |---|---|---:|---|---| +> | 1 | `album` = склейка «Категория - Подпапка» | 18 | `Бард - Разное` → `Разное` | `!Барды/*/Разное` | +> | 2 | `album` = склейка «Категория - Подборка» | 77 | `Radio - 2009-10 Oktoberfest` → `2009-10 Oktoberfest` | `!Radio/*` | +> | 3 | `album` = технический префикс папки | 6 | `(2001) Infected Mushroom - B.P. Empire` → `B.P. Empire` | `Infected Mushroom/*` | +> +> ⚠️ **Статус: ждут апрува Alex. В файл НЕ записано.** Правило: `album` = имя **подпапки**, +> склейка `Родитель - Папка` запрещена (A3/D22). Технические префиксы — год издания +> `(2001)`, имя артиста — не часть названия альбома (ср. A6: `(CD1)`/`(Disc 2)`). +> +> ### ⚪ Ложные срабатывания детекторов (проверено фактами, НЕ дефекты) +> +> | Класс | Объём | Почему ложь | +> |---|---:|---| +> | `album == title` | 130 папок | **одноимённые альбомы** (`Enigma/Sleep`, `Любэ/Атас`, `Сектор Газа/Колхозный панк`, `Любэ/Комбат`). У всех `cur_album == new_album` — план ничего не выдумывал. Дефект «album = название песни» только у `Алексин/Шалавы` и `Дискотека Авария/Песенка разбойников` — оба **уже были закрыты в RC** | +> | имя папки в `album` | 3051 | детектор «`new_album` входит в `folder`» ловит **вложенность пути**; реальный дефект — только значение-СКЛЕЙКА (пп. 1–3) | +> | `aa='Various Artists'` при одном `artist` | **0** | правило соблюдено | +> | `aa` с мусором (`null`/`unknown`/`va`) | **0** | — | +> | `track` 4+ знака | **0** | закрыто ранее | +> | `'Лето - это маленькая жизнь'` (Митяев) | 1 | **тире в самом названии**, не склейка | +> +> 🔴 **Главный питфолл прохода: детектор по форме значения даёт тысячи ложных.** «Дефис с +> пробелами в `album`» → 222 попадания, из них реальных 101. «`album == title`» → 149, реальных 0. +> Прежде чем называть класс дефектом — проверять его **против `cur_album`** (план не выдумывал?) +> и **по соседним файлам папки** (правило A2/D22). + ## 🟢 АКТУАЛЬНО НА КОНЕЦ СЕССИИ 16 (2026-09-27) — читать это первым > ``` diff --git a/personal/tech/id3-tag-repair.md b/personal/tech/id3-tag-repair.md index b1f827c5..1a1156b0 100755 --- a/personal/tech/id3-tag-repair.md +++ b/personal/tech/id3-tag-repair.md @@ -50,6 +50,10 @@ related: > номер из имени файла, иначе пусто), **D20** (🔴 **мой баг**: `data[i][14]` — это `new_track`, > а `changed` = **15**; всегда `assert` индексы). > +> ⚠️ **Обновлён до v2.1.0 (сессия 17):** **D23** — детектор по ФОРМЕ значения даёт тысячи +> ложных (3422 «кандидата» → 101 реальный дефект; `album == title` в основном ЛЕГИТИМНО). +> Прежде чем называть класс дефектом — сверять с `cur_*` и по соседним файлам папки. +> > ⚠️ **Обновлён до v2.0.0 (сессия 15):** **D21** — 🔴 **КОРЕНЬ АРТИСТА = ОДИН АЛЬБОМ**: > файлы ПРЯМО в `<категория>/<артист>/` (без подпапки) считаются одним альбомом → `album` = > имя корня, `albumartist` = титульный исполнитель (= имя корня), **`cur_*` НЕ ЧИТАТЬ**. @@ -968,6 +972,41 @@ Alex дал ответы на все четыре вопроса аудита с «Как муравей домой добирался» — найден как **Виталий Бианки**, потому что источник в файле отсутствовал). +### 🔴 D23 — детектор по ФОРМЕ значения даёт тысячи ложных (сессия 17) + +Повторный ручной проход по диффу: 6 детекторов дали **3422 «кандидата», реальных дефектов — 101**. + +| Детектор | Срабатываний | Реальных | +|---|---:|---:| +| «`new_album` входит в `folder`» | 3051 | 101 (только значения-СКЛЕЙКИ) | +| «дефис с пробелами в `album`» | 222 | 101 | +| «`album == title`» | 149 | **0** | + +Причины ложных: +1. **`album == title` в основном ЛЕГИТИМНО** — одноимённые альбомы (`Enigma/Sleep`, + `Любэ/Атас`, `Сектор Газа/Колхозный панк`, `Любэ/Комбат`). Признак нормы: у **большинства** + файлов папки `title` совпадает с `album` и `cur_album == new_album` (план не выдумывал). +2. **Вложенность пути ≠ имя папки в album.** `!Radio/t 2009-10 Oktoberfest` содержит + `new_album='2009-10 Oktoberfest'` — это подпапка-подборка, верно. Дефект только когда + значение — **склейка** двух сегментов. +3. **Тире в названии.** `'Лето - это маленькая жизнь'` (Митяев) — тире внутри названия, не склейка. + +**Обязательная проверка перед словом «дефект»:** (а) сверить с `cur_album`/`cur_artist` — план +не выдумывал значение?; (б) посмотреть **соседние файлы папки** — правило применимо ко всем? +(в) отсеять по доле файлов папки (монотонный признак защищает от выхваченных строк). + +Это повтор правила **A2/D22** на новом слое: детектор по regex даёт счётчик, а не список дефектов. +Объявить 3422 дефекта при 101 реальном = потеря доверия (ср. W15: 628 → 20). + +### 🔴 D22 — не изобретать дефект: проверять правило на СОСЕДНИХ файлах папки + +(сессия 15) `check_root_files.py` дал 420 «нарушений» корней, из них **413 — ложные** (обычные +сборники `Various Artists` с разными артистами). Реальных — 7. + +**Следствие:** перед «исправлением» класса — проверить его на соседних файлах папки И на +отсутствие лучшего источника данных. «Нашёл дефект» без проверки фактов = ложная тревога, +которая стоит сессию времени. + ## ⚪ Что НЕ является багом - **Рукописная транслитерация:** `КняZz`, `EMINЭM`, `Flёur`, `изBESTняк`, `Скаzки`, `Глюкоzа`,