Commit Graph

7 Commits

Author SHA1 Message Date
Дмитрий 039743a71f feat(footgun-fixes): O13 skill-escape канон + O11 detectMoney сужен + O18 judge_mode warn + SE-R7-6 loop-termination (sub-plan E Tasks 1-6 + SE1/C-4) 2026-06-11 17:13:48 +03:00
Дмитрий ae3f841cee feat(escape-sign): reader key-gated verify floor_escape (M6 FIX-5 Task 3)
loadFloorEscapes (единственный ВЫДАЮЩИЙ читатель floor_escape) теперь key-gated
проверяет подпись: ключ есть → оставить только валидно-подписанные (форж/
неподписанный/битый отброшены); нет ключа (truthy) → принять все (как сегодня,
content-floor backstop).

- Рефактор: generic loadRecords → floor_escape-специфичный readFloorEscapeRecordsAt,
  возвращает ПОЛНЫЕ записи {type,action,ts,sig} (не stripped) для верификации.
  Единственный вызыватель — loadFloorEscapes (loadConsumed читает другой файл).
- loadFloorEscapes(sessionId, now, {keyImpl, fsImpl, runtimeDir}) — 3-й опц.
  аргумент, обратно-совместим (8 потребителей зовут loadFloorEscapes(sess)).
- ОТКЛОНЕНИЕ от дословного кода плана (одобрено владельцем): быстрый путь —
  пропусков нет → [] БЕЗ резолва ключа. Поведение §3/§6 идентично, но keychain-
  subprocess не дёргается на каждый tool-use в массовом пустом случае
  (loadFloorEscapes — gate hot-path; 5 из 8 потребителей keychain не читали).

TDD: 6 новых тестов — 4 key-gated (signed принят / forged+tampered отброшены /
ключ null → все / '' falsy → все / окно 5 мин), 2 на быстрый путь (нет записей /
нет файла → [] без вызова ключа). Регрессия существующего escape-grant GREEN
(26 тестов). Суммарно 32 GREEN по затронутым файлам.

План: docs/superpowers/plans/2026-06-10-floor-escape-signing.md (Task 3)
Прод-код инертен до провижининга ключа (Фаза 8). Гейт закрытия — следующим шагом.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 05:28:40 +03:00
Дмитрий f71f1abef8 feat(m7-phase2): escapeAllowsEvent — panic-предикат escape-survivability (правило 7б) 2026-06-08 10:17:43 +03:00
Дмитрий bbd66c9b61 feat(m7-phase0): canonicalAction тотальна — внешний try + pathNormalizeSafe (правило 7а) 2026-06-08 09:59:29 +03:00
Дмитрий a5b62fbfad fix(m7-floor): canonicalAction +PowerShell — escape-привязка специфична (P-2)
Task 1.2b Фазы 1 М7 (КРИТ). canonicalAction получил ветку PowerShell:
`powershell:${normalizeCommand(command)}`. Без неё PS уходил в write-fallback,
пустой путь резолвился в cwd → один escape-грант разблокировал ЛЮБУЮ PS-команду
в окне (тест специфичности был зелёным ложно: a===b==='write:<cwd>').

Сквозной фикс: тот же canonicalAction зовут пол (Task 1.4), стена (enforce-supreme-gate)
и консьюмер. Bash/Write/mcp-ветки не задеты. 118 GREEN (escape-grant + 4 потребителя).
2026-06-08 08:56:44 +03:00
Дмитрий d221ba499d fix(m6): аудит-правки — G-5 egress токен, единый findOpenGrant, escape-журнал, уникальный id снимка
Аудит М6 (audit-context-building + sharp-edges + корректность; комплекс М1–М6), 4 практичных фикса (TDD):
- FIX-1: enforce-mcp-classification печатает точный FLOOR-ESCAPE токен в egress/verdict-блоке (G-5 для egress).
- FIX-2: escape-grant.findOpenGrant — единый предикат свежести для open и consume (гасит ИМЕННО открывший грант; чинит утечку one-shot при дублях/future-ts).
- FIX-3: enforce-supreme-gate.runGate — best-effort журнал escape (escape:true), указатель не двигается, сбой журнала не блокирует.
- FIX-4: enforce-snapshot — уникальный дефолтный id снимка (ts-pid-счётчик) против ms-коллизии refs/floor-snapshots.

Регрессия tools-only 2843 passed + 2 skip (+9, 0 регрессий). FIX-5 (подпись гранта) сознательно не делали (нулевая защита без ключа; protected-path уже гарантирует).
2026-06-07 19:43:05 +03:00
Дмитрий 87d84a2e3f feat(m6): escape-grant pure core — canonicalAction + escapeGrantOpen + readers 2026-06-07 18:41:42 +03:00