Commit Graph

8 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
Дмитрий 7faef3c93f feat(escape-sign): домен FLOOR_ESCAPE + sign/verify helpers (M6 FIX-5 Task 1)
Defense-in-depth для escape-гранта: подпись пропуска floor_escape, чтобы форж
без секретного ключа отвергался (поверх content-floor). Task 1 — фундамент:

- receipt-sign.mjs: +домен RECEIPT_DOMAINS.FLOOR_ESCAPE='floor-escape' (R-31,
  изолирует подпись floor-escape от approval/frozen-plan).
- askuser-answer-parser.mjs: +signFloorEscapeRecord/verifyFloorEscapeRecord —
  зеркало signApprovalRecord/verifyApprovalRecord, домен FLOOR_ESCAPE. Чистые,
  без ключа → sig:null.

TDD: 5 новых тестов (доменная изоляция, подпись/верификация целой записи,
подделка/без sig/без ключа/чужой ключ/чужой домен → false). Регрессия по
затронутым файлам 82 GREEN, 0 регрессий.

Спека: docs/superpowers/specs/2026-06-10-floor-escape-signing-design.md
План:  docs/superpowers/plans/2026-06-10-floor-escape-signing.md (Task 1)
Прод-код инертен до провижининга ключа (Фаза 8).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 05:13:20 +03:00
Дмитрий 6b44e7afd8 feat(m6): toFloorEscapeRecord — распознавание escape-одобрения 2026-06-07 18:44:09 +03:00
Дмитрий fe5cf99fc9 fix(brain): доменное разделение подписи — план/артефакт/журнал/расписка не взаимозаменяемы (R-31/J6) 2026-06-05 06:21:19 +03:00
Дмитрий 3af57e180a feat(m1): signed askuser approval records (P10-c HMAC receipts) 2026-06-04 03:59:38 +03:00
Дмитрий c14fb72e84 feat(router-gate-v4): Stream H Task 6 — askuser-answer-parser wrapper + toApprovalRecord schema sync
Closes Stream H Task 6 (H4). Retires the manual approval-write workaround
the controller used throughout Stream H Tasks 1-5.

Two changes:

1. Pure module tools/askuser-answer-parser.mjs gains toApprovalRecord(answer, opts)
   exporter that detects a git verb in the user's free-form answer and returns
   a Stream B-compatible {type:'approve_git_operation', command, ts} record
   (matches loadApprovedGitOps reader format in shell-content-rules.mjs:125).
   Returns null for non-git answers and for stop/abort/cancel keywords.

2. New PostToolUse(AskUserQuestion) wrapper tools/enforce-askuser-answer-parser.mjs
   reads each question/answer pair, calls toApprovalRecord, appends matching
   records to ~/.claude/runtime/askuser-decisions-<sess>.jsonl. Fail-open
   observability — never blocks AskUserQuestion.

Regression: vitest tools 1742/1742 GREEN (was 1731; +5 toApprovalRecord tests
under "toApprovalRecord (Stream H Task 6 — schema sync)" including non-string
guard, +6 wrapper-hook tests under "enforce-askuser-answer-parser wrapper
(Stream H Task 6)" including missing session_id fail-open guard).

DEFERRED: settings.json registration (matcher "AskUserQuestion", PostToolUse,
fail-open, timeout 2000ms) — batched with H5/H6/H7/H8 hook activations at end
of Phase H-α/H-β. Hook code is fully implemented and unit-tested; activation
pending settings.json update.

Stream H Task 6 of 11. Plan: docs/superpowers/plans/2026-05-30-router-gate-v4-stream-H.md
2026-05-30 11:28:13 +03:00
Дмитрий 9bc7babf38 fix(router-gate): stream E — punctuation-aware stop detection + review nits (BOM/JSDoc/??) 2026-05-29 19:45:57 +03:00
Дмитрий 557fe07fcf feat(router-gate): stream E — askuser-answer-parser (S27/E33/E34 + parse + approval)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 19:27:01 +03:00