Commit Graph

2072 Commits

Author SHA1 Message Date
Дмитрий 93fcb5e141 docs(router-mentor): R-08 hierarchical waves design spec 2026-06-09 04:51:39 +03:00
Дмитрий 0e995970f9 feat(reconcile): wire reconcileEvent reader in main (inert, WARN-only) 2026-06-09 04:08:22 +03:00
Дмитрий 752512d3cd feat(status): R-30 journal integrity block via live verifyChain (read-only) 2026-06-09 04:06:53 +03:00
Дмитрий 1000abc7fc feat(status): R-24 door coverage block (read-only) 2026-06-09 04:05:15 +03:00
Дмитрий 0eef670e54 feat(door-coverage): door matcher reader and canonical mutating tools list 2026-06-09 04:02:27 +03:00
Дмитрий 2e6a6c0a7a feat(status): R-09 learning queue block (read-only) 2026-06-09 03:59:32 +03:00
Дмитрий 6c8918dff4 docs(router-mentor): plan blockB classes 1+2 (R-09/R-24/R-30/reconcile) 2026-06-09 03:57:03 +03:00
Дмитрий eb4b38f481 docs(router-mentor): handoff k novoy sessii (E/G zakryt, Blok B otbreynstormlen) 2026-06-09 03:46:59 +03:00
Дмитрий 2900554d5f docs(router-mentor): E/G warm-up batch zakryt v reestre hvostov (P1-P6) 2026-06-09 03:25:43 +03:00
Дмитрий a85d7f9d5f docs(router-mentor): DOC-1 escape-awareness callout pered aktivaciey M6 (P6 E/G) 2026-06-09 03:24:22 +03:00
Дмитрий 553ddea464 docs(tools): utochnit docstring node-graph + pinning-invarianty (P5 E/G) 2026-06-09 03:23:39 +03:00
Дмитрий cf9f803d36 feat(status): detail-render doski oborony + escapeCell anti-injection (P4 E/G) 2026-06-09 03:21:29 +03:00
Дмитрий 5ae0b1359f fix(observer): routing-detector ignorit PASTED-citaty /node (P1 E/G, 4-y FP-klass)
Novyy uzkiy stripPastedContext (fenced+blockquote only) pered detekciey. NE reuse stripQuotedContext (tot stripaet inline - FN). Sohraneno FP-smeshchenie routingGate (SE-1). Regressiya 3185 passed.
2026-06-09 03:18:55 +03:00
Дмитрий 84f75abb14 fix(observer): PII count via sanitize pipeline, overlap once (P2 E/G)
Edinyy PIPELINE: count ravno chislu redakciy sanitize (SE-2). sanitize byte-identical. Regressiya 3177 passed.
2026-06-09 03:16:49 +03:00
Дмитрий cfc4e0a853 fix(observer): release-класс не ловит голый commit (P3 E/G)
classifyTask: убран commit из release-регекса (коммит != релиз). push/merge/deploy/release/релиз/тегни остаются. Аналитика-only, гейтов-потребителей нет. Регрессия 3175 passed.
2026-06-09 03:14:24 +03:00
Дмитрий f801593987 docs(router-mentor): план E/G warm-up batch (7 тасков, bite-sized TDD)
Инлайн-исполнение (субагенты запрещены). Порядок простое-первым P3/P2/P1/P4/P5/P6 + закрытие реестра. Точный код тестов и правок, 4 правки безопасности учтены. Также факт-правка примеров P3 в спеке (first-match порядок classifyTask).
2026-06-08 19:47:30 +03:00
Дмитрий 0774a41f13 docs(router-mentor): E/G spec — 4 правки безопасности после adversarial-анализа
Цепочка audit-context-building/sharp-edges/variant-analysis. P1 узкий stripPastedContext (fenced+blockquote only, не reuse stripQuotedContext — сохранить FP-смещение гейта). P2 counting-replacers по конвейеру sanitize (count==редакции). P4 escapeCell anti-injection в STATUS.md. P5 пиннинг документируемого инварианта. Жёсткие стены М2/М5/М4/М6 не затронуты.
2026-06-08 19:40:34 +03:00
Дмитрий 62d3352d3e docs(router-mentor): spec для E/G warm-up batch (6 пунктов)
Дизайн утверждён владельцем. Точность наблюдателя (4-й FP-класс quoted /node, PII double-count, release-class commit) + детальный рендер доски обороны + косметика node-graph/reviewer + DOC-1 escape-awareness. Всё инлайн, TDD, commit-not-push, регрессия tools-only не ниже baseline 3174. Live-вшивка источников доски — граница B-блока.
2026-06-08 19:26:31 +03:00
Дмитрий acf1d90209 docs(router-mentor): handoff к следующей сессии (после закрытия H)
Ready-to-copy промт + карта оставшихся хвостов (B/A/C/E/F/G/H3) + квирки
(vitest --root, git PowerShell, node -e блок, память-гейт) + цепочка скилов
+ жёсткие правила (commit-not-push, CLAUDE.md off-limits). commit-not-push.

