# Живой роутер-наставник — спека пере-сборки (single live flow)

**Статус:** ЧЕРНОВИК. **R6.3.** R1 черновик → audit-context-building → sharp-edges (§12) → variant-analysis (§13) → systematic-debugging (§14) → 2-й адверсариал R5 (§15). **R6** — крупная переработка под редизайн: ДР-1..6 + P1 (§1.5), unified-цикл (§4), round-3 анализ кода. **R6.1** — фолд round-4 ре-адверсариала (8 SE-R7 + 3 системных). **R6.2** — фолд дизайн-микропрохода: 6 MUST-fix open'ов разрешены (O2/O13/O16/O17/O18/O19, §10). **R6.3** — фолд ревью 5-скил цепочки 5 sub-plan'ов A-E (24 находки: C-1 + нах.F1-F7 + VF-1 + V-1/V-2/C-3, §10) + новые sub-plan C2/F. Дальше: executing-plans — фаза правок планов+спеки.
**Дата:** 2026-06-10. **Эпик:** «роутер-наставник». **Кодовая фраза:** «роутер-наставник».
**Объём (одобрено владельцем):** живой шов наставника + проверенный контекст + ОДИН итеративный цикл поверх машин М1–М7; активация settings.json — шаг владельца, не в scope.

**Обозначения.** `[ФАКТ file:line]` код · `[ФАКТ D-N]` design-notes 2026-06-01 · **[ПРЕДЛОЖЕНИЕ]** новое · **[ДР-N]** §1.5 · **[SE/VA/CD-N]** §12-14 (R5) · **[R2-*]** §15 · **[CD-R6-N]/[SE-R6-N]** round-3 · **[SE-R7-N]** round-4 · **[✅O-N]** разрешённый open · `⬅OPEN`.

> ✅ Пройдено: R1 audit · sharp-edges · variant · systematic-debugging · R5 второй адверсариал · R6 round-3 на коде машин · R6.1 round-4 ре-адверсариал · **R6.2 дизайн-микропроход (6 MUST-fix разрешены).**

---

## §0. Что изменилось

**R5 → R6:** §1.5 ДР дословно · §4 один цикл · §8 FOLD в §4 · §3/§5/§6/§7 приземление ДР + CD-R6 + SE-R6 · CD-R6-A архитектурная честность.

**R6 → R6.1 (round-4):** 3 системных анти-паттерна устранены (S1 «ИЛИ»→каноничный / S2 controller-string→secure-default / S3 плоский O-список→tier) + 3 изолированных + §12 round-4 реестр.

**R6.1 → R6.2 (дизайн-микропроход 2026-06-10):** 6 MUST-fix open'ов РАЗРЕШЕНЫ выбором владельца:
- **✅O2** verity: гибрид — флаг при построении + `freezePlan` блокирует неразрешённую EXTRACTED (§5.6).
- **✅O13** escape канон `skill:<полный input.skill>` нормализованный (§6 NB).
- **✅O16** staleness: inline-поле `{stale, commits_behind, uncommitted}` в граф-секции (§5.4).
- **✅O17** task-id: persisted first-plan-anchor (§6.3).
- **✅O18** judge_mode mismatch: WARN-лог + owner-резюме, fail-safe направление (§7.3).
- **✅O19** `MENTOR_PROBE_CAP=2` файла/круг (§5.7).

**R6.2 → R6.3 (фолд ревью 5-скил цепочки 2026-06-10):** ревью (audit-context-building → sharp-edges → variant-analysis → systematic-debugging → verification-before-completion) 5 sub-plan'ов A-E против R6.2 + построчная сверка цитат кода — вскрыло 24 находки. Закрыто В СПЕКЕ: **C-1** развод двух выходов наставника (§6.1); **нах.F4** binding вердикт↔plan_hash (§6.2); **VF-1** INFERRED-guard отдельный (§5.5); **нах.F7** дозапрос соседа (§5.3); **нах.F2** радары=код (§5.7/§8). Остальное — в новые sub-plan'ы **C2** (манифест интеграции V-1: нах.F1/F3/F5 + V-2/C-3) + **F** (радары). Карта закрытия — §10.

---

## §1. Контекст и проблема

1.1 **Живого наставника НЕТ.** Код собран (`router-engine.mjs`), зовут ТОЛЬКО тесты `[ФАКТ router-engine.mjs:6-7]`. Роутер=наставник `[ФАКТ :106]`. `buildRouterPrompt` СОБРАН, но НЕ ПОДКЛЮЧЁН.
1.2 **Дисциплина «enforce by construction», без соавтора.** `[ФАКТ 2026-06-08-...machine-7-design.md:69,246]`.
1.3 **Предел L2.** Наставник `[ФАКТ router-engine.mjs:98]`; судья слеп `[ФАКТ judge-engine.mjs:44,55-57+:12,47; D30]`. Оба слепы к ПРОЕКТУ → фантазии Claude ловит владелец `[ФАКТ L2 design-notes:172]`.
1.4 **Собрано, не заведено:** судья (A1; обёртка `enforce-judge-gate.mjs` режимы inert/shadow/live-block `[ФАКТ :6-8]`), печать (`plan-lock.mjs`/`seal-orchestration.mjs`/`judge-seal-channel.mjs`), `refResolves` `[ФАКТ plan-lock.mjs:226]`.

**Две проблемы, запустившие редизайн (владелец):**
1. **Разную литературу читать по-разному, разными скилами.** → закрыто ДР-1/ДР-5.
2. **Наставник слишком слеп** в разгаре проекта. → закрыто ДР-3/ДР-P1.

---

## §1.5. Решения сессии — ДР-1..6 + P1 (ЯДРО, дословно)

