# Router-Mentor — handoff для новой сессии (Фаза B / кодинг)

**Дата:** 2026-06-11. **Эпик:** «роутер-наставник». **Кодовая фраза:** «роутер-наставник».

**Назначение.** Передать новой сессии полное состояние эпика после закрытия ФАЗЫ ПРАВОК (edit-план). Все 24 находки ревью + решения + контракты ЗАФИКСИРОВАНЫ в закоммиченных артефактах (спека R6.3 + 7 планов + C2-манифест) — этот файл ведёт к ним и к Фазе B (кодинг). Источник истины — git, не чат.

**Состояние на 2026-06-11 (6 коммитов на main):** ФАЗА ДИЗАЙН (спека R6.3) + ФАЗА ПЛАНИРОВАНИЯ (7 планов) + ФАЗА РЕВЬЮ (5-скил цепочка, 24 находки) + ФАЗА ПРАВОК (все 24 находки закрыты) — ЗАКРЫТЫ. Следующее: **ФАЗА B — кодинг** по 7 планам → реальные `tools/*.mjs` + тесты (НЕ начата).

---

## Промт для новой сессии (копировать целиком)

```text
роутер-наставник. Подхвати работу из прошлой сессии. Кодовая фраза эпика: «роутер-наставник».

═══ КАК РАБОТАТЬ (жёсткие правила владельца — НАРУШАТЬ НЕЛЬЗЯ) ═══
• БЕЗ ОТСЕБЯТИНЫ. Только КОД и ДИЗАЙН. КАЖДОЕ утверждение — с цитатой (file:line / § спеки /
  нах.F-/SE-/V-/C-номер). Прошлые сессии ехали из плохого чтения кода и фантазий. Сомнение — читай ещё.
• КАЧЕСТВО ПРЕВЫШЕ ВСЕГО. Скорость/экономия/цена/время — НЕ важны.
• Каждую новую фазу/задачу и цепочку скилов — на согласование ПЕРЕД стартом (AskUserQuestion). Дождись «вперёд».
• Коммиты/push/правки settings.json/keychain/ENV — делает ВЛАДЕЛЕЦ. Claude settings.json не пишет.
• Каждый ответ: 1-я строка «экономия:…», 2-я «coverage:…» (channel:id; если навык не вызван Skill-инструментом
  В ЭТОМ ходе — coverage=direct:<role>).
• Ветка main, чекаут: c:\моя\проекты\портал crm\Документация (русские буквы в пути — ловушка).
• Субагенты/Task/Workflow ЗАПРЕЩЕНЫ — всё инлайн.
• git — терминал владельца; && НЕ работает в PS 5.1 («;» + «if ($?) {}»); lefthook падает на
  регенерируемом docs/observer/STATUS.md → коммит владелец делает с $env:LEFTHOOK="0" … $env:LEFTHOOK=$null.
• CLAUDE.md в основном чекауте — ЧУЖАЯ ЗОНА параллельных сессий, НЕ трогать.

═══ ⛔ МЕХАНИКА СТЕНЫ И ESCAPE (КРИТИЧНО — оборона М1–М6 АКТИВНА) ═══
Стена enforce-supreme-gate в разговорном режиме ПУСКАЕТ только семена (writing-plans / brainstorming /
discovery-interview / systematic-debugging / test-driven-development / requesting-code-review /
verification-before-completion) + чтения (Read/Grep/Glob/readonly-Bash/TodoWrite). БЛОКИРУЕТ всё мутирующее:
запись/правку файлов (Write/Edit), ФОРМАЛЬНЫЕ скилы (audit-context-building / sharp-edges / variant-analysis),
запись кода. Даже readonly git через Bash может блокироваться (default-deny) — для git проси владельца.
Режим (б): стену НЕ снимать, ЭСКЕЙПИТЬ каждое мутирующее действие. КАК: AskUserQuestion, где ОДНА опция =
строка FLOOR-ESCAPE (>30 симв.). Владелец выбирает → enforce-askuser-answer-parser (PostToolUse) пишет
ПОДПИСАННЫЙ одноразовый грант, окно 5 мин. Затем РОВНО одно мутирующее действие проходит. Грант ОДНОРАЗОВЫЙ.
КАНОН (lowercase / прямые слэши / NFC):
  • запись/правка файла:  FLOOR-ESCAPE: write:c:/моя/проекты/портал crm/документация/<путь в нижнем регистре>
  • вызов формального скила (канон=cwd в текущем коде): FLOOR-ESCAPE: write:c:/моя/проекты/портал crm/документация
Семена escape НЕ требуют. Один escape = одно действие (грант матчит и Write, и Edit на тот же путь).
⚠️ Окно 5 мин — ЗАПРАШИВАЙ escape и делай действие В ТОМ ЖЕ ходу. ПРОВЕРЕНО: механика работает (десятки правок
этой сессии прошли так). Cosmetic-AskUser хук блокирует ПРОСТЫЕ кнопочные вопросы — задавай простые «да/нет»
ТЕКСТОМ; FLOOR-ESCAPE-вопросы хук пропускает.
ЭФФЕКТИВНОСТЬ ПРАВОК .md: НЕ переписывай большие файлы целиком (риск фантазии в цитатах). Делай точечные Edit
по якорю ЛИБО добавляй раздел «## R6.3 amendments» с OLD→NEW контрактами (как делали — см. планы). Read файла
перед Edit обязателен (harness), Read грант НЕ гасит.

═══ ГДЕ МЫ В ЭПИКЕ (после сессии 2026-06-11) ═══
Эпик — строим ЖИВОГО роутера-наставника (соавтор плана) поверх машин М1–М7.
ЗАКРЫТО ПОЛНОСТЬЮ И В GIT (6 коммитов на main):
  • ФАЗА ДИЗАЙН — спека R6.3 (финал).
  • ФАЗА ПЛАНИРОВАНИЯ — 5 sub-plan A-E + 2 новых (C2, F).
  • ФАЗА РЕВЬЮ — 5-скил цепочка (audit-context-building → sharp-edges → variant-analysis →
    systematic-debugging → verification-before-completion), вскрыла 24 находки.
  • ФАЗА ПРАВОК (edit-план) — ИСПОЛНЕНА ПОЛНОСТЬЮ, все 24 находки закрыты.
СЛЕДУЮЩАЯ ФАЗА (НЕ начата): ФАЗА B — КОДИНГ по 7 планам → реальные tools/*.mjs + тесты.

КОММИТЫ ЭТОЙ СЕССИИ (проверь `git log --oneline -8` на main):
  ee65be2 A-E R6.3 amendments + C производитель вердикта
  3b03bdd9 спека R6.3 хвост (§6.2/§5.5/§5.3/§5.7/§8/§10/§0/шапка)
  84e264f1 C2 манифест + F радары
  1edddc42 спека §6.1 R6.3 (ядро C-1) + edit-план
  886c0ac5 (прошлая сессия) 5 sub-plan A-E
КОММИТЫ ЛОКАЛЬНЫЕ (не запушены, ~57↑) — push решает владелец.

═══ ИСТОЧНИК ИСТИНЫ (ПРОЧИТАЙ ПЕРВЫМ — ВСЁ ТАМ, не в чате) ═══
Все 24 находки + решения ЗАФИКСИРОВАНЫ в закоммиченных файлах — НИЧЕГО не потеряно:
1. СПЕКА R6.3: docs/superpowers/specs/2026-06-10-router-mentor-live-rebuild-design.md
   — §0 changelog «R6.2→R6.3» (что вскрыло ревью) · §6.1 развод двух выходов наставника (корень C-1) ·
     §6.2 binding вердикт↔plan_hash (нах.F4) · §5.5 INFERRED-guard (VF-1) · §5.3 дозапрос соседа (нах.F7) ·
     §5.7/§8 радары=код (нах.F2) · §10 КАРТА ЗАКРЫТИЯ всех находок (нах.F1-F7/VF-1/V-1/V-2/C-1..C-3 → куда закрыто).
2. EDIT-ПЛАН (полный реестр находка→Task + контракты): docs/superpowers/plans/2026-06-10-router-mentor-subplans-edit-plan.md
   — Self-Review внизу = таблица «находка → Task» для ВСЕХ 24 + V1-V6 + C1-C4. ЭТО мастер-список, читай целиком.
3. 7 ПЛАНОВ РЕАЛИЗАЦИИ (каждый = TDD-задачи + внизу раздел «## R6.3 amendments» с правками ревью):
   A docs/superpowers/plans/2026-06-10-router-mentor-subplan-a-context-verity.md (context-verity, 6 задач + amendments SE6/VF-1/SE9)
   B docs/superpowers/plans/2026-06-10-router-mentor-subplan-b-layered-graph.md (project-graph, 8 задач + amendments SE7/SE8/SE11/V-3)
   C docs/superpowers/plans/2026-06-10-router-mentor-subplan-c-live-seam.md (живой шов, 7 задач + Task 3b ПРОИЗВОДИТЕЛЬ ВЕРДИКТА + amendments A1-A8)
   C2 docs/superpowers/plans/2026-06-10-router-mentor-subplan-c2-integration-manifest.md (НОВЫЙ — манифест интеграции, реестр деферралов W1-W7)
   D docs/superpowers/plans/2026-06-10-router-mentor-subplan-d-reading-discipline.md (reading-discipline, 8 задач + amendments SE4/SE5/SE12)
   E docs/superpowers/plans/2026-06-10-router-mentor-subplan-e-footgun-fixes.md (footgun-фиксы существующих машин, 6 задач + amendments SE1/C-4)
   F docs/superpowers/plans/2026-06-10-router-mentor-subplan-f-completeness-radars.md (НОВЫЙ — graph-radar + skeleton-radar, нах.F2)

═══ ЧТО СТРОИТ КАЖДЫЙ ПЛАН (для Фазы B) ═══
A — tools/context-verity.mjs: parseRef / resolveCitation (по anchor-символу SE-1) / verifyArtifact (резолв EXTRACTED +
    secure-default downgrade S2 + VF-1 INFERRED-guard) / artifactHasUnresolvedExtracted (freeze-side guard ✅O2).
B — tools/project-graph.mjs: parseGraph / nodeDistrict+DISTRICT_RULES / pruneJunk / buildDistrictMap (LAYER-0) /
    districtDetail (LAYER-1) / readStaleness ✅O16 (commits_behind может быть null SE11) / buildGraphSection.
    Гибрид: директорий-ось ПЕРВИЧНА, 1009 communities ВТОРИЧНЫ. graphify-out junction СТАЛЫЙ (commit 81cbd8c1) —
    enumeration Step 0 сверяет районы/junk против реального graph.json (SE7/SE8).
C — 5 модулей: router-task-id.mjs (deriveTaskId ✅O17) / mentor-journal.mjs (tamper-evident, переисп. action-journal) /
    mentor-verdict.mjs (validateMentorVerdict СВОИ слоты + Task 3b: buildMentorVerdictPrompt + runMentorVerdict
    ПРОИЗВОДИТЕЛЬ + binding plan_hash) / mentor-seam.mjs (buildMentorPrompt + runMentorRound, rename graph→groundingGraph SE2) /
    freeze-gate.mjs (freezeGate: binding plan_hash нах.F4 + rename verityImpl→hasUnresolvedExtractedImpl SE3 + verity ✅O2).
C2 — БОЕВАЯ ПРОВОДКА (реестр W1-W7): W1 renderDistricts+«(100%)»-rewrite в buildRouterPrompt (нах.F1/C-2) ·
    W2 decideReadEvent→стена + planAuthorizesPath продюсер (нах.F3/SE5) · W3 onPlanWrite A0 (нах.F5) · W4 warn→owner ·
    W5 мастер-порядок · W6 кросс-модульный интеграционный тест (V-2) · W7 контракты инъекций + C-3 readFileImpl.
D — tools/reading-discipline.mjs: classifyReadingContent (тип ДР-5 + SE12 .env по basename) / grepHeaderFallback /
    classifyReadKind (4 вида) / readingGateDecision (impl-only) / checkProbeCap ✅O19 / decideReadEvent. SE4: каждый
    тип имеет производителя ИЛИ удалён. SE5 DANGER: planAuthorizesPath/probeCount НЕ стабы.
E — фиксы существующих машин: canonicalAction Skill-ветка ✅O13 (escape-grant.mjs) / toFloorEscapeRecord skill-lowercase
    (askuser-answer-parser.mjs) / detectMoney сузить O11 (judge-seal-channel.mjs) / judgeModeMismatch+warn ✅O18
    (enforce-supreme-gate.mjs) / tools/loop-termination.mjs новый. ⚠️ E меняет ЖИВУЮ оборону → активация
    координируется с владельцем (C-4: после E владелец печатает escape формальных скилов как skill:<id>, не write:cwd).
F — tools/graph-radar.mjs (тронул X→соседи Y→адресован?) + tools/skeleton-radar.mjs (grep заголовков→отчёт по каждому).

ПОРЯДОК СБОРКИ ФАЗЫ B (C2-W5): A, B, D, E (чистые автономные модули) → C (живой шов, инъекция A/B/D) →
  C2 (боевая проводка, правит router-engine М3 + enforce-supreme-gate М2 аддитивно — согласовать с владельцем) →
  F (радары). Регрессия каждого включает соседей. Активация (settings.json/ключ/флаг/llmCall) — владелец ПОСЛЕ всех.
Модули A/B/C/D/E/F АВТОНОМНЫ в тестах (всё инъектируется); A+B нужны на боевой проводке C (раздел «Боевая проводка» в C).

═══ КЛЮЧЕВЫЕ ФАКТЫ КОДА (сверены построчно сессией 2026-06-11) ═══
  tools/router-engine.mjs — buildRouterPrompt:98 ({prompt,plan,graph,catalog,contracts}→{system,user}), :99
    nodesForCtx=(catalog&&catalog.nodes)||(graph&&graph.nodes)||[] (catalog/graph НЕ разделены — чинит C2-W1),
    :114 «--- ГРАФ+КАТАЛОГ УЗЛОВ (100%) ---» (переписать C2-W1), groundTrace:73-79, runRouter:140,
    TRACE_SLOTS:48, detectHighRisk:19, validateTrace confidence∈[0,1]:65, :152-153 воздержание 5.2.
  tools/plan-lock.mjs — freezePlan:62, freezeArtifact:194, planId:15-17, actionMatchesStep:86, refResolves:226.
  tools/action-journal.mjs — appendEntry:25-41 →{entries,headSig}, verifyChain:53-68, assertSafeSessionId:77-82.
  tools/enforce-supreme-gate.mjs — decide:135-181, decideMode:188 (escape choke :193 ПЕРВОЙ), isObserveOnly:41-64
    (Read/Grep/Glob :43), judge_mode silent-cliff :211-216.
  tools/escape-grant.mjs — canonicalAction:30-49 (Bash:34/PowerShell:38/mcp:39 есть; Skill ветки НЕТ → write:cwd,
    чинит E Task 1), findOpenGrant:57-65, окно 5мин :17.
  tools/askuser-answer-parser.mjs — toFloorEscapeRecord:195-203, FLOOR_ESCAPE_RE:192.
  tools/judge-seal-channel.mjs — MONEY_RE:24 (подстрочный, сузить E Task 3), detectMoney:27.
  Машины М1-М6 СОБРАНЫ и АКТИВНЫ (предыдущие фазы эпика) — Фаза B встраивается ПОВЕРХ (CD-3 аддитивно;
    router-engine=М3 правим, enforce-supreme-gate=М2 правим аккуратно-аддитивно, plan-lock/seal/М5/М6 НЕ трогаем).

═══ КВИРКИ ═══
• vitest ТОЛЬКО из app/: cd app && node node_modules/vitest/vitest.mjs run --config vitest.config.tools.mjs <фильтр> --reporter dot
  (cwd между Bash-вызовами ненадёжен → префиксить cd app && в одной команде). keytar рабочий ТОЛЬКО в КОРНЕВОМ node_modules.
• settings.json под Read-deny — Claude не читает; правит ВЛАДЕЛЕЦ. graphify-out junction ~6305 узлов / СТАЛЫЙ.
• escape окно 5 мин — request+act в одном ходу. lefthook → коммиты владельца с $env:LEFTHOOK="0".
• Память: write требует активного claude-md-management + coverage direct:memory-sync (два gate'а).

═══ ПЕРВОЕ ДЕЙСТВИЕ НОВОЙ СЕССИИ ═══
1. `git log --oneline -8` (подтверди 6 коммитов выше на main).
2. Прочитай (Read, свободно): спеку R6.3 → edit-план (Self-Review = реестр 24 находок) → 7 планов (включая разделы
   «R6.3 amendments» и C2-манифест). Подтверди владельцу, что всё на месте и ничего не потеряно.
3. Спроси владельца через AskUserQuestion: начинать ли ФАЗУ B (кодинг) и КАКИМ порядком/подходом (Фаза B = много
   мутирующих записей кода, каждая под escape — обсуди эффективность; субагенты запрещены). Дождись «вперёд».
БЕЗ ОТСЕБЯТИНЫ. Качество превыше всего. Спрашивай перед каждой фазой и каждым формальным скилом. Правки кода —
только TDD (RED→GREEN), под escape, по 7 планам. Кодовая фраза «роутер-наставник».
```

