feat: plan-done и арбитраж gate3 — только терминальный грант (consent forgery B4)
Снятие печати плана (plan-done) и арбитраж gate3 (gate3-arb:accept/continue) — тело-агностичные согласия, обходящие/снимающие стену — теперь открываются ТОЛЬКО терминальным грантом владельца (Поза 1, HOLE-4). supreme-gate: новый параметр terminalGrants в decideMode/runGate, PLAN_FINISH_ACTION проверяется против него (лёгкий escape остаётся на chat-грантах); main грузит loadTerminalGrants. gate3-loop: арбитраж-гранты грузятся через loadTerminalGrants (loader-swap; resolveOwnerArbitration агностична). Ядро стены: 138/138, gate3 44/44, полный свод 4346. Спека §B/§DEC. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+40
@@ -0,0 +1,40 @@
|
||||
# Consent-forgery fix — Часть B4: plan-done + gate3-arb → терминал Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: superpowers:executing-plans / test-driven-development.
|
||||
|
||||
**Goal:** Снятие печати плана (`plan-done`) и арбитраж gate3 (`gate3-arb:accept/continue`) открываются ТОЛЬКО терминальным грантом владельца, не chat floor_escape. Поза 1 для согласий, обходящих/снимающих стену.
|
||||
|
||||
**Architecture (трогает ЯДРО стены — высокий blast-radius):**
|
||||
- `enforce-supreme-gate`: ввести параметр `terminalGrants` в `decideMode`/`runGate`; проверку `plan-done` (PLAN_FINISH_ACTION) перевести с `escapeGrants` на `terminalGrants`. Лёгкий escape (canonicalAction, строка 396) остаётся на `escapeGrants` (chat ОК). `main()` грузит `loadTerminalGrants(sess)`.
|
||||
- `enforce-gate3-loop`: `main()` грузит `grants` для `resolveOwnerArbitration` через `loadTerminalGrants` вместо `loadFloorEscapes` (loader-swap; `resolveOwnerArbitration` логику не меняем — она агностична источнику).
|
||||
|
||||
**Спека:** §B/§DEC Поза 1 (HOLE-4 — тело-агностичные plan-done/gate3-arb отнесены в тяжёлый класс).
|
||||
|
||||
**Режим:** ШТАТНЫЙ. Коммит — дисциплина handoff.
|
||||
|
||||
---
|
||||
|
||||
### Task 1 (DONE): plan-done → terminalGrants (supreme-gate)
|
||||
|
||||
- decideMode/runGate: новый параметр `terminalGrants = []`; PLAN_FINISH_ACTION проверяется против него.
|
||||
- main(): `let terminalGrants = []` → `loadTerminalGrants(sess)` → передан в runGate.
|
||||
- Импорт `loadTerminalGrants` в supreme-gate.
|
||||
- Тесты: finish-грант тесты переведены на `terminalGrants`; добавлен RED-тест «plan-done в escapeGrants (chat) НЕ завершает; только terminalGrants». ✅ 138/138.
|
||||
|
||||
### Task 2 (DONE): gate3-arb → терминал (gate3-loop)
|
||||
|
||||
- main(): `grants: loadTerminalGrants(sess)` вместо `loadFloorEscapes(sess)` (TDD-исключение: loader-wiring; `resolveOwnerArbitration` агностична, покрыта своими тестами). ✅ 44/44.
|
||||
|
||||
### Task 3 (DONE): полный свод
|
||||
|
||||
- `npx vitest run --config vitest.config.tools.mjs --no-file-parallelism` → 4346 passed, 2 skipped. Ядро цело.
|
||||
|
||||
---
|
||||
|
||||
## Осталось (B5/C/GUIDE/нормативка)
|
||||
|
||||
- **B5** — разрушительный bash/powershell (rm-rf/force-push/migrate:fresh) → терминал. В supreme-gate
|
||||
лёгкий escape (строка 396, `escapeGrantOpen(canonicalAction…, escapeGrants…)`) сейчас принимает
|
||||
chat-грант на ЛЮБОЕ действие, включая `bash:rm -rf`. Нужен `isHeavyAction(action)`: heavy → проверять
|
||||
против `terminalGrants`, light → `escapeGrants`. Переиспользовать «ядерный» детектор floor (D1).
|
||||
- C / GUIDE / нормативка — как в спеке.
|
||||
Reference in New Issue
Block a user