**ДР-1 (гранулярность + чтение):**
- Единица плана = «уверенная растяжка до следующей НЕИЗВЕСТНОСТИ» (вар. B).
- Роутер задаёт крупность + ГРОМКОСТЬ церемонии по сложности/риску (вар. C) через `LEVEL_SKIP_CATEGORIES` `[ФАКТ router-engine.mjs:29]` + `detectHighRisk` `[ФАКТ :19]`. Пол C = atomic-план + роутер-выбор-скила-чтения, НИКОГДА не ноль.
- Свободного чтения НЕТ. Свободно ТОЛЬКО: чтение графа + написание плана. Любое чтение СЫРЬЯ = гейченый шаг, роутер выбирает reading-скил под тип контента (= решение проблемы 1). Граница: пред-проверенная карта (граф) — свободно; свежее понимание из сырья — под воротами.

**ДР-2 (свежесть):** авто-ИНКРЕМЕНТАЛЬНОЕ освежение графа (по git-diff с последнего снимка) ПЕРЕД заходом к наставнику. Что именно освежать/слать — уточняет P1.

**ДР-3 (понимание наставника + радары пропусков):**
- Слой 0 = прунённый граф-СТРУКТУРА (имена+связи+capabilities, БЕЗ содержимого) — ВСЕГДА (дёшево, «карта метро»). Это и есть «поверхностно».
- Слой 1 = зона задачи (релевантная партиция, освежённая, + проверенный контекст). Роутер дозирует глубину. Наставник РАССУЖДАЕТ, не читает по умолчанию.
- Пропуски ловим лестницей: граф-радар (файл-уровень: тронул X, граф связывает с Y — где Y?) + скелет-радар (раздел-уровень: grep заголовков/сигнатур, Claude отчитывается по КАЖДОМУ пункту скелета: затронуто/не релевантно/не читал) + строгий reading-скил (внутри-раздела, предотвращение, ДР-1) + машинная context-verity (верность цитат, НЕ наставник читает) + НАСТАВНИК МОЖЕТ САМ прочитать подозрительный файл/раздел (по конкретному подозрению, с обоснованием, нужным скилом, маленький бюджет — ПРОВЕРОЧНОЕ чтение критика, НЕ свободное чтение автора) + владелец (остаток). Сокращаем, не обнуляем (L2-пол).

**ДР-4 (информированность vs независимость):** информированный наставник + СЛЕПОЙ судья `[ФАКТ judge-engine.mjs:12]` — намеренная ПАРА. Захват-резистанс = РАСШИРЕНИЕ существующего «поспори-с-собой / не глотай молча / воздержание 5.2» `[ФАКТ router-engine.mjs:107-109 + :152-153]` с «выбора скила» на разбор плана-ПО-ПУНКТАМ. НЕ новый механизм. Слепота судьи + owner-гейт — backstop'ы.

**ДР-5 (выбор reading-скила):** тип контента = из дешёвых метаданных (расширение + путь + узел графа) + grep-заголовок fallback; неоднозначно → воздержание 5.2 (переспрос). Рекурсии нет.

**ДР-6 (СИММЕТРИЯ спора):** спор наставник↔Claude ДВУСТОРОННИЙ. Любая сторона, выдвигая (роутер — дозапрос/чтение/правку/возражение; Claude — ОТКАЗ принять), ОБЯЗАНА дать обоснование. Не сошлись за 3 круга → к ВЛАДЕЛЬЦУ — в ОБОИХ направлениях.

**ДР-P1 (граф 6305 узлов — НЕ слать целиком):**
- Прунинг мусора (build/node_modules/бэкапы/осиротевшее — targets ПРОВЕРИТЬ против реального graphify-out, НЕ выдумывать).
- Партиция = вар. C: свернуть 1009 communities в ~10-15 человеко-именованных «районов».
- Две резолюции: слой 0 = карта районов (всегда, дёшево); слой 1 = детали нужного района (роутер выбирает под задачу, освежается per ДР-2).
- + Наставник вправе ДОЗАПРОСИТЬ соседний район (с обоснованием) для полной оценки — дешёвое чтение КАРТЫ (не файлов), отдельный бюджет, конструктивная форма воздержания. Лечит риск «дали не тот район».

---

## §2. Фундамент (🔒 неизменен) — F1-F6 держатся; ДР РАСШИРЯЮТ, не заменяют

| # | Инвариант | Якорь |
|---|-----------|-------|
| F1 | План — ПЕРВЫМ; ничего кроме плана; оба слоя | `[ФАКТ D11/D12]` |
| F2 | Два слоя; сила проверки по фазе | `[ФАКТ 6.5/D33]` |
| F3 | Наставник — СОАВТОР; будится САМ (A0); спорит кругами | `[ФАКТ D24/D34/D35/D16]` |
| F4 | Тупик наставник↔Claude → ВЛАДЕЛЕЦ (~3 круга) | `[ФАКТ D34 :190]` |
| F5 | Замороженный план → СУДЬЯ-ворота + надзор | `[ФАКТ D30 :178]` |
| F6 | ЦЕЛЬ владельца, МЕТОД наставника | `[ФАКТ D29 :172]` |

---

## §3. Цель и не-цели (scope)

**Цель.** Живой шов наставника + конструкция проверенного контекста + ОДИН итеративный цикл.
**В scope:** §5 проверенный контекст; §6 наставник-шов; §7 owner-гейт+заморозка→судья (A1); §4 единый цикл.
**НЕ в scope:** активация settings.json (владелец); детали A1; **пересмотр М2/М5/М6 — встраиваемся ПОВЕРХ (аддитивно — CD-3).**

**[CD-R6-A] Архитектурная честность.** Движки ОДНОКРАТНЫ: `runRouter` `[ФАКТ router-engine.mjs:140]`; `runJudge` `[ФАКТ judge-engine.mjs:81]`; стена `[ФАКТ enforce-supreme-gate.mjs:135-181]`. Поток ИТЕРАТИВЕН → оркестрация контроллером. Машины энфорсят **ЧЕКПОЙНТЫ** (заморозка/печать/судья/owner-гейт), диалог — контроллер-orchestrated. Обещания спеки ограничены (asymptote floor `[ФАКТ memory feedback_asymptote_floor]`).

---

## §4. Поток целиком — ОДИН итеративный цикл (unification)

Разговорный и реализационный циклы СИММЕТРИЧНЫ: «план → роутер → (владелец) → судья → action → новый план». §8 — тот же цикл, action варьируется.