coverage: direct:session-handoff
2026-06-08 19:12:01 +03:00
Дмитрий 64fb063a22 docs(router-mentor): H закрыт — реестр хвостов + handoff обновлены
Блок H помечен ЗАКРЫТЫМ в реестре хвостов (H1/H2 + критический путь этап 1) и
handoff (финальная сводка решений + 5 находок аудита + квирк vitest --root для
worktree под .claude). commit-not-push.

coverage: direct:h-housekeeping
2026-06-08 19:07:37 +03:00
Дмитрий 65b3c57515 feat(nodes): конфликт-рёбра R-12 (Tooling §6 + R14.5, двусторонние)
4 пары attributes.conflicts_with из канона (mutual exclusion / replaces):
postgres-mcp↔boost (§6.1 «не оба активными»/replaces) + треугольник UI-генераторов
frontend-design↔ui-ux-pro-max↔21st-magic (R14.5 «один генератор на задачу,
не параллельно и не друг с другом»). ADR-границы — комплементарные различения,
не конфликты; §9.1-отвергнутые не узлы реестра. m3e: резолв+симметрия GREEN.

coverage: skill:executing-plans
2026-06-08 18:59:46 +03:00
Дмитрий 3dbd8a5cd9 test(m3e): живой инвариант покрытия реестра карточками + конфликт-целостность
Новый tools/m3e-card-coverage-invariants.test.mjs на реальном реестре:
(1) у каждого узла nodes.yaml есть карточка skill===slug (missingContracts пуст);
(2) нет пустых карточек (G-B); (3) конфликт-рёбра резолвятся и симметричны (G-H);
(4) реестр контрактов без формальных ошибок/дублей/дрейфа. GREEN — покрытие 86/86.
Конфликт-проверки пока тривиальны (0 рёбер), наполнятся в Task 4.

