# Машина 7 — BUILD-handoff #4 (Фазы 0/2/3 СОБРАНЫ + Фаза 4 SCOPED)

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

> Состояние: дизайн → критразбор → план → **Фаза 1 (content-floor) собрана ранее** → **СЕЙЧАС собраны Фазы 0, 2, 3 (TDD, гейт закрытия на каждой) + Фаза 4 разнесена в SCOPED план-док (4a/4b/4c)**. Всё закоммичено (commit-not-push, origin не тронут). Регрессия tools-only **3090 passed + 2 skip** (baseline Фазы 1 был 3044+2 → +46, 0 регрессий). Этот файл сменяет build-handoff #3. Следующий шаг — **Фаза 4a** через `superpowers:writing-plans` → `superpowers:executing-plans`.

---

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

роутер-наставник. Машина 7. Состояние: **Фазы 0, 2, 3 СОБРАНЫ ПОЛНОСТЬЮ** (TDD RED→GREEN, гейт закрытия на каждой, регрессия tools-only **3090 passed + 2 skip**, 0 регрессий). **Фаза 4 (поглощение дисциплины в М4) — РАЗНЕСЕНА в SCOPED план-док (4a/4b/4c), код НЕ начат.** Всё закоммичено (commit-not-push, origin не тронут). НИЧЕГО НЕ ДЕЛАЙ САМ ПОКА НЕ ПОДТВЕРДИШЬ СОСТОЯНИЕ — прочитай, сверь дерево, потом начинай Фазу 4a (или жди решения владельца).

1. ДЕРЕВО (вся работа здесь, НЕ в основном репо):
   путь:  c:\моя\проекты\портал crm\Документация\.claude\worktrees\brainrepo
   ветка: worktree-brainrepo  (ОПЕЧАТКА-ловушка: «Документация» — русские а/и)
   Подтверди: `git -C "<wt>" log -25 --oneline` (git ТОЛЬКО через PowerShell). Если git заблокирован `enforce-parallel-session-lock` — это СТЕЙЛ-lock от закрытой сессии; владелец закрыл предыдущее окно, lock освободится (или попросить владельца).
   **Якоря коммитов (снизу вверх):** `8e56df38` (Фаза 1 верх, было) → Фаза 0 `06ad12cd..8a9e21c2` (5) → Фаза 2 `f71f1abe..db322499` (6) → Фаза 3 `576e9c60..521a64ed` (4) → Фаза 4 SCOPED план `1d8457e6` → build-handoff #4 (верх).

2. ГЛАВНЫЕ ФАЙЛЫ (прочитать первыми):
   - Этот build-handoff #4 (разделы «ГДЕ СТОИМ», «ЧТО ДАЛЬШЕ — Фаза 4», «ЦЕПОЧКА СКИЛОВ», «КВИРКИ»).
   - План Фазы 4 (SCOPED): `docs/superpowers/plans/2026-06-08-router-mentor-machine-7-phase-4.md` — §4.2 mapping + 4a/4b/4c + §12 инварианты + **turn-scoping subtlety (решить ПЕРВЫМ в 4a)**.
   - Спека М7: `docs/superpowers/specs/2026-06-08-router-mentor-machine-7-design.md` (§4.2 таблица поглощения, §6 КАРТА/ЗАКОН, §7 доска/манифест, §8 судья, §9 переезд, §10 увольнения, §12 инварианты).
   - Мастер-план: `docs/superpowers/plans/2026-06-08-router-mentor-machine-7.md` («Граф фаз» — Фазы 5-8 scoped).
   - Закрытые планы (как делалось): `…phase-0.md`, `…phase-2.md`, `…phase-3.md` (полный TDD-стиль с реальным кодом — образец для разворачивания Фазы 4).
   - Память: запись по «роутер-наставник» (`project_router_mentor_machine_7.md` + MEMORY.md).

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

