# Машина 7 — «Растворение зоопарка + непробиваемая дисциплина + переезд» — дизайн

**Дата:** 2026-06-08 · **Статус:** дизайн согласован + **прошёл независимый критический разбор, поправки внесены (см. §13)** · **Ветка:** `worktree-brainrepo`
**Кодовая фраза эпика:** «роутер-наставник».
**Предшественники:** Машины 1–6 собраны, проаудичены, закоммичены (commit-not-push, baseline tools-only **2843 passed + 2 skip**). М7 опирается на швы М5 §5 (пол/классификатор/подписант/критерий) и М6 §6 (escape/снимок). Это **полный дизайн ПЕРЕД планом реализации** — `superpowers:writing-plans` следующий шаг; код не строим, пока план не написан и не одобрен.

**Метод подготовки (цепочка скилов, одобрена владельцем):** `audit-context-building` (построчный разбор дисциплины + карта обходов) → `sharp-edges` (адверсариальный стресс-тест: где дизайн сам провоцирует обход) → `variant-analysis` (sweep всех близнецов каждого класса по всем хукам и машинам) → `superpowers:brainstorming` (этот дизайн). Реализация — инлайн TDD (субагенты/Task/Workflow запрещены ограничением владельца).

---

## 1. Зачем — цель и принцип атрибуции

**Канонический запрос владельца (дословно):** *«когда мы запустим в бой все 1–6 машины и они будут тобой обходиться — я не смогу понять, толи это ты нашёл обход в их работе, толи глючат машины. Поэтому дисциплина это главное.»*

Из этого следует **инженерная цель М7** — не «добавить ещё правил», а сделать дисциплину **атрибутируемой**:

> Если работа прошла мимо дисциплины — это должно быть ОДНОЗНАЧНО одно из трёх **видимых** событий:
> 1. **дисциплина выполнена честно** (контроллер реально сделал требуемое — видно по журналу), ЛИБО
> 2. **владелец кликнул escape** (законный обход, записан в защищённый канал), ЛИБО
> 3. **машина глючит** (видимый блок с ошибкой / громкий крик «пост пустой»).
>
> **Четвёртого — «тихо проскользнул» — НЕ существует.** Тогда любая аномалия атрибутируется без догадок: глюк машины ≠ хитрость контроллера.

**Условия, при которых промис держится (критический разбор 2026-06-08, честно).** Промис §1 не самоочевиден — он держится ТОЛЬКО при трёх предпосылках, иначе «тихо проскользнул» возможен:
- **(П1) Content-floor полон** (§4.1 правило 8 + §5): пол рубит опасное-по-содержанию (произвольное исполнение / install / egress / redirect) **независимо от членства в плане**. Без этого вредная in-plan команда (`node -e`, `curl`-exfil) проскальзывает — стена проверяет лишь членство, пол лишь необратимость (находка V1).
- **(П2) Escape сквозной и переживает сбой** (§4.1 правило 7 + §6): escape оценивается ДО любой бросающей логики и чтится ВСЕМИ fail-CLOSE-стражами. Без этого баг fail-CLOSE-хука кирпичит сессию мимо escape (находка SE-I/L6).
- **(П3) Думающий слой М4 жив для не-skill каналов** (§8 + §11): `direct`/`node`/`chain` журналом механически не верифицируемы — их оправданность судит только ИИ-слой М4. При $0/деградации судьи эти каналы — на доверии (находка SE-C). Доска §7 обязана показывать, жив ли М4-ИИ.

Четыре структурных условия этой цели (см. §3–§7):
- **Непробиваемая дисциплина** (Кусок 1): контроллер не может обойти тихо — включая content-floor (П1) и журнал-факт навыков (§4.2 + skill-журналер).
- **Сквозной живучий escape** (П2): единственная законная дверь не отключается сбоем и работает против всех стражей.
- **Неприкосновенный закон** (Кусок 2): контроллер не может переписать сами правила, что его связывают.
- **Доска видимости** (Кусок 3): владелец видит, что произошло — включая здоровье М4-ИИ (П3).

М7 закрывает три отложенных в М5 §6 / М6 §7 куска: растворение старого дисциплинарного зоопарка, портативный normative-канал правок «мозга», доска «кто на посту».

---

## 2. Карта обходов дисциплины (доказательная база)

Построчный аудит (`audit-context-building`) + sweep (`variant-analysis`) дали полную карту. **Сначала классы, потом конкретика** (урок проекта: закрытие 99% одного класса не помогает, если атакующий берёт другой класс).

### 2.0 КОРЕНЬ (одна причина почти всего)

`tools/enforce-hook-helpers.mjs:7` — архитектурный контракт: **«ВСЕ хуки ОБЯЗАНЫ fail-quiet (exit 0) при ошибке»**. Это анти-самоблокировка по дизайну — и ровно она делает дисциплину обходимой и неотличимой от глюка. Прецедент инверсии уже есть: `enforce-normative-content-rules.mjs:203` М5 **уже** перевернул свой fail-quiet → fail-CLOSE («ошибка → блок, требует владельца»). М7 распространяет этот карвут на ВСЮ дисциплину.

### 2.1 Классы обходов и все их экземпляры

