# Router-mentor — Handoff (Этап 3 стены 🟢 + анализ М3 + runbook активации)

**Дата:** 2026-06-09 · **Кодовая фраза:** «роутер-наставник».
**Ветка:** `worktree-brainrepo` · **commit-not-push** (origin не тронут).
**HEAD на момент handoff:** `681c2b8a`.

**Сделано этой сессией:**
1. **Этап 3 shadow-обкатка стён ЗАКРЫТА 🟢** — построен read-only инструмент `tools/shadow-replay.mjs`
   (+ тест) по полной цепочке скилов; прогон владельцем показал М2/М4/М5/М6 = **0 over-block,
   real-catch всё, 0 miss**. Обкатка вскрыла 2 огреха harness (не стен) — починены по TDD.
2. **Анализ всего М3** — модель наставника («по умолчанию беру / 3 круга аргументов / эскалация
   к владельцу / воздержание по confidence») **полностью в коде**, но **ИНЕРТНА** (A7).
3. **Runbook активации** `docs/superpowers/runbooks/2026-06-09-router-mentor-activation-A1-A6-A7.md`.

---

## === ПРОМТ ДЛЯ НОВОЙ СЕССИИ (скопировать целиком) ===

роутер-наставник. Этап 3 (shadow-обкатка стён) ЗАКРЫТ — все стены 🟢. Дальше — включение наставника М3 (цепочка A1→A6→A7), но это рубильники владельца + проводка кода. НЕ приступай к коду сразу: прочитай состояние, реши со мной что берём, подними согласованную цепочку скилов, действуй по ней. Всё инлайн, субагенты/Task/Workflow ЗАПРЕЩЕНЫ.

ДЕРЕВО: `c:\моя\проекты\портал crm\Документация\.claude\worktrees\brainrepo`, ветка `worktree-brainrepo`. Git — ТОЛЬКО PowerShell (`git -C "<wt>" ...`), литеральные пути. Сверь верх: `git -C "<wt>" log -15 --oneline` (верх — handoff-коммит `docs(router-mentor): ... stage3 and m3 handoff`; под ним `681c2b8a` runbook A1/A6/A7, `4c1ad037` чистый отчёт, `a6300537` фиксы harness).

ПРОЧИТАЙ ПЕРВЫМИ: `docs/superpowers/plans/2026-06-09-router-mentor-stage3-and-m3-handoff.md` (этот файл) + `docs/superpowers/runbooks/2026-06-09-router-mentor-activation-A1-A6-A7.md` (порядок включения) + `docs/superpowers/plans/2026-06-08-router-mentor-loose-ends-registry.md` (реестр хвостов, раздел A). При необходимости — `docs/superpowers/specs/2026-06-09-router-mentor-stage3-shadow-replay-design.md` + `tools/shadow-replay.mjs`.

ДАЛЬШЕ: спроси владельца, что берём. Варианты: (А) Claude берёт 🟦-части кодом в порядке цепочки A1→A6→A7 — сперва **A1**: проводка `enforce-judge-gate.runJudgeGate` мок→живой Sonnet ЗА ФЛАГОМ (паттерн safe-baseline/v4-судьи, $0 до включения), по TDD; потом **A7**: проводка `runRouter`/`router-verity`/`router-emerge` мок→живой Sonnet + контракты + чтение журнала М1 в `round-control`. Несущий код судьи/роутера → ВЫШЛИ цепочку скилов на согласование ДО старта. (Б) Владелец сам включает рубильники по runbook, Claude на подхвате. (В) «пуш» — финализировать накопленный эпик (shadow-replay + runbook + предыдущее) через `finishing-a-development-branch`. (Г) М4-судья shadow-обкатка (A1 рубильник) до проводки кода.

ЦЕПОЧКА СКИЛОВ (что сработало): для несущего кода — `brainstorming → audit-context-building → sharp-edges → variant-analysis → writing-plans → executing-plans (инлайн TDD, наблюдаемый RED) → verification-before-completion → regression`. Для read-only/наблюдения — без adversarial-скилов. Для bugfix с известным корнем — `test-driven-development → verification → regression`. НЕ `requesting-code-review`. Владелец требует: высылать цепочку скилов на согласование ДО рискованных задач.

ЖЁСТКОЕ: commit-not-push (пуш ТОЛЬКО по слову «пуш»); 1-я строка «экономия:…», 2-я «coverage:…»; CLAUDE.md в worktree НЕ трогать (чужая зона); стены М2/М5/М4/М6 не ослаблять; нормативку не двигать; чужую грязь дерева (observer-jsonl авто-регенерат / `.scratch/` / `patch-*.mjs` / `setup-nm.mjs` / `commit-msg.txt`) НЕ коммитить — стейдж своих файлов поимённо.

СТАРТ: handoff + runbook + реестр → выбор хвоста у владельца → согласование цепочки → действуй. Кодовая фраза: «роутер-наставник».