---

## Краткий индекс закрытых находок (детали — в спеке §10 + amendments планов)

| Класс | Где закрыто |
|-------|-------------|
| C-1 (вердикт без производителя) | спека §6.1 (развод ролей) + C Task 3b `runMentorVerdict` |
| нах.F1 / C-2 (layer0 теряется + «(100%)») | C2-W1 + C amendments A3 + спека §5.3 |
| нах.F2 (радары) | sub-plan F + спека §5.7/§8 |
| нах.F3 (D/E wiring) | C2-W2/W4 + D amendments SE5 |
| нах.F4 (binding вердикт↔plan_hash) | спека §6.2 + C amendments A1 |
| нах.F5 (onPlanWrite не построен) | C2-W3 |
| нах.F6 (detectHighRisk гранулярность) | C amendments A8 |
| нах.F7 (дозапрос соседнего района) | спека §5.3 + C amendments A6 |
| SE1–SE13 | amendments в A/B/C/D/E (по таблице edit-плана Self-Review) |
| VF-1 (INFERRED-guard) | спека §5.5 + A amendments |
| V-1/V-2/V-3/C-3 | C2-манифест (реестр деферралов + интеграционный тест + контракты инъекций) |
| V-4/V-5/V-6 | спека §6.2/§5.7/§8 + cross-cutting в amendments |
| C-4 (escape vs runbook) | E amendments |

Полная таблица «находка → Task» — в edit-плане (Self-Review). Карта «§ спеки → закрытие» — в спеке R6.3 §10.
