Ещё два пользовательских пункта (по запросу владельца): (A) maintenance — точные шаги выключить/включить стену через settings.json hooks; (D) если lefthook ругается на STATUS.md — git restore --staged --worktree перед commit. Согласовано.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Два пользовательских пункта по итогам сессии 14.06: (B) перезапуск Claude Code перечитывает settings.json, но не сбрасывает застрявшую печать/сессию — сброс через досрочное завершение или новую церемонию с другим именем; (C) запись в память/правила про саму стену by-design требует escape владельца или maintenance. Согласовано владельцем (в+с).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Новый enforce-mentor-then-judge.mjs запускает наставника дочерним процессом до конца, потом судью (свежий mentor-GO/вердикт) - убирает гонку параллельных PostToolUse-хуков. Машины enforce-mentor-on-plan-write/enforce-judge-gate байт-в-байт не тронуты. Зарегистрирован в settings.json. TDD +5 тестов.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
processEvent (PostToolUse AskUser) теперь подписывает floor_escape-пропуск
подписью FLOOR_ESCAPE, когда ключ доступен (resolveReceiptKey):
- +keyImpl=resolveReceiptKey, fsImpl={appendFileSync,mkdirSync} — инъекция для
hermetic-тестов; резолв ключа один раз на событие (fail-safe: ошибка → key=null
→ floor_escape пишется неподписанным, PostToolUse-наблюдаемость не ломается).
- esc подписывается только при наличии ключа; approve_git_operation (rec) НЕ
трогаем (§2.2). Нет ключа → esc без sig (как сегодня).
- Запись через fsImpl.* вместо прямых node:fs.
TDD: 2 новых теста (ключ → валидная подпись; ключ null → без sig). Регрессия
существующего enforce-askuser-answer-parser GREEN (approve_git_operation-путь цел).
Суммарно 10 GREEN по затронутым файлам.
План: docs/superpowers/plans/2026-06-10-floor-escape-signing.md (Task 2)
Прод-код инертен до провижининга ключа (Фаза 8).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
assertValidJudgeMode guard in freezePlan/freezeArtifact: fail-CLOSE on any
mode != {null|shadow|live-block}. Closes YAGNI-candidate from sealed-plan §11
/ gate1+se2 §4 (SE-a) — bogus mode can no longer enter a seal at the source
(complements the wall's fail-closed live-block whitelist).
- freezePlan validates the judgeMode param; freezeArtifact validates the
embedded artifact.judge_mode (injected by seal-orchestration).
- guard sits before id/sig computation -> no partially-signed bogus-mode seal.
- throw is best-effort-swallowed at enforce-judge-gate.mjs onWiredSeal ->
no seal produced (fail-CLOSE), hook never crashes.
- real flow never trips it (judgeGateMode yields only inert/shadow/live-block,
inert never seals) — drift-only guard.
TDD: new tools/plan-lock-judge-mode.test.mjs (6 tests). Regression tools-only
3449 passed / 2 skipped / 0 failed (was 3443+2skip). 0 regressions.
sharp-edges + variant-analysis: clean (only two seal producers, both guarded;
wall comparison already fail-closed).
Plan: docs/superpowers/plans/2026-06-09-seal-time-judge-mode-validation.md
Производство двух печатей (артефакт-решение + план-шаги), чтобы стене М2 было
что матчить — код-предусловие флипа. Inline TDD, спека/план одобрены владельцем.
- C1 artifact-from-spec.mjs: спека markdown -> {sections, source_sha} по якорям {#id} (P2-2).
- C2 plan-steps-parse.mjs: план -> [{op,object,ref}], fail-CLOSE, reject op:Task (VA-4),
канон object = repo-relative POSIX (SE-5; pathNormalize только на матче в стене, не на парсе).
- C3/C4 plan-lock.mjs: judge_mode в ПОДПИСАННОЙ базе freezePlan (VA-2) + атомарный persist
temp->rename для обоих save (SE-4/VA-3, артефакт ДО плана).
- C6 seal-orchestration.mjs: sealableArtifact/sealablePlan + judgedHashOf (SD-1) +
sealArtifact/sealPlan на РЕАЛЬНОМ GO (SE-3 wired===true), штамп artifact_id из текущего
артефакта (SD-3), judge_mode впрыснут в печать ПОСЛЕ хеш-сверки sealOnApproval (фикс TOCTOU).
- C5 enforce-judge-gate.mjs: SPEC_PATH_RE + sealOnWiredGo (печать на wired GO, инъекция в main,
юнит-тесты hermetic) + judged_hash в вердикте runJudgeGate. extractGate2Product не тронут
(Гейт-2 = планы; Гейт-1 spec-judging — отдельный заход перед флипом).
- Интеграция seal-to-wall: печать -> decideMode стены М2 (allow / non-match block / closed-door).
Тесты: full tools-only регрессия 3427 passed | 2 skipped, 0 регрессий (+29 новых кейсов).
Печать в рантайме НЕ производится до флипа (стена/судья не зарегистрированы) — сборка
готовит код-предусловие. Спека docs/superpowers/specs/2026-06-09-sealed-plan-production-design.md.
Closes Stream H completely. Appends a "Final activation — Layer 4 verified
live" section to the completion log documenting:
- User completed Action 2 (.claude/settings.json batch replacement) via
.scratch/activate-stream-h.ps1 on 2026-05-30 ~12:38 МСК. Backup at
.claude/settings.json.backup-20260530-123741. 7 new hook entries appended.
- User completed Action 1 (keytar install + ROUTER_LLM_KEY in user env)
with --legacy-peer-deps to resolve the histoire/vite peer conflict
(memory quirk 74). ROUTER_LLM_KEY (35 chars) exported user-level. Base
URL left at Anthropic default — no ProxyAPI middleware.
- Live verification via .scratch/verify-layer-4.ps1 → both opt-in
integration tests under ROUTER_LLM_LIVE_TEST=1 PASS on real API calls:
* single Sonnet judge returns a parseable YES/NO — 1950 ms
* 3-judge consensus reaches all three models with real (non-null)
verdicts — 2021 ms (Sonnet 4.6 + Haiku 4.5 + Opus 4.7 each returned
a real YES/NO; no fallback to doubt)
Total duration 4.54 s. 4 real API calls. Cost ~$0.01-0.05.
Layer 4 LLM-judge now active on live traffic. Router-gate v4 reaches the
master-plan target ~0.5-0.8% bypass rate. Architectural floor ~0.5%
irreducible per the 7 fundamental limits documented in memory
`feedback_asymptote_floor_irreducible.md`.
Carry-over: PowerShell 5.1 mojibake on em-dashes inside .scratch/ helper
scripts is cosmetic only; affects the final summary banner, not the
verification itself. Non-blocking.
Docs-only change; covered by docs-only short-circuit in
enforce-verify-before-push (§5 п.13 CLAUDE.md).
Stream H closed. No further follow-ups required.
Closes Stream H. Adds the canonical completion artifact at
docs/observer/notes/2026-05-30-stream-h-completion.md documenting:
- All 10 commits landed in this Stream H push (2a3b5b4d..d75c8922 main).
- Per-task summary linking each H<N> to its commit SHA + 1-line rationale.
- Two manual actions the user needs to perform outside Claude to activate
the new hooks: (1) npm install keytar + store ROUTER_LLM_KEY in keychain,
(2) append 7 hook entries to .claude/settings.json (verbatim JSON
provided). Both are blocked from in-Claude execution by structural
router-gate hooks (read-path-deny on settings.json without LEGIT_SKILLS
exemption; npm install in router-gate hard-blacklist).
- 5 defects/quirks discovered during execution with follow-up direction
(read-path-deny skill exemption gap, TDD-gate cross-actor blindness,
detectFullTestRun regex narrowness, findOverride stub, subagent vitest
output misread).
- 5 intentional deferrals listed (H10 worktree bootstrap; full LLM-judge
activation pending Action 1; Smoke 8 live test pending Action 2; no
normative bump because Stream H is infrastructure not Tooling-canon;
worktree cleanup conditional on local presence).
- Cumulative state after Stream H: 1776/1776 vitest tools GREEN, 6 hooks
ready to activate, 2 brain-retro analyzer extensions live, recovery
runbook published with 7 fabrication patterns.
Docs-only change; covered by docs-only short-circuit in
enforce-verify-before-push (§5 п.13 CLAUDE.md).
Stream H Task 11 of 11 — final consolidation.
findOverride/findOverrideAttempt/loadOverrideVocab become permanent stubs returning null/null/empty.
Non-deleted hooks (verify-before-push, tdd-gate, memory-coverage, branch-switch) still import these
symbols and need them to compile; runtime always reports 'no override'.
Adapted 15 existing tests in enforce-hook-helpers.test.mjs and 7 in enforce-semgrep-security.test.mjs
that asserted old vocab behaviour; all now assert stub behaviour (null/empty).
1824/1824 vitest tools GREEN.
Stream G of router-gate v4 deployment.
Two operational gotchas discovered в session 29.05.2026 (router-gate v3.6-3.8 sweep + post-sweep memory updates):
1. §5 п.13 NB — docs-only short-circuit считает строго .md-суффикс.
cspell-words.txt / package.json / lefthook.yml рядом со spec.md
делают diff mixed → verify-before-push активен → нужен vitest sentinel
ИЛИ override. Прецедент: commit 46c43169.
2. §5 +п.15 — enforce-memory-coverage hook не принимает chain-каналы
(chain:commit-push-mem-sync etc); требует строго direct:memory-sync
в свежем turn'е. Memory updates как часть multi-step задачи планировать
отдельным turn'ом или использовать memory dump override.
Прецедент: 4-й шаг sweep задачи заблокирован.
Via /claude-md-management:revise-claude-md skill flow.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Markdownlint added blank line before list in TL;DR v3.5 Changes section. Cosmetic, no semantic change. Captured to keep working tree clean for session handoff.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>