# Машина 7 — BUILD-handoff #5 (Фазы 4/5/6/7-код СОБРАНЫ — остались только шаги ВЛАДЕЛЬЦА + переезд Ф8)

Кодовая фраза эпика: **«роутер-наставник»**.

> ⚠️ **УСТАРЕЛО — НЕ ВХОДИТЬ ПО ЭТОМУ ФАЙЛУ (баннер 12.06.2026).** Пункт 1 «ДЕРЕВО» больше неверен: 09.06 ветка `worktree-brainrepo` слита с main (общая точка `440fd71b`), и вся дальнейшая стройка (sealed-plan, Гейт-1/SE-2, G1/Level B, M6 FIX-5, наставник Фаза B, активация, smoke) шла на **main в ОСНОВНОЙ копии** `c:\моя\проекты\портал crm\Документация`. Worktree `brainrepo` — стейл-снимок 09.06, работать в нём нельзя. Инцидент 12.06: Фаза-8-сессия зашла по этому handoff в стейл-worktree → коммит `d1ad4e85` (sealedPlanCoversEdit live-wiring) повис на устаревшей базе (вносится cherry-pick'ом ВНУТРИ Фазы 8, см. роадмап), settings.json откатился, слияние не прошло. **Актуальный вход эпика — роадмап `docs/superpowers/specs/2026-06-12-router-mentor-roadmap.md`.**
>
> Состояние: дизайн → критразбор → Фазы 0/1/2/3 (handoff #4) → **СЕЙЧАС собраны Фаза 4 (4a/4b/4c+§12), Фаза 5, Фаза 6, Фаза 7-код** (TDD, гейт закрытия на каждой). Всё **commit-not-push** (origin не тронут). Регрессия tools-only **3163 passed + 2 skip** (baseline handoff#4 был 3090+2 → +73, 0 регрессий). Этот файл сменяет build-handoff #4. **Весь Claude-buildable код М7 готов** — дальше только шаги владельца: завершить ИИ-проводку судьи (реальный транспорт + активация) и **Фаза 8 «БОЛЬШОЙ ПЕРЕЕЗД»** (регистрация М1–М6 в settings.json + увольнение v4-зоопарка).

---

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

роутер-наставник. Машина 7. Состояние: **М1–М6 собраны; Фазы 0–7(код) СОБРАНЫ ПОЛНОСТЬЮ** (TDD, регрессия tools-only **3163 passed + 2 skip**, 0 регрессий). Всё **commit-not-push** (origin не тронут). Остались **шаги ВЛАДЕЛЬЦА**: (А) завершить ИИ-проводку судьи М4 — подключить реальный llmCall-транспорт в `runJudgeGate` + ключ в keychain + флаг + обкатка shadow→block; (Б) **Фаза 8 «БОЛЬШОЙ ПЕРЕЕЗД»** — атомарно зарегистрировать М1–М6 в `.claude/settings.json` + снять v4-зоопарк + тест-гейт §9.2 + откат. НИЧЕГО НЕ ДЕЛАЙ САМ ПОКА НЕ ПОДТВЕРДИШЬ СОСТОЯНИЕ — прочитай, сверь дерево, потом жди решения владельца (он либо делает шаги переезда, либо просит «пуш», либо иную работу).

1. ДЕРЕВО (вся работа здесь, НЕ в основном репо):
   путь:  c:\моя\проекты\портал crm\Документация\.claude\worktrees\brainrepo
   ветка: worktree-brainrepo  (ОПЕЧАТКА-ловушка: «Документация» — русские а/и)
   Подтверди: `git -C "<wt>" log -20 --oneline` (git ТОЛЬКО через PowerShell). Стейл-lock от закрытой сессии — попроси владельца.
   **Якоря коммитов (снизу вверх):** handoff#4 `3bd3caee` → Ф4a `02e3ff73`/`a29fa9ca`/`a630c994` → Ф4b `2f39286d`/`e791d33c`/`f3f3a70a` → Ф4c `97630256` → §12 `f9a4b10d` → Ф5 `2d2f3fc5`/`3ef85369` → Ф6 `6c53fe99`/`942f9bb8` → Ф7 `84de110f`/`1bc8b305`/`ee9e3123` → handoff #5 (верх). **HEAD = `ee9e3123`** (+ docs-коммит handoff#5).

2. ГЛАВНЫЕ ФАЙЛЫ (прочитать первыми):
   - Этот build-handoff #5 (что собрано + шаги владельца + тест-гейт §9.2).
   - Планы фаз (как делалось, образец TDD): `…-phase-4{,-4a,-4b,-4c}.md`, `…-phase-5.md`, `…-phase-6.md`, `…-phase-7.md`.
   - Спека М7: `docs/superpowers/specs/2026-06-08-router-mentor-machine-7-design.md` (§8 ИИ-проводка, §9 план переезда, §10 список увольнений, §12 инварианты).
   - Мастер-план: `docs/superpowers/plans/2026-06-08-router-mentor-machine-7.md` («Граф фаз»).
   - Память: `project_router_mentor_machine_7.md` + MEMORY.md по «роутер-наставник».

3. ГДЕ СТОИМ:
   - М1–М6 собраны ранее (ВЫКЛЮЧЕНЫ; в бою живёт v4-зоопарк). Фазы 0/1/2/3 М7 собраны (handoff #4).
   - **СЕЙЧАС собраны Фазы 4/5/6/7-код** (см. «ЧТО СОБРАНО» ниже).
   - **НЕ начато (шаги ВЛАДЕЛЬЦА):** завершение ИИ-проводки судьи (реальный транспорт + активация) + Фаза 8 (переезд).

4. ЧТО ДАЛЬШЕ — ТОЛЬКО ШАГИ ВЛАДЕЛЬЦА (Claude собрать не может):
   **(А) Завершить ИИ-проводку судьи М4 (§8 последняя фаза):**
   - Подключить реальный llmCall-транспорт + извлечение «продукта на суд» (что судит судья) в `tools/enforce-judge-gate.mjs::runJudgeGate(event)` (сейчас нейтральный GO, wired:false). Транспорт переиспользовать из `tools/llm-judge.mjs` (multiJudgeConsensus / callAnthropicAPI).
   - Положить ключ судьи в OS-keychain (паттерн signer; `tools/judge-key-config.mjs::resolveJudgeKey`).
   - Поднять флаг env `ROUTER_MENTOR_JUDGE_ENABLED=1`.
   - **Обкатать в shadow** (default при активации) → проверить логи → затем `ROUTER_MENTOR_JUDGE_MODE=block` (рекомендация §11 — прецедент L4 over-block, когда живой судья блокировал даже readonly).
   **(Б) Фаза 8 «БОЛЬШОЙ ПЕРЕЕЗД» (§9.3, settings.json — Claude'у закрыт):**
   - Тест-гейт §9.2 ДО переключения: регрессия ≥ 3163+2 ✅ (уже) + per-machine smokes (каждая М1–М6 блокирует свой класс, fail-CLOSE, громко) + интеграционные (escape сквозной / манифест кричит при снятом страже / закон требует ключ, карта — нет / дисциплина fail-CLOSE+громко / журнал-факт не обходится текстом). Зелёное по КАЖДОМУ — иначе не переключать.
   - Атомарно зарегистрировать в `.claude/settings.json` пост-переездный набор М1–М6 (см. `floor-manifest-check.DEFAULT_REQUIRED_HOOKS` — 9 хуков: enforce-floor / enforce-supreme-gate / enforce-judge-gate / enforce-snapshot / enforce-floor-escape-consume / enforce-read-path-deny / enforce-mcp-classification / enforce-normative-content-rules / enforce-skill-journaler) + поглощённую дисциплину Ф4 (enforce-coverage-verify / enforce-todowrite-skill-verifier / enforce-rationalization-audit / enforce-self-debrief-detector).
   - Снять v4-зоопарк (§10): router-gate / powershell-gate / runtime-write-deny / verify-before-push / verify-record / branch-switch / llm-judge-per-tool / llm-judge-response-scan / router-prehook / router-tool-gate / router-stop-gate / tdd-gate / tdd-real-test-verifier / decomposition-detector / safe-baseline-metering / parallel-session-lock / subagent-* и т.д.
   - Включить `sealedPlanCoversEdit` через plan-lock `actionMatchesStep` (build-loop §6) + расширить matcher normative-content-rules на дисциплинарные исходники.
   - **Откат:** глючит → escape/снимок М6 + one-shot возврат settings.json к зоопарку. Доска §7 (`docs/observer/STATUS.md`, секция «Кто на посту») покажет, что не встало.

5. ЦЕПОЧКА СКИЛОВ (СОГЛАСОВАНА владельцем, строгий вариант — держать на ВСЕХ фазах):
   - **Слой 0 — драйвер:** `superpowers:executing-plans` (инлайн; субагенты/Task/Workflow ЗАПРЕЩЕНЫ владельцем).
   - **Слой 0.5 — для scoped:** сначала `superpowers:writing-plans` развернуть bite-sized TDD-план.
   - **Слой 1 — per-Task:** `audit-context-building` (прочитать модуль ЦЕЛИКОМ) → `superpowers:test-driven-development` (RED→GREEN) → `superpowers:systematic-debugging` (на непредвиденный красный) → `superpowers:verification-before-completion`.
   - **Слой 1.5:** `sharp-edges` ПОСЛЕ опасных Task.
   - **Слой 2 — гейт закрытия:** `audit-context-building` → `sharp-edges` → `variant-analysis` → `regression` (tools-only, ≥ baseline) → `verification-before-completion` → коммит.
   - НЕ `requesting-code-review`. Скилы загружать раз, применять инлайн (coverage `direct:<role>`).

6. ЖЁСТКОЕ: commit-not-push (пуш ТОЛЬКО по слову «пуш» — через `superpowers:finishing-a-development-branch`); владельцу — простым языком, код/память — технически; **каждый ответ 1-я строка «экономия:…», 2-я «coverage:…»**. Memory-write требует активного `claude-md-management` (enforce-normative-content-rules живой) + coverage `direct:memory-sync`. **CLAUDE.md в worktree — НЕ трогать** (99.8KB uncommitted diff параллельной сессии router-gate v4, чужая зона).

7. КВИРКИ (подтверждены всеми сессиями):
   - vitest — через **Bash**, ОДНА абс.команда: `node "<wt>\app\node_modules\vitest\vitest.mjs" run --root "<wt>\app" --config "<wt>\app\vitest.config.tools.mjs" [фильтр] --reporter dot`. Фильтры РАЗДЕЛЬНО (`a b`), не `a|b`. Фильтр = подстрока имени файла.
   - git — через **PowerShell**, по одной команде, литеральные пути, БЕЗ переменных, БЕЗ if-чейнинга. Коммит: msg в `<wt>\.scratch\*.txt` (Write, UTF-8) → `git -C "<wt>" commit -F "<...>.txt"`. «Can't find lefthook in PATH» — ШУМ.
   - **PowerShell-гейт режет** `Get-Process`, `git ls-files`, `$var=...`, `Write-Output`, `Format-Table`. Список файлов — **Grep** (не Glob — junction). Существование — Read/Grep.
   - **enforce-tdd-gate:** prod-правка `tools/*.mjs` требует ПРЕДШЕСТВУЮЩЕЙ правки `*.test.mjs` в этом ходе (RED первым). Новый prod-файл — после нового тест-файла. **Перезапись существующего тест-файла** требует сперва Read его (harness).
   - **enforce-tdd-real-test-verifier:** дифф теста обязан содержать `it(`+`expect(` И ссылаться на правимый prod. Структурный тест (readFileSync src + assert) — легальный приём для не-юнит-правок (fail-CLOSE-конверсии, CLI-проводки): он содержит it/expect + readFileSync на prod-путь.
   - Тест-файлы: **for-of + it()**, НЕ `it.each`.
   - **Edit-anchor:** перечитывать точный текст перед заменой.
   - Чужая грязь в дереве (`docs/observer/*.jsonl` авто-регенерат / чужие планы `2026-06-05-*`/`2026-06-07-*` / `.scratch/` / `patch-*.mjs` / `setup-nm.mjs`) — НЕ коммитить. Стейджить ТОЛЬКО свои файлы поимённо.
   - `<wt>` = c:\моя\проекты\портал crm\Документация\.claude\worktrees\brainrepo

8. СТАРТ новой сессии: прочитай handoff #5 → сверь дерево (`git log`, HEAD = `ee9e3123` + docs handoff#5) → **жди решения владельца** (переезд Ф8 / завершение проводки судьи — шаги владельца; либо «пуш»; либо иная работа). Кодовая фраза: «роутер-наставник».

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

---

## ЧТО СОБРАНО ЭТОЙ СЕССИЕЙ (детально, 15 коммитов)

### Фаза 4 — поглощение дисциплины в М4 (8 коммитов)

- **4a** `02e3ff73`/`a29fa9ca`/`a630c994`: `enforce-coverage-verify` → журнал-факт K2 (пересечение «Skill-tool_use ЭТОГО хода ∩ журнал» — turn-scoping решён вариантом 4, без false-pass) + fail-CLOSE + снят override; `enforce-todowrite-skill-verifier` → журнал session-scope + fail-CLOSE + PreToolUse; оба в FAIL_CLOSE_DISCIPLINE_HOOKS.
- **4b** `2f39286d`/`e791d33c`/`f3f3a70a`: rationalization+self-debrief в манифест fail-CLOSE; `enforce-rationalization-audit` fail-OPEN→fail-CLOSE (язык мягкий, halt-counter сохранён; «структурный слот с якорем» = слоты вердикта судьи `validateVerdictSlots`, НЕ контроллер-текст → нет Класс-1-риска); decomposition покрыт `existenceCheck` Гейт-1 через журнал (proof-тест).
- **4c** `97630256`: Гейт-2 `planGateSteps`/`runPlanGate` (specToPlanCoverage+k5, sealed-план, закрыта Класс-1 дыра hasPlanIndicator text-mention) + Гейт-3 `runCriterionGate` absorption-proof (подписанный зелёный, не само-sentinel).
- **§12** `f9a4b10d`: whole-phase инвариант-гейт `m7-phase4-invariants.test.mjs` (fail-CLOSE / escape≠override / нет text-bypass / манифест-членство для поглощённых хуков).

### Фаза 5 — портативный normative-канал КАРТА/ЗАКОН + build-loop (2 коммита)

- `2d2f3fc5`: `classifyNormative` + `isDisciplineSourcePath` + `contentTouchesLaw` (КАРТА=CLAUDE.md/memory; ЗАКОН=Pravila/PSR/Tooling + дисциплинарный исходник ВНЕ плана + контент-правка правил; build-loop: под sealed-планом → КАРТА; сомнение→ЗАКОН).
- `3ef85369`: `decide` §6 — контент-слои (defense) → ЗАКОН требует escape владельца (скил недостаточен) → КАРТА-поток (skill+judge); `sealedPlanCoversEdit` точка инъекции (Ф8 wiring через plan-lock).

### Фаза 6 — доска «кто на посту» + манифест М1–М6 (2 коммита)

- `6c53fe99`: SE-B — `DEFAULT_REQUIRED_HOOKS` 5→9 (+М4 judge-gate, М6 snapshot/escape, М1 журналер).
- `942f9bb8`: `computeGuardBoardBlock` — доска в STATUS.md (регистрация каждого стража + режим судьи + «ПОСТ ПУСТОЙ», read-only).

### Фаза 7 — ИИ-проводка судьи М4, КОД-СТОРОНА (3 коммита)

- `84de110f`: `judgeGateMode` — inert/shadow/live-block (default shadow D28; рубильник важнее режима).
- `1bc8b305`: `enforce-judge-gate` mode-aware через `finalGate` (судья GO И пол чист → allow; иначе block; пол перевешивает; битый вердикт→NO-GO) + seam `runJudgeGate` (нейтральный GO до owner-транспорта — flip без транспорта не кирпичит) + live-main fail-CLOSE.
- `ee9e3123`: доска показывает реальный `judgeGateMode()` (не хардкод 'inert').

## Регрессия по фазам (0 регрессий на всём пути)

3090+2 (handoff#4) → 4a 3094 → 4b 3100 → 4c 3106 → §12 3122 → Ф5 3143 → Ф6 3152 → Ф7 **3163 passed + 2 skip**.

## Что НЕ сделано (ждёт владельца)

- Завершение ИИ-проводки судьи: реальный llmCall-транспорт + извлечение продукта в `runJudgeGate` + активация (ключ/флаг/режим).
- **Фаза 8** (переезд: регистрация М1–М6 в settings.json + увольнение зоопарка + sealedPlanCoversEdit live-wiring + matcher на дисциплинарные исходники).
- Push (только по «пуш»).
- Детальный рендер недавних escape/блоков в доске (счётчики есть, детализация — follow-up).
