# Активация роутера-наставника М3 — цепочка A1 → A6 → A7 (runbook)

**Дата:** 2026-06-09 · **Эпик:** «роутер-наставник» · **Ветка:** `worktree-brainrepo`.
**Статус:** runbook для владельца. Ничего не включается этим документом — это карта порядка.
**Источник:** анализ кода М3 (router-engine / round-control / verity / emerge / exploration) +
реестр хвостов `2026-06-08-router-mentor-loose-ends-registry.md` (раздел A).

---

## 0. Зачем порядок именно A1 → A6 → A7

Наставник (Слой B М3) **зависит** от двух вещей, поэтому включать строго по порядку:

- [router-engine.mjs:6-7](../../../tools/router-engine.mjs) — «live-wiring **только после Машины 4**».
  → **A1 (судья М4) раньше A7.**
- [round-control.mjs:17-23](../../../tools/round-control.mjs) — круг читает **журнал М1** (`invokedSkills`),
  чтобы проверить «требуемый скил реально вызван». Без журнала проверка пуста.
  → **A6 (журнал М1) раньше A7.**

Стены (пол М5 / снимок М6 / стена М2 — A3/A4/A5) — **отдельная ветка** (их shadow-обкатка пройдена
2026-06-09, все 🟢). Для дисциплины наставника они не обязательны, но для полного боевого режима —
да; их активация идёт параллельно и здесь не блокирует A1→A6→A7.

**Каждая фаза — два типа шагов:**
- 🟦 **Claude может подготовить кодом** (за флагом, $0 до включения — как уже делали для
  v4-судьи и safe-baseline): проводка мок→живой Sonnet, чистые функции, тесты.
- 🔴 **Только твой рубильник** (мне `settings.json` и keychain заблокированы): ключи, env-флаги,
  регистрация хуков, перезапуск.

---

## A1 — Судья М4 (живой, сперва shadow) · R-33

Судья наставника оценивает качество роутинга/плана. Сейчас
[enforce-judge-gate.runJudgeGate](../../../tools/enforce-judge-gate.mjs) = `{decision:'GO', wired:false}`
(нейтральная заглушка). Режим: `inert` / `shadow` (логирует, не блокирует) / `live-block`.

**🟦 Claude (код, за флагом, $0):**
1. Проводка `runJudgeGate(event)` — реальный `llmCall`-транспорт + извлечение «продукта на суд»
   (план/цель/карточки из события). По образцу уже сделанной проводки safe-baseline/v4-судьи:
   spend гейтится флагом+ключом (`resolveJudgeConfig`-паттерн), без них $0.
   TDD: чистый `runJudge*` + тесты; обёртка инертна до флага.

**🔴 Владелец (рубильник):**
2. Ключ судьи `router-mentor-judge` в keychain (имя — **подтвердить** по `judge-key-config.mjs`).
3. env: `ROUTER_MENTOR_JUDGE_ENABLED=1` + `ROUTER_MENTOR_JUDGE_MODE=shadow`.
4. Регистрация **обёртки** `enforce-judge-gate` в `settings.json` (PreToolUse). NB: регистрировать
   обёртку, не движок — у движка нет рубильника $0.
5. Перезапуск.

**✅ Проверка (shadow):** судья пишет вердикты в журнал, но **НЕ блокирует** рабочий цикл.
Прогнать 1-2 дня обычной работы, посмотреть, нет ли over-block-ложняков (урок v4-судьи —
он клинил `git status`; здесь судья на план/роутинг, не на каждый Bash, но проверить).

**↩ Откат:** `ROUTER_MENTOR_JUDGE_MODE=shadow` (если был block) или снять флаг → $0/inert.

**Переход к block:** после чистого shadow — `ROUTER_MENTOR_JUDGE_MODE=block`.

---

## A6 — Журнал М1 (регистрация) · R-15

Журнал [action-journal](../../../tools/action-journal.mjs) — хеш-цепочка действий; круг наставника
читает его, чтобы знать «какие скилы реально вызваны». Код готов и запинен (М1, `5782ede3`); нужна
только регистрация узкого хука-писателя, иначе журнал пуст.