```
Промт владельца
  → [Claude молчит — F1]
  ↻ ИТЕРАЦИЯ (петля):
     1. ПЛАН-С-ОБОСНОВАНИЯМИ-ПО-ПУНКТАМ (единица = «растяжка до неизвестности», ДР-1;
        громкость по риску detectHighRisk:19/LEVEL_SKIP:29)
     2. РОУТЕР-НАСТАВНИК будится СТРУКТУРНО (A0) `[ФАКТ master-roadmap.md:136]`
        вход: промт + журнал переговоров ЗАДАЧИ (D36) + ПРОВЕРЕННЫЙ контекст (§5)
              + слой-0 карта районов (ВСЕГДА, ДР-3/P1) + слой-1 район + skill-каталог + контракты
        → расширяет план + скилы → круги (≤MENTOR_ROUND_CAP=3, симметрия ДР-6, память per-ЗАДАЧЕ)
        → тупик → ВЛАДЕЛЕЦ (F4, в ОБА направления)
     3. СОГЛАСОВАНО → OWNER-ГЕЙТ-1 (явное одобрение, VA-1; концизное резюме, R2-SE-a)
     4. ЗАМОРОЗКА (требует СОДЕРЖАТЕЛЬНЫЙ mentor-вердикт на choke freezePlan — VA-8/CD-R6-C)
     5. СУДЬЯ-ВОРОТА gate-2 (СЛЕП — F5/D30)
     6. ACTION (=шаг плана `[ФАКТ enforce-supreme-gate.mjs:135-181]`):
        читать-граф (свободно) | читать-сырьё (гейчено, reading-скил ДР-1/5)
        | собрать | спросить-владельца | сделать
        → надзор сигналит СЕМАНТИЧЕСКИЙ дрейф (guide, НЕ блок; VA-4/CD-6)
        → радары ДР-3 как проверка ПОЛНОТЫ исполнения (Q3)
     7. РЕЗУЛЬТАТ → НОВЫЙ план → ↻ к п.1
  ⊗ ТЕРМИНАЦИЯ петли (SE-R7-6): выход ТОЛЬКО когда владелец явно объявляет «цель достигнута»
     ЛИБО судья gate-3 `goal_achieved` `[ФАКТ judge-engine.mjs:26]` даёт GO на завершение.
     Контроллер сам петлю НЕ закрывает.
```

**[Q3-инсайт]** Один цикл, параметризованный типом action. **[SE-R7-1]** Тип action security-критичен; в impl-режиме стена ВЫВОДИТ тип из (tool + path + plan-step), НЕ из controller-строки; в разговорном — дисциплина (CD-R6-A).

---

## §5. Конструкция проверенного контекста (фаза «понимание» цикла)

5.1 **graphify** — структурная карта `[ДР-P1]`. 5.2 **audit-context-building** — построчно.

5.3 **Слоистая подача графа (ДР-3 + ДР-P1).** **[ПРЕДЛОЖЕНИЕ]** Слой-0 = прунённая граф-СТРУКТУРА → ~10-15 «районов» (свёртка 1009 communities) — ВСЕГДА. Слой-1 = детали нужного района. **[CD-R6-G]** Project-граф — ОТДЕЛЬНАЯ секция промпта, НЕ skill-каталог; `buildRouterPrompt` разделяет `catalog` и `graph` (`groundTrace`) `[ФАКТ router-engine.mjs:99,148]` — слать прунённый каталог-район, заземлять против полного. Переписать «(100%)» `[ФАКТ :114]`. Прунинг-targets ПРОВЕРИТЬ против graphify-out.
**[R6.3 — дозапрос соседнего района (нах.F7, ДР-P1).]** Наставник вправе ДОЗАПРОСИТЬ детали соседнего района (с обоснованием) — дешёвое чтение КАРТЫ (`districtDetail` из sub-plan B, НЕ файлов), отдельный бюджет (лечит «дали не тот район»). Механизм: наставник в вердикте/трассе указывает нужный район → `runMentorRound` (sub-plan C) подтягивает `districtDetail(district)` следующим кругом. C T5 этого НЕ строит — деферрал → C2-манифест (не потерять). Конструктивная форма воздержания, не free-reading (карта, не сырьё).

5.4 **Свежесть (ДР-2) — staleness-сигнал каноничный (S1, ✅O16).** **[ПРЕДЛОЖЕНИЕ]** Каноничный МИНИМУМ: **inline-поле staleness в граф-секции промпта** `{stale:true, commits_behind:N, uncommitted:M}` — наставник рассуждает, ЗНАЯ о staleness, дёшево. Pre-mentor refresh — **enhancement поверх**, НЕ замена (не «триггер ИЛИ сигнал» — сигнал ВСЕГДА). **[CD-R6-D]** Сущ. `graphify-safe-update.mjs` — POST-COMMIT `[ФАКТ header]`, doc → флаг `[ФАКТ :127-141]`, код → AST-merge `[ФАКТ :143-190]`; наставник зовётся ДО коммита → триггер не совпадает с нуждой → потому каноничен СИГНАЛ, не refresh.

5.5 **Артефакт контекста — формат + secure-default (S2).** **[ПРЕДЛОЖЕНИЕ]** `{ id, claim, ref:"file:line", kind:"EXTRACTED|INFERRED" }`. **[SE-2]** `INFERRED` — `derivation_ref` + sign-off владельца + лимит доли (O9). **[secure-default]** `kind` НЕ доверяется controller-ставимым: `EXTRACTED` ОБЯЗАН пройти context-verity-резолв (§5.6); НЕ прошёл → понижается до `INFERRED` (sign-off). Мис-метка INFERRED→EXTRACTED не обходит owner-sign-off.
**[R6.3 — INFERRED-guard ОТДЕЛЬНЫЙ (VF-1).]** sub-plan A `verifyArtifact` только ПОНИЖАЕТ kind (EXTRACTED→INFERRED при непрошедшем резолве); собственно СТРАЖ INFERRED — sign-off владельца + лимит доли INFERRED (O9) — A НЕ строит. Без него поток с массой INFERRED-цитат «проверен» формально: всё downgraded ушло в INFERRED, а freeze-gate ✅O2 их не блокирует (он про неразрешённую EXTRACTED, не про долю INFERRED). Нужен отдельный guard: доля INFERRED ≤ порога И каждая INFERRED несёт `derivation_ref` + owner-sign-off. Деферрал → C2-манифест / owner-activation (не потерять).

