docs(spec): router overhaul — этап 2 упрощён после параллельной починки парсера

Параллельная сессия 23.05 13:16-13:38 закрыла 60% этапа 2 через коммиты
3baeaa12/b685bf9b/04a9c12b (spec observer-parser-skill-hook-expand v3):

- candidates_considered whitelist filter (KNOWN_NODES)
- schema_version 2 → 3 forward-only
- primary_rationale.recommended_node (для direct эпизодов)
- events[].hook_fired.scripts (reverse-lookup settings.json)
- analyzer accepts schema >=2 (v2+v3 mix) + recommended_node_for_direct ось

Скорректирован этап 2 spec — отмечено что сделано, оставшаяся работа:
disciplinePercentByClassification/routerStepReached/boundariesAppliedRate
срезы analyzer, переключение missed-activations на реестр из этапа 1,
блок "Метрики дисциплины" в STATUS.md, baseline snapshot.

План этапа 1 (реестр) — без изменений, парсер не задействует.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-05-23 13:58:41 +03:00
parent 9ab5c0359d
commit 2b45da0e98
@@ -136,15 +136,23 @@
### Этап 2 — Измерения (baseline до enforcement)
**Цель:** починить парсер + добавить метрики, получить **honest «точку До»** дисциплины.
**Цель:** добавить метрики разбивки дисциплины по типам задач, получить **honest «точку До»** дисциплины.
**Артефакты:**
**Что УЖЕ сделано параллельной сессией 23.05 (коммиты `4665c537`, `6192d395`, `6a9df652` — spec `2026-05-23-observer-parser-skill-hook-expand-design.md`):**
- ✅ Fix `tools/observer-transcript-parser.mjs` — `candidates_considered` whitelist filter (`tools/observer-known-nodes.txt` + `observer-chain-map.json`); проза/процедуры/код отсекаются. Forward-only.
- ✅ Schema v3 — `schema_version` 2 → 3. Старые v2-эпизоды не правим (append-only).
- ✅ `primary_rationale.recommended_node` — поле есть в v3, заполняется из `observer-classification-map.json` (этап 2 переключит на реестр).
- ✅ `events[].hook_fired.scripts` — reverse-lookup имени скрипта из `.claude/settings.json` + user.
- ✅ `tools/brain-retro-analyzer.mjs` accepts schema ≥2 (v2+v3 mix); добавлена `recommended_node_for_direct` факторная ось.
**Что осталось делать в этапе 2:**
- **Fix `tools/observer-transcript-parser.mjs`** — `candidates_considered` сейчас заполняется булитами ответа. Заменить на честное поле: либо «узлы, реально матченные триггерами шага 3 роутера», либо пустой массив. Forward-only — старые v2-эпизоды не правим, добавляем `schema_version: 3` маркер.
- **`tools/brain-retro-analyzer.mjs`** — новые срезы:
- `disciplinePercentByClassification` — % эпизодов с матченным триггером, разбивка по `task_classification`.
- `routerStepReached` — на каком шаге роутера эпизод действительно остановился (если step=1 для всех — это баг парсера, отметить).
- `boundariesAppliedRate` — % эпизодов с непустым `boundaries_applied`.
- **`tools/missed-activations.mjs`** — переключить с `observer-classification-map.json` на реестр из этапа 1 (`docs/registry/nodes.yaml`). Маппинг classification → recommended_nodes теперь автоматический через `nodes[i].triggers[].classification`.
- **`docs/observer/STATUS.md` generator** — добавить блок «Метрики дисциплины»:
```
@@ -156,15 +164,14 @@
| analysis | 8 | 50% | 50% |
```
- **`tools/missed-activations.mjs`** — обновить, чтобы использовать реестр из этапа 1 (а не текущий `observer-classification-map.json`). Маппинг classification → recommended_nodes теперь автоматический через `nodes[i].triggers[].classification`.
- **Baseline snapshot** в `docs/observer/baselines/2026-XX-XX-pre-enforcement.md` — фиксируем цифры «до» (% дисциплины, missed activations, % regulated, % границ применено), чтобы потом сравнить.
**Definition of done:**
- Парсер `candidates_considered` пишет имена узлов (или `[]`), не булиты ответа. Проверка: ни в одном новом эпизоде нет строк длиннее 50 символов в `candidates_considered`.
- STATUS.md показывает разбивку дисциплины по типам задач.
- Baseline snapshot закоммичен.
- Существующие тесты `brain-retro-analyzer.test.mjs` + новые срезы — GREEN.
- Существующие тесты `brain-retro-analyzer.test.mjs` + новые срезы (`disciplinePercentByClassification`/`routerStepReached`/`boundariesAppliedRate`) — GREEN.
- `missed-activations.mjs` читает реестр из этапа 1; результат на тех же данных не должен сильно дрейфить от текущего (sanity check). Тесты GREEN.
**Точка остановки:** ты видишь цифры «27% дисциплины, 0% на feature», говоришь «продолжаем» → этап 3.