| Класс | Суть | Экземпляры (все, по sweep) |
|---|---|---|
| **Класс 1 — controller-text → ПРОПУСК** ⚠️ | Контроллер пишет строку в своём тексте → дисциплина расступается | `branch-switch` (маркеры `BRANCH-SWITCH-CONFIRMED`/`RECOVERY-INTENT:`, читаются из `lastAssistantText`, стр. 57-58/68-69) · `router-tool-gate` (routing-tag `<!-- routing: direct_justified=true -->`, `decodeRoutingTag`, стр. 85/120) · `memory-coverage` (своя строка `coverage: direct:memory-sync`, стр. 44-46, без проверки) · `coverage-verify` (`direct`/`node`/`chain`/`hook`/`agent` принимаются на слово, стр. 77-78; только `skill:` сверяется с реальным вызовом, стр. 63-74) · `tdd-gate` (упоминание пути `docs/superpowers/plans/...` в тексте = «план есть», `hasPlanIndicator` стр. 129) |
| **Класс 2 — fail-open** | `catch → block:false`: ошибка/сбой хука → молча пропуск | `memory-coverage`, `coverage-verify`, `branch-switch`, `verify-before-push`, `verify-record`, `todowrite-skill-verifier` (стр. 90), `tdd-gate`, `rationalization-audit` (8 шт. — все дисциплинарные main') |
| **Класс 3 — no-op / warn-only** | Зарегистрирован, но не блокирует вообще | `decomposition-detector` (no-op main, стр. 50) · `safe-baseline-metering` (no-op main, стр. 18) · `parallel-session-lock` (no-op main «until Phase H», стр. 12) · `router-tool-gate` (режим по умолчанию warn-only, стр. 67) |
| **Класс 4 — never-block / timing** | Срабатывает ПОСЛЕ действия, ловит следующий ход | `rationalization-audit` (PostToolUse, никогда не блокирует — только флаги) · `coverage-verify`/`todowrite` (Stop — текущее нарушение уже произошло) |
| **Класс 5 — структурно-только** | Проверяет форму, не смысл | `tdd-real-test-verifier` (требует `expect/it` + ссылку на prod-файл, но `expect(true).toBe(true)` проходит; семантику добивает только мутация М5) |
| **Класс 6 — мёртвый словарь** | Уже закрыт, но реклама осталась | `findOverride`/`findOverrideAttempt` → `null` (v4 §4.2, `helpers.mjs:209-221`): фразы `срочно`/`memory dump`/`recovery`/`без скилов`/`ремонт инфраструктуры` **не обходят**. НО block-сообщения и §17-напоминания их ещё называют (stale, вводит в заблуждение — `verify-before-push:74`, `memory-coverage:58`, `branch-switch:71` и ~10 вызовов findOverride) |

### 2.2 Чистый раскол (sweep подтвердил)

- **Защита уже fail-CLOSE** (11 файлов): `supreme-gate`, `floor`, `snapshot`, `read-path-deny`, `mcp-classification`, `normative-content-rules`, `router-gate`, `powershell-gate`, `tdd-real-test-verifier`, `self-debrief-detector`, `runtime-write-deny` (по пути блока).
- **Дисциплина fail-OPEN** (8 файлов): см. Класс 2. Это и есть мишень М7.

### 2.3 Усиления sharp-edges (что под-весил аудит)

- **SE1 — конфиг-обрыв «регистрация»:** дисциплина включена, только если хук зарегистрирован; отсутствие = тихо выключено, ничто не кричит. Эмпирически: весь костяк М1–М6 сейчас **не зарегистрирован** (инертен), и никто не предупредил. → правило 5 (манифест-самопроверка).
- **SE2 — fail-open = неотличимость:** сбой машины и тихий обход выглядят одинаково («прошло без блока»). Это прямой враг цели §1. → правило 1 (fail-CLOSE + крик).
- **SE3 — stringly-typed доверие = корень Класса 1:** сигнал доверия живёт как подстрока в канале, куда пишет контроллер. → правило 3 (журнал-факт) + правило 4 (авторизация только escape).
- **SE4 — врущая подсказка:** мёртвые фразы в сообщениях → confused-developer импровизирует. → чистка Класса 6.
- **SE5 — небезопасный дефолт режима:** warn-only по умолчанию. → enforce by construction.
- **SE6 — timing:** PostToolUse/Stop не предотвращают. → правило 2 (PreToolUse).

---

## 3. Целевая оборона — кто на посту после переезда

После переезда живут **только машины М1–М6** (одна связная оборона):

| Страж | Охраняет |
|---|---|
| **М1 Фундамент** | Журнал (неподделываемый канал фактов) + ключ подписи. Субстрат всего. |
| **М2 Стена** | Действие обязано быть шагом запечатанного плана. |
| **М3 Роутер** | Каким навыком решать задачу (по журналу, не по моему тексту). |
| **М4 Судья** | Приёмка ТЗ/плана/результата против цели + надзор; механический пол $0 + ИИ-голоса прицельно. |
| **М5 Пол** | Необратимое/секреты — намертво, даже при мёртвом судье. |
| **М6 Ключ+снимок** | Escape владельца (единственная законная дверь, сквозной) + точка отката. |

---

## 4. Кусок 1 — Поглощение дисциплины в М1–М6 (непробиваемо)

### 4.1 Восемь правил ужесточения (6 из brainstorm + 2 из критического разбора; применяются к КАЖДОЙ поглощённой дисциплине)

1. **fail-CLOSE** — карвут из контракта `helpers:7`: дисциплинарный страж при любой своей ошибке → **блок** (не fail-quiet). Прецедент — `normative-content-rules:203`.
2. **PreToolUse где предотвращение, Stop где только детекция** — предотвращать до действия (лечит SE6). NB (критический разбор): часть дисциплины по природе пост-фактумная (рационализация-язык → пост-оценщик; полнота результата → Гейт-3). Её НЕ выдавать за PreToolUse: §4.2 явно метит каждую строку `[Pre]` (предотвращение) / `[Stop]` (детекция). Что можно предотвратить (навык-перед-действием, тест-перед-кодом, действие-в-плане) — строго Pre.
3. **Журнал-факт, не мой текст** — проверяем, что навык реально вызван / тест реально прогнан, по журналу М1 (контракт K2 судьи), а НЕ по строке, что написал контроллер (лечит Класс 1 / SE3).
4. **Авторизация только владельцем = escape М6** — никаких controller-маркеров/фраз/тегов. Единственное «пройти мимо» — подписанный клик владельца через AskUserQuestion side-channel, видимый в журнале (лечит Класс 1 / SE3).
5. **Манифест-самопроверка** — на старте громко кричит, если дисциплинарный страж не зарегистрирован (лечит SE1); созвучно М4 §12 «J5 → пост пустой».
6. **Громко на каждый блок** — глюк → видимый блок с диагностикой → атрибутируется машине (лечит SE2, замыкает цель §1).
7. **Escape-survivability** (критический разбор, лечит SE-I/L6) — аварийный выход владельца обязан: (а) оцениваться ДО любой бросающей вычисления (canonicalAction/normalize **тотальны** — никогда не бросают; вход всегда доходит до escape-чека); (б) иметь session-level panic-ветку, проверяемую раньше per-tool-логики; (в) чтиться ВСЕМИ остающимися fail-CLOSE-стражами (`read-path-deny`/`mcp-classification`/`normative-content-rules`), не только стеной/полом/egress. Иначе единственное восстановление — правка settings.json (owner-only), т.е. дисциплинарный баг = кирпич.
8. **Content-floor независимо от плана** (критический разбор, лечит V1/V1-PS) — несущий пол рубит не только НЕОБРАТИМОЕ, но и ОПАСНОЕ-ПО-СОДЕРЖАНИЮ (произвольное исполнение `node -e`/`bash -c`/`python -c`/`eval`; install пакетов; egress `curl`/`wget`/`nc`/`socat`; stdout-redirect) — **даже валидным шагом плана** (как сейчас рубит снос БД, Δ7). Это перенос полного `BASH_HARD_BLACKLIST` (и PowerShell-эквивалента) в пол, а НЕ растворение в «необратимое». Без правила 8 in-plan вредный content проскальзывает (стена = членство, пол = необратимость).

### 4.2 Таблица поглощения

| Дисциплина зоопарка | → Машина | Ужесточённая форма |
|---|---|---|
| План перед prod-кодом (`tdd-gate` #6) | **М4 Гейт-2 + М2 стена** | План — запечатанный артефакт (не упоминание пути в тексте); действие обязано быть шагом запечатанного плана. fail-CLOSE, PreToolUse. |
| RED-тест перед кодом (`tdd-gate` #3) | **М5 критерий+мутация** | Настоящий зелёный по критерию + мутация P18 (сломал код → тест краснеет). Пустой тест не проходит. |
| Тест — настоящий (`tdd-real-test-verifier`) | **М5** | Уже fail-CLOSE; +мутация добивает семантику Класса 5. |
| Проверка перед commit/push (`verify-before-push`/`verify-record`) | **М4 Гейт-3 + М5 GREEN** | Подписанная зелёная расписка (М5 signer), не само-написанный sentinel. fail-CLOSE. |
| Безопасность ветки (`branch-switch`) | **М2 стена + М6 escape** | Маркеры `BRANCH-SWITCH-CONFIRMED`/`RECOVERY-INTENT:` **удалены**; единственное «да» на ветку — escape-клик владельца. fail-CLOSE. |
| Coverage = реальный навык (`coverage-verify`/`memory-coverage`) `[Pre+Stop]` | **М4 журнал K2 + skill-журналер** | Проверка по ЖУРНАЛУ вызовов (М1), не по строке `coverage:`. **Поправка (SE-C/SE-K):** журнал-факт верифицирует ТОЛЬКО `skill:`-канал; `direct`/`node`/`chain` журналом не верифицируемы (нет Skill-вызова) — их судит думающий М4 (П3 §1), механически не закрыть. Чтобы K2 видел навыки, нужен **PostToolUse skill-журналер** (§12), пишущий КАЖДЫЙ Skill-вызов в журнал независимо от членства в плане (иначе seed/ad-hoc навыки в журнал не попадают). fail-CLOSE. |
| TodoWrite заявил навык (`todowrite-skill-verifier`) `[Pre]` | **М4 журнал K2 + skill-журналер** | Журнал-факт (через skill-журналер §12). fail-CLOSE, PreToolUse. |
| Скрытое дробление (`decomposition-detector`) `[Stop]` | **М4 Гейт-1 look-ahead** | Обещанные навыки сверяются с журналом; no-op хук удалён. Детекция пост-фактумная — Stop, не выдавать за Pre. |
| Рационализация (`rationalization-audit`) `[Stop]` | **М4 пост-оценщик D31 + halt-counter** | Жёсткое — структурные слоты М4 (нельзя продолжить, не заполнив, с якорем); детектор-языка остаётся мягким сигналом в оценщик. Пост-фактумная — Stop. |
| Self-debrief без retro (`self-debrief-detector`) | **М4 дисциплина** | Уже fail-CLOSE; вливается в дисциплину судьи. |
| Косметический AskUser (`askuser-cosmetic-detector`) | **остаётся** (рядом с М3/М4) | Уже жёсткий, журнал-сверка brainstorming. |
| Роутинг §17 (`router-tool-gate`/`prompt-injection`-reminder) | **М3 роутер + М2** | routing-tag-обход **удалён**; «не тот навык» ловит М3 по журналу; warn-only → enforce. |

**Куда что легло:** **М4** забирает почти всю поведенческую дисциплину (план/verify/coverage/todowrite/decomposition/rationalization/self-debrief — всё через **журнал-факт K2**, не текст). **М5** — тесты+мутация+подписанный GREEN **+ content-floor (правило 8)**. **М2** — ветка + действие-в-плане. **М6** — единственная законная дверь. **М3** — роутинг. **М1** — журнал+ключ, на которых всё стоит.

**Несущая зависимость журнала (критический разбор SE-K).** Журнал-факт K2 работает ТОЛЬКО если журнал реально ловит Skill-вызовы. Сейчас журнал пишет ТОЛЬКО `supreme-gate` на allow шага плана → seed-навыки (`writing-plans`/`brainstorming`/`discovery-interview`) и observe-only **не журналятся**, а non-seed навык журналится лишь как шаг плана. Значит: (1) нужен **PostToolUse skill-журналер** — пишет каждый Skill-вызов в журнал независимо от плана; (2) **реактивные дисциплинарные навыки** (`systematic-debugging`/`test-driven-development`/`requesting-code-review` — их зовут на внезапный баг, заранее не планируя) добавить в seed-allow стены (иначе стена их рубит как «вне плана»). Без (1)+(2) §4.2 coverage/todowrite/«журнал-сверка brainstorming» невыполнимы.

---

## 5. Карты покрытия (доказать: при увольнении ничего не теряем)

Перед увольнением каждого живого стража строится **карта покрытия** — таблица «каждое его блокирующее правило → покрыто ли полом/стеной/судьёй». Увольнение только при 100% покрытии; непокрытое → переносится в принимающую машину **до** удаления.

> **Поправка критического разбора (V1, КРИТИЧНО).** Прежняя формула «покрыто полом (необратимое) ИЛИ стеной (вне плана) ИЛИ переносится в пол как явный класс» была **материально неполна**: стена проверяет лишь ЧЛЕНСТВО в плане (не содержание), пол — лишь НЕОБРАТИМОСТЬ. Значит весь content-blacklist router-gate, КРОМЕ необратимого субсета, проскальзывал как шаг плана. Закрытие — правило 8 §4.1: **полный `BASH_HARD_BLACKLIST` переносится в пол отдельным content-классом, рубящим независимо от членства в плане** (не «растворяется»).

| Увольняемый | Карта покрытия (что доказать) |
|---|---|
| `router-gate` (Bash content default-deny) | **Перенос ПОЛНОГО `BASH_HARD_BLACKLIST` (`enforce-router-gate.mjs:45-73`) в content-floor М5 (правило 8), рубящий ВНЕ зависимости от плана.** Покрыть поимённо: (1) **arbitrary-exec** `node -e/-p/--eval/-r/--import`, `python -c`, `bash/sh -c`, `eval`, node-inline-`fs.*` — критично: это отмычки, способные подделать escape-грант в `~/.claude/runtime` и подорвать машины (floor-write-guard только Write-TOOL, не node-fs); (2) **install** `npm/yarn/pnpm/composer install/require/add`, `npx claude-*`; (3) **egress** `curl -X`, `wget`, `nc/ncat/netcat`, `socat`; (4) **redirect** `>`/`>>`/`2>file` (C16); (5) **env-prefix-интерпретатор**, `--watch` persistent; (6) sub-shell `$(...)`, prompt-injection `echo`. Необратимый субсет (`rm -rf`/`migrate:fresh`/`reset --hard`/force-push/`db:wipe`) уже в `FLOOR_RE`. Whitelist-подход router-gate (default-deny) снимается — content-безопасность Bash держат content-floor (всегда) + членство-в-плане (стена). |
| `powershell-gate` (PowerShell content) `[V1-PS]` | **Реоткрытие v3.8 F1 при наивном увольнении.** `floor-decide` инспектирует команду только при `name==='Bash'` (стр. 85) → PowerShell-tool пол не смотрит вообще. Перенос: content-floor правила 8 расширить на PowerShell-tool отдельным набором (`Remove-Item -Recurse -Force`, `Invoke-WebRequest`/`iwr`, `iex`, redirect `>`/`Out-File`, `Start-Process` интерпретатора) — PS-нативные глаголы НЕ матчат unix-regex, нужен свой набор. **+ Поправки разбора плана:** (P-2) `canonicalAction` ОБЯЗАН получить ветку PowerShell (`powershell:…`) — без неё все PS-команды схлопываются в `write:`, escape неспецифичен (один грант открывает все PS); (P-3) PS-ветка пола рубит запись write-глаголом (`Set-Content`/`Add-Content`/`Copy-Item`/…) в защищённый путь — иначе PS подделывает escape-грант. См. план Task 1.2b/1.4. |
| `L4` (`llm-judge-per-tool`/`response-scan`) | Тупой per-tool consistency-вопрос → покрыт надзором А2 судьи М4 (расхождение → голос «Верность намерению»). М4 шире (приёмка ТЗ/плана/результата). |
| `runtime-write-deny` | Запись Write-инструментом в `~/.claude/runtime` → ветка пола М5 (RUNTIME_RE). **NB (правило 7):** после переезда обязан чтить escape (сейчас не чтит — DOC-1). |
| `verify-before-push` / `verify-record` | «Свежая проверка перед push» → М5 по-критерийный подписанный GREEN + М4 Гейт-3. |
| `branch-switch` | «Правильная ветка» → шаг запечатанного плана (М2) + escape владельца (М6). Маркеры `BRANCH-SWITCH-CONFIRMED`/`RECOVERY-INTENT:` удалены. |
| `read-path-deny` / `mcp-classification` / `normative-content-rules` (остаются §10) | Остаются content-стражами, НО **обязаны начать чтить escape (правило 7/L6)** — иначе escaped-правка ЗАКОНА (§6) блокируется нормативным стражем, не знающим escape. |
| дисциплина (memory-coverage/coverage-verify/todowrite/tdd-gate/decomposition/...) | См. §4.2 — каждая в свою машину, журнал-факт (через skill-журналер §12). |

---

## 6. Кусок 2 — Портативный normative-канал (правка «мозга»)

**Проблема:** локдаун (fail-CLOSE везде) залочит и правку самого мозга. Без санкционированного канала контроллер не сможет даже обновить CLAUDE.md/память (прецедент Read-deny over-block, `feedback_read_path_deny_blocks_claude_md`).

**Два сорта мозга (ключ дизайна):**
- **КАРТА** (operational): `memory/*.md`, `CLAUDE.md`, заметки. Контроллер ведёт постоянно (ловит уроки) — это его работа.
- **ЗАКОН** (normative): `Pravila`, `PSR`, `Tooling` + **любой файл, меняющий сами правила/дисциплину машин**. Это правила, что СВЯЗЫВАЮТ контроллера.

**Модель авторизации (решение владельца — гибрид):**
- **Правка КАРТЫ** — низкий порог: content-страж (`normative-content-rules` М5: «память = совет, НИКОГДА не разрешение», без инъекций) + журнал + видно на доске. Контроллер ведёт свободно, владелец видит после.
- **Правка ЗАКОНА** — **требует escape-ключа владельца** (М6). Контроллер **не может переписать правила, что его связывают**, без подписанного согласия. Это отрезает «тихое само-ослабление дисциплины под видом легитимного обновления мозга».

**Портативность:** канал — **локальный** (своя церемония + страж содержимого), **не зависит от внешнего MCP-плагина** `claude-md-management` (был прецедент «недоступен после disconnect»). Существующий рабочий процесс (плагин) остаётся допустимым, но не является единственной точкой отказа.

**Граница КАРТА/ЗАКОН — детерминированная** (по пути файла + по содержимому: правка секции правил/дисциплины в любом файле → ЗАКОН). Сомнение → ЗАКОН (нужен ключ). Эта классификация — в коде, не «на доверии».

**Поправка критического разбора (SE-D — дилемма build-loop).** «Любой файл, меняющий правила/дисциплины машин → ЗАКОН → escape» включает исходники `tools/enforce-*.mjs` / `judge-*.mjs` / `floor-*.mjs`. Но сами М1–М6 СТРОЯТСЯ правкой этих файлов через TDD — если каждая правка требует escape владельца, цикл сборки клинит (тот же класс over-block, что Read-deny/L4). Разрешение:
- **Правка дисциплинарного исходника ПОД запечатанным планом-стройки** (артефакт плана = эта спека М7 / последующий план реализации) — НЕ требует escape: ею уже управляет стена М2 (действие = шаг плана) + content-floor + TDD-гейт. Самомодификация в этом случае санкционирована планом, который владелец одобрил.
- **Правка дисциплинарного исходника ВНЕ запечатанного плана** (ad-hoc «подкрутить хук на лету») — ЗАКОН → escape владельца. Это и есть защита «контроллер не переписывает связывающие его правила втихую».
- Детерминированный различитель — тот же `actionMatchesStep`, что у стены: есть валидный замороженный план, чей шаг покрывает эту файл-правку → КАРТА-режим сборки; нет покрытия → ЗАКОН.

**Escape для ЗАКОНА должен реально работать (SE-I/L6).** Escaped-правка ЗАКОНА идёт через остающийся `normative-content-rules` (страж нормативки), который сейчас escape НЕ знает → заблокирует легитимную escaped-правку. Правило 7 §4.1 обязывает: `normative-content-rules` (и прочие remaining-стражи) читают escape-грант и пропускают точное совпадение канон-строки. Существующая skill-exemption (claude-md-management) остаётся параллельным легальным каналом для КАРТЫ.

---

## 7. Кусок 3 — Доска «кто на посту» (read-only)

Живой дашборд состояния обороны — расширение существующего `docs/observer/STATUS.md` (генератор-наблюдатель). **Read-only, ничего не блокирует, низкий риск.**

Содержимое:
- **Каждая из М1–М6:** зарегистрирована? активна? (через манифест-самопроверку §4.1 правило 5).
- **Здоровье судьи М4:** работает / деградировал до пола / бюджет исчерпан (М4 §12 «упал → ГРОМКО кричит, пост пустой») **+ режим: inert ($0) / shadow (D28 — логирует, не блокирует) / live-block** — критично для П3 §1: при не-live-block судья НЕ закрывает `direct`/`node`-каналы, доска обязана это показать, иначе ложное чувство защиты.
- **Манифест:** любой страж не на месте → **«⚠️ ПОСТ ПУСТОЙ»** (нельзя объявить «оборона стоит» без подтверждения).
- **Недавние escape** (клики владельца — законные обходы, для аудита) + **недавние блоки** (что остановлено) + **стоимость судьи** (он платный).

**Поправка критического разбора (SE-B — манифест неполон).** `floor-manifest-check::DEFAULT_REQUIRED_HOOKS` сейчас проверяет 5 хуков (`enforce-floor`/`enforce-supreme-gate`/`enforce-normative-content-rules`/`enforce-read-path-deny`/`enforce-mcp-classification`) — **без М4 (`enforce-judge-gate`) и М6 (`enforce-snapshot`/`enforce-floor-escape-consume`)**. Доска рапортует «protected» при незарегистрированных М4/М6. Закрытие: расширить `DEFAULT_REQUIRED_HOOKS` до ПОЛНОГО пост-переездного набора М1–М6 + skill-журналер (§12) — иначе §7 «каждая М1–М6 зарегистрирована?» технически ложно.

**Роль доски в цели §1:** доска — это **окно владельца в атрибуцию**. При аномалии владелец смотрит на доску: она говорит «судья деградировал (глюк)» / «escape в 14:03 (ты разрешил)» / «блок (дисциплина держит)». Кусок 1 = непробиваемость (enforcement), Кусок 3 = видимость (display) — две половины одного требования.

---

## 8. ИИ-проводка судьи М4 (полный боевой режим)

М4 = два слоя: **механический пол $0** (журнал/стена/критерий/якоря — даром, первым) + **думающий слой (платный ИИ)** — «голоса» (премортем/атакующий/корректность/полнота) как реальные запуски навыков (М4 §8). **Без ИИ-части М4 деградирует до механического пола + громкий крик** (М4 §12).

Проводка (шаг владельца + последняя фаза):
- ключ модели вне доступного контроллеру окружения (паттерн М5 signer / OS-keychain);
- флаг-рубильник $0 (регистрировать **обёртку** `enforce-judge-gate`, не движок — у движка нет рубильника; урок L4 live-wiring);
- реальные вызовы моделей вместо моков; режим D28 «сперва тихо» — но владелец выбрал **сразу боевой** (см. §11 — риск принят, обкатка опциональна по выбору владельца, рекомендация — короткий тихий период).
- журнал под-прогонов судьи — в **неподделываемом контроллером** канале (М4 §9.1 F1).

L4 (`llm-judge-per-tool`/`response-scan`) ретайрится после того, как М4 подтверждён картой покрытия (§5).

---

## 9. План переезда (подготовка → тест-гейт → переключение → откат)

Решение владельца: **полный переезд разом, но впереди — тщательная подготовка + тесты «всё работает».**

1. **Подготовка (инлайн TDD):** собрать поглощённую дисциплину в М1–М6 по §4 (fail-CLOSE/журнал-факт/PreToolUse); построить карты покрытия §5; ИИ-проводка судьи §8; normative-канал §6; доска §7; манифест-самопроверка; чистка Класса 6 (мёртвый findOverride + врущие сообщения).
2. **Тест-гейт «всё работает» (обязательное условие переключения):**
   - регрессия tools-only **≥ 2843 passed + 2 skip** (планка М6);
   - per-machine smokes (каждая М1–М6 блокирует свой класс, fail-CLOSE, громко);
   - интеграционные smokes: escape **сквозной** (стена+пол+egress+зоопарк-наследники чтут клик); манифест **кричит** при снятом страже; **закон** требует ключ, **карта** — нет; дисциплина **fail-CLOSE+громко** на спровоцированной ошибке; **журнал-факт** не обходится моим текстом (Класс 1 закрыт).
   - Зелёное **по каждому пункту** — иначе переключение не делаем.
3. **Большое переключение (шаг владельца, settings.json Claude'у закрыт):** атомарно зарегистрировать М1–М6 + снять весь зоопарк. Разом.
4. **Откат:** если переключение глючит — escape/снимок М6 + one-shot возврат settings.json к зоопарку (владелец). Доска §7 показывает, что именно не встало.

---

## 10. Список увольнений (что снимается с поста)

> **⚠️ Перед активацией М6 (DOC-1):** законный escape владельца (М6) чтут ТОЛЬКО стена М2 / пол М5 / egress-страж. Параллельные стражи зоопарка (`router-gate`/`runtime-write-deny`/судья М4 L4 и прочие content-стражи §10) про escape НЕ знают → реальный `force-push` / запись в `.env` НЕ пройдут, пока зоопарк ещё зарегистрирован. Полностью «дверь» открывается лишь когда эта Фаза 8 растворит/научит зоопарк (правило 7/L6 §4.1). До завершения §10 escape — частичный по конструкции; это ожидаемо, не баг.

- **Старая защита** (растворяется в пол/стену по §5): `router-gate`, `powershell-gate`, `runtime-write-deny`, `verify-before-push`, `verify-record`, `branch-switch`. **NB (V1/V1-PS):** `router-gate`/`powershell-gate` увольняются ТОЛЬКО ПОСЛЕ переноса полного content-blacklist в content-floor М5 (§4.1 правило 8 + §5) — не раньше, иначе ~20 Bash-классов + весь PowerShell открываются. `runtime-write-deny`/прочие content-стражи после переезда обязаны чтить escape (правило 7).
- **Старый судья:** `llm-judge-per-tool`, `llm-judge-response-scan` (L4).
- **Старый роутер-классификатор:** `router-prehook`, `router-tool-gate`, `router-stop-gate`, `router-embedding-warmup` (заменяется М3).
- **Поглощённая дисциплина** (в М4/М5 по §4.2): `memory-coverage`, `coverage-verify`, `tdd-gate`, `tdd-real-test-verifier`, `self-debrief-detector`, `rationalization-audit`, `todowrite-skill-verifier`, `prompt-injection`(reminder).
- **Мёртвый груз (no-op main):** `decomposition-detector`, `safe-baseline-metering`, `parallel-session-lock` (если подтвердится no-op — иначе перенести в М5 4.5).
- **Бессмысленные (субагенты запрещены):** `subagent-return-scanner`, `subagent-prompt-prefix`.
- **Мёртвый словарь (Класс 6):** удалить вызовы `findOverride`/`findOverrideAttempt` + врущие сообщения о фразах.
- **Остаются:** наблюдение `observer-stop-hook`, `cost-stop-hook`; `askuser-cosmetic-detector` (уже жёсткий); content-стражи М5 (`read-path-deny`/`mcp-classification`/`normative-content-rules`/`workflow-gate`) под именем М5 — **обязаны начать чтить escape (правило 7/L6)**.
- **Новое (критический разбор):** content-floor класс в М5 (правило 8, port blacklist) + PostToolUse skill-журналер (§4.2/§12) + расширенный `DEFAULT_REQUIRED_HOOKS` манифеста (§7).

---

## 11. Остаточные пределы (честно)

- **~0.5% неустраним** (7 фундаментальных ограничений v4: goal-misalignment / recursive trust / info-theoretic leak / behavioral residual / external deps / user approval ambiguity / gate paradox). Полную изоляцию ключа судьи даёт только железо (HSM/YubiKey, v4.2-фаза).
- **Промис §1 условен (критический разбор, П3):** «тихо проскользнул невозможно» держится для `skill:`-канала механически (журнал-факт), но для `direct`/`node`/`chain` — ТОЛЬКО при live-block М4-ИИ; при $0/shadow/деградации эти каналы на доверии. Механически не закрывается (нельзя журналом доказать «direct был оправдан»). Митигация: доска §7 показывает режим М4 + опц. бэкстоп «direct требует журнал-доказательства, что навык не подошёл».
- **Соц-инженерия escape** (М6 §8): владельца теоретически можно уговорить кликнуть опасное «безобидно обрамив». Снижается показом сырой канонической строки, не до нуля.
- **Риск big-bang без обкатки — ПРИНЯТ владельцем:** «сразу боевой режим». М4 в проде не обкатана; если её думающий слой переблокирует (как L4 в первый день) — может заклинить рабочий цикл. Митигация: тест-гейт §9.2 + откат §9.4 + (рекомендация дизайнера, не обязательна) короткий тихий период D28 перед hard-block.
- **Структурно-только остаток Класса 5** добивается мутацией М5, но «гениально ли подумал ВНУТРИ слота» — не гарантируется (М4 §13): добивают оценщик-постфактум D31 + владелец на Гейте-3.

---

## 12. Инвентарь модулей для writing-plans

**Правки существующих машин (→ обязателен `audit-context-building` перед каждой):**
- М4: журнал-K2 для coverage/todowrite/decomposition (через skill-журналер); Гейт-2 план-требование; Гейт-3 verify; пост-оценщик D31 + halt-counter для rationalization; вливание self-debrief; ИИ-проводка (обёртка `enforce-judge-gate` + ключ/флаг). 
- М5: мутация P18 как условие GREEN; подписанный по-критерийный GREEN; **content-floor класс (правило 8): port полного `BASH_HARD_BLACKLIST` + PowerShell-набор, блок независимо от плана** (V1/V1-PS — НЕ просто «перенос необратимого»); floor-write-guard расширить с Write-TOOL на содержимое команд node/PowerShell. **Реализация (разбор плана 2026-06-08):** единый источник `matchBashHardBlacklist` (перенесён в `shell-content-rules.mjs`, НЕ ручной список — P-1); content-block whole+per-segment паритет с `bashIsFloor` (P-4); `suspicious ||= contentBlock` (P-5); `canonicalAction` +ветка PowerShell (P-2); PS forge-страж записи в защищённый путь (P-3).
- М2: ветка-как-шаг-плана; действие-в-плане для вытесненной дисциплины; seed-allow реактивных дисциплинарных навыков (SE-K).
- М3: роутинг по журналу (замена `router-tool-gate`); enforce by construction (без warn-only).
- М6: escape на normative-ЗАКОН (Кусок 2) — расширение floor_escape на класс «правка закона»; **escape-survivability (правило 7): canonicalAction тотальна, panic-ветка, чтение escape остальными стражами**.
- остающиеся content-стражи (`read-path-deny`/`mcp-classification`/`normative-content-rules`): **добавить чтение escape-гранта** (L6).
- `enforce-hook-helpers`: карвут fail-CLOSE для дисциплинарного подмножества (контракт `:7` уточнён — «дисциплина fail-CLOSE, наблюдение fail-quiet»).

**Новое:**
- normative-канал: детерминированный классификатор КАРТА/ЗАКОН (+ build-loop-различитель «покрыт ли план-шагом», SE-D) + локальная церемония правки (Кусок 2).
- доска «кто на посту»: расширение `STATUS.md`-генератора (Кусок 3) + манифест-самопроверка (правило 5) + **расширение `DEFAULT_REQUIRED_HOOKS` до полного набора М1–М6 (SE-B)**.
- per-страж карты покрытия §5 (артефакты-доказательства перед увольнением).
- **content-floor класс в М5** (правило 8, V1/V1-PS): port `BASH_HARD_BLACKLIST` + PowerShell-набор в пол, блок независимо от плана; floor-write-guard расширить с Write-TOOL на содержимое команд node/PowerShell.
- **PostToolUse skill-журналер** (SE-K): пишет каждый Skill-вызов в action-journal независимо от членства в плане; + seed-allow стены для реактивных дисциплинарных навыков (`systematic-debugging`/`test-driven-development`/`requesting-code-review`).
- **escape-survivability** (правило 7, SE-I/L6): canonicalAction/normalize тотальны; session-level panic-escape до per-tool-логики; escape-чтение добавить в `read-path-deny`/`mcp-classification`/`normative-content-rules`.

**Чистка/удаление:** §10.

**CI-инварианты (анти-регресс дисциплины):**
- structural-тест: ни один дисциплинарный страж не использует `if (result.ok)` (truthy) — только `=== true` (М5 N5);
- grep-инвариант: нет controller-text→allow в дисциплине (нет `assistantText.includes(marker) → block:false`);
- escape≠protection: дисциплина не несёт override-вокабуляра (только escape М6);
- манифест-тест: снятие дисциплинарного стража из ожидаемого набора → CI красный (набор = полный М1–М6, SE-B);
- **content-floor инвариант (V1):** каждая запись `BASH_HARD_BLACKLIST` + PowerShell-набор имеет тест «рубится полом даже как валидный шаг плана»;
- **escape-survivability инвариант (SE-I):** тест «дисциплинарный страж бросает на входе → escape всё равно оценён → escaped-действие проходит» (не кирпич);
- **skill-журнал инвариант (SE-K):** тест «seed/ad-hoc Skill-вызов → попал в action-journal → K2 его видит».

---

## 13. Поправки критического разбора (2026-06-08)

После согласования дизайна владелец заказал **независимый критический разбор** (объектив «как будто спеку писал не я») по 4 осям: покрытие целей 7 машин / дыры дисциплины (главное) / логика и баги / реальные усиления. Цепочка: `audit-context-building` (заземление утверждений против реального кода М1–М6) → `sharp-edges` → `variant-analysis` → `superpowers:systematic-debugging`. Все фактологические утверждения §2 подтвердились кодом (8/8); sweep Класса 1 §2.1 — полон. Внесены закрытия:

- **V1 / V1-PS (КРИТИЧНО):** content-blacklist router-gate/powershell-gate переносится в content-floor М5 целиком (правило 8 §4.1, §5, §12), рубит независимо от плана. Без этого ~20 Bash-классов (arbitrary-exec/install/egress/redirect) + весь PowerShell проскальзывали как шаг плана; `node -e` мог подделать escape-грант и подорвать машины изнутри.
- **SE-I / L6 (Высокая):** escape-survivability (правило 7): тотальные canonicalAction/normalize, panic-ветка до per-tool-логики, чтение escape ВСЕМИ remaining fail-CLOSE-стражами. Без этого баг fail-CLOSE-хука = кирпич мимо escape; escaped-правка ЗАКОНА блокировалась `normative-content-rules`.
- **SE-C / SE-K (Высокая):** журнал-K2 честно ограничен `skill:`-каналом; `direct`/`node`/`chain` судит только live-М4 (§1 П3, §11); добавлен PostToolUse skill-журналер + seed-allow реактивных навыков (§4.2, §12), иначе seed/ad-hoc навыки в журнал не попадают.
- **SE-D (Высокая, стопор сборки):** граница КАРТА/ЗАКОН для дисциплинарных `.mjs` разрешена через «покрыт ли правкой план-шаг» (§6) — build-loop не клинит, ad-hoc самомодификация требует escape.
- **SE-A / L1 (Средняя):** §4.2 каждая строка помечена `[Pre]`/`[Stop]` — пост-фактумная дисциплина не выдаётся за PreToolUse (правило 2).
- **SE-B (Средняя):** `DEFAULT_REQUIRED_HOOKS` манифеста расширен до полного М1–М6 + skill-журналер (§7) — доска не рапортует ложное «protected».
- **§1 переписан:** промис «четвёртого не существует» снабжён честными предпосылками П1 (content-floor) / П2 (escape живуч) / П3 (live-М4 для не-skill) + 4-е структурное условие (сквозной живучий escape).

**Открытый verify-item прошлого handoff закрыт фактом:** `enforce-parallel-session-lock.mjs:12` — no-op → §10 увольнение.

### Поправки разбора ПЛАНА (2026-06-08, второй проход)

После написания плана реализации владелец заказал отдельный критический разбор **самого плана** (объектив «как будто план писал не я»; та же цепочка `audit-context-building` → `sharp-edges` → `variant-analysis` → `superpowers:systematic-debugging`, заземление против реального кода М1–М6). Найдено 8 находок (2 КРИТ / 1 ВЫС / 3 СРЕД / 2 НИЗ), все заземлены в коде, призраки отсеяны. Внесены в план (детали — план §«Поправки разбора плана» + Tasks 1.0.5/1.1/1.2b/1.3/1.4/1.5/1.6). Затрагивают и спеку:
- **P-1 (КРИТ):** заявленный «полный port `BASH_HARD_BLACKLIST`» в плане был **подмножеством** (терял #21 env-prefix / #22 --watch / #34 echo-inj / C16 `2>file` / cp-mv-chmod-chown-chgrp; `cp X ~/.claude/runtime/…` = forge escape-гранта). Закрытие: **единый источник** `matchBashHardBlacklist` (перенесён в `shell-content-rules.mjs`), не ручной список; §12 content-floor инвариант доказывает полноту по конструкции. Поэтому §5 «покрыть поимённо» теперь читается как «покрыть единым матчером + инвариант», не «перепечатать».
- **P-2 (КРИТ):** `canonicalAction` (escape-grant.mjs) не имеет ветки PowerShell → все PS-команды = `write:` → escape неспецифичен (одного гранта хватает на любую PS-команду в окне), причём план-тест escape был зелёным ложно (обе стороны равно сломаны). Закрытие — ветка PowerShell + тест специфичности.
- **P-3 (ВЫС):** PS-ветка пола возвращала `block:false` минуя runtime/secret-страж (поле `command` не парсится общим write-стражем) → PS forge escape-гранта. Закрытие — PS forge-страж.
- **P-4/P-5/P-6/P-7/P-8** — per-segment паритет content-block; `suspicious ||= contentBlock` (судья видит); §12 CI-инварианты закреплены за фазами; явный список fail-CLOSE-подмножества Фазы 0; честная пометка «план = детальная Фаза 1 + scoped-скелет».

Промис §1 и предпосылки П1–П3 не меняются — разбор плана подтвердил их и **уточнил, что П1 (content-floor) держится только при едином источнике + PowerShell-привязке escape**, иначе остаётся дыра.

## Само-аудит спеки (2026-06-08)

Дизайн собран через цепочку `audit-context-building` (карта обходов §2, построчно с цитатами строк) + `sharp-edges` (6 находок SE1–SE6 → 6 правил ужесточения §4.1) + `variant-analysis` (sweep всех близнецов §2.1). Ядро — **принцип атрибуции §1**: непробиваемость (Кусок 1) + неприкосновенный закон (Кусок 2) + видимость (Кусок 3) ⇒ глюк машины ≠ хитрость контроллера. Технический content проверен против реального кода М1–М6; границы с машинами — в §3–§5. Остаточные пределы названы честно §11.

## Следующий шаг

По одобрению владельцем — детальный TDD-план реализации через `superpowers:writing-plans`, затем сборка (инлайн, субагенты запрещены), затем тест-гейт §9.2 + переключение §9.3 (шаг владельца).