5.6 **context-verity — гибрид флаг+freeze-блок (✅O2).** **[ПРЕДЛОЖЕНИЕ]** Чистый `tools/context-verity.mjs` по образцу `refResolves` `[ФАКТ plan-lock.mjs:226]`. **[SE-1]** Резолв по СИМВОЛУ/контенту. **[✅O2]** verity ФЛАГает неразрешённые при построении (не блок посреди потока); **`freezePlan`-чекпойнт ОТКАЗывает печать артефакта, если в нём есть неразрешённая EXTRACTED-цитата** (использует существующий чекпойнт CD-R6-A, не mid-flow блок). **[VA-9]** Пустой артефакт (0 EXTRACTED) НЕ «проверен». **[R2-SE-g]** Субстанция ≠ счёт. **[SE-4]** Чтит owner-escape (§6 choke).

5.7 **Лестница радаров + bounded probe (✅O19).** Граф-радар + скелет-радар (Claude отчитывается по КАЖДОМУ пункту) + строгий reading-скил + context-verity + наставник-сам-читает + владелец. **[✅O19]** Критик-чтение наставника = `MENTOR_PROBE_CAP=2` файла/раздела на КРУГ (подозрение + сосед; ×MENTOR_ROUND_CAP=3 → макс 6/задача); НЕ «малый» аспирационно — иначе free-reading backdoor мимо ДР-1. Сокращаем, не обнуляем (L2-пол).
**[R6.3 — радары = КОД (нах.F2).]** Граф-радар + скелет-радар — чистые модули `tools/graph-radar.mjs` + `tools/skeleton-radar.mjs` (sub-plan F): граф-радар (тронул X → соседи Y по `links` → адресован?), скелет-радар (grep заголовков → отчёт по КАЖДОМУ пункту: touched/not-relevant/not-read/not-reported, молчание → not-reported). Решение владельца 2026-06-10: радары — КОД, а не только поведение (раньше были в лимбо «код или дисциплина»). Wiring на фазе исполнения (§8 Q3) — C2/поведенческий.

5.8 **Типизация чтений (CD-R6-B).** `isObserveOnly` пускает Read/Grep/Glob БЕЗУСЛОВНО `[ФАКТ enforce-supreme-gate.mjs:43]`. 4 вида: (1) граф-карта — свободно; (2) **авторское чтение СЫРЬЯ — цель гейта ДР-1**; (3) проверочное чтение критика (5.7, bounded ✅O19); (4) harness-обязательное. **R6:** reading-gate ДР-1 ТОЛЬКО на вид 2; виды 1/3/4 свободны. Имя Read-tool не отличает вид 2 от 4 → гейт ДР-1 энфорсим ТОЛЬКО в impl-режиме (frozenPlan → raw-read = plan-step). **[SE-R7-5]** В разговорном — дисциплина + read-LOG (сигнал владельцу о фронт-лоаде сырья до заморозки), не блок. CD-3-граница: новый предусловный слой ПЕРЕД observe-only.

5.9 **discovery-interview SYSTEM — ⬅OPEN (O3)** (дубль VA-3).

5.10 **Ревью владельца → проверенный контекст.** **[SE-6]** verity = РЕЗОЛВ цитат, НЕ честность. Ревью ОБЯЗАТЕЛЬНЫЙ. **verity ≠ истина.** **[VA-11]** Артефакт human-reviewable (O12). **[R2-SE-a/R2-VA-meta]** Каждый owner-гейт — КОНЦИЗНОЕ резюме; owner-точки консолидировать; ≥1 substance-гейт на задачу — неуклоняемый и редкий (O15, §15).

---

## §6. Наставник-шов (фаза «менторинг» цикла — главный OPEN)

> **🔒 Сквозной инвариант (R2-VA-7 — централизация escape).** Каждый НОВЫЙ слой-ворота чтит owner-escape. ОДНА choke-точка: стена первой строкой `decideMode` зовёт `escapeGrantOpen` `[ФАКТ enforce-supreme-gate.mjs:193]`, ДО плановых проверок; allow mode:'escape' БЕЗ advanceTo `[ФАКТ :194]`. Новые гейты — к ТОМУ ЖЕ choke (O14). **[SE-R6-1/✅O13]** Скил-escape канон сейчас = `write:<cwd>` агностичен `[ФАКТ escape-grant.mjs:43-44]`. **✅O13 (MUST-fix реализации):** канон `skill:<полный input.skill>` нормализованный (lowercase/trim; e.g. `skill:audit-context-building:audit-context-building`) — однозначно, совпадает с тем, что видит владелец в AskUser, без коллизий. Грант привязан к КОНКРЕТНОМУ скилу.