**🔴 Владелец (рубильник):**
1. Регистрация узкого matcher-хука журналирования в `settings.json` (пишет `{op,object}` действия;
   узкий — чтобы не ловить лишнее). Точный matcher — **подтвердить** по journaler-хуку.
2. Перезапуск.

**✅ Проверка:** после нескольких действий `~/.claude/runtime/action-journal-<session>.jsonl`
наполняется; `verifyChain` зелёный (целостность). (Файл в read-protected runtime — проверяешь ты
в своём терминале, мне чтение runtime заблокировано.)

**↩ Откат:** снять matcher из `settings.json`.

**Зависимость:** A6 **до** A7 (круг без журнала не проверит «скил вызван»).

---

## A7 — Роутер-наставник М3 (live-wiring) · R-07 — ГЛАВНЫЙ ШАГ

Включает Слой B: [router-engine](../../../tools/router-engine.mjs) (трасса+confidence+воздержание<0.5),
[round-control](../../../tools/round-control.mjs) (default-follow / 3 круга / эскалация),
[router-verity](../../../tools/router-verity.mjs) (критик плана vs сырые слова),
[router-emerge](../../../tools/router-emerge.mjs) (всплывшая нужда).

**🟦 Claude (код, за флагом, $0):**
1. Проводка `runRouter`/`router-verity`/`router-emerge` — заменить мок-`llmCall` на живой
   `callAnthropicAPI` (Sonnet 4.6, [router-config.CLASSIFIER_MODEL](../../../tools/router-config.mjs)),
   ровно как у классификатора. За флагом `ROUTER_MENTOR_ENABLED` — без него мок/инерт, $0.
   TDD: чистая ветка выбора транспорта + тесты на флаг.
2. Проводка look-ahead контрактов: подать 86 карточек (`docs/registry/contracts/*.contract.json`,
   H закрыт) в `buildRouterPrompt({contracts})`.
3. Проводка `round-control` на чтение журнала М1 (`invokedSkills` из `action-journal`) — managed-режим.

**🔴 Владелец (рубильник):**
4. env: `ROUTER_MENTOR_ENABLED=1` (+ ключ Sonnet уже есть, как у классификатора).
5. Регистрация хуков наставника в `settings.json` (prompt-фаза + раунд-контроль на Stop).
6. Перезапуск; обкатка shadow (наставник советует и пишет, но 3-круговую блокировку держать в
   мягком режиме первые дни) → потом боевой.

**✅ Проверка:** на содержательной задаче наставник по умолчанию требует взять рекомендованный
узел; твои аргументы → soft-return (до 3 кругов) → не сошлись → эскалация к тебе. Низкоуверенные
(<0.5) рекомендации **сами уходят в воздержание** (порог) — шум из «88 diverged» не возникает.

**↩ Откат:** снять `ROUTER_MENTOR_ENABLED` → роутер вернётся к Слою A (лёгкий классификатор).

---

## Сводка зависимостей

```
A1 (судья М4 живой, shadow→block)
        │  router-engine «только после Машины 4»
        ▼
A6 (журнал М1 зарегистрирован)
        │  round-control читает журнал
        ▼
A7 (наставник М3 live-wiring: мок→Sonnet + контракты + раунд-контроль)
        ▼
наставник работает: default-follow / 3 круга / эскалация / воздержание<0.5
```

Параллельно (не блокирует, для полного боевого): стены A3 (пол М5) / A4 (escape М6) / A5 (стена М2)
— shadow-обкатка пройдена 🟢; A2 (Фаза 8 переезд) и A9 (push) — финал.

## Что дальше

- Скажешь — Claude берёт 🟦-части (проводка мок→живой Sonnet за флагом, TDD, $0 до твоего
  включения) последовательно A1 → потом A7-код; 🔴-рубильники остаются за тобой в этом же порядке.
- H3 (few-shot память роутера) и разведка (`router-exploration` rate>0) — отдельные owner-решения,
  не на критическом пути.
