docs(m7): критический разбор спеки — поправки V1/V1-PS/SE-I/SE-C/SE-K/SE-D/SE-A/SE-B
Независимый критический разбор дизайна М7 (цепочка audit-context-building → sharp-edges → variant-analysis → systematic-debugging). Фактология §2 подтверждена реальным кодом 8/8; sweep Класса 1 полон. Закрытия: - V1/V1-PS (КРИТИЧНО): полный port BASH_HARD_BLACKLIST + PowerShell-набор в content-floor М5 (правило 8), блок независимо от плана. Иначе in-plan node -e / curl-exfil / npm install проскальзывали как шаг плана; node -e мог подделать escape-грант и подорвать машины изнутри. - SE-I/L6: escape-survivability (правило 7) — тотальные canonicalAction/ normalize, panic-ветка до per-tool-логики, чтение escape всеми остающимися fail-CLOSE-стражами (read-path-deny/mcp-classification/normative-content-rules). - SE-C/SE-K: журнал-K2 честно ограничен skill:-каналом; +PostToolUse skill-журналер + seed-allow реактивных навыков (иначе seed/ad-hoc навыки в журнал не попадают). - SE-D: граница КАРТА/ЗАКОН для .mjs через "покрыт ли правкой план-шаг" (build-loop не клинит, ad-hoc самомодификация требует escape). - SE-A: §4.2 метки [Pre]/[Stop]. SE-B: манифест до полного набора М1-М6. - §1 промис снабжён предпосылками П1/П2/П3 + 4-е структурное условие; §13 changelog. Verify-item прошлого handoff закрыт фактом: enforce-parallel-session-lock = no-op. Только спека (.md), код не трогался.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Машина 7 — «Растворение зоопарка + непробиваемая дисциплина + переезд» — дизайн
|
||||
|
||||
**Дата:** 2026-06-08 · **Статус:** дизайн согласован с владельцем (через `superpowers:brainstorming`) · **Ветка:** `worktree-brainrepo`
|
||||
**Дата:** 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` следующий шаг; код не строим, пока план не написан и не одобрен.
|
||||
|
||||
@@ -21,10 +21,16 @@
|
||||
>
|
||||
> **Четвёртого — «тихо проскользнул» — НЕ существует.** Тогда любая аномалия атрибутируется без догадок: глюк машины ≠ хитрость контроллера.
|
||||
|
||||
Три структурных условия этой цели (см. §3–§7):
|
||||
- **Непробиваемая дисциплина** (Кусок 1): контроллер не может обойти тихо.
|
||||
**Условия, при которых промис держится (критический разбор 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): владелец видит, что произошло.
|
||||
- **Доска видимости** (Кусок 3): владелец видит, что произошло — включая здоровье М4-ИИ (П3).
|
||||
|
||||
М7 закрывает три отложенных в М5 §6 / М6 §7 куска: растворение старого дисциплинарного зоопарка, портативный normative-канал правок «мозга», доска «кто на посту».
|
||||
|
||||
@@ -82,14 +88,16 @@
|
||||
|
||||
## 4. Кусок 1 — Поглощение дисциплины в М1–М6 (непробиваемо)
|
||||
|
||||
### 4.1 Шесть правил ужесточения (применяются к КАЖДОЙ поглощённой дисциплине)
|
||||
### 4.1 Восемь правил ужесточения (6 из brainstorm + 2 из критического разбора; применяются к КАЖДОЙ поглощённой дисциплине)
|
||||
|
||||
1. **fail-CLOSE** — карвут из контракта `helpers:7`: дисциплинарный страж при любой своей ошибке → **блок** (не fail-quiet). Прецедент — `normative-content-rules:203`.
|
||||
2. **PreToolUse** — предотвратить, не PostToolUse-сетовать (лечит SE6).
|
||||
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 Таблица поглощения
|
||||
|
||||
@@ -100,15 +108,17 @@
|
||||
| Тест — настоящий (`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`) | **М4 журнал K2** | Проверка по ЖУРНАЛУ вызовов (М1), не по строке `coverage:`. `direct`/`node`-лазейка закрыта (все каналы журнал-сверяются). fail-CLOSE. |
|
||||
| TodoWrite заявил навык (`todowrite-skill-verifier`) | **М4 журнал K2** | Журнал-факт. fail-CLOSE, PreToolUse. |
|
||||
| Скрытое дробление (`decomposition-detector`) | **М4 Гейт-1 look-ahead** | Обещанные навыки сверяются с журналом; no-op хук удалён. |
|
||||
| Рационализация (`rationalization-audit`) | **М4 пост-оценщик D31 + halt-counter** | Жёсткое — структурные слоты М4 (нельзя продолжить, не заполнив, с якорем); детектор-языка остаётся мягким сигналом в оценщик. |
|
||||
| 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. **М2** — ветка + действие-в-плане. **М6** — единственная законная дверь. **М3** — роутинг. **М1** — журнал+ключ, на которых всё стоит.
|
||||
**Куда что легло:** **М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» невыполнимы.
|
||||
|
||||
---
|
||||
|
||||
@@ -116,14 +126,18 @@
|
||||
|
||||
Перед увольнением каждого живого стража строится **карта покрытия** — таблица «каждое его блокирующее правило → покрыто ли полом/стеной/судьёй». Увольнение только при 100% покрытии; непокрытое → переносится в принимающую машину **до** удаления.
|
||||
|
||||
> **Поправка критического разбора (V1, КРИТИЧНО).** Прежняя формула «покрыто полом (необратимое) ИЛИ стеной (вне плана) ИЛИ переносится в пол как явный класс» была **материально неполна**: стена проверяет лишь ЧЛЕНСТВО в плане (не содержание), пол — лишь НЕОБРАТИМОСТЬ. Значит весь content-blacklist router-gate, КРОМЕ необратимого субсета, проскальзывал как шаг плана. Закрытие — правило 8 §4.1: **полный `BASH_HARD_BLACKLIST` переносится в пол отдельным content-классом, рубящим независимо от членства в плане** (не «растворяется»).
|
||||
|
||||
| Увольняемый | Карта покрытия (что доказать) |
|
||||
|---|---|
|
||||
| `router-gate` / `powershell-gate` (широкий default-deny) | Каждое правило hard-blacklist (`rm`/`mv`/`cp`/redirect/`node -e`/`npm install`/`curl -X`/`wget`/`nc` и т.д., `enforce-router-gate.mjs:45-73`) + default-deny-whitelist → покрыто полом М5 (необратимое) ИЛИ стеной М2 (вне плана → блок) ИЛИ переносится в пол как явный класс. **Особое внимание:** `npm install` зловреда — не «необратимо» и не обязательно «вне плана» → нужен явный перенос в пол/стену, иначе дыра. |
|
||||
| `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, нужен свой набор. |
|
||||
| `L4` (`llm-judge-per-tool`/`response-scan`) | Тупой per-tool consistency-вопрос → покрыт надзором А2 судьи М4 (расхождение → голос «Верность намерению»). М4 шире (приёмка ТЗ/плана/результата). |
|
||||
| `runtime-write-deny` | Запись Write-инструментом в `~/.claude/runtime` → ветка пола М5 (RUNTIME_RE). |
|
||||
| `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). |
|
||||
| дисциплина (memory-coverage/coverage-verify/todowrite/tdd-gate/decomposition/...) | См. §4.2 — каждая в свою машину, журнал-факт. |
|
||||
| `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). |
|
||||
|
||||
---
|
||||
|
||||
@@ -143,6 +157,13 @@
|
||||
|
||||
**Граница КАРТА/ЗАКОН — детерминированная** (по пути файла + по содержимому: правка секции правил/дисциплины в любом файле → ЗАКОН). Сомнение → ЗАКОН (нужен ключ). Эта классификация — в коде, не «на доверии».
|
||||
|
||||
**Поправка критического разбора (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)
|
||||
@@ -151,10 +172,12 @@
|
||||
|
||||
Содержимое:
|
||||
- **Каждая из М1–М6:** зарегистрирована? активна? (через манифест-самопроверку §4.1 правило 5).
|
||||
- **Здоровье судьи М4:** работает / деградировал до пола / бюджет исчерпан (М4 §12 «упал → ГРОМКО кричит, пост пустой»).
|
||||
- **Здоровье судьи М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) — две половины одного требования.
|
||||
|
||||
---
|
||||
@@ -190,20 +213,22 @@ L4 (`llm-judge-per-tool`/`response-scan`) ретайрится после тог
|
||||
|
||||
## 10. Список увольнений (что снимается с поста)
|
||||
|
||||
- **Старая защита** (растворяется в пол/стену по §5): `router-gate`, `powershell-gate`, `runtime-write-deny`, `verify-before-push`, `verify-record`, `branch-switch`.
|
||||
- **Старая защита** (растворяется в пол/стену по §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.
|
||||
- **Остаются:** наблюдение `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.
|
||||
@@ -213,17 +238,21 @@ L4 (`llm-judge-per-tool`/`response-scan`) ретайрится после тог
|
||||
## 12. Инвентарь модулей для writing-plans
|
||||
|
||||
**Правки существующих машин (→ обязателен `audit-context-building` перед каждой):**
|
||||
- М4: журнал-K2 для coverage/todowrite/decomposition; Гейт-2 план-требование; Гейт-3 verify; пост-оценщик D31 + halt-counter для rationalization; вливание self-debrief; ИИ-проводка (обёртка `enforce-judge-gate` + ключ/флаг).
|
||||
- М5: мутация P18 как условие GREEN; подписанный по-критерийный GREEN; перенос классов `router-gate`/`runtime-write` в пол по карте покрытия §5.
|
||||
- М2: ветка-как-шаг-плана; действие-в-плане для вытесненной дисциплины.
|
||||
- М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.
|
||||
- М2: ветка-как-шаг-плана; действие-в-плане для вытесненной дисциплины; seed-allow реактивных дисциплинарных навыков (SE-K).
|
||||
- М3: роутинг по журналу (замена `router-tool-gate`); enforce by construction (без warn-only).
|
||||
- М6: escape на normative-ЗАКОН (Кусок 2) — расширение floor_escape на класс «правка закона».
|
||||
- М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-канал: детерминированный классификатор КАРТА/ЗАКОН + локальная церемония правки (Кусок 2).
|
||||
- доска «кто на посту»: расширение `STATUS.md`-генератора (Кусок 3) + манифест-самопроверка (правило 5).
|
||||
- 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.
|
||||
|
||||
@@ -231,10 +260,27 @@ L4 (`llm-judge-per-tool`/`response-scan`) ретайрится после тог
|
||||
- structural-тест: ни один дисциплинарный страж не использует `if (result.ok)` (truthy) — только `=== true` (М5 N5);
|
||||
- grep-инвариант: нет controller-text→allow в дисциплине (нет `assistantText.includes(marker) → block:false`);
|
||||
- escape≠protection: дисциплина не несёт override-вокабуляра (только escape М6);
|
||||
- манифест-тест: снятие дисциплинарного стража из ожидаемого набора → CI красный.
|
||||
- манифест-тест: снятие дисциплинарного стража из ожидаемого набора → 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` (карта обходов §2, построчно с цитатами строк) + `sharp-edges` (6 находок SE1–SE6 → 6 правил ужесточения §4.1) + `variant-analysis` (sweep всех близнецов §2.1). Ядро — **принцип атрибуции §1**: непробиваемость (Кусок 1) + неприкосновенный закон (Кусок 2) + видимость (Кусок 3) ⇒ глюк машины ≠ хитрость контроллера. Технический content проверен против реального кода М1–М6; границы с машинами — в §3–§5. Остаточные пределы названы честно §11.
|
||||
|
||||
Reference in New Issue
Block a user