6.1 **Будится структурно (A0) + вердикт-substance.** **[ПРЕДЛОЖЕНИЕ]** Хук на запись/обновление плана (A0 `[ФАКТ master-roadmap.md:136]`), пишет вердикт.
**[VA-8 + CD-R6-C + S1 — КАНОНИЧНЫЙ choke]** Энфорсмент на ЗАМОРОЗКУ через ЕДИНСТВЕННУЮ точку — `freezePlan` `[ФАКТ plan-lock.mjs:62]` (единственное место печати плана; 5 функций печати сходятся в него). **НЕ «freezePlan ИЛИ frozenPlan-проверка».** Секвенс: наставник со-авторит → owner-гейт-1 → `freezePlan`(требует mentor-вердикт) → судья gate-2.
**[R2-SE-c + SE-R7-8 — СОБСТВЕННЫЕ слоты]** Гейт проверяет вердикт СОДЕРЖАТЕЛЕН по СОБСТВЕННЫМ слотам наставника (непустые, адресуют план ПО-ПУНКТАМ) — НЕ заимствует `validateVerdictSlots`/линзы судьи `[ФАКТ judge-engine.mjs:15,19-27]`. Паттерн-зеркало, но СВОИ слоты.
**[SE-R6-6 — substance, не presence]** Содержательный mentor-вердикт = РЕАЛЬНЫЙ заход наставника (непустые слоты + реальный router-вызов), НЕ stub/degraded. Зеркало: судья недоступен → `{decision:'GO', wired:false}` `[ФАКТ enforce-judge-gate.mjs:67-69,81]` НЕ суд.
**[CD-3]** Чек — ОТДЕЛЬНОЕ предусловие к `freezePlan`; seal/`plan-lock`/М6 не трогаются.
**[SE-3/R2-SE-h]** fail-CLOSED; на блок — owner-escape. «Наставник ОШИБСЯ» (таймаут/краш → RETRY) vs «ЗАБЛОКИРОВАЛ» (legit → escape).
**[R6.3 — РАЗВОД ДВУХ ВЫХОДОВ НАСТАВНИКА (корень C-1).]** Наставник делает ДВА типа вызовов LLM с РАЗНЫМИ выходами: **(а) ВЫБОР-СКИЛА** — router-трасса `{candidates, chosen, why_chosen, twins_considered, confidence}` `[ФАКТ router-engine.mjs:48 TRACE_SLOTS]` (существующий `runRouter`-пайплайн `[ФАКТ :140]`); **(б) РАЗБОР-ПЛАНА** — mentor-вердикт `{plan_points_addressed, reasoning, recommendation, confidence}` (СОБСТВЕННЫЙ промпт `buildMentorVerdictPrompt`, просит ИМЕННО эти слоты). Это РАЗНЫЕ промпты и РАЗНЫЕ валидаторы. Гейт `freezePlan` `[ФАКТ plan-lock.mjs:62]` требует вердикт (б), НЕ трассу (а). **Производитель вердикта:** `runMentorVerdict` (зеркало `runRouter`, но verdict-промпт + `validateMentorVerdict`; `wired:true` при реальном заходе); `onPlanWrite` (A0 `[ФАКТ master-roadmap.md:136]`) инициирует его при записи плана и персистит результат (task-id-bound). Без производителя вердикта-как-данных в живом потоке НЕТ — `buildMentorPrompt` просит router-слоты, а freeze-gate ждёт verdict-слоты → содержательного вердикта на choke не появится. [Закрывает C-1 / нах.F5; реализация — sub-plan C + C2-манифест.]

6.2 **Вход — проверенный контекст.** **[ПРЕДЛОЖЕНИЕ]** `buildRouterPrompt` `[ФАКТ router-engine.mjs:98]` + журнал переговоров ЗАДАЧИ `[ФАКТ D36:217-218]` + ПРОВЕРЕННЫЙ КОНТЕКСТ (§5) + слой-0/слой-1 project-граф (§5.3).
**[CD-R6-H — НЕ противоречие]** 2026-06-05 `[ФАКТ :16-17,46]` не кормил живым контекстом. Мы НЕ кормим сырым чатом; контекст — ПРОВЕРЕННЫЙ артефакт. ОСОЗНАННАЯ ревизия `[ФАКТ handoff:60]`. Судья остаётся слеп (§7.2) `[ФАКТ judge-engine.mjs:12]`; асимметрия намеренна (ДР-4). ⬅OPEN (O8).
**[R2-VA-5]** Вердикт привязан к ХЕШУ плана `[ФАКТ enforce-supreme-gate.mjs:84 R-27]`; счётчик/журнал — к ЗАДАЧЕ.
**[R6.3 — binding ВЕРДИКТ↔plan_hash ЭНФОРСИТСЯ (нах.F4).]** `runMentorVerdict` кладёт в вердикт `plan_hash = planId(steps)` `[ФАКТ plan-lock.mjs:15-17]`; `freezeGate` (§6.1, sub-plan C Task 6) ОБЯЗАН сверить `verdict.plan_hash === planId(замораживаемых steps)` — иначе СТАРЫЙ/чужой содержательный вердикт пропустит печать НОВОГО плана (presence-substance дыра R2-VA-meta). «Вердикт есть» ≠ «вердикт ДЛЯ ЭТОГО плана». `mismatch → блок (fail-CLOSED) → owner-escape`.

6.3 **Состояние кругов (память per-ЗАДАЧЕ) + task-id (✅O17).** **[ПРЕДЛОЖЕНИЕ]** Счётчик + история `[ФАКТ D36:217-218]`. **[SE-7]** `MENTOR_ROUND_CAP=3`; 0 = не высказался = не заморозить; потолок → эскалация. **[VA-7→R2-SE-d]** Счётчик/журнал — per-ЗАДАЧЕ.
**[SE-R6-4 + S1 — tamper-evident]** Журнал переговоров ≠ М1 `action-journal` `[ФАКТ action-journal.mjs:17]`. **tamper-evident (хеш-цепь зеркало М1)** каноничен; НЕ «ИЛИ derivable».
**[✅O17]** task-id = **persisted first-plan-anchor**: присваивается A0-хуком при ПЕРВОМ плане задачи, ПЕРСИСТИТСЯ, НЕИЗМЕНЕН весь жизненный цикл (re-issue плана с новым хешем НЕ сбрасывает; стабилен через re-issue, различен между задачами — НЕ plan-hash, НЕ prompt).

6.4 **Эскалация → владелец (симметрия ДР-6).** `[ФАКТ F4/D16/D34/D36; :274]` Резюме спора (ОБЕ позиции). **[ДР-6]** двусторонний; каждая сторона ОБЯЗАНА обоснование; 3 круга → владелец в ОБА направления.
**[CD-R6-F]** F6 «МЕТОД наставника» `[ФАКТ D29:172]` vs ДР-6: наставник ВЕДЁТ метод → Claude вправе оспорить с обоснованием → 3 круга → владелец (F4). Не унилатерально.

