Commit Graph

255 Commits

Author SHA1 Message Date
Дмитрий 8961e3e5f5 docs(mentor): гайд стены — maintenance toggle + рецепт коммита со STATUS.md
Ещё два пользовательских пункта (по запросу владельца): (A) maintenance — точные шаги выключить/включить стену через settings.json hooks; (D) если lefthook ругается на STATUS.md — git restore --staged --worktree перед commit. Согласовано.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 08:07:26 +03:00
Дмитрий 5de25c333e docs(mentor): гайд стены — перезапуск≠сброс плана + память/правила требуют разрешения
Два пользовательских пункта по итогам сессии 14.06: (B) перезапуск Claude Code перечитывает settings.json, но не сбрасывает застрявшую печать/сессию — сброс через досрочное завершение или новую церемонию с другим именем; (C) запись в память/правила про саму стену by-design требует escape владельца или maintenance. Согласовано владельцем (в+с).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 08:03:18 +03:00
Дмитрий c00d2b17bb docs(mentor): процедура escape владельца (FLOOR-ESCAPE токен) в гайд стены
Зафиксирована процедура разового подписанного пропуска floor_escape: владелец пишет метку FLOOR-ESCAPE: <action> в ответе AskUser, среда подписывает ключом, окно 5 мин, одноразовый. Формат canonicalAction (bash/powershell/skill/write/mcp). Найдено по запросу владельца «расскажи и отметь в инструкции» (сессия 14.06).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 07:04:26 +03:00
Дмитрий e554725226 feat(wall): оркестратор наставник-судья - строгая последовательность печати
Новый 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>
2026-06-13 17:15:37 +03:00
Дмитрий d786c273ca fix(mentor): печать плана M7 — снять дедлок судья↔наставник + наблюдаемость seal-attempts 2026-06-13 03:40:20 +03:00
Дмитрий cefb1b9612 docs(mentor): two-level negotiation spec-v2 (anchored) + plans 2026-06-12 19:15:48 +03:00
Дмитрий 4073164d0d feat(mentor): wire mentor surface + counter + escalation card (wave 7) 2026-06-12 19:09:59 +03:00
Дмитрий 9f939cd41f feat(mentor): wire judge escalation to arbitration card (wave 6) 2026-06-12 19:03:59 +03:00
Дмитрий eca9be46c8 feat(mentor): objection-format judge+mentor formatters (waves 4-5) - 9 tests green 2026-06-12 18:43:43 +03:00
Дмитрий 8918190bbe feat(mentor): negotiation-section parser (wave 3) - 4 tests green 2026-06-12 18:30:05 +03:00
Дмитрий 6c6d6d2e4c feat(mentor): arbitration-card pure builder (wave 2) - 6 tests green 2026-06-12 18:26:17 +03:00
Дмитрий 48e8111cc2 feat(mentor): mentor NO-GO counter L1 (wave 1) - 3 tests green 2026-06-12 17:59:24 +03:00
Дмитрий ebce8e5536 feat(m7): re-plan на ходу (impl-карвут) + эскалация судьи (escape-honor + счётчик NO-GO) + docs-хвост 2026-06-12 15:48:17 +03:00
Дмитрий d86e1b453d docs(mentor): тест-гейт Ф8 пройден 3754+2 GREEN + пусковой рецепт регрессии (npx, не app/node_modules — баг vitest 4.1.5 на out-of-root) 2026-06-12 11:10:42 +03:00
Дмитрий 880adcc449 docs(mentor): роадмап — хвосты вычеркнуты (env-фикс был в 95bb6b17, Связано: в шаблоне) + журнал bugs.md в репо + observer refresh 2026-06-12 10:52:24 +03:00
Дмитрий dd41e474c2 docs(mentor): инцидент 12.06 — вход Фазы 8 на main, баннер в handoff #5, судьба d1ad4e85 (cherry-pick только внутри Ф8) + cspell словоформы + observer refresh 2026-06-12 10:45:53 +03:00
Дмитрий e69fd396b2 docs(router-mentor): R6.2 + sub-plan A + handoff-2 2026-06-10 13:36:57 +03:00
Дмитрий 364da6bf48 docs(phase8): refresh снимок+runbook + paste-ready settings.json блок
После закрытия M6 FIX-5 и верификации тест-гейта §9.2:

