# Машина 7 — BUILD-handoff #3 (Фаза 1 content-floor СОБРАНА + PS single-source)

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

> Состояние: дизайн → критразбор спеки → план → разбор плана (8 находок) → **Фаза 1 (content-floor) РЕАЛИЗОВАНА полностью + закрывающий variant-analysis-гейт нашёл и закрыл PS single-source дрейф**. Всё закоммичено (commit-not-push, origin не тронут). Регрессия tools-only **3044 passed + 2 skip** (baseline 2843+2, 0 регрессий). Следующий шаг — Фаза 0 (или иная по выбору владельца) через `superpowers:writing-plans` → `superpowers:executing-plans`. Этот файл сменяет build-handoff #2.

---

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

роутер-наставник. Машина 7. Состояние: **Фаза 1 (content-floor V1/V1-PS) СОБРАНА ПОЛНОСТЬЮ** + PS single-source дрейф закрыт (variant-analysis). Всё закоммичено (commit-not-push). Регрессия tools-only **3044 passed + 2 skip**, 0 регрессий. НИЧЕГО НЕ ДЕЛАЙ САМ — прочитай, подтверди состояние, и **жди решения владельца** (старт Фазы 0 / иной фазы / ревью / пуш).

1. ДЕРЕВО (вся работа здесь, НЕ в основном репо):
   путь:  c:\моя\проекты\портал crm\Документация\.claude\worktrees\brainrepo
   ветка: worktree-brainrepo  (ОПЕЧАТКА-ловушка: «Документация» — русские а/и)
   Подтверди: `git -C "<wt>" log -13 --oneline` (git через PowerShell). Верхний коммит Фазы 1 = `8e56df38` (PS single-source); ниже до `1c251d25` — 11 коммитов content-floor; под ними `15af97ad` handoff #2.

2. ГЛАВНЫЕ ФАЙЛЫ (прочитать первыми):
   - Этот build-handoff #3 (разделы «ГДЕ СТОИМ» + «ЧТО ДАЛЬШЕ» + «ЦЕПОЧКА СКИЛОВ»).
   - Спека М7: `docs/superpowers/specs/2026-06-08-router-mentor-machine-7-design.md` (§4.1 8 правил, §5 content-floor, §6 КАРТА/ЗАКОН, §10 порядок увольнений, §12 CI-инварианты, §13 changelog).
   - План: `docs/superpowers/plans/2026-06-08-router-mentor-machine-7.md` — «Граф фаз», «Правило перехода между фазами», §12-инварианты-по-фазам; ФАЗА 1 (Task 1.0–1.6) уже реализована; ФАЗЫ 0,2-8 — scoped-карты (разворачивать через writing-plans).
   - Память: запись по «роутер-наставник» (project_router_mentor_machine_7.md).

3. ГДЕ СТОИМ:
   - М1–М6 собраны ранее (ВЫКЛЮЧЕНЫ; в бою живёт v4-зоопарк). Фаза 1 М7 — собрана СЕЙЧАС.
   - **Фаза 1 — КОРЕНЬ переезда (§10 запрещает увольнять router-gate/powershell-gate до неё) — ЗАКРЫТА.** Что сделано:
     - P-1 единый источник Bash-content (matchBashHardBlacklist → shell-content-rules); классиф. +contentBlock; floor-decide content-block ветка Bash (bashIsContentBlock whole+per-segment+sub-shell-страж) и ветка PowerShell (matchPsHardBlacklist + psProtectedWrite forge-страж); canonicalAction +ветка PowerShell (escape специфичен, P-2); §12 инвариант (весь BASH_HARD_BLACKLIST floored по конструкции, P-6); escape-инвариант (Bash+PS+кросс-shell).
     - **PS single-source** (закрытие variant-analysis-находки): PS_HARD_BLACKLIST + matchPsHardBlacklist перенесены в shell-content-rules (единый дом, зеркало P-1); powershell-gate ре-экспортирует; пол через psContentBlock-делегат видит ТОТ ЖЕ набор, что гейт; +bare-egress +rmdir +rm.
   - sharp-edges-гейт (строгий, по выбору владельца) после Task 1.3 и 1.4 закрыл 2 структурных класса: sub-shell content-bypass (`$(echo no)$(echo de) -e`) + PS-алиасы forge/delete.
   - **Реализация Фаз 0, 2-8 НЕ начата.**