coverage: skill:test-driven-development
2026-06-08 18:56:10 +03:00
Дмитрий caadc92be0 feat(contracts): карточки marketing/project-agent/kg/historic (#74-#86 + #1) — все 86 готовы
14 финальных карточек: marketing (#74-#83: marketing-plugin, marketingskills,
brand-voice, marketing-ru[own], yandex-metrika-mcp, yandex-wordstat-mcp, telegram-mcp,
postiz, dataforseo-mcp[deferred], unisender-go-mcp[deferred]) + project-agent
(normative-sync[own], prod-deploy-validator[own]) + kg (graphifyy) + historic
(postgres-mcp #1). m3a GREEN. ВСЕ 86 узлов имеют карточку.

coverage: skill:executing-plans
2026-06-08 18:54:55 +03:00
Дмитрий 083095174c feat(contracts): карточки discovery/authoring/dev-support/finance/backend/infosec (#55-#73)
19 карточек. own (self-authored): discovery-interview, billing-audit, ru-tax-accounting,
laravel-backend-patterns, pdn-152fz-audit, threat-model, security-go-live. external:
skill-creator, plugin-dev, hookify, claude-code-setup, context7, finance-plugin, rector,
php-insights, nightowl[deferred], owasp-zap, nuclei, ward. m3a GREEN. 72/86 готово.

coverage: skill:executing-plans
2026-06-08 18:52:28 +03:00
Дмитрий d48365de5e feat(contracts): карточки design/integration/ml-ai/business-process (#44-#54)
11 карточек: design (figma-mcp[deferred], universal-icons-mcp, design-plugin) +
integration (openapi-mcp) + ml-ai (promptfoo, data-scientist, jupyter-mcp[deferred])
+ business-process (operations[зонтик], process-modeling[own], process-analysis[own],
n8n-mcp[deferred]). process-* = own (self-authored); остальные external. m3a GREEN.
53/86 карточек готово.

coverage: skill:executing-plans
2026-06-08 18:49:18 +03:00
Дмитрий 078e829b38 feat(contracts): карточки phase-3 + off-phase (UI-pool/debug/architecture/audit/PM)
18 карточек (все external): phase-3 (semgrep, trivy, dependabot, pg-audit,
pg-anonymizer) + UI-pool (ui-ux-pro-max, 21st-magic, claude-md-management) +
debug-runtime (sentry-mcp, redis-mcp) + architecture-tooling (adr-kit, mermaid,
architecture-patterns, deptrac) + audit-security (trail-of-bits, security-guidance)
+ project-management (ccpm, product-management). zero-hash + path"" → G4 инертен.
m3a 3/3 GREEN. 42/86 карточек готово.

coverage: skill:executing-plans
2026-06-08 18:47:19 +03:00
Дмитрий 9dc6bb55fd feat(contracts): карточки phase-1 + phase-2 (#10-#30)
16 карточек: phase-1 (boost, pint, larastan, roave-security, ide-helper, squawk,
pg-formatter, pg-partman[dormant], pest) + phase-2 (superpowers[own,зонтик], volar,
vue-tsc, eslint-prettier, vitest, histoire, frontend-design). superpowers = own
(без source); остальные external (zero-hash + path"" → G4 инертен). m3a 3/3 GREEN.

coverage: skill:executing-plans
2026-06-08 18:44:20 +03:00
Дмитрий 52cea07fee feat(contracts): карточки phase-0 (#2-#9) + m3a form-инвариант всех карточек
8 карточек-контрактов phase-0: playwright-mcp, github-mcp, markdownlint, cspell,
lychee, stylelint, gitleaks, pa11y (все external, zero-hash + path"" → G4 инертен).
m3a расширен: «ВСЕ файлы contracts/ form-валидны + нет дрейфа» (loadRegistry errors
+ driftFlags пусты) — per-батч валидация прогоном vitest. m3a 3/3 GREEN.

coverage: skill:executing-plans
2026-06-08 18:38:24 +03:00
Дмитрий f1c245f8f6 feat(card-coverage): чистый чекер покрытия узел↔карточка + конфликт-рёбра
Новый tools/card-coverage.mjs (H, R-11/R-12): missingContracts (узел без
карточки skill===slug), emptyCards (needs∪produces пусто — G-B), unresolvedConflicts
(висячая ссылка — G-H), asymmetricConflicts (A→B без B→A — G-H). Чистые функции,
данные инъектируются. TDD на фикстурах: RED→GREEN, 5/5.

coverage: skill:test-driven-development
2026-06-08 18:34:46 +03:00
Дмитрий d1a767867a fix(skill-contract): G-E — страж дрейфа инертен при пустом source.path без содержания
checkContractDrift: external без локального source.path И без поданного
currentContent (== null) → не сторожим (G4 инертен). Это прод-случай зеро-хеша
(Р5 MCP/marketplace): loadRegistry при пустом path не читает content. Прямой
вызов с поданным currentContent — drift сверяется как раньше. TDD: RED→GREEN,
48/48 skill-contract + registry. Дисциплина doubt→drift на реальных источниках
не понижена.

coverage: skill:test-driven-development
2026-06-08 18:33:05 +03:00
Дмитрий 4d257a1c44 docs(router-mentor): план реализации блока H (карточки + конфликт-рёбра)
Bite-sized TDD-план: Task1 G-E мех-правка, Task2 чистый чекер card-coverage,
Tasks 3.1-3.20 авторинг 86 карточек по батчам, Task4 конфликт-рёбра (§9+ADR),
Task5 живой инвариант m3e (последним → GREEN), Task6 гейт закрытия.
Исполнение инлайн (субагенты запрещены). commit-not-push.

coverage: skill:writing-plans
2026-06-08 18:07:22 +03:00
Дмитрий 1aacb2fe66 docs(router-mentor): H-design — вложены находки аудита достаточности (G-A/B/E/G/H)
Аудит «достаточно ли паспорта для роутера и судьи» (audit-context →
variant-analysis → sharp-edges → verification). Вердикт: схема достаточна,
новое поле не нужно. Вложены 5 находок: G-E (страж дрейфа инертен при
path=="" — точечная мех-правка), G-A (разделитель близнецов в capabilities),
G-B (инвариант «минимум содержания»), G-G (норма вход/выход), G-H (инвариант
резолв+симметрия). G-F/G-C/G-D отложены. commit-not-push.

coverage: direct:brainstorming-author
2026-06-08 18:03:17 +03:00
Дмитрий e2f5ba0406 docs(router-mentor): H-block design — node cards (R-11) + conflict edges (R-12)
Дизайн блока H реестра хвостов эпика «роутер-наставник»: наполнение графа
скилов данными — 86 карточек-контрактов (per-node, skill=slug) + явные
конфликт-рёбра (Tooling §9 + ADR, двусторонние) + инвариант покрытия (TDD).
Механику 3-A/3-B/3-C/3-D не трогаем. commit-not-push.

coverage: skill:brainstorming
2026-06-08 17:43:03 +03:00
Дмитрий 85ffb25e2d docs(router-mentor): сводный реестр хвостов эпика до боевого режима
Свод всех отложенных пунктов «роутер-наставник / реинжиниринг мозга»
(7 машин + router-discipline + периферия мозга + граф скилов): блоки
H/A/B/C/E/F/G, критический путь к продакшену, колонка «кто закрывает»
(Claude / владелец). Read-only сбор, ничего не чинится. Главный
недостающий кусок — карточки узлов (2 из ~86) + конфликт-рёбра (0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 16:40:40 +03:00
Дмитрий 7c3a495e5c docs(m7): build-handoff #5 — Фазы 4/5/6/7-код СОБРАНЫ, остались шаги владельца + переезд Ф8
Сменяет handoff #4. Готовый промт для новой сессии + полное состояние: 15 коммитов
02e3ff73..ee9e3123 (Ф4 8 / Ф5 2 / Ф6 2 / Ф7 3), регрессия 3090→3163+2 без регрессий,
commit-not-push. Детальные шаги ВЛАДЕЛЬЦА: (А) завершить ИИ-проводку судьи (реальный
транспорт runJudgeGate + ключ/флаг/обкатка shadow→block), (Б) Фаза 8 переезд (регистрация
М1–М6 в settings.json + увольнение v4-зоопарка + тест-гейт §9.2 + откат). Цепочка скилов,
квирки, якоря коммитов — для подхвата следующей сессией.
2026-06-08 15:07:01 +03:00
Дмитрий ee9e312300 feat(m7-phase7): доска Ф6 — judgeMode ← judgeGateMode() (реальный режим судьи: inert до активации)
CLI status-md-generator передаёт в доску «кто на посту» реальный режим судьи через
judgeGateMode() вместо хардкода 'inert'. До активации владельцем (флаг+ключ) → 'inert'
(видимое поведение не меняется); после активации доска покажет shadow/live-block.
Структурный тест фиксирует проводку (импорт + judgeMode: judgeGateMode(), не хардкод). 51/51 GREEN.
2026-06-08 14:46:12 +03:00
Дмитрий 1bc8b30563 feat(m7-phase7): enforce-judge-gate mode-aware + finalGate + runJudgeGate seam + live fail-CLOSE (§8)
Обёртка судьи переписана с {active}-shadow-заглушки на mode-aware: decide({mode,verdict,
floorBlocked}) — inert/shadow → allow ($0/D28 тихий); live-block → finalGate (судья GO И пол
чист → allow; иначе block; битый вердикт → NO-GO, сомнение→блок). runJudgeGate — owner-seam
(§8 последняя фаза: реальный llmCall-транспорт + извлечение продукта подключает владелец; до
этого нейтральный GO wired:false — flip mode=block без транспорта НЕ кирпичит). main:
inert/shadow → allow fail-open ($0); live-block → exitDisciplineDecision (fail-CLOSE, судья жив).
7/7 GREEN. Инертно до активации владельцем.
2026-06-08 14:44:35 +03:00
Дмитрий 84de110fee feat(m7-phase7): judgeGateMode — inert/shadow/live-block (§8, default shadow D28; рубильник важнее режима)
Новый резолвер режима судьи М4 в judge-gate-config: inert ($0, нет флага/ключа) / shadow
(active, логирует не блокирует — D28 «сперва тихо») / live-block (active + ROUTER_MENTOR_JUDGE_
MODE=block, блокирует на NO-GO). Рубильник judgeActive важнее режима: MODE=block без флага/ключа
→ всё равно inert. Default при активации — shadow (рекомендуемая обкатка §11). 9/9 GREEN.
2026-06-08 14:42:52 +03:00
Дмитрий 942f9bb8a1 feat(m7-phase6): доска «кто на посту» (computeGuardBoardBlock) — манифест М1–М6 + режим судьи + ПОСТ ПУСТОЙ (§7)
Новый чистый computeGuardBoardBlock в status-md-generator: read-only снимок обороны М1–М6 из
checkManifest (registered/missing) — missing → «⚠️ ПОСТ ПУСТОЙ» (нельзя ложно объявить protected,
SE-B), + режим судьи М4 (пока inert; live — Ф7) + счётчики недавних escape/блоков. Врезан в
renderStatus сразу после таблицы контролёров C1–C6; CLI читает .claude/settings.json (fail-quiet
→ {}). GUARD_LABELS маппит хуки на машины М1–М6. Read-only, ничего не блокирует. 49/49 GREEN.
2026-06-08 14:28:56 +03:00
Дмитрий 6c53fe998a feat(m7-phase6): SE-B — DEFAULT_REQUIRED_HOOKS до полного М1–М6 (+М4 judge-gate, М6 snapshot/escape, М1 журналер)
floor-manifest-check.DEFAULT_REQUIRED_HOOKS расширен с 5 (пол+стена+3 exfil-стража) до 9 —
+enforce-judge-gate (М4), +enforce-snapshot и +enforce-floor-escape-consume (М6), +enforce-
skill-journaler (М1). Раньше доска рапортовала бы «protected» при незарегистрированных М4/М6
(SE-B). Теперь «ПОСТ ПОЛНЫЙ» = весь контур М1–М6. WARN-only (сигнал, не блок, Δ8). 13/13 GREEN.
2026-06-08 14:26:57 +03:00
Дмитрий 3ef853695b feat(m7-phase5): decide §6 — ЗАКОН требует escape владельца, КАРТА — claude-md-management (build-loop SE-D)
decide переорганизован: escape-allow → контент-слои (recovery/suspicious/fake-rule, defense
для всей нормативки, сохраняют reason) → §6 classification (LAW non-escaped → block «требует
escape владельца, скил недостаточен») → CARD-поток (skillActive + judge + H3-degradation).
ЗАКОН (Pravila/PSR/Tooling + ad-hoc дисциплинарный исходник + контент-правка правил) больше НЕ
проходит по одному claude-md-management-скилу — только escape. КАРТА (CLAUDE.md/memory) —
прежний скил-канал. build-loop sealedPlanCoversEdit (Ф8 live через plan-lock). Tooling-тест
обновлён под §6; +4 §6-теста. 48/48 GREEN.
2026-06-08 12:49:01 +03:00
Дмитрий 2d2f3fc591 feat(m7-phase5): classifyNormative — детерминированный КАРТА/ЗАКОН + build-loop SE-D (§6)
Новые чистые экспорты в enforce-normative-content-rules: isDisciplineSourcePath (исходники
машин М1–М6 по префиксам enforce-/judge-/floor-/escape-grant/action-journal/receipt-/
shell-content-rules/plan-lock/classify-destructive/path-normalization), contentTouchesLaw
(контент правит правила/дисциплину), classifyNormative → {kind:'CARD'|'LAW'}. КАРТА =
CLAUDE.md/MEMORY.md/memory; ЗАКОН = Pravila/PSR/Tooling + дисциплинарный исходник ВНЕ плана +
контент-правка правил; build-loop: дисциплинарный исходник ПОД sealed-планом → КАРТА; сомнение
→ ЗАКОН. Тотален (null guard). Интеграция в decide — Task 2. 44/44 GREEN.
2026-06-08 12:46:46 +03:00
Дмитрий f9a4b10d1f test(m7-phase4): §12 whole-phase инвариант-гейт — анти-регресс поглощённой дисциплины
Lock-in тест над поглощённой дисциплиной Фазы 4a/4b (coverage/todowrite/rationalization +
self-debrief в манифесте): fail-CLOSE (exitDisciplineDecision, нет fail-open catch→block:false),
escape≠override (нет findOverride-вокабуляра), нет controller-text→allow (text-bypass вырезан,
Класс 1), манифест-членство (Ф6 self-check). Scope только поглощённые 4a/4b — не ещё-не-
поглощённые (memory-coverage/branch-switch/verify-* retire Ф8). 16/16 GREEN. Закрывает Фазу 4.
2026-06-08 12:28:31 +03:00
Дмитрий 9763025621 feat(m7-phase4c): Гейт-2 planGateSteps/runPlanGate (sealed план-требование) + Гейт-3 verify absorption proof (§4.2)
Гейт-2 combiner (зеркало criterionGateSteps): runPlanGate = specToPlanCoverage + k5CriterionCheck
через runGateLadder. Поглощает tdd-gate Rule #6 «план перед prod-кодом» в ЗАПЕЧАТАННОЙ форме
(покрытие sealed-плана + критерий значимого шага), без Класс-1 text-mention hasPlanIndicator.
Синергия с М2-стеной. Гейт-3 absorption-proof: runCriterionGate засчитывает только ПОДПИСАННЫЙ
зелёный по критерию (расписка М5), отвергает само-написанный sentinel. Live-wiring обоих — Ф7;
retire tdd-gate/verify-* — Ф8. 43/43 GREEN.
2026-06-08 12:26:34 +03:00
Дмитрий f3f3a70aa5 test(m7-phase4b): decomposition покрыт existenceCheck Гейт-1 через журнал (§5 coverage-map)
Proof покрытия: обещанный планировочный навык, не вызванный по журналу (extractSkillCalls),
→ existenceCheck.missingSkills непуст → NO-GO. Доказывает, что Гейт-1 М4 ловит скрытое
дробление через журнал-факт ДО retire no-op enforce-decomposition-detector (Ф8). Live-wiring
«обещанные навыки ← журнал» в judge-gate — Фаза 7. 39/39 GREEN (примитивы уже построены).
2026-06-08 12:21:12 +03:00
Дмитрий e791d33c78 feat(m7-phase4b): enforce-rationalization-audit fail-OPEN → fail-CLOSE (exitDisciplineDecision, §2.1 Класс 2)
main конвертирован с fail-OPEN (catch→block:false) на fail-CLOSE через exitDisciplineDecision
(throw/малформ → блок, анти-SE2). decide/audit/паттерны/halt-counter (priorFlagCount≥2) —
без изменений; язык-детектор остаётся мягким сигналом (flags), блок только halt-counter'ом.
Структурный тест сверяет наличие exitDisciplineDecision + отсутствие fail-open catch. 37/37 GREEN.
2026-06-08 12:20:10 +03:00
Дмитрий 2f39286ddf feat(m7-phase4b): rationalization + self-debrief в FAIL_CLOSE_DISCIPLINE_HOOKS (манифест Ф6)
Обе Stop-дисциплины Фазы 4b зарегистрированы в манифесте fail-CLOSE. self-debrief уже
fail-CLOSE поведенчески; rationalization конвертируется отдельным коммитом (Task 2).
Манифест-тест (for-of) сверяет наличие обоих. 89/89 тестов хелперов GREEN.
2026-06-08 12:18:51 +03:00
Дмитрий a630c994db feat(m7-phase4a): coverage-verify + todowrite-skill-verifier в FAIL_CLOSE_DISCIPLINE_HOOKS (манифест Ф6)
Оба поглощённых дисциплинарных стража Фазы 4a добавлены в FAIL_CLOSE_DISCIPLINE_HOOKS —
манифест-самопроверка Фазы 6 потребует их регистрации. Манифест-тест (for-of) сверяет
наличие обоих. 87/87 тестов хелперов GREEN.
2026-06-08 11:10:41 +03:00
Дмитрий a29fa9caa9 feat(m7-phase4a): todowrite-skill-verifier — журнал-факт session-scope + fail-CLOSE + PreToolUse (§4.2)
Выполненный todo, claim'ящий Skill, теперь сверяется с ЖУРНАЛОМ вызовов (extractSkillCalls,
канал М1) вместо transcript-извлечения. Session-scope осознанно (выполненный todo мог
закрыться в прошлом ходе — отличие от coverage, которое turn-scoped). decide получает
journalSkillCalls; main грузит журнал через loadJournal+extractSkillCalls, обёрнут
exitDisciplineDecision (fail-CLOSE Фазы 0). Переориентирован на PreToolUse-семантику
(предотвращение, §4.2 [Pre]; регистрация matcher — шаг владельца Ф8). 5/5 тестов GREEN.
2026-06-08 11:08:56 +03:00
Дмитрий 02e3ff7379 feat(m7-phase4a): coverage-verify — журнал-факт K2 (turn∩journal) + fail-CLOSE + снят override (§4.2)
coverage skill:X теперь требует X в ПЕРЕСЕЧЕНИИ «Skill-tool_use этого хода ∩ журнал
вызовов» (turn-scope от границы хода transcript, факт от журнала М1 через skillTakenByJournal
K2). Не по строке coverage: — Класс 1 закрыт; turn-scoping без false-pass (X из прошлого хода
в журнале, но не в transcript этого хода → block). direct/node/chain/hook/agent приняты на
этом слое (журналом не верифицируемы, §4.2). main обёрнут exitDisciplineDecision (fail-CLOSE
Фазы 0). Override-вокабуляр снят (§12 escape≠override). 9/9 тестов GREEN.
2026-06-08 11:07:35 +03:00