diff --git a/docs/superpowers/specs/2026-05-23-router-discipline-overhaul-design.md b/docs/superpowers/specs/2026-05-23-router-discipline-overhaul-design.md index 52cdd879..2398676a 100644 --- a/docs/superpowers/specs/2026-05-23-router-discipline-overhaul-design.md +++ b/docs/superpowers/specs/2026-05-23-router-discipline-overhaul-design.md @@ -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.