- 2026-06-10-phase8-state-snapshot.md: HEAD 4dd2098e→5be1cd6e; M6 FIX-5 из
  «отложено» → закрыто (key-gated); D-3 доска live → закрыта (84231a14);
  регрессия 3449→3478; §9.2 верифицирован зелёным (предусловие C закрыто).
- 2026-06-09-phase8-deployment-runbook.md: Prerequisites регрессия →3478 +
  §9.2 verified; +строка History 2026-06-10.
- 2026-06-10-phase8-settings-paste-block.md (новый): paste-ready записи для
  settings.json — 13 хуков защитного контура (PreToolUse 10 / PostToolUse 2 /
  Stop 1) + companion + список снятия зоопарка (~20). Merge-not-replace, атомарно,
  пол #1 ДО снятия router-gate. Референс для владельца (Claude settings.json не пишет).

Только docs. Активация Фазы 8 (settings.json/keychain/ENV) — шаги владельца.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 05:52:32 +03:00
Дмитрий 5be1cd6e80 docs(escape-sign): отметить M6 FIX-5 как РЕАЛИЗОВАНО (спека §12 + план чек-боксы)
После закрытия реализации M6 FIX-5 (3 задачи TDD + гейт закрытия, регрессия
3478+2skip GREEN):

- spec 2026-06-10-floor-escape-signing-design.md: статус ЧЕРНОВИК → РЕАЛИЗОВАНО;
  §12 боксы «Ревью владельца» + «writing-plans» → [x] (+пометка одобренного
  отклонения Task 3: быстрый путь).
- plan 2026-06-10-floor-escape-signing.md: +статус-баннер (РЕАЛИЗОВАНО, регрессия,
  отклонение Task 3); все рабочие чек-боксы (Task 1/2/3 + гейт) → [x].

Только docs. Прод-код инертен до провижининга ключа (Фаза 8).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 05:38:21 +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
Дмитрий f4ac596a11 feat(escape-sign): writer подписывает floor_escape при наличии ключа (M6 FIX-5 Task 2)
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>
2026-06-10 05:16:15 +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
Дмитрий e506a836e7 docs(router-mentor): phase-8 state snapshot + M6 FIX-5 design/plan
- docs/superpowers/2026-06-10-phase8-state-snapshot.md — снимок состояния
  эпика «роутер-наставник» (что готово / owner-шаги / отложенное).
- M6 FIX-5 (подпись escape-гранта, key-gated, defense-in-depth): спека
  (одобрена, 2 адверсар. прохода + self-review) + bite-sized TDD-план.
  Реализация НЕ начата — design-only артефакты.

Кодовая фраза эпика: «роутер-наставник».
2026-06-10 05:04:52 +03:00
Дмитрий 84231a1470 feat(board): live source for guard board escapes/blocks (D-3)
Доска «кто на посту» (STATUS.md §7) теперь показывает реальные недавние
escape владельца и блоки машин М1–М6 вместо хардкода []/[].

- new tools/guard-block-log.mjs: logGuardBlock (best-effort, fail-quiet,
  Node fs append в guard-blocks-<sess>.jsonl) + loadRecentBlocks/
  loadRecentEscapes (скан session-файлов runtime, окно 24ч + cap 10, ts→ISO).
- проводка logGuardBlock в block-ветку main() 9 машинных хуков (floor /
  supreme-gate / judge-gate / snapshot / read-path-deny / mcp-classification /
  normative-content-rules / verify-gate / criterion-gate). Логгер вызывается
  ПОСЛЕ решения, не влияет на block; decide() pure не тронут.