6.5 **Под стеной — семена.** `[ФАКТ enforce-supreme-gate.mjs:25-27,196-198]`. **NB-мина** `[ФАКТ master-roadmap.md:149 K4]`. **[SE-5]** Наставнику НЕ seed-слот; пишет через канал гейта-1 (O5).
**[CD-R6-E]** «СВОБОДНЫХ действий НЕТ» vs seed-allowlist `[ФАКТ enforce-supreme-gate.mjs:31-36,136,196-197]` (bootstrap D12/D13). **Определение:** «свободное действие» = «мутирующее исполнение вне замороженного плана»; пред-плановый свободный набор = seeds + observe + AskUser/EnterPlanMode.

6.6 **Две роли (в одном цикле).** `[ФАКТ master-roadmap.md:141 ПОСЛЕ; :147+ ДО; D34/D35]` (1) СОАВТОР ДО; (2) ВЕДЁТ ПОСЛЕ (§4 п.6). Разделены ФАЗОЙ.

6.7 **Выбор reading-скила (ДР-5) — machine-derived (S2).** **[ПРЕДЛОЖЕНИЕ]** Тип контента из метаданных (ext + путь + узел графа) + grep-fallback; неоднозначно → `abstain 5.2` `[ФАКТ router-engine.mjs:152-153]`. **[SE-R6-7/SE-R7-1]** closed-list (как `LEVEL_SKIP_CATEGORIES` `[ФАКТ :29]`) + machine-derived (ext/graph-node, не controller-string) + grep-fallback; мис-классификация ловится abstain.

---

## §7. Owner-гейт → Заморозка → СУДЬЯ-ворота (чекпойнт цикла)

7.0 **Owner-гейт-1 на ПЛАН (VA-1).** `[ФАКТ master-roadmap.md:337]` Порядок: согласовано → owner-гейт-1 → заморозка → судья → exec. **[CD-4]** F4 (опц.) + §7.0 (всегда). **[R2-SE-a]** КОНЦИЗНОЕ резюме (≤10 пунктов + дельта). Консолидировать (O15).

7.1 **Печать гейтит СУДЬЯ.** `[ФАКТ D30; judge-seal-channel.mjs:2-5]` Наставник не печатает `[ФАКТ :6]`. **Carve-out** `[ФАКТ :8-9,32-36]`: деньги (`detectMoney` :24-29) ИЛИ тупик → ВЛАДЕЛЕЦ (F4). **[SE-8/SE-R6-2]** `detectMoney` подстрочный `[ФАКТ :23-24]` → мис-триггер; безопасное направление, кормит fatigue → сузить ⬅OPEN (O11).

7.2 **Вход судьи — слеп.** `[ФАКТ judge-engine.mjs:44,55-57+:12,47; D30]` §6.2 сюда НЕ распространяется. Линзы `[ФАКТ :19-27]`; пост-чек `[ФАКТ :81-112]`; сомнение→блок `[ФАКТ :67-70]`.

7.3 **Проводка A1 + judge_mode сигнал (✅O18).** `[ФАКТ enforce-judge-gate.mjs:6-8,209-225]` Режимы inert/shadow/live-block; Гейт-1(specs)>Гейт-2(plans) `[ФАКТ :58-60]`; судья недоступен → degraded-GO `[ФАКТ :67-69]`. ⬅OPEN (O6).
**[SE-R6-3/✅O18]** double judge_mode silent-cliff: энфорсмент только если ОБЕ печати `'live-block'` `[ФАКТ enforce-supreme-gate.mjs:211]`; рассинхрон → тихо в разговорный `[:212-216]`; footgun = ТИШИНА. **✅O18:** направление fail-safe СОХРАНИТЬ (→разговорный, не блок — не кирпичить легитимный переход), но ГРОМКО: **WARN-лог** + строка в **owner-резюме гейта-1** «энфорсмент off: judge_mode рассинхрон план≠артефакт». Владелец знает.

---

## §8. Исполнение под надзором — СВЁРНУТО в §4 (action как узел петли)

- **Действие = шаг плана** `[ФАКТ enforce-supreme-gate.mjs:135-181]`. Журнал пред-записывает намерение ДО allow (Δ3) `[ФАКТ :244-249]`; разрушительный in-plan шаг стена не благословляет (Δ7) `[ФАКТ :170-172; classify-destructive.mjs:29-39]`.
- **Надзор** — сигналит СЕМАНТИЧЕСКИЙ дрейф (НЕ блокирует) `[VA-4]`. «Ведёт»=guide `[CD-6]`. Форма ⬅OPEN (O7).
- **[Q3]** Радары ДР-3 = проверка ПОЛНОТЫ исполнения; ДР-1 громкость на рискованный шаг.
- **[R6.3]** Радары исполняются модулями F (`buildGraphRadar`/`buildSkeletonRadar`) ПОСЛЕ action-шага: контроллер строит чек-лист «соседи Y тронутого X адресованы? по каждому заголовку — отчёт touched/not-relevant/not-read». Wiring — C2/поведенческий (не F). Машина даёт чек-лист; отметку «достаточно/адресовано» ставит наставник/владелец (L2-пол, не машинное «достаточно»).

---

## §9. Новое vs существующее

Артефакт/`context-verity.mjs`, слоистый project-граф (§5.3), staleness-поле (§5.4), контекст-как-вход (§6.2), журнал переговоров tamper-evident + task-id (§6.3), живой шов (§6), escape-канон `skill:<name>` (§6 NB), reading-typing (§5.8), единый цикл + termination (§4) — **НОВОЕ**. owner-гейт-1 (A1), гейт `freezePlan` на mentor-вердикт + verity-freeze-блок (аддитивно), judge_mode WARN — поверх существующего. **Коррекция R5:** стена М2/пол М5/печать М6, судья+A1, `buildRouterPrompt` — **СОБРАНО, но НЕ ПОДКЛЮЧЕНО** `[ФАКТ router-engine.mjs:6-7]`.

---

## §10. Открытые вопросы — TIERED