4. ЧТО ДАЛЬШЕ (Фаза 4 — самый большой объём, 3 под-фазы; ПЕРЕД каждой развернуть детальный bite-sized план через `superpowers:writing-plans`, читая поглощаемый хук целиком):
   - **4a (Pre/Stop):** coverage-verify + todowrite-skill-verifier перенацелить на **журнал-K2** (Фаза 3 `extractSkillCalls` → `skillTakenByJournal`) + fail-CLOSE (`disciplineOutcome` Фазы 0). **СНАЧАЛА решить turn-scoping:** журнал сессионный (кумулятивный), а coverage/todowrite требуют «навык вызван в ЭТОМ ходе» — наивный re-point даст false-pass (навык из прошлого хода). Варианты: turn-id в payload журнала / окно по `at`-времени / привязка к step-указателю стены. Это design-задача — решить в плане 4a.
   - **4b (Stop):** decomposition → Гейт-1 look-ahead (обещанные навыки ← журнал); rationalization → D31 пост-оценщик + halt-counter (язык-детектор = мягкий сигнал); self-debrief → влить в судью. Читать `enforce-decomposition-detector.mjs` / `enforce-rationalization-audit.mjs` / `enforce-self-debrief-detector.mjs` целиком ПЕРЕД правкой.
   - **4c (Гейты):** Гейт-2 (`specToPlanCoverage`+`k5CriterionCheck`) — prod-код только под шагом плана; Гейт-3 (`criteriaGreenMatched`+`fingerprintFresh`+`greenSignaturesValid`) — commit/push = подписанный зелёный по критерию. WIRING существующих пол-примитивов в judge-gate-обёртку.
   - **§12 инварианты Фазы 4 (финальный тест-гейт):** structural (нет `if(result.ok)` truthy — только `=== true` в дисциплине), grep (нет `assistantText.includes(marker)→block:false` — текст-байпас вырезан), escape≠protection (дисциплина без override-вокабуляра).
   - Затем **Фаза 5** (normative-канал КАРТА/ЗАКОН + build-loop, SE-D) → **6** (доска + манифест полного М1–М6, SE-B) → **7** (ИИ-проводка судьи М4, enforce-judge-gate live — ключ/флаг шаг владельца) → **8** (карты покрытия §5 + тест-гейт §9.2 + увольнения §10 + БОЛЬШОЙ ПЕРЕЕЗД §9.3 — владелец).

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