- status-md-generator CLI: recentEscapes/recentBlocks из читателей вместо []/[].

До флипа Фазы 8 доска показывает 0/0 (хуки не зарегистрированы — данных нет);
реальная польза — пост-флип наблюдаемость.

TDD: guard-block-log.test (6) + 9 структурных wiring-тестов + 1 board-тест.
Гейт закрытия: sharp-edges (промежуточный по 9 хукам + читатели) +
variant-analysis (все block-ветки покрыты, иных источников нет). Регрессия
tools-only 3465 passed / 2 skipped / 0 failed (было 3449+2skip). 0 регрессий.

Plan: docs/superpowers/plans/2026-06-10-guard-board-live-source.md
2026-06-10 04:28:53 +03:00
Дмитрий 4dd2098e7b feat(seal): validate judge_mode at freeze time (defense-in-depth, SE-2 §4)
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
2026-06-10 03:48:07 +03:00
Дмитрий ec73a5c2d0 docs(gate1+se2): design spec + TDD plan (М7 Фаза 8, 2 хвоста до флипа)
Спека docs/superpowers/specs/2026-06-09-gate1-and-se2-design.md (одобрена; 2 адверсариальных
прохода: SD-1 High «trim→артефакт не печатается» + VA-a/SE-a «fail-open→whitelist» закрыты)
+ план docs/superpowers/plans/2026-06-09-gate1-and-se2.md (4 задачи, bite-sized TDD).
2026-06-09 19:05:23 +03:00
Дмитрий 0289e93c0e feat(gate1+se2): wire spec-judging (Гейт-1) + fail-closed wall whitelist (SE-2)
М7 Фаза 8 — последние 2 хвоста до флипа. Inline TDD; спека+план одобрены; 2 адверсариальных прохода.

