docs: wall-GUIDE — рецепт escape инвертирован под фикс подделки согласия

Раздел «Аварийный выход» переписан под Поза 1 (consent-forgery A+B1-B5+C): старый рецепт
«контроллер кладёт FLOOR-ESCAPE в КНОПКУ» снят (anti-button отвергает) → ЛЁГКОЕ согласие
владелец набирает САМ свободным вводом (контроллер не диктует — anti-dictation), ТЯЖЁЛОЕ
(owner-seal/ops-runbook/commit/plan-done/gate3-arb/разрушит. bash) — ТОЛЬКО из терминала
владельца (node tools/owner-consent.mjs <sessionId> <action>, подпись fail-closed). Добавлена
заметка в «Обновления 18.06» с коммитами эпика. Оперативная шпаргалка (не нормативный квинтет).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-18 20:05:49 +03:00
parent 0d31e62248
commit f62b5f25ab
+47 -29
View File
@@ -13,6 +13,14 @@
Закрыты главные баги стены: теперь она контролирует КАЧЕСТВО (наставник+судья), а механику/
необратимое не сваливает на владельца. Коммиты: B+C ч.2 `bc1d2a3`, D1 `bbc053e`, D2 `b47a71c`, §3.4 `cdcaf61`.
- **⛔ ПОДДЕЛКА СОГЛАСИЯ ЗАКРЫТА (эпик consent-forgery, A+B1-B5+C).** Несущая дыра: контроллер сочинял
ярлык кнопки `FLOOR-ESCAPE: owner-seal:<hash>`, среда возвращала его как «ответ» без действия
владельца → подписанный грант → план опечатывался «одобрен владельцем». **Фикс:** согласие — ТОЛЬКО
из свободного ввода владельца (лёгкое) ИЛИ из его терминала (тяжёлое). Кнопка-с-меткой и диктовка
метки больше не дают грант. **Рецепт escape ниже ИНВЕРТИРОВАН** (см. «Аварийный выход»). Коммиты:
A `cdc32b1`, B1 `dec0ed5`, B2 `f870907`, B3 `29287d7`, B4 `5bcf229`, B5 `11969ac`, C `0d31e62`.
Спека `specs/2026-06-18-consent-forgery-fix-design.md`.
- **Осмотр сайта под планом (B+C ч.2, `op:"session"`).** Чтобы пройтись/пощёлкать (логин, формы,
чужой сайт), план объявляет ОДИН шаг-сеанс: `{op:"session", goal, tools:[действующие инструменты],
produces:"<итоговый файл>"}`. Внутри сеанса смотришь/кликаешь по живым `ref` сколько нужно (указатель
@@ -193,41 +201,51 @@ CARD-путь (`sealedPlanCoversEdit` под опечатанным планом
- блок «ожидался шаг N: …» → ты в середине плана на шаге N (возможно, застрял — см. F-J);
- выполнилось → стена снята (или открыт escape).
## Аварийный выход владельца (escape)
## Аварийный выход владельца (escape) — ОБНОВЛЕНО 18.06.2026 (фикс подделки согласия)
Разовое подписанное разрешение на ОДНО действие под стеной. Владелец даёт его **в ответе на
AskUserQuestion**: в ответе должна **буквально** присутствовать метка `FLOOR-ESCAPE: <action>`
среда ищет её регэкспом в конце ответа (`/FLOOR-ESCAPE:\s*(.+)$/`, см.
[tools/askuser-answer-parser.mjs](../../tools/askuser-answer-parser.mjs)::`toFloorEscapeRecord`).
Каноны `<action>` ([tools/escape-grant.mjs](../../tools/escape-grant.mjs)::`canonicalAction`):
> ⛔ **Старый рецепт «контроллер кладёт `FLOOR-ESCAPE:` в КНОПКУ» БОЛЬШЕ НЕ РАБОТАЕТ.** После фикса
> подделки согласия (эпик consent-forgery: A + B1-B5 + C) ответ, дословно совпавший с ярлыком
> контроллерской кнопки, согласием НЕ считается (anti-button — среда могла вернуть кнопку без действия
> владельца). Согласие — только из СВОБОДНОГО ввода владельца ЛИБО из его ТЕРМИНАЛА. Спека:
> `docs/superpowers/specs/2026-06-18-consent-forgery-fix-design.md`.
**Два класса согласия (Поза 1, решение владельца 18.06):**
**ЛЁГКОЕ**`write:<путь>`, безопасный `bash:`, `skill:<имя>`. Владелец САМ набирает метку
`FLOOR-ESCAPE: <action>` в поле «Другое» ответа AskUserQuestion (свободный ввод; среда ищет
`/FLOOR-ESCAPE:\s*(.+)$/`, `toFloorEscapeRecord`). Контроллер кнопку-с-меткой НЕ делает (anti-button
отвергнет) и метку дословно НЕ диктует (anti-dictation `detectOtherSocialEng` → грант не пишется).
Грант одноразовый, окно **5 минут**, точное совпадение `canonicalAction`. **Применяй СРАЗУ.**
**ТЯЖЁЛОЕ**`owner-seal:<hash>`, `ops-runbook:<hash>`, `commit:<hash>`, `plan-done`, `gate3-arb:*`,
разрушительный `bash:`/`powershell:` (rm-rf/force-push/migrate:fresh/db:wipe). **ТОЛЬКО из ТЕРМИНАЛА
владельца:**
```
node tools/owner-consent.mjs <sessionId> <action>
```
Скрипт подписывает терминальный грант (`origin:owner-terminal`) ключом keychain. Контроллер запустить
с пользой не может: его Bash без доступа к keychain → грант не подписан → читатель отвергает; и
`~/.claude/runtime` он не пишет (пол). Читатели тяжёлого принимают грант ТОЛЬКО при валидной подписи
(**fail-closed** без ключа — `loadTerminalGrants`).
**Каноны `<action>`** ([tools/escape-grant.mjs](../../tools/escape-grant.mjs)::`canonicalAction`):
- Bash → `bash:<норм. команда>` · PowerShell → `powershell:<норм. команда>`
- Skill → `skill:<имя lowercase>` · Write/Edit → `write:<путь>`
- MCP → `mcp:<имя>:<args-json>`
- Завершить застрявший план → `plan-done` (резерв-метка) · Опечатать на арбитраже → `owner-seal:<hash>` (Фикс 3)
- Skill → `skill:<имя lowercase>` · Write/Edit → `write:<путь>` · MCP → `mcp:<имя>:<args-json>`
- Завершить план → `plan-done` · Арбитраж gate3 → `gate3-arb:accept:<fp>` / `gate3-arb:continue:<fp>`
- Опечатать на арбитраже → `owner-seal:<hash>` · Деплой → `ops-runbook:<hash>` · Коммит → `commit:<hash>`
**Канон пути для `write:`** — абсолютный, **lowercase**, прямые слэши `/`, NFC (ровно как даёт
`pathNormalizeSafe`). Пример: `write:c:/моя/проекты/портал crm/документация/docs/superpowers/router-mentor-wall-guide.md`.
Грант одноразовый, окно **5 минут**, точное посимвольное совпадение `canonicalAction` с действием
инструмента. **Применяй escape СРАЗУ** (иначе окно истечёт).
**Канон пути для `write:`** — абсолютный, **lowercase**, прямые слэши `/`, NFC (как `pathNormalizeSafe`).
### Как дать escape ПРАВИЛЬНО (иначе клик уходит «в никуда») — урок 16.06
**Что escape чтит:** стена М2 / пол М5 / судья М4 / гейт памяти. **НЕ чтит:** `router-gate` (git —
отдельный канал, см. «Коммит») и `normative §6` для discipline-source (F-K — правь терминалом).
-**Контроллер делает САМУ кнопку AskUserQuestion = строкой `FLOOR-ESCAPE: <action>`**, владелец
её осознанно выбирает. Тогда ответ = текст кнопки = содержит метку → среда подписывает грант.
Это и есть «контроллер спрашивает — владелец выбирает — но ответ сформулирован верно».
-**Обычная кнопка** («Разрешаю», «Ок», «Да») — её текст НЕ содержит `FLOOR-ESCAPE:` → грант НЕ
пишется → стена держит. (Грабли: 3 клика подряд впустую, прежде чем поняли причину.)
-**Контроллер уговаривает владельца вписать метку в свободное поле ответа** — защита
`detectOtherSocialEng` (`askuser-answer-parser.mjs`) ловит такие фразы-подсказки как соц-инженерию
и флагует. Не диктуй текст в свободное поле — **давай метку готовой кнопкой**.
**Что escape чтит:** стена М2 / пол М5 / судья М4 / гейт памяти (память/нормативка). **НЕ чтит:**
`router-gate` (git — отдельный канал, см. «Коммит») и `normative §6` для discipline-source (F-K — правь терминалом).
**Активация (обязательна в settings.json):** PostToolUse `AskUserQuestion``enforce-askuser-answer-parser`
(writer, подписывает грант ключом `router-mentor-receipts`) + `Edit|Write|MultiEdit|Bash|PowerShell`
`enforce-floor-escape-consume` (one-shot, гасит грант). Без них клик уходит «в никуда».
**Активация (settings.json):** PostToolUse `AskUserQuestion``enforce-askuser-answer-parser`
(writer: **anti-button** + **anti-dictation**; подписывает грант ключом `router-mentor-receipts`) +
`Edit|Write|MultiEdit|Bash|PowerShell``enforce-floor-escape-consume` (one-shot гасит лёгкий грант).
Тяжёлый терминальный канал — скрипт `tools/owner-consent.mjs` (запускает владелец, вне гейтов).
## Коммит