6. ЖЁСТКОЕ: commit-not-push (пуш ТОЛЬКО по слову «пуш»); владельцу — простым языком, код/память — технически; дыр не делать; **каждый ответ 1-я строка «экономия:…», 2-я «coverage:…»**. Фаза 8 (регистрация М7-хуков в `.claude/settings.json` + увольнение v4-зоопарка + push) — **шаг ВЛАДЕЛЬЦА** (Claude'у settings.json закрыт). До регистрации все собранные М7-хуки ИНЕРТНЫ (логика готова и протестирована, но не подключена).

7. КВИРКИ (подтверждены сессиями 0/2/3):
   - 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`. Фильтр = подстрока имени файла (напр. `enforce-floor`).
   - git — через **PowerShell**, по одной команде, литеральные пути, БЕЗ переменных ($var гейт режет), БЕЗ if-чейнинга. Коммит: msg в новый `<wt>\.scratch\m7-*.txt` (Write-tool, UTF-8) → `git -C "<wt>" commit -F "<wt>\.scratch\<msg>.txt"`. «Can't find lefthook in PATH» — ШУМ.
   - ⚠️ **PowerShell-гейт режет** `Get-Process`, `git ls-files`, `$var=...`, `Write-Output`/`echo`. Для списка файлов — **Grep** (надёжен), НЕ Glob (промахивается в junction). Для существования файла — Read/Grep.
   - **enforce-tdd-gate:** prod-правка существующего `tools/*.mjs` требует ПРЕДШЕСТВУЮЩЕЙ правки соответствующего `*.test.mjs` в этом ходе (RED первым). Новый prod-файл — тоже после нового тест-файла.
   - **enforce-tdd-real-test-verifier:** ДИФФ тест-правки обязан содержать `it(`+`expect(` И ссылаться на правимый prod. **Import-only правка теста БЛОКИРУЕТСЯ** (нет expect) — добавлять импорт ВМЕСТЕ с expect-содержащим блоком одним диффом (либо aliased-import рядом с describe).
   - Тест-файлы: **for-of + it()**, НЕ `it.each` (verifier не распознаёт).
   - **Edit-anchor:** перечитывать точный текст перед заменой — был случай `message: r.reason` (не `r.message`) сорвал anchor. Многострочный импорт — добавлять символы в существующий блок ИЛИ aliased-import у места использования.
   - **escape binding-ключ:** `canonicalAction(name,input)` — Bash→`bash:<norm cmd>`, PowerShell→`powershell:<norm cmd>`, mcp→`mcp:...`, иначе (Read/Write/Edit/…)→`write:<norm path>`. В тестах грант-ключ вычислять ТЕМ ЖЕ `canonicalAction` (детерминированное совпадение без знания нормализованного значения). NB: Read/Write одного пути → один ключ `write:<path>` (path-scoped, не op-scoped).
   - В рабочем дереве есть НЕ-наша грязь: `docs/observer/*.jsonl` (авто-регенерат), чужие планы `2026-06-05-*`/`2026-06-07-*`, `.scratch/`, `patch-*.mjs`, `setup-nm.mjs`, `commit-msg.txt` — НЕ коммитить, не трогать. Стейджить ТОЛЬКО свои файлы поимённо.
   - `<wt>` = c:\моя\проекты\портал crm\Документация\.claude\worktrees\brainrepo

8. СТАРТ новой сессии: прочитай handoff #4 + план Фазы 4 + спеку §4.2/§12 → сверь дерево (`git log`, верх = build-handoff #4, под ним `1d8457e6`) → **начни Фазу 4a: `superpowers:writing-plans` развернуть детальный план 4a (с решением turn-scoping), затем `superpowers:executing-plans` + TDD**. Если владелец сказал иное (ревью / пуш / иная фаза) — следуй ему.

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

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

---

## ЧТО СОБРАНО ЭТОЙ СЕССИЕЙ (детально)

### Фаза 0 — fail-CLOSE-карвут + escape-survivability примитивы (5 коммитов `06ad12cd..8a9e21c2`)
- `pathNormalizeSafe` (path-normalization.mjs) — тотальный normalize (на throw→''), строгий `pathNormalize` сохранён для content-стражей.
- `canonicalAction` (escape-grant.mjs) — тотальна (внешний try→`'unknown:'`, дефолт normalizeImpl=pathNormalizeSafe). Нулевой дрейф ключей.
- `disciplineOutcome`/`exitDisciplineDecision` + `FAIL_CLOSE_DISCIPLINE_HOOKS`/`FAIL_QUIET_OBSERVATION_HOOKS` + уточнён контракт `helpers:7` (enforce-hook-helpers.mjs). disciplineOutcome строгий: малформ-возврат decideFn → fail-CLOSE (sharp-edges-фикс).

### Фаза 2 — escape-survivability полная (6 коммитов `f71f1abe..db322499`)
- `escapeAllowsEvent(event,grants,consumed,now)` (escape-grant.mjs) — panic-предикат (тотален).
- enforce-floor `decide` — panic-ветка (floorDecide в try; throw+escape→allow; инъект `floorDecideImpl`).
- enforce-read-path-deny — escape-honor (escapeGrantOpen перед block).
- enforce-normative-content-rules — escape-honor §6 (escapeAction в начале decide → escaped owner law-edit проходит без skillActive).
- enforce-supreme-gate — `panicEscapeDecision` + main: ранняя загрузка escapes + catch-recheck (сетап бросил→escape оценён). decideMode G-1α уже escape-first (тест-инвариант под бросающим verify).
- NB: enforce-mcp-classification escape УЖЕ чтил (не трогали).

### Фаза 3 — skill-журналер + seed-allow реактивных (4 коммита `576e9c60..521a64ed`)
- `enforce-skill-journaler.mjs` (НОВЫЙ, PostToolUse) — пишет op:'Skill' в action-journal (дедуп vs wall pre-write через `shouldJournalSkill`) + `extractSkillCalls(entries)` мост журнал→K2. Best-effort main.
- SEED_SKILLS (supreme-gate) +`systematic-debugging`/`test-driven-development`/`requesting-code-review`/`verification-before-completion`.
- FAIL_CLOSE_DISCIPLINE_HOOKS +`enforce-skill-journaler`.

### Фаза 4 — SCOPED (план-док `1d8457e6`, код НЕ начат) — см. раздел «ЧТО ДАЛЬШЕ».

## Цепочка коммитов (на `worktree-brainrepo`, commit-not-push)
Фаза 0: `06ad12cd` `bbd66c9b` `dc30c5da` `91a5acc4` `8a9e21c2`
Фаза 2: `f71f1abe` `9148c8c6` `73fa2d61` `b6fe66e3` `317f8cb6` `db322499`
Фаза 3: `576e9c60` `3fad5e04` `5320de83` `521a64ed`
Фаза 4 plan: `1d8457e6` → build-handoff #4 (верх).

## Что НЕ сделано (ждёт)
- Фаза 4 код (4a/4b/4c), Фазы 5-8.
- Push (только по «пуш»).
- Регистрация М7-хуков в settings.json + увольнение v4-зоопарка (Фаза 8, владелец).