Гейт-1 (печать артефакта в рантайме):
- extractGate1Product (enforce-judge-gate.mjs): детект записи specs/*.md (Write-only) → судить
  линзами gate1 (движок уже поддерживает). runJudgeGate: спека→gate1, иначе план→gate2.
- judged_hash от СЫРОГО content (SD-1, разбор #1 High): trimmed source_sha не сошёлся бы с
  печатью sealOnWiredGo → артефакт НИКОГДА не печатался бы. Один канон судья→печать.
- extractGate2Product не тронут (Гейт-2 = планы, регрессия зелёная).

SE-2 (стена не чтит shadow):
- decideMode (enforce-supreme-gate.mjs): fail-closed whitelist — энфорсмент ТОЛЬКО при
  judge_mode==='live-block' на ОБЕИХ печатях; shadow/null/опечатка → разговорный (мутаторы block).
  Разбор #1 (VA-a/SE-a): убрана единственная fail-OPEN сверка; опечатка режима безопасна.
- мигрированы 3 enforce-теста стены на judge_mode:'live-block'.

Тесты: gate1 10, SE-2 6; регрессия tools-only 3443 passed / 2 skip / 0 регрессий.
Гейт-1 тесты — отдельный файл enforce-judge-gate-gate1.test.mjs (real-test-verifier блокирует
import-only Edit существующего теста). Печать в рантайме до флипа НЕ производится.
2026-06-09 19:05:17 +03:00
Дмитрий 09598dd5bd feat(seal): sealed-plan production pipeline (M7 Фаза 8 code-precondition)
Производство двух печатей (артефакт-решение + план-шаги), чтобы стене М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.
2026-06-09 17:50:25 +03:00
Дмитрий 8718e2a965 docs(seal): sealed-plan production design spec + TDD implementation plan
Спека (ОДОБРЕНА владельцем, 2 адверсариальных разбора, 18 находок закрыты)
+ bite-sized TDD-план (7 задач) для код-предусловия флипа Фазы 8
(производство двух печатей: артефакт-решение + план-шаги).

design-only — прод-код и стена не затронуты. Эпик «роутер-наставник» М7.
2026-06-09 16:51:46 +03:00
Дмитрий 4c1ad03705 docs(shadow-replay): clean stage 3 report all walls green 2026-06-09 07:27:29 +03:00
Дмитрий c55e14b626 feat(brain): surface router-gate v4 signals into episode + factor axes
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
2026-05-31 19:05:20 +03:00
Дмитрий 2f59541d4b docs(observer): add brain data catalog
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
2026-05-31 18:18:47 +03:00
Дмитрий 9280c48025 docs(router-gate-v4): remaining-holes checklist update + CLAUDE.md insertion draft (item 1b tails) 2026-05-31 07:04:27 +03:00
Дмитрий 84dcf4aab3 docs(router-gate-v4): safe-baseline spec v4 + plan + handoff (item 1b) 2026-05-31 05:58:13 +03:00
Дмитрий c805988085 docs(observer): router-gate v4 remaining-holes checklist (Stream H follow-up) 2026-05-30 19:38:51 +03:00
Дмитрий 6ac4b1c1b1 feat(router-gate-v4): safe-baseline-metering wrapper + llm-judge-config gate (Stream H tail) 2026-05-30 19:29:58 +03:00
Дмитрий 612b3a3382 docs(router-gate-v4): Stream H final — Layer 4 LLM-judge verified live via integration smoke
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.
2026-05-30 13:30:34 +03:00
Дмитрий 0ff2053ae0 docs(router-gate-v4): Stream H Task 11 — completion log with deferred batch actions for user
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.
2026-05-30 11:46:32 +03:00
Дмитрий 1a84864e44 chore(router-gate-v4): delete 5 obsolete v3.9 hooks + vocab.json (Stream G cleanup)
Deleted hooks superseded by v4 architecture (spec section 4 behavioral pivot):
- enforce-chain-recommendation (replaced by router-gate decide)
- enforce-classifier-match (replaced by skill-scope-verifier Direction 2)
- enforce-graph-first (replaced by decide classification)
- enforce-semgrep-security (folded into normative-content-rules + per-tool LLM-judge)
- enforce-override-limit (universal vocab removal section 4.2)
- enforce-override-vocab.json (vocab abolished)

Regression: 1705/1705 vitest tools GREEN after deletion.
2026-05-30 06:12:59 +03:00
Дмитрий a3002bbe3b feat(router-gate-v4): enforce-mcp-classification (PreToolUse mcp__* wrapper, §5.3 + G1/G12) 2026-05-30 06:11:21 +03:00
Дмитрий 430396dfba feat(router-gate-v4): enforce-self-debrief-detector (PreToolUse mutating wrapper, §3.12 NEW) 2026-05-30 06:08:19 +03:00
Дмитрий 27c73fb050 feat(router-gate-v4): enforce-todowrite-skill-verifier (Stop hook wrapper, §3.9 Direction 4)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-30 06:00:00 +03:00
Дмитрий 40d4443926 refactor(router-gate-v4): stub override helpers (universal vocab removed per spec §4.2)
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.
2026-05-30 05:55:46 +03:00
Дмитрий 480649db30 fix(rationalization-audit): skip quoted citations to remove false-positives 2026-05-29 18:47:21 +03:00
Дмитрий 8910ae6cd6 spec(router-gate): v3.8 → v3.9 Round 7 audit closure (13 классов, 3 фундаментальные плоскости)
Round 7 adversarial audit (через superpowers:brainstorming skill) выявил 13 классов
которые 9 предыдущих раундов не покрывали:
- 2 FATAL: F5 Read-leak parent_random_id через Glob+Read (R-NEW-4 обнулён),
  F6 subagent tool_result.content exfil
- 4 CRITICAL: C12 system DNS/config (/etc/hosts/~/.ssh/registry) вне §3.1,
  C13 || true exit-code spoof (per-token vs per-chain),
  C14 subagent state exfil,
  C15 §5.2 multi-language gap (PHP/Ruby/Go test runners)
- 5 SERIOUS: S22 Skill(claude-md-management) exemption backdoor,
  S23 Workflow args parameter payload,
  S24 path-equivalence (Unicode NFC/NFD + Windows 8.3 + hardlinks),
  S25 MCP filesystem/redis write tools classification,
  S26 stop-keywords morphology gaps
- 2 EDGE: E31 gate-error reason disclosure (probing pattern),
  E32 LLM-judge cache cross-session persistence

18 spec edits: header bump + TL;DR + Changes v3.8→v3.9 table + §3.1 system paths
+ parent-sentinel→restricted + §3.4 PostToolUse Task scanner + §3.6.2 normative-content
second-layer gate + §4.5 stop-keywords expanded + §4.7 cache per-session + §5 MCP
classification + §5.1 chain ANY-mutating + PostToolUse rev-parse verify + §5.1.2
PowerShell mirror + §5.2 multi-language scan + §6.3 redacted reason mode + §9 13 closures
+ §10.2 gate-config v3.9 fields + §11 v3.9 history entry.

Spec: 2554 → 2964 строк (+410 lines). Budget: 45-60h (v3.8) → 53-72h (v3.9).
Закрыто 118 holes total через 10 раундов adversarial audit.

cspell-words.txt +18 терминов (exfiltration/exfil/NFD/RCE/syscall/Inodes/PROGRA/
resolv/nsswitch/ics/HKCU/HKLM/fsutil/unstar/mvn/popen/брэйншторм/стопаем).

Generalisable formula R7 (новая): для каждого следующего audit задавать 3 вопроса
до enumeration — какие safe tools/paths/chains дают visibility/leverage; какие
границы scope подразумеваются но не enforce'ятся; где per-token vs per-chain
formulation gap есть в композиции.

§0 cross-refs не меняются — spec-only, не tooling-канон / не ADR / не off-phase
подкатегория.

Methodology: superpowers:brainstorming skill + AskUserQuestion scope choice
(user выбрал «Полное v3.9 closure всех 13»).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 14:36:36 +03:00
Дмитрий d181e98046 docs(claude-md): v2.40 add §5 п.13 NB (mixed-diff blocks docs-only short-circuit) + §5 +п.15 (memory-coverage rejects chain channels)
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>
2026-05-29 14:29:38 +03:00
Дмитрий 46c4316966 spec(router-gate): v3.6-3.8 sweep — rounds 5/6 closure (45 holes in 22 classes)
Adversarial audit rounds 5+6 на v3.5 spec выявили 45 attack-векторов:
- Round 5 (v3.5→v3.6 + v3.6→v3.7 maximum-closure): 15 + 7 acceptable residual closed
- Round 6 (v3.7→v3.8): 30 attack-векторов в 18 классах вкл. 4 FATAL

v3.6 — Round 5 closure (15 holes, +9 protected paths, Smoke 4-7,
§5.1↔§4.5 sync, recovery-pattern hard-block в §4.7).

v3.7 — Maximum closure pass (7 v3.6 residual + edge): LLM-judge на
каждую AskUser-опцию (R-NEW-1), parent_random_id 256-bit sentinel
(R-NEW-4), restricted/ subdir + journal-reader CLI (R-NEW-2),
shell-quote tokenizer (R-NEW-3), TF-IDF + LLM-judge для off-topic
(R12), smart batching multi-question AskUser (S6), git stash variants
в conditional class (Edge).

v3.8 — Round 6 closure (30 holes в 18 classes):
- F1 PowerShell tool gate (был полностью вне scope §5.1 — обнуляло
  архитектуру на Windows)
- F2 Workflow internal agent() enumeration (nested агенты вне
  gate-visibility — unlimited bypass)
- F3 node_modules whole-dir hard-deny + dep-checksums verification
  через SHA-256 ключевых deps
- F4 LLM-judge anti-injection (delimiter tokens + pre-filter +
  multi-judge consensus Sonnet+Haiku)

§3.1 protected paths расширен +30 entries (memory/CLAUDE.md/Pravila/
PSR/Tooling с Skill exemption для claude-md-management, CI/CD configs,
lint/build configs, plugin cache, shell init, npm configs, node_modules,
parent-sentinel, dep-checksums, expected-path).

§3.0.1 OS-keychain для LLM key (Windows Credential Manager / Keychain /
libsecret через keytar); key не в process.env → не утечёт через npm
test stdout.

§3.2.1 automated bootstrap smoke (1/5/6/7 на каждый session start,
cached 7 days); user-run остаётся для 3/4/8.

§6.1 docs/recovery-procedures.md новый файл — пошаговая шпаргалка
PowerShell-команд для 3 уровней recovery.

Budget: 13.5-20h (v3.5) → 22.5-32h (v3.6) → 33-44h (v3.7) → 45-60h (v3.8).
Закрыто 105 holes total через 9 раундов adversarial audit.

Generalisable lesson v3.8: каждый раунд аудита должен начинать с
abstract classification классов атак до enumeration конкретных дыр.
v3.7 «maximum closure» был maximum внутри границ воображения v3.6 R5-audit;
Round 6 показал что сами границы имели дыры.

Spec: 1980 → 2554 строк (+1110 inserts / -44 deletes за v3.6-3.8 sweep).
+13 терминов в cspell-words.txt (PowerShell aliases, npm deps).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 13:55:11 +03:00
Дмитрий 2c8e6146fb docs(handoff): stage 5 findings 1+2 merged + prod-deploy commands ready 2026-05-29 09:45:59 +03:00
Дмитрий f1486015b0 docs(CLAUDE.md): v2.39 router-gate Уровень 4 spec v3.2→v3.5 finalized
Сессия 29.05.2026: 4 раунда adversarial audit + 2 dedicated brainstorm на N1/S5 и S8 закрыли ВСЕ известные controller-writable signals архитектурно.

5 commits на main за сессию:
- 832fadbc v3.2 — 18 holes из v4 audit (4 fatal + 11 critical + 8 serious + 3 edge)
- 903aa700 v3.3 — 12 holes из v4.1 audit на v3.2, N1 fatal honest residual
- 15bf46a1 v3.4 — S5 TRUE closure через side-channel file subagent-block-<tool-use-id>.json
- 80c81602 v3.5 — S8 TRUE closure через AskUserQuestion-gate + §4.5 git-pattern
- 6c6796d8 cosmetic markdownlint fix

Acceptable residual list пуст. Generalisable formula: write-канал в protected file через отдельный gate-процесс при harness-driven событии.

Implementation budget: 13.5-20h (v3.1) → 22.5-32h (v3.5) в 6 этапов через subagent-driven-development. Готов к writing-plans фазе в следующей сессии.

CLAUDE.md изменения:
- Шапка v2.38 → v2.39 (полный 5-commit summary + урок про controller-writable signals)
- §6 +top-абзац (краткий session-recap)
- §9 +v2.39 entry в начало списка

§0 cross-refs НЕ правились — Pravila/PSR_v1/Tooling Прил.Н не затронуты (design-only spec, не tooling-канон).

Memory writes отложены — coverage hook требует direct:memory-sync per-turn, в session wrap-up turn'е coverage был direct:session-wrap-up. Drafts оформлены в handoff-сводке.

Через /claude-md-management:revise-claude-md.

Verify-sentinel: 1179/1179 vitest tools-only GREEN.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 08:37:53 +03:00
Дмитрий 6c6796d84a chore(spec): cosmetic markdownlint auto-fix in router-gate v3.5
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>
2026-05-29 08:31:21 +03:00