**✅ РАЗРЕШЕНО (дизайн-микропроход 2026-06-10):**
- **O2** verity → гибрид флаг + `freezePlan`-блок неразрешённой EXTRACTED (§5.6).
- **O13** escape-канон → `skill:<полный input.skill>` нормализованный (§6 NB).
- **O16** staleness → inline-поле `{stale, commits_behind, uncommitted}` в граф-секции (§5.4).
- **O17** task-id → persisted first-plan-anchor (§6.3).
- **O18** judge_mode mismatch → WARN-лог + owner-резюме, fail-safe направление (§7.3).
- **O19** `MENTOR_PROBE_CAP=2` файла/круг (§5.7).

**✅ РАЗРЕШЕНО (ревью 5-скил цепочки 2026-06-10 → R6.3):**
- **C-1** развод двух выходов наставника (выбор-скила trace vs разбор-плана verdict) → §6.1 R6.3; производитель `runMentorVerdict` + `onPlanWrite` (sub-plan C + C2-W3).
- **нах.F1 / C-2** catalog≠graph + карта районов в промпте + «(100%)»-rewrite → §5.3 + C2-W1.
- **нах.F2** радары = код (graph-radar + skeleton-radar) → §5.7/§8 + sub-plan F.
- **нах.F3** reading-discipline wiring (decideReadEvent + planAuthorizesPath продюсер) → C2-W2.
- **нах.F4** binding вердикт↔plan_hash энфорсится → §6.2.
- **нах.F5** onPlanWrite построен → C2-W3.
- **нах.F7** дозапрос соседнего района → §5.3 + C2.
- **VF-1** INFERRED-guard — отдельный энфорсмент (sign-off + лимит O9) → §5.5 + C2.
- **V-1 / V-2 / C-3** манифест интеграции + кросс-модульный тест + контракты инъекций → sub-plan C2.

**🟠 design-choice OPEN (обсуждаемо, не небезопасный дефолт):**
O1 артефакт где · O3 discovery-interview SYSTEM · O4 хук пробуждения · O5 канал записи=гейт-1 · O6 стыковка A1 · O7 форма надзора · O8 независимость наставника · O9 порог INFERRED · O10 механика escape-awareness · O11 сузить detectMoney · O12 размер артефакта · O14 централизованная choke escape · O15 консолидация owner-гейтов/анти-fatigue.

---

## §11. Реестр цитат (сверено на шаге 1 R6 — построчно)

**Код (✅):** `router-engine.mjs:6-7,19,29,98,106,107-109,114,140,148,152-153`; `judge-engine.mjs:12,15,19-27,44,55-57,47,67-70,81-112`; `enforce-supreme-gate.mjs:20-27,31-36,43,84,135-181,139,170-172,193-198,211-216,244-249`; `escape-grant.mjs:30-49,43-44,57-65,193`; `askuser-answer-parser.mjs:192-203,222-229`; `plan-lock.mjs:53-57,62,139-154,226`; `judge-seal-channel.mjs:2-9,22-36`; `classify-destructive.mjs:29-39,54-67`; `action-journal.mjs:17,53-68,77-82`; `enforce-judge-gate.mjs:6-8,58-60,67-69,81,129-135,209-225,233-250`; `seal-orchestration.mjs:25,36`; `graphify-safe-update.mjs:header,104-141,143-190`; `path-normalization.mjs:38-39,82-118`.
**Дизайн (✅):** `2026-06-01-...design-notes.md` (D11/D12/D16:130/D24/D29:172/D30:178/D33/D34:190,274/D35:198/D36:217-218; L2:172); `plans/2026-06-03-...master-roadmap.md:136,141,147+,149,337`; `specs/2026-06-05-...conversational-input...:16-17,46`; `specs/2026-06-08-...machine-7-design.md:69,246`; `specs/2026-06-09-...A1-judge-gate2-wiring-design.md`; `memory feedback_asymptote_floor`.

> **NB.** R6 round-3 сверял РЕАЛЬНЫЙ код 13 файлов. R6.1 round-4 — ре-адверсариал на тексте. R6.2 — дизайн-микропроход (6 MUST-fix). Номера строк хрупки (SE-1) — резолв по символу.

---

## §12. sharp-edges (round-1 + round-3 + round-4)

**Round-1 (R5):** SE-1..SE-8.

**Round-3 (R6):**

| ID | Footgun | Цитата | Сев. | Митигация |
|----|---------|--------|------|-----------|
| SE-R6-1 | escape агностичен (`write:cwd`) | `escape-grant.mjs:43-44` | High | ✅O13 `skill:<input.skill>` |
| SE-R6-2 | detectMoney подстрочный → fatigue | `judge-seal-channel.mjs:23-24` | Low-Med | сузить (O11) |
| SE-R6-3 | double judge_mode silent-cliff | `enforce-supreme-gate.mjs:211` | Med | ✅O18 WARN+owner |
| SE-R6-4 | журнал переговоров мутируемый | `action-journal.mjs:17` | Med | tamper-evident (§6.3) |
| SE-R6-5 | ДР-1 reading-gate ↔ isObserveOnly | `enforce-supreme-gate.mjs:43` | High | типизация, impl-only (§5.8) |
| SE-R6-6 | degraded-GO presence≠substance | `enforce-judge-gate.mjs:67-69,81` | Med-High | `wired:true` (§6.1) |
| SE-R6-7 | reading-скил из метаданных | `router-engine.mjs:29` | Low | closed-list + abstain (§6.7) |
| SE-R6-8 | task-identity не определён | — | Med | ✅O17 first-plan-anchor |

**Round-4 (R6.1) — 3 СИСТЕМНЫХ + точечные:**

| ID | Footgun | § | Митигация |
|----|---------|---|-----------|
| **S1** | «X ИЛИ слабее-Y» в резолюциях ×3 | §5.4/§6.1/§6.3 | каноничный выбор (✅) |
| **S2** | controller-string дискриминатор ×3 | §4/§5.5/§6.7 | machine-derived/secure-default (✅) |
| **S3** | плоский O-список прячет MUST-fix | §10 | tier + ✅резолв 6 (✅) |
| SE-R7-6 | внешняя петля без termination | §4 | владелец/судья gate-3 (✅) |
| SE-R7-7 | «малый бюджет» undefined | §5.7 | ✅O19 N=2 |
| SE-R7-8 | mentor заимствует слоты судьи | §6.1 | СОБСТВЕННЫЕ слоты (✅) |
| SE-R7-5 | impl-only энфорс → стимул в разговорном | §5.8 | conversational read-LOG (✅) |