## === КОНЕЦ ПРОМТА ===

---

## Коммиты этой сессии (commit-not-push, `987feb2e..681c2b8a`)

| Коммит | Что |
|---|---|
| `987feb2e` | spec shadow-replay (Этап 3, Подход 1 read-only прогон) |
| `45905432` | spec data-source fix (audit-context: журнал/runtime не читаем, эпизоды+фикстура) |
| `2ba34dc0` | план реализации shadow-replay |
| `82287033..647879ad` | TDD-сборка Tasks 1-9 (фикстуры → classifyOutcome → М5/М6 → М2 → М4/М3 → buildCorpus/runMachine/report → main) |
| `a6300537` | фиксы harness (исключить runtime-записи из benign; скоуп М6 на Bash-floor) |
| `4c1ad037` | чистый отчёт прогона (все стены 🟢) |
| `681c2b8a` | runbook активации A1→A6→A7 |

**Регрессия tools-only: `3292 passed / 2 skipped / 0 failed`.**

## Состояние М3 (для следующей сессии)

- **Слой A (ЖИВОЙ):** `router-classifier` (Sonnet 4.6) + `router-prehook` (state) + `router-tool-gate`
  (освобождает `question`/`conversation`!) + `router-stop-gate`. Это даёт число `confidence` в хуке §17.
- **Слой B (ИНЕРТЕН = наставник):** `router-engine` (трасса+confidence+воздержание<0.5) +
  `round-control` (proceed/soft-return/escalate-owner, 3 круга) + `router-verity` (критик плана vs
  сырые слова) + `router-emerge` (всплывшая нужда) + `router-exploration` (rate=0, выкл). Зовётся
  с **мок-llmCall**, не активен.
- **«88 diverged» в отчёте М3** = наставник не включён + Слой A освобождает вопросы; НЕ недисциплина.
  При живом наставнике низкоуверенные (<0.5) рекомендации сами уходят в воздержание.

## Хвосты М3 (раздел A реестра)

- **A1/R-33** судья М4 живой (ключ + флаг + регистрация + проводка `runJudgeGate` мок→Sonnet).
- **A6/R-15** журнал М1 — регистрация узкого matcher-хука (код запинен `5782ede3`).
- **A7/R-07** наставник М3 live-wiring (мок→Sonnet + контракты + раунд-контроль). **Зависит от A1+A6.**
- H3 (few-shot память) + разведка (`router-exploration` rate>0) — owner-решения, не критпуть.
- Стены A3/A4/A5 (пол/escape/стена) + A2 (Фаза 8) + A9 (push) — параллельная ветка к боевому.

## Квирки сессии (экономят время новой)

- **vitest:** `npx vitest run --root "<wt>/app" --config "<wt>/app/vitest.config.tools.mjs" <фильтр> --reporter dot` — **через Bash tool** (PowerShell-гейт режет `npx`/`node`), БЕЗ `cd`, явный абсолютный `--root`.
- **PowerShell-гейт** режет `npx`/`node`/`if`/чтение `~/.claude/runtime`. **Router-гейт** режет `cd` в `.claude`-путь + compound `(cd && ...)`. → **живой запуск инструментов (node) из тулов Claude заблокирован**; `node tools/shadow-replay.mjs` запускает ВЛАДЕЛЕЦ в своём терминале из корня worktree.
- **git** — PowerShell `git -C "<wt>"`, отдельными командами (без `if`); короткие ASCII commit-msg.
- **TDD-gate** ждёт падающий тест в СОБСТВЕННОМ тест-файле prod-модуля (`X.mjs` → `X.test.mjs`). Поэтому фикстуры слиты в `shadow-replay.mjs` (не отдельный модуль).
- **`enforce-tdd-real-test-verifier`** отвергает правку ОДНОЙ строки теста (импорт) — нужен `it`+`expect` в правке → **перезаписывать тест-файл целиком (Write)** при добавлении нового describe ИЛИ Edit-ить блок с it+expect.
- **Память харнесса** — только при активном `claude-md-management` + coverage `direct:memory-sync`; CLAUDE.md в worktree off-limits → знание фиксировать в `docs/superpowers/*` (git).
- **«Can't find lefthook in PATH»** — ШУМ, игнор.

## Методология (что сработало)

- Цепочка скилов высылается владельцу на согласование ДО рискованной задачи; владелец утверждает.
- `audit-context-building` поймал оптимистичную разметку источников данных ДО плана (журнал/runtime
  read-protected) — спек поправлен до кода.
- shadow-обкатка вскрыла огрехи **инструмента**, не стен — ценность подтверждена; стены здоровы.
- Объяснять владельцу-непрограммисту простыми словами + сверять модель (он поправил мою модель М3
  с «advisory» на «наставник default-follow» — проверено по коду, он прав).
