diff --git a/docs/superpowers/plans/2026-06-08-router-mentor-machine-7-build-handoff-4.md b/docs/superpowers/plans/2026-06-08-router-mentor-machine-7-build-handoff-4.md new file mode 100644 index 00000000..853e86b0 --- /dev/null +++ b/docs/superpowers/plans/2026-06-08-router-mentor-machine-7-build-handoff-4.md @@ -0,0 +1,101 @@ +# Машина 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 "" 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:` с перечислением скилов (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 "\app\node_modules\vitest\vitest.mjs" run --root "\app" --config "\app\vitest.config.tools.mjs" [фильтр] --reporter dot`. Несколько фильтров — РАЗДЕЛЬНЫМИ аргументами (`a b`), НЕ `a|b`. Фильтр = подстрока имени файла (напр. `enforce-floor`). + - git — через **PowerShell**, по одной команде, литеральные пути, БЕЗ переменных ($var гейт режет), БЕЗ if-чейнинга. Коммит: msg в новый `\.scratch\m7-*.txt` (Write-tool, UTF-8) → `git -C "" commit -F "\.scratch\.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:`, PowerShell→`powershell:`, mcp→`mcp:...`, иначе (Read/Write/Edit/…)→`write:`. В тестах грант-ключ вычислять ТЕМ ЖЕ `canonicalAction` (детерминированное совпадение без знания нормализованного значения). NB: Read/Write одного пути → один ключ `write:` (path-scoped, не op-scoped). + - В рабочем дереве есть НЕ-наша грязь: `docs/observer/*.jsonl` (авто-регенерат), чужие планы `2026-06-05-*`/`2026-06-07-*`, `.scratch/`, `patch-*.mjs`, `setup-nm.mjs`, `commit-msg.txt` — НЕ коммитить, не трогать. Стейджить ТОЛЬКО свои файлы поимённо. + - `` = 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, владелец).