[2026-09-27] eagle: personal/plans/music-artist-albumartist-repair.md personal/tech/batch-data-edit-review-loop.md personal/tech/whale-soul-answer-format.md
This commit is contained in:
1 parent
204b254cc5
commit
d787749dd5
3 files changed
+334
-1
No files matched your search
@@ -36,6 +36,96 @@ related:
|
||||
6. **Инвариант полноты:** `sum(частей) == total`. Проверять **сумму**, не только группы.
|
||||
7. **Не выдавать выборку за полную проверку.**
|
||||
|
||||
## 🔴 Урок сессии 29-ОКТИ (2026-09-27): ФИЛЬТР ВЫВОДА ЖИВЁТ ВНУТРИ ГЕНЕРАТОРА
|
||||
|
||||
**Инстанс:** канонный дифф `~/Downloads/music-tags/DIFF-base-vs-applyplan-v3.csv`,
|
||||
сборщик `/tmp/build_canon_diff_v3.py`, источник `/tmp/apply-plan-v3.csv`.
|
||||
|
||||
### 1. 🔴 Пост-обработчик НЕ защищает от регенерации
|
||||
|
||||
Убрал 117 шумовых строк `track N → N/M` **отдельным скриптом** (`/tmp/drop_track_noise.py`) —
|
||||
чисто стало 945 строк. Следующая пересборка диффа **вернула все 117**: сборщик о фильтре
|
||||
не знал и сгенерировал их заново.
|
||||
|
||||
🔑 **Правило: фильтр вывода (шум-термы, исключения, нормализация) обязан находиться
|
||||
ВНУТРИ генератора-производителя артефакта, а не в скрипте-постобработчике.**
|
||||
Иначе каждый прогон генератора = регрессия, и её надо ловить руками.
|
||||
|
||||
**Проверка дисциплины:** перезапустить генератор ВТОРОЙ раз и сверить `wc -l` + `md5`.
|
||||
Идемпотентный генератор даёт те же числа.
|
||||
|
||||
### 2. Шум-термы: отличать правку от смены ФОРМАТА
|
||||
|
||||
`track_number` в базе Navidrome — **целое** (`1`..`24`). Значения `6/14` (номер/всего) и
|
||||
`08` (ведущий ноль) для плеера означают **то же самое число**, а `TRCK` с `/` ломает часть
|
||||
парсеров и сортировку.
|
||||
|
||||
🔑 **Критерий «не правка»:** если новое значение различается со старым только ФОРМОЙ и
|
||||
приводится к нему приведением типа (`int("6/14".split("/")[0]) == 6`, `int("08") == 8`) —
|
||||
это шум, а не правка. Выбрасывать из диффа.
|
||||
|
||||
Доказательство (факт из БД): `track_number LIKE '%/%'` → **0**, `GLOB '0[0-9]*'` → **0**.
|
||||
То есть база уже хранит целое, правки были впустую.
|
||||
|
||||
```python
|
||||
def _is_track_noise(r): # внутри генератора, не снаружи
|
||||
if r[3] != "track":
|
||||
return False
|
||||
old, new = r[4].strip(), r[5].strip()
|
||||
m = re.fullmatch(r"(\d+)/(\d+)", new)
|
||||
if m and old == m.group(1):
|
||||
return True # 6 -> 6/14 : значение не изменилось
|
||||
m2 = re.fullmatch(r"0+(\d+)", new)
|
||||
if m2 and old == m2.group(1):
|
||||
return True # 8 -> 08 : значение не изменилось
|
||||
return False
|
||||
```
|
||||
|
||||
### 3. 🔴 Число групп ≠ число строк ≠ число файлов
|
||||
|
||||
Доложил «genre 911 строк», Alex заподозрил расхождение. Реальность:
|
||||
**911 — число ГРУПП `(папка, значение)`**, из них схлопнулось **427 строк** диффа,
|
||||
а покрытие — **7861 файл (100%)**.
|
||||
|
||||
🔑 **В отчёте всегда называть, ЧТО именно посчитано:** группы / строки / файлы.
|
||||
Голое число без единицы измерения = гарантированный спор.
|
||||
|
||||
### 4. Схлопывание: ключ и что писать в `old`
|
||||
|
||||
- Ключ группировки: `(folder, field, new)`. **Старое значение в ключ НЕ входит** —
|
||||
иначе группы не собираются никогда (у каждого трека свой старый тег).
|
||||
- `old` при схлопывании: единственное значение, если все совпали; иначе `<N разных>`.
|
||||
- Одна папка может дать НЕСКОЛЬКО строк по одному полю, если у неё несколько `new`
|
||||
(пример: сборник `Sbornik_Novij_Rok`, `genre` = Folk/Pop/Rock/Punk/Rap). Это норма
|
||||
для сборника, не дефект.
|
||||
|
||||
### 5. Сортировка канонного диффа — `field` ПЕРВЫМ ключом
|
||||
|
||||
Alex: «**почему сортировки по филду нету в диффе**».
|
||||
Сортировка по `(folder, field, new)` мешает: внутри папки ПАПКА/ТРЕК чередуются, `field`
|
||||
идёт вразнобой. Правильно: `(field, folder, path)` — блоки по полю сквозные.
|
||||
|
||||
```python
|
||||
FIELD_ORDER = {f: i for i, f in enumerate(FIELDS)}
|
||||
rows.sort(key=lambda r: (FIELD_ORDER[r[3]], r[1], r[2], r[5]))
|
||||
```
|
||||
|
||||
### 6. Детектор дефекта: критерий «мусор», не «не равно эталону»
|
||||
|
||||
Детектор «правило корня не применилось» через `new_album != basename(folder)` дал **6161**
|
||||
ложных. Причина: он валится на **осмысленных** значениях (`Все пройдёт милая`, `Попса`,
|
||||
`Классика`) — правило корня там и не должно применяться.
|
||||
|
||||
🔑 **Формулировать детектор через `is_junk(значение)`, а не через «отличается от
|
||||
ожидаемого».** Иначе тысячи ложных срабатываний и потеря доверия к проверке.
|
||||
|
||||
### 7. Перед «фиксом» мусорного значения — спросить, не план ли это
|
||||
|
||||
76 файлов с `album='Разное' / 'Избранное' / 'Песни' / 'misc'` выглядели дефектом.
|
||||
Alex: «**план такой и был что папку Разное мы кидаем как альбом "Разное" а не разгребаем**».
|
||||
|
||||
🔑 **Мусорное на вид значение может быть осознанным решением. Спрашивать, не «улучшать».**
|
||||
|
||||
## 🔴 Уроки волны 38 (2026-09-26)
|
||||
|
||||
### 1. Частичный фикс фильтра-дроппера прячет остаток
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
---
|
||||
title: Whale SOUL.md — формат ответа (Verified answer format)
|
||||
namespace: personal
|
||||
type: tech
|
||||
created: '2026-09-27'
|
||||
updated: '2026-09-27'
|
||||
tags:
|
||||
- hermes
|
||||
- soul
|
||||
- whale
|
||||
- communication
|
||||
- alex-preference
|
||||
related:
|
||||
- '[[personal/plans/music-artist-albumartist-repair]]'
|
||||
- '[[personal/tech/alex-communication-patterns]]'
|
||||
---
|
||||
|
||||
# Whale SOUL.md — формат ответа
|
||||
|
||||
Файл: `~/.hermes/hermes-whale/SOUL.md` — системный промпт Кита (Whale).
|
||||
Загрузка в каждый turn, поэтому правки там действуют сразу.
|
||||
|
||||
## 🔴 Что добавлено (2026-09-27, вечер)
|
||||
|
||||
**Триггер:** Alex — «**вот всегда бы ты так отвечал**» после ответа, который начинался
|
||||
с артефакта (путь файла + md5 + число из самого файла), а не с рассказа о работе.
|
||||
|
||||
**Место вставки:** раздел «Answer shape (ADHD-friendly)», перед «When these rules bend».
|
||||
|
||||
```
|
||||
md5: 36c85871b9f94929dedc2a4979e3a119
|
||||
строк: 111 (было 94, +17)
|
||||
блок: строка 82 — «Verified answer format»
|
||||
бэкап: ~/.hermes/hermes-whale/SOUL.md.bak-20260927-205340
|
||||
```
|
||||
|
||||
## Содержание блока (дословно)
|
||||
|
||||
**Verified answer format (Alex approved 2026-09-27: "вот всегда бы ты так отвечал"):**
|
||||
When reporting finished work — artifact FIRST, not narration. Structure:
|
||||
|
||||
1. **Line 1 = the artifact.** File path + `md5` + a count read from the file itself
|
||||
(`wc -l`, `grep -c`). Nothing before it.
|
||||
2. **What changed** — short list, each line `what → why`. No hedging.
|
||||
3. **Backups** — paths of what was saved before the edit.
|
||||
|
||||
Never open with "сейчас проверю" / "let me check". Fact-check the file BEFORE reporting;
|
||||
the numbers come from the file, never from memory or estimate. Never invent a value Alex
|
||||
did not supply.
|
||||
|
||||
**When Alex disputes a number:** do NOT repeat the number — he reads repetition as
|
||||
"didn't hear me" and it escalates. Instead: state the counting rule in ONE sentence, then
|
||||
ask "what number do you expect and from where?" A mismatch is a defect signal, not a debate.
|
||||
|
||||
**Answer length:** "всё готово, проверяй" is the target shape. Long reports are not read.
|
||||
Defect not closed → "не готово" + ONE line of cause. No menus, no "делать?" — once a defect
|
||||
is named, finish it in the same turn.
|
||||
|
||||
## Почему именно так
|
||||
|
||||
| Факт про Alex | Следствие в блоке |
|
||||
|---|---|
|
||||
| Не читает длинные отчёты | «всё готово, проверяй» — целевая форма |
|
||||
| Спор о числе = «не услышал» → мат | не повторять цифру, дать правило счёта |
|
||||
| Переспрашивание после названного дефекта = саботаж | «no "делать?", finish in the same turn» |
|
||||
| Числа из памяти = выдумка | числа только из файла, факт-проверка ДО отчёта |
|
||||
| Требует доказательств («Мой `read back` ≠ работает») | строка 1 = артефакт + md5 + счёт |
|
||||
|
||||
## Связь с memory
|
||||
|
||||
Дублирующая запись в USER.md профиля Кита — та же суть, компактнее.
|
||||
SOUL.md — источник истины, memory — быстрый доступ.
|
||||
|
||||
## Как править
|
||||
|
||||
1. Бэкап: `cp ~/.hermes/hermes-whale/SOUL.md ~/.hermes/hermes-whale/SOUL.md.bak-$(date +%Y%m%d-%H%M%S)`
|
||||
2. `patch` по уникальной строке-якорю (не перезаписывать целиком)
|
||||
3. Проверить: `wc -l`, `grep -n "Verified answer format"`, `md5 -q`
|
||||
4. 🔴 НЕ трогать секцию «Core Rules» и «Absolute rules» — там plan-first и
|
||||
no-delete/no-kill, они главнее стиля
|
||||
Reference in new issue
Block a user