4. ЧТО ДАЛЬШЕ (план §«Граф фаз», dependency-ordered):
   - **Фаза 0** — fail-CLOSE-карвут (`enforce-hook-helpers` контракт :7 → дисциплинарное подмножество fail-CLOSE, P-7 список) + escape-survivability примитивы (тотальные canonicalAction/normalize). Acceptance: «дисциплинарный хелпер на ошибке → block», «canonicalAction на мусоре не бросает».
   - **Фаза 2** — escape-survivability полная (panic-ветка до per-tool + escape-honor во всех fail-CLOSE-стражах, L6/SE-I).
   - **Фаза 3** — skill-журналер (PostToolUse) + seed-allow реактивных навыков (SE-K). Журнал-K2 М4 зависит от этого.
   - **Фаза 4** — поглощение поведенческой дисциплины в М4 (coverage/todowrite/decomposition/rationalization/self-debrief через журнал-K2 + Гейт-2/Гейт-3). §12 structural+grep+escape≠protection инварианты.
   - **Фаза 5** — normative-канал КАРТА/ЗАКОН + build-loop-различитель (Кусок 2, SE-D).
   - **Фаза 6** — доска «кто на посту» + манифест полного М1–М6 (Кусок 3, SE-B). §12 манифест-тест.
   - **Фаза 7** — ИИ-проводка судьи М4 (enforce-judge-gate live, ключ/флаг — шаг владельца).
   - **Фаза 8** — карты покрытия §5 + тест-гейт §9.2 + увольнения §10 + БОЛЬШОЙ ПЕРЕЕЗД §9.3 (владелец). **Сюда же отнесены отложенные находки** (см. ниже).
   - Каждая фаза 0,2-8 — отдельный bite-sized план через `superpowers:writing-plans` ПЕРЕД сборкой.

5. ЦЕПОЧКА СКИЛОВ (СОГЛАСОВАНА владельцем, строгий вариант — держать на всех фазах):
   - **Слой 0 — драйвер:** `superpowers:executing-plans` (инлайн; субагенты/Task/Workflow ЗАПРЕЩЕНЫ владельцем).
   - **Слой 0.5 — для scoped-фаз 0,2-8:** сначала `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), не только на закрытии фазы. Находка → systematic-debugging → закрытие TDD.
   - **Слой 2 — гейт закрытия фазы:** `audit-context-building` → `sharp-edges` → `variant-analysis` (siblings: другие потребители/копии — это поймало PS single-source дрейф) → `regression` (tools-only, ≥ baseline) → `verification-before-completion` → коммит.
   - НЕ использовать в штатной форме `requesting-code-review` (диспетчит субагента — запрещено); заменять инлайн-адверсариалом Слоя 2.

6. ЖЁСТКОЕ: commit-not-push (пуш ТОЛЬКО по слову «пуш»); владельцу — простым языком, код/память — технически; дыр не делать; **каждый ответ 1-я строка «экономия:…», 2-я «coverage:…»** (coverage мульти-скил оркестрации = `direct:<role>` с перечислением скилов — иначе Stop-хук enforce-coverage-verify ругается, что skill-канал не совпал с реально вызванным).

7. КВИРКИ (подтверждены этой сессией):
   - vitest — через Bash, ОДНА абсолютная команда:
       node "<wt>\app\node_modules\vitest\vitest.mjs" run --root "<wt>\app" --config "<wt>\app\vitest.config.tools.mjs" [фильтр1 фильтр2 …] --reporter dot
     ⚠️ Несколько фильтров — РАЗДЕЛЬНЫМИ аргументами (`a b`), НЕ `a|b` (vitest трактует `|` буквально).
   - git — через PowerShell, по одной команде, литеральные пути, БЕЗ переменных ($var гейт режет) и БЕЗ if-чейнинга. Коммит: `git -C "<wt>" commit -F "<wt>\.scratch\msg.txt"`. «Can't find lefthook in PATH» — шум.
   - ⚠️ **Живые гейты блокируют удаление:** `rm`/`Remove-Item`/`git rm` → router-gate/powershell-gate hard-block. Физически удалить файл в сессии НЕЛЬЗЯ (`powershell-destructive.mjs` оставлен тонким делегатом — удаление follow-up по git-approval/владельцем).
   - ⚠️ `Write-Output`/`echo` в PowerShell-tool → powershell-gate default-deny. Не использовать в диагностике; git-команды напрямую.
   - ⚠️ Bash `&&`/`;`/`||` с мутирующей частью → router-gate C13 hard-block. Проверки делать Glob/Grep/Read, не shell-chain.
   - **enforce-tdd-gate:** prod-правка существующего модуля требует ПРЕДШЕСТВУЮЩЕЙ правки соответствующего `*.test.mjs` в этом ходе (TDD RED первым).
   - **enforce-tdd-real-test-verifier:** ДИФФ test-правки обязан содержать `expect(`+`it(` И ссылаться на правленый prod-файл. Comment-only / `+элемент-в-массив` правки теста ОТКЛОНЯЮТСЯ → добавлять полноценный `it(...expect...)`, не подменять в массиве.
   - Тест-файлы используют **for-of + it()**, НЕ `it.each` (его не распознаёт tdd-real-test-verifier).
   - worktree junction: пути от родителя «Документация» с префиксом `.claude/worktrees/brainrepo/...`. Glob иногда промахивается мимо существующего файла; Write в существующий файл требует предварительного Read.
   - В рабочем дереве есть НЕ-наша грязь (`docs/observer/*.jsonl` авто-регенерат + чужие `patch-*.mjs`/`setup-nm.mjs`/`commit-msg.txt`/`.scratch` от прошлых сессий) — НЕ коммитить, не трогать.
   - <wt> = c:\моя\проекты\портал crm\Документация\.claude\worktrees\brainrepo

8. ОТЛОЖЕНО В ФАЗУ 8 §5 (карты покрытия) — записать, не потерять:
   - Физическое удаление `tools/powershell-destructive.mjs` + теста (сейчас тонкий делегат над matchPsHardBlacklist; НЕ второй источник, но мёртв-для-floor). Требует git-approval / владельца.
   - Полная enumeration PowerShell-danger в едином PS_HARD_BLACKLIST: `&` call-operator, `Invoke-Command (icm)`, PS sub-expression `$()`, `.`-dot-sourcing. Это coverage, не структурный класс (структурные sub-shell+алиасы уже закрыты).
   - FP-толерантность пола PowerShell унаследована от гейта (например `sc query`/чтение `del.txt` блокируются как опасные токены) — осознанно, fail-safe, escapable. Если захочется сузить — отдельная задача (риск under-block, обсудить).

9. СТАРТ новой сессии: прочитай handoff #3 + спеку §10/§12 + план «Граф фаз» → подтверди состояние (верхний коммит `8e56df38`, Фаза 1 закрыта) → **СПРОСИ владельца, что делаем** (старт Фазы 0 / иной фазы / ревью / пуш). **Сам не начинай.**

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

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

---

## Цепочка коммитов Фазы 1 (на `worktree-brainrepo`, commit-not-push)

| Коммит | Что |
|---|---|
| `1c251d25` | P-1 единый дом matchBashHardBlacklist → shell-content-rules |
| `3847c863` | classify-destructive +contentBlock (V1 Bash) |
| `91af38ca` | powershell-destructive psContentBlock (V1-PS) — позже стал делегатом |
| `a5b62fbf` | canonicalAction +PowerShell — escape специфичен (P-2) |
| `89e9ca15` | floor-decide content-block ветка Bash (escapable) |
| `7277584e` | sharp-edges после 1.3: bashIsContentBlock рубит sub-shell как класс |
| `ea83a714` | floor-decide ветка PowerShell content-block + forge-страж (P-3) |
| `18373383` | sharp-edges после 1.4: PS-алиасы forge+delete |
| `6556f5ca` | инвариант escape снимает content-block (Bash+PS) + специфичность P-2 |
| `473fd211` | §12 content-floor инвариант — весь BASH_HARD_BLACKLIST floored (P-6) |
| `8e56df38` | **PS single-source** — matchPsHardBlacklist в shell-content-rules (variant-analysis) |

Верхний = `8e56df38`. Под цепочкой — `15af97ad` (handoff #2).

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

- Фазы 0, 2-8 (scoped — разворачивать через writing-plans при подходе).
- Push — только по «пуш» (origin не тронут).
- Удаление `powershell-destructive.mjs` (Фаза 8 / git-approval).