## §13. variant-analysis (round-1 + round-3)

**Round-1 (R5):** VA-1 owner-гейт · VA-6 escape=circuit-breaker · VA-8 гейт заморозки · VA-7 per-задача · VA-9 пустой артефакт · VA-11 human-reviewable · VA-4 семантический надзор · VA-3(=O3).

**Round-3 — матрица приземления ДР:**

| ДР | Первичная посадка | Вторичные швы | Аддитивно? |
|----|-------------------|---------------|------------|
| ДР-1 | М3 `:29`+`:19` | ⚠️ М2 `isObserveOnly:43` (CD-R6-B) | НЕТ — трогает М2 |
| ДР-2 | `graphify-safe-update:104-118` | ⚠️ doc-флаг-only `:127` (CD-R6-D) | частично |
| ДР-3 | М3 `buildRouterPrompt:99` | context-verity по `refResolves:226` | новое + М3-вход |
| ДР-4 | М3 `:107-109,152-153` | судья слеп `:12` | аддитивно |
| ДР-5 | М3 новый классификатор | abstain `:152-153` | аддитивно |
| ДР-6 | М3 промпт | журнал ≠ М1; тупик→владелец F4 | новый стор |
| ДР-P1 | новый слой → `:99` | catalog≠graph `:148` | новое + М3-вход |

## §14. systematic-debugging — противоречия машин (round-3)

| ID | Противоречие | Резолв |
|----|--------------|--------|
| 🔴 CD-R6-A | машины однократны ↔ поток итеративен | энфорс на ЧЕКПОЙНТАХ (§3/§15) |
| 🔴 CD-R6-B | ДР-1 нет-чтения ↔ isObserveOnly | типизация, impl-only (§5.8) |
| 🔴 CD-R6-C | VA-8 mentor-вердикт ↔ seal на judge-GO | mentor-вердикт на `freezePlan` (§6.1) |
| 🟠 CD-R6-D | ДР-2 refresh ↔ post-commit+doc-флаг | staleness-сигнал каноничный (§5.4) |
| 🟠 CD-R6-E | «свободных действий нет» ↔ seed bootstrap | «свободное»=мутирующее вне плана (§6.5) |
| 🟠 CD-R6-F | F6 метод ↔ ДР-6 Claude-отказ | иерархия ведёт→оспорить→владелец (§6.4) |
| 🟠 CD-R6-G | ДР-P1 прунинг ↔ «(100%)» + 2 графа | project-граф отд. секция (§5.3) |
| 🟢 CD-R6-H | informed-mentor ↔ 2026-06-05 | сознательная ревизия (§6.2) |

**Round-1 (R5):** CD-1 🔴 переписка→журнал плана · CD-3 🟠 аддитивно · CD-4/CD-6 🟡. НЕ противоречия: CD-2/CD-5/CD-7.

---

## §15. Предельные свойства (адверсариал R5 + архитектурный вывод R6)

**🔴 R2-VA-meta — «Presence ≠ Substance» ПРОНИЗЫВАЕТ все гейты.** Вердикт наставника (R2-SE-c/SE-R6-6/SE-R7-8), owner-одобрение (R2-SE-a), context-verity (SE-6), escape-грант (SE-R6-1) — КАЖДЫЙ удовлетворяется presence-токеном без субстанции. Единственная проверка субстанции — внимательный человек, который устаёт `[ФАКТ memory feedback_asymptote_floor]`. **Дизайн ОБЯЗАН:** (1) машинно проверять субстанцию (вердикт-слоты, релевантность, реальный router/judge-вызов); (2) консолидировать owner-точки + концизные резюме (O15); (3) ≥1 неуклоняемый редкий substance-гейт.

**🔴 R2-VA-7 — централизация escape.** ОДНА choke-точка `[ФАКТ enforce-supreme-gate.mjs:193]`; новые гейты — к тому же choke (O14).

**🔴 CD-R6-A — итеративный поток на однократных движках.** Энфорсмент на ЧЕКПОЙНТАХ, НЕ на раунд-диалоге (контроллер-orchestrated). asymptote behavioral-residual/user-approval floor. **Не дефект — граница архитектуры.**

**🔴 R6.1 round-4 урок — системность анти-паттернов.** Footgun'ы R6 рекуррентны («ИЛИ» ×3, controller-дискриминатор ×3, плоский O-список). Подтверждает R5 §15. **Правило:** N-й адверсариал ищет СИСТЕМНОСТЬ (повтор паттерна по §§), не только точечные дыры.

**Реестр round-2 (R5):**

| ID | Сев. | Митигация | Статус |
|----|------|-----------|--------|
| R2-SE-a | High | концизные резюме + консолидация (O15) | §5.10/§7.0 |
| R2-SE-c | High | вердикт СОДЕРЖАТЕЛЕН (свои слоты) | §6.1 |
| R2-SE-f | High | скил-escape канон `skill:<name>` (✅O13) | §6 NB |
| R2-SE-d | Med | счётчик per-ЗАДАЧЕ | §6.3 |
| R2-SE-h | Med | error→retry vs block→escape | §6.1 |
| R2-SE-g | Low | субстанция≠счёт | §5.6 |
| R2-SE-b | Low | escape мимо гейта-1 — владелец в контроле | — |
| R2-VA-meta | High | substance-чеки + консолидация (O15) | §15/§5.10 |
| R2-VA-7 | High | централизовать escape (O14) | §6 |
| R2-VA-5 | Med | счётчик→задача, вердикт→хеш плана | §6.2/§6.3 |
| R2-VA-8 | — | escape=универсальный circuit-breaker | §6 |
| R2-VA-9 | Low | reuse validateVerdictSlots паттерн | §6.1 |
