Commit Graph

109 Commits

Author SHA1 Message Date
Дмитрий 332ea25eb7 feat(registry): контракт-каталог surfacing-open-questions + регистрация в словаре
Узел 6 скила охотника (спека v6, раздел contract): карточка-контракт own-навыка,
токен closed-open-questions-ledger в capability-vocabulary, счётчик контрактов 153→154.
Реестр остаётся зелёным (vocab-rollout-full).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 09:54:55 +03:00
Дмитрий 4555d32241 refactor(router): снос мёртвого router-prehook (остаток прежней Stage-3 схемы)
router-prehook (UserPromptSubmit-хук прежнего router-discipline) — мёртвый остаток: не
зарегистрирован в settings.json, его роль поглощена живым швом наставника (classify на этапе плана).
Единственным импортёром был его собственный тест. router-tool-gate читает state-файл (данные), не
модуль — его импорты не затронуты. Полный свод после удаления зелёный (висячих импортов нет).
Удалены: router-prehook.mjs, router-prehook.test.mjs, router-prehook.mjs.bak-noLLM.
Хвост спеки роутера §9 (уборка), эпик роутер-реестр этап 3, item 5.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 09:18:46 +03:00
Дмитрий 9ec5e1ee58 feat(router): exit-2 судьи дисциплины несёт имя забытого навыка с директивой вызвать
buildForgottenSkillCard формирует внятную карточку «ПЛАН ЗАБЫЛ вызвать навык(и) из skills-json:
X → вызови Skill X» вместо общей прозы. decide() возвращает список uncalled; main() отдаёт карточку
в exit-2. callCovers/нормализация/fail-CLOSE — без изменений. Хвост спеки роутера §6 (контроллеру —
имя забытого навыка), эпик роутер-реестр этап 3, item 4.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 09:05:17 +03:00
Дмитрий 5eea8e2a43 feat(wall): research-read MCP в разговоре (egress-страж нетронут, тяжёлый firecrawl исключён)
Правка машинерии №4 скила surfacing-open-questions (спека v6, раздел stena4):
isResearchRead пускает поимённо perplexity/exa/firecrawl read-инструменты в разговорной
фазе; crawl/agent/interact/monitor/map исключены. egress-страж не тронут.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 09:02:28 +03:00
Дмитрий f1b9cce71f feat(wall): окно дозаписи журнала охотника в карантин docs/observer/questions
Правка машинерии №3 скила surfacing-open-questions (спека v6, раздел stena3):
isLedgerAppend пускает Write/Edit в карантин open-questions-*.md (префикс/.md/без
вложенности), включена в разрешение разговорной фазы рядом с isAuthoringWrite.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 08:51:03 +03:00
Дмитрий 81da2e2c45 feat(observer): эпизод несёт четыре вердикта (роутер/наставник/судья/gate3)
Новый observer-verdicts: читает персистентный verdict-snapshot-<sid>.json и сводит к четырём
звеньям (последний вердикт по ts на звено). Эпизод наблюдателя получил поле verdicts из снимка
текущей сессии → по логам восстановимо, на каком звене план отскочил. Раньше в эпизоде был только
сигнал роутера. Граница не тронута (observer-stop-hook, recommended_chain, цепочки). Хвост спеки
роутера §7 (логирование решающих), эпик роутер-реестр этап 3, item 3.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 08:42:14 +03:00
Дмитрий 6ef3f94911 feat(wall): пустить вызов surfacing-open-questions (SEED) в разговоре
Правка машинерии №1 скила surfacing-open-questions (спека v6, раздел stena1):
surfacing-open-questions добавлен в SEED_SKILLS — вызов охотника проходит в
разговорной фазе, как brainstorming/discovery-interview. Вызов скила мир не мутирует.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 08:37:35 +03:00
Дмитрий 7c282242c2 feat(oq): журнал охотника — формат/разбор/replay/активная-сессия
Узел «журнал» скила surfacing-open-questions (спека v6, раздел zhurnal):
formatEventLine/parseEventLine, replay с отбросом битой хвостовой строки,
activeSessionOf (порог протухания 30 мин — одна активная сессия на тему).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 08:18:31 +03:00
Дмитрий f22f8bd2ef feat(router): пининг совета роутера по goalHash (переписка шагов не зовёт LLM заново)
Новый router-pin-store: пин совета роутера по (task_id, goalHash) пер-сессионно.
on-plan-write пин-aware: пин-попадание по неизменной цели → совет переиспользуется,
classifyImpl НЕ зовётся; промах/смена цели → classify + сохранение пина. Проводка в
активный наставник-хук инъекцией реального стора с sessionId (инъекция-выкл по умолчанию,
старое поведение/тесты целы). Хвост спеки роутера §4 (пининг по goalHash), эпик роутер-реестр
этап 3, item 2. Граница не тронута (recommended_chain, цепочки, observer-stop-hook, owner-seal).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 08:18:15 +03:00
Дмитрий 4713a65b63 fix(router): extractPlanGoal берёт всё тело ## Цель (не первый абзац/fenced/шапку)
extractPlanGoal обрывал многострочную цель на первой строке (multiline $) и при
пустой строке под заголовком падал в фолбэк, хватавший skills-json-блок или Kind-маркер
как цель → роутер классифицировал план по мусору, пининг садился на мусор. Регекс теперь
берёт тело секции целиком до следующего заголовка / fenced-блока / конца текста; фолбэк
исключает заголовки и fenced-блоки; при нескольких секциях берётся первая.
Хвост спеки роутера §4 (вход роутера), эпик роутер-реестр этап 3, item 1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 07:51:22 +03:00
Дмитрий 84949cca4b fix(wall): наставник чтит owner-seal — пропуск к судье в тупике + урок в гайд
owner-seal был мёртв в тупике с наставником: наставник блокировал (exit 2) раньше,
чем оркестратор звал судью (а owner-seal читает только судья). Теперь
decideMentorObjection принимает ownerSealOpen; при открытом терминальном гранте
владельца наставник не блокирует (и на NO-GO, и на degraded) — пропускает к судье,
который печатает через ownerSealOpen. main() вычисляет owner-seal тем же
ownerSealOpenForEvent, что и судья. GO-путь не изменён.

Гайд стены: урок 2026-06-21 — при требовании наставника о церемонии вокруг
разрушительных шагов уступать и добавлять прогон проверки перед каждым; owner-seal
теперь работает и в тупике с наставником.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 06:12:54 +03:00
Дмитрий 7c728917c7 refactor(observer): этап 3 сноса цепочек L — снос chain-detector + chain-map + retrofill
Снята зависимость парсера транскрипта наблюдателя от машинерии L-цепочек:
- observer-transcript-parser больше не импортирует observer-chain-detector,
  не загружает observer-chain-map.json и не пишет primary_rationale.chain_ref;
- KNOWN_NODES больше не черпает имена из карты цепочек (источники: known-nodes.txt,
  маркер direct, форменные правила #NN и плагин:навык);
- удалены observer-chain-detector.mjs(+test), observer-chain-map.json,
  observer-retrofill-chain-ref.mjs(+test).

Граница не тронута: recommended_chain/recommended_node/chain_progress/chain_completed,
observer-stop-hook, командные цепочки, verifyChain. Полный свод зелёный.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 05:50:59 +03:00
Дмитрий c5af28f529 refactor(router): Этап B сноса цепочек L — потребители/наблюдатель/хуки без реестра L1-L17
B2: router-classifier.mjs без buildChainsBlock и блоков «Available chains» (recommended_chain сохранён).
B3: удалены router-stop-gate(+test) и observer-chain-map-checker(+test); status-md-generator без
health-check C6; lefthook.yml без шага observer-chain-map-checker. observer-chain-detector и
observer-chain-map.json — снос отложен в под-этап (живые импортёры transcript-parser/retrofill/stop-hook).
Гайд: восстановлена markdown-разметка урока 2026-06-20. Полный свод зелёный.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:01:48 +03:00
Дмитрий 4249535eea refactor(router): Этап B1 сноса цепочек L — node-graph без chains/hintLinksOf
Этап 3 эпика «роутер-реестр» (B1): из tools/node-graph.mjs убрана поддержка chains
(в buildNodeGraph) и функция hintLinksOf (живого импортёра нет); тест приведён в
соответствие (без hintLinksOf-блока и литералов chains). twinsOf/conflictsOf/resolveNode/
checkGraphFreshness сохранены. Полный свод зелёный (263 файла, 4414 тестов — прогон в чистом
терминале владельца; под Bash сессии воркеры коллапсируют от контеншна).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 16:15:10 +03:00
Дмитрий 0103388bc0 feat(wall): ScheduleWakeup self-pause allowed in all modes + guide 2026-06-20 15:39:57 +03:00
Дмитрий 612eabc228 refactor(registry): Этап A сноса цепочек L — schema/nodes/registry-load без chains
Этап 3 эпика «роутер-реестр» (фундамент): убран реестр именованных цепочек L1-L17
из schema.json (required/свойство chains/chain_membership/определение chain), nodes.yaml
(153 строки chain_membership + секция chains), registry-load.mjs (chains/findChainsByNode)
и его теста. recommended_chain и прочие границы D5 не тронуты. Полный свод зелёный
(263 файла, 4412 тестов). node-graph/router-classifier (Этап B) устойчивы к отсутствию chains.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 14:51:49 +03:00
Дмитрий a5d30f38a3 feat(registry): живой охват 2c — данности, граф, coverage-wiring, врезка в гейт
Этап 2c эпика роутер-реестр: оживление машины охвата как замена цепочкам L.
- registry-initial-inputs.mjs: токены-данности (category:given) для initialInputs.
- registry-graph-health.test.mjs: граф ацикличен, рёбра producer-consumer.
- coverage-wiring.mjs: мост recommended skills -> readinessChecklist -> {cards, ready, holes}; ready=нет-дыр.
- enforce-judge-gate.mjs: coverageCardsFor/coverageGate — карточки + стоп при дыре (инъекция-выкл).
- замок словаря (vocabTokens) на живом пути; гайд по стене: автономность + уроки сессии.
Регрессия: 4375 passed (канонический свод владельца).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:18:22 +03:00
Дмитрий 13fbcc9903 перевод агентов роутера/наставника/судьи на deepseek-v4-flash 2026-06-19 11:20:20 +03:00
Дмитрий 4dee49e4a1 feat(registry): токенизация needs/produces — группа tools/MCP, ЭТАП 2b ЗАВЕРШЁН (роутер-реестр)
Phase 2b группа C (финал): 51 атомарный инструмент (MCP-серверы + линтеры/
тулинг) переведены на токены словаря. Словарь +98, всего 265 токенов, v0.6.0.

ИТОГ ЭТАПА 2b: ВСЕ 153 контракта needs/produces на токенах словаря.
- замок словаря проходит на полном наборе (0 unknown) — готовность к 2d;
- граф ожил: A8-цепочка, superpowers, knowledge-work, кросс-плагинные мосты
  (write-spec->writing-plans, frontend-design->design-handoff).

Тест: финальный замок-тест всего реестра (153 контракта + рёбра графа).
Регрессия 4373 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:27:39 +03:00
Дмитрий 88fc55b4a5 feat(registry): токенизация needs/produces — группа skills B (этап 2b, роутер-реестр)
Phase 2b группа B: 39 контрактов (plugin-dev, claude-md-management, adr-kit,
ui-ux-pro-max, frontend-design + одиночные self-authored/standalone скилы)
переведены на токены словаря. Словарь +61, всего 167 токенов, v0.5.0.

Кросс-мост графа: frontend-design produces ui-design -> design-handoff (group A).
skill-creator/writing-skills сходятся на authored-skill.

Тест: замок-тест группы B + кросс-мост ui-design. Регрессия 4371 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:23:08 +03:00
Дмитрий ef92b5e39e feat(registry): токенизация needs/produces — группа knowledge-work (этап 2b, роутер-реестр)
Phase 2b группа A: 43 контракта (product-management/design/marketing/
operations/finance/brand-voice) переведены с прозы на токены словаря.
Словарь +67, всего 106 токенов, v0.4.0.

Достроены мостовые цепочки графа:
- user-research -> research-synthesis / synthesize-research (raw-research)
- content-creation -> draft-content -> brand-review (content-framework/marketing-draft)
- journal-entry-prep -> close-management (close-entries)
- write-spec -> (feature-spec, кормит writing-plans)
- design-handoff <- ui-design (от frontend-design, цепочка в группе tools)

Тест: новый замок-тест группы (43 контракта проходят словарь + рёбра).
Регрессия 4369 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:10:32 +03:00
Дмитрий acd9bdc479 feat(registry): токенизация needs/produces — батч superpowers (этап 2b, роутер-реестр)
Phase 2b батч 1: 14 superpowers-контрактов переведены с прозы на токены словаря.
Словарь +13 (атомарные выходы + данности), всего 39 токенов, v0.3.0.

Граф ожил для рабочих цепочек (рёбра producer->consumer):
- brainstorming -> writing-plans -> executing-plans / subagent-driven
- test-driven-development -> requesting-code-review -> receiving-code-review
- finishing-a-development-branch (needs completed-change)

Тесты: новый замок-тест батча (14 контрактов проходят словарь + рёбра графа);
m3c-coverage-invariants просьба обновлена на токен; capability-vocabulary
счётчик -> >= (словарь живой). Регрессия 4369 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:03:22 +03:00
Дмитрий 9ad00cf96c feat(registry): фундамент-словарь capability-токенов (этап 2a, роутер-реестр)
Phase 2a эпика «роутер-реестр» (спека v2 §3, OPEN-1): расширен
docs/registry/capability-vocabulary.json 10 -> 26 токенов.

- A8-цепочка (10) сохранена.
- 9 токенов-мостов рабочих цепочек (создают рёбра графа producer<->consumer):
  feature-spec, implementation-plan, completed-change, code-review-feedback,
  raw-research, ui-design, marketing-draft, content-framework, close-entries.
- 7 токенов-данностей задачи (-> initialInputs в 2c): feature-intent,
  feature-or-bugfix, bug-or-failure, ui-task, user-understanding-need,
  marketing-content-task, close-source-data.
- Тест формы на реальном файле (validateVocabulary ok + счётчик + ключевые токены).

Атомарные produce-токены ~144 контрактов добавляются в 2b (словарь живой).
Структурная разведка подтверждена графом проекта (graphify, правило 14):
coverage-machine не подключён к живому enforce-judge-gate (работа 2c),
два реестра (контрактный community 92 / узловой community 20).

Регрессия: 4367 passed, exit 0 (5 чужих node:test исключены).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 08:57:36 +03:00
Дмитрий 524bcfd05f feat: разворачивание комка ui-ux-pro-max — 7 навыков (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Решение владельца 19.06 (путь 2):
зонтик ui-ux-pro-max развёрнут в 7 карточек-навыков + 7 под-узлов #31a..#31g.
Роль сохранена в каждой карточке: материал/решение по UI → стек Vue+Vuetify
(R6.0), финальный код — Frontend Design #30.

- 7 карточек: banner-design, brand, design, design-system, slides, ui-styling,
  ui-ux-pro-max (master)
- nodes.yaml: узел #31 → #31a..#31g; мастер #31g держит конфликт-треугольник
  (frontend-design ↔ 21st-magic); обратные ссылки у #30/#32 перенаправлены на
  ui-ux-pro-max:ui-ux-pro-max → симметрия конфликтов сохранена (m3e зелёный)
- зонтик убран; registry-load.test: 153 узла / 145 active
- hookify оставлен одной карточкой (решение владельца)

Правка PSR (роль UPM: материал → решатель-с-ограничением) — отдельным шагом.

Регрессия (без 5 pre-existing node:test файлов): 4365 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:35:14 +03:00
Дмитрий 396ec5f851 feat: разворачивание комка brand-voice — 3 навыка (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик brand-voice развёрнут
в 3 карточки-навыка + 3 под-узла #76a..#76c.

- 3 карточки: brand-voice-enforcement, discover-brand, guideline-generation
- nodes.yaml: узел #76 → #76a..#76c; триггеры (тон/голос бренда → enforcement,
  brand guidelines → guideline-generation); ADR-015 MKT6 на enforcement
- зонтик убран; registry-load.test: 147 узлов / 139 active

Этап 1 (разворачивание): 10/12 комков готовы. Остались развилки владельцу:
hookify (slug hookify:hookify кривой) и ui-ux-pro-max (требует правки PSR).

Регрессия (без 5 pre-existing node:test файлов): 4365 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:42:15 +03:00
Дмитрий 4a25302ac9 feat: разворачивание комка finance-plugin — 8 навыков (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик finance-plugin развёрнут
в 8 карточек-навыков + 8 под-узлов #61a..#61h.

- 8 карточек: audit-support, close-management, financial-statements,
  journal-entry, journal-entry-prep, reconciliation, sox-testing, variance-analysis
- journal-entry (финализация) и journal-entry-prep (подготовка к close) оставлены
  обе с разными визитками (решение по дублю)
- nodes.yaml: узел #61 → #61a..#61h; триггеры распределены; ADR-012 граница
  на sox-testing (SOX n/a РФ)
- зонтик убран; registry-load.test: 145 узлов / 137 active

Регрессия (без 5 pre-existing node:test файлов): 4365 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:39:50 +03:00
Дмитрий 65224b268c feat: разворачивание комка operations — 9 навыков (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик operations развёрнут в
9 под-узлов #51a..#51i. process-doc уже был вынесен карточкой
(operations-process-doc.contract.json) — ей заведён узел #51d.

- 8 новых карточек: capacity-plan, change-request, compliance-tracking,
  process-optimization, risk-assessment, runbook, status-report, vendor-review
- process-doc — узел #51d на существующую карточку operations:process-doc
- nodes.yaml: узел #51 → #51a..#51i; триггеры распределены; ссылка L4 → operations:runbook
- зонтик убран; registry-load.test: 138 узлов / 130 active

Регрессия (без 5 pre-existing node:test файлов): 4365 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:37:05 +03:00
Дмитрий 08c951a4b8 feat: разворачивание комка marketing-plugin — 8 навыков (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик marketing-plugin развёрнут
в 8 карточек-навыков + 8 под-узлов #74a..#74h.

- 8 карточек: brand-review, campaign-plan, competitive-brief, content-creation,
  draft-content, email-sequence, performance-report, seo-audit
- nodes.yaml: узел #74 → #74a..#74h; триггеры распределены (классификация
  marketing + маркетинговый контент → content-creation как resolver C1);
  ADR-015 boundary на content-creation; ссылка L16 обновлена
- marketing-plugin:competitive-brief отличён от product-management:competitive-brief
- зонтик убран; registry-load.test: 130 узлов / 122 active

Регрессия (без 5 pre-existing node:test файлов): 4365 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:33:54 +03:00
Дмитрий f2365caf4b fix: escape-окошки мимо anti-cosmetic-стража (escape-flow unblock)
Anti-cosmetic-детектор (>2 простых AskUser за сессию → hard-block, требует brainstorming) глушил
ЛЕГИТИМНЫЙ поток escape-окошек: владелец даёт разрешение FLOOR-ESCAPE через AskUser, и после >2
таких окошек стена их блокировала — нормативку под стеной нельзя было довести (баг найден живым
прогоном 18.06). Фикс по аналогии с git-approval exemption (Calibration 5): isEscapeAuthQuestion
(вопрос несёт метку FLOOR-ESCAPE) освобождается в decide() — не косметика, не считаем, не блокируем.
Не абьюзится: метка сигналит авторизацию владельца, а не подмену идеации. Свод 4383 зелёный.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 23:20:01 +03:00
Дмитрий bf3d557cce feat: разворачивание комка design-plugin — 7 навыков (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик design-plugin развёрнут
в 7 карточек-навыков + 7 под-узлов #46a..#46g. Контракт раньше описывал
лишь 3 из 7 реальных навыков — теперь покрыты все.

- 7 карточек: accessibility-review, design-critique, design-handoff,
  design-system, research-synthesis, user-research, ux-copy
- nodes.yaml: узел #46 → #46a..#46g; триггеры (дизайн-критика→critique,
  ux-копирайт→ux-copy, research synthesis→research-synthesis)
- зонтик убран; registry-load.test: 123 узла / 115 active

Регрессия (без 5 pre-existing node:test файлов): 4365 passed, exit 0.
(askuser-cosmetic-escape-exempt флакает под параллелизмом — изолированно зелёный, не связан.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:18:20 +03:00
Дмитрий 0258b9d2a7 feat: разворачивание комка product-management — 8 навыков (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик product-management развёрнут
в 8 карточек-навыков + 8 под-узлов #42a..#42h.

- 8 карточек: write-spec, roadmap-update, metrics-review, product-brainstorming,
  sprint-planning, stakeholder-update, synthesize-research, competitive-brief
- nodes.yaml: узел #42 → #42a..#42h; триггеры (planning/prd→write-spec,
  роадмап→roadmap-update, метрики→metrics-review); ссылка L9 обновлена
- product-management:competitive-brief отличён от marketing:competitive-brief
  (та самая коллизия имён, ради которой имя файла несёт плагин)
- зонтик убран; registry-load.test: 117 узлов / 109 active

Регрессия (без 5 pre-existing node:test файлов): 4361 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:13:44 +03:00
Дмитрий f01f5b8bbc feat: разворачивание комка adr-kit — adr + judge (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик adr-kit развёрнут в
2 содержательные карточки (служебные init/setup/upgrade/lint/migrate/
install-hooks в реестр не входят — решение владельца 18.06).

- 2 карточки: adr-kit__adr (ведение ADR) + adr-kit__judge (сверка vs Accepted ADR)
- nodes.yaml: узел #36 → #36a/#36b; триггеры (adr→#36a, enforcement→#36b);
  ссылки L4/L5 обновлены на adr-kit:adr
- зонтик adr-kit убран (карточка + узел)
- registry-load.test: 110 узлов / 102 active
- m3b-node-graph: резолв известного узла #36 → #36a

Регрессия (без 5 pre-existing node:test файлов): 4361 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:09:38 +03:00
Дмитрий ded5372f4e feat: разворачивание комка plugin-dev — 7 навыков (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик plugin-dev развёрнут в
7 карточек-навыков + 7 под-узлов #57a..#57g.

- 7 карточек plugin-dev__<навык>.contract.json (agent/command/hook/mcp/
  plugin-structure/plugin-settings/skill-development)
- nodes.yaml: узел #57 → #57a..#57g; keyword-триггеры на plugin-structure;
  ссылка L11 обновлена на plugin-dev:plugin-structure
- зонтик plugin-dev убран (карточка + узел)
- registry-load.test: 109 узлов / 101 active

Регрессия (без 5 pre-existing node:test файлов): 4361 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:05:06 +03:00
Дмитрий 5a7c5c255c feat: разворачивание комка superpowers — 14 навыков (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик superpowers (14 meta-skills
одной карточкой) развёрнут в 14 отдельных карточек-навыков + 14 под-узлов
ради точного подбора роутером.

- 14 карточек superpowers__<навык>.contract.json (skill = superpowers:навык)
- nodes.yaml: узел #19 развёрнут в #19a..#19n; классификации-триггеры
  распределены: feature в brainstorming, planning в writing-plans, tdd в TDD, debug в debugging
- writing-plans приведён к конвенции (был own без префикса/узла → external + узел)
- зонтик superpowers убран (карточка + узел)
- тесты: registry-load 103 узла/95 active; m3a/m3c образцы own/external
- splitting-inventory: прогресс + доп-каскады для крупных комков

Регрессия свода: 4361 passed, 0 failed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 22:53:20 +03:00
Дмитрий e98ba1e527 feat: разворачивание комка claude-md-management — пилот реестра роутера
Эпик роутер-реестр, спека v2 §2. Развёрнут самый маленький комок-зонтик
в 2 отдельные карточки-навыка ради точного подбора роутером. Пилот выверил
конвенцию для остальных 11 комков.

- 2 карточки: claude-md-management__claude-md-improver + __revise-claude-md;
  поле skill = плагин:навык, kind external, zero-hash source
- nodes.yaml: узел #33 развёрнут в дочерние #33a/#33b; ссылка L12 обновлена
- schema.json: паттерн id расширен на дочерний суффикс #NNa
- registry-load.test: счётчики узлов 89 в 90, active 81 в 82
- splitting-inventory.md: инвентаризация 12 комков + выверенная конвенция
- тест-сторож split-pilot-claude-md + план пилота

Регрессия свода: 4361 passed, 0 failed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 22:35:59 +03:00
Дмитрий b978738be6 fix: NO-GO наставника стирает прежнее «да» (стейл-mentor-GO)
Судья мог судить/печатать план, который наставник завернул: mentor-GO привязан к plan_hash =
planId(steps) (только шаги), пишется ТОЛЬКО на GO и НЕ стирался на NO-GO. При идентичных steps
(менялся лишь текст плана) старое «да» переживало смену содержания — судья находил устаревшее
одобрение (mentor-go-store::mentorGoValidFor по plan_hash) и проходил mentorApproved-гейт несмотря
на свежий NO-GO наставника. Вскрыто живым прогоном (план опечатался при mentor NO-GO + judge GO).
Фикс: clearMentorGo стирает запись; enforce-mentor-on-plan-write на реальном NO-GO (blocked) её
зовёт (degraded не трогаем — verdict неизвестен). Инвариант: «да» наставника живёт ⟺ последний
проход одобрил. Свод 4376 зелёный.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 22:00:24 +03:00
Дмитрий d669a6bcb5 fix: возражения судьи доходят до показа вердикта (visibility-gap)
Контроллер видел голое «NO-GO [judge]» без претензий: показ вердикта берёт поле reason, а
pushVerdict писал reason = verdict.reason || recommendation — у судьи recommendation пуст (суть в
objections[]), и возражения терялись. Хотя они есть в системе (карточка арбитража / память кругов
через formatJudgeObjection) — просто не в показ. Новая judgeSurfaceReason(verdict): reason/
recommendation, иначе formatJudgeObjection(verdict.verdict) — дословные возражения. runJudgeTurn
использует её для pushVerdict + writeStage. Поймано вживую: судья дал delivery=internal[heavy] +
позиция-без-якорей[light], а контроллеру пришло пусто. Свод 4374 зелёный.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 21:29:04 +03:00
Дмитрий 7cf91ecf12 feat: роутер-реестр — словарь capability-токенов, прототип A8, замок словаря 2026-06-18 20:33:42 +03:00
Дмитрий 0d31e62248 feat: анти-диктовка свободного floor_escape (consent forgery C)
Свободный floor_escape (лёгкий escape в чате) НЕ доверяется, если контроллер в своём тексте
текущего хода инструктировал владельца вписать метку. processEvent читает текст контроллера
из транскрипта хода (readTranscript + lastAssistantText, переиспользован), один раз на событие
зовёт detectOtherSocialEng (раньше был мёртвой проводкой — не вызывался нигде); flagged →
floor_escape не пишется. Паттерны detectOtherSocialEng усилены императивной диктовкой метки
FLOOR-ESCAPE (глагол рядом; простое упоминание концепта не флагуется). fail-open observability —
сбой чтения транскрипта → как раньше. Применяется к floor_escape (git-approval закрыт #A).
Завершает кодовую часть эпика (A + B1-B5 + C). Спека §C. Свод 4350 зелёный.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 19:54:25 +03:00
Дмитрий 11969ac3ea feat: пол требует терминальный грант для разрушительного (consent forgery B5)
Per-command escape несущего пола (rm -rf / git push --force / migrate:fresh / db:wipe / запись в
runtime/секрет) открывается ТОЛЬКО терминальным грантом владельца (origin+подпись, fail-closed),
не chat floor_escape — Поза 1. Пол по определению блокирует лишь необратимое → весь его escape
тяжёлый: enforce-floor::main грузит loadTerminalGrants вместо loadFloorEscapes. decide()/floorDecide
агностичны источнику — логика и тесты пола не тронуты. Стена (supreme-gate 396) не правится: пол
(matcher '*') связывает первым. Завершает Часть B (терминал-канал). Свод 4346 зелёный, пол 12/12.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 19:26:24 +03:00
Дмитрий 5bcf229e4f feat: plan-done и арбитраж gate3 — только терминальный грант (consent forgery B4)
Снятие печати плана (plan-done) и арбитраж gate3 (gate3-arb:accept/continue) — тело-агностичные
согласия, обходящие/снимающие стену — теперь открываются ТОЛЬКО терминальным грантом владельца
(Поза 1, HOLE-4). supreme-gate: новый параметр terminalGrants в decideMode/runGate, PLAN_FINISH_ACTION
проверяется против него (лёгкий escape остаётся на chat-грантах); main грузит loadTerminalGrants.
gate3-loop: арбитраж-гранты грузятся через loadTerminalGrants (loader-swap; resolveOwnerArbitration
агностична). Ядро стены: 138/138, gate3 44/44, полный свод 4346. Спека §B/§DEC.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 19:03:10 +03:00
Дмитрий 29287d73c9 feat: деплой и коммит — только терминальный грант владельца (consent forgery B3)
ops-runbook:<hash> (деплой) и commit:<hash> (коммит агентом) открываются ТОЛЬКО
терминальным грантом владельца (origin:owner-terminal + валидная подпись, ключ обязателен —
fail-closed #KEY), не chat floor_escape — Поза 1. loadPlanScopedGrants переписан как
loadTerminalGrants + фильтр по префиксу (origin/подпись/нижняя граница в одном месте, DRY).
Мосты blessed-ops/commit-grant не тронуты (читают через те же обёртки). Тесты загрузчиков
переписаны под новый контракт. Спека §B/§KEY/§CRIT6.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 18:39:48 +03:00
Дмитрий f87090702c feat: owner-seal только из терминального гранта (consent forgery B2)
Печать «одобрено владельцем» (owner-seal) теперь открывается ТОЛЬКО терминальным грантом
владельца (loadTerminalGrants), не chat floor_escape — Поза 1 для самого тяжёлого согласия.
Вычисление вынесено в тестируемую ownerSealOpenForEvent (источник грантов инъектируется);
sealTurnProd зовёт её с loadTerminalGrants. sealOnWiredGo (берёт ownerSealOpen параметром) и
его тесты не тронуты. Убран ставший неиспользуемым верхний импорт loadFloorEscapes
(escape-валве судьи берёт его динамически). Спека §B/§CRIT7.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 18:17:46 +03:00
Дмитрий dec0ed502a feat: терминальный грант владельца — примитив (consent forgery B1)
Несомненный канал согласия для тяжёлого (Поза 1): floor_escape с origin:owner-terminal,
подписанный ключом keychain. Скрипт владельца tools/owner-consent.mjs строит+подписывает+
пишет грант (запускает владелец; контроллер не может — нет ключа + floor режет запись runtime).
Читатель loadTerminalGrants принимает ТОЛЬКО origin-помеченные валидно-подписанные гранты,
ключ обязателен (fail-closed, #KEY). Нулевой радиус: живые потребители НЕ тронуты —
подключение (owner-seal/ops-runbook/commit/plan-done/gate3/bash) отдельными заходами B2+.
Спека: specs/2026-06-18-consent-forgery-fix-design.md §B/§KEY.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 18:02:28 +03:00
Дмитрий cdc32b1a1d fix: anti-button — согласие только из свободного ввода владельца (consent forgery A)
Ответ AskUserQuestion, дословно совпавший с ярлыком контроллерской кнопки, больше
не порождает доверенную запись (floor_escape И approve_git_operation). Закрывает
наблюдаемую подделку owner-seal и HOLE-1 (git-approval тем же классом). Фундамент —
guard в единственном писателе processEvent + чистый предикат answerMatchesOption.
Спека: specs/2026-06-18-consent-forgery-fix-design.md §A.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 17:43:58 +03:00
Дмитрий cdcaf610a0 fix: §3.4 десинк — печать снимается ЛЕНИВО (criterion-gate видит план на пуше)
Баг: на ПОСЛЕДНЕМ шаге плана supreme-gate (PreToolUse) снимал печать синхронно
ДО того, как со-хук criterion-gate (PreToolUse, в settings.json ПОЗЖЕ) успевал
проверить пуш → criterion видел «нет плана» и ложно блокировал код-пуш.

Фикс (правка только enforce-supreme-gate.mjs runGate):
- на planComplete печать БОЛЬШЕ НЕ снимается синхронно (указатель за конец +
  метка петли E-S1 остаются) → план жив для co-хуков в этом же tool-call;
- печать снимается ЛЕНИВО на СЛЕДУЮЩЕМ действии (ветка в начале runGate: если
  committed-указатель за последним листом и steps — непустой массив → removeFrozenPlan
  + разговорный режим). Гард steps на массив: минимальные/legacy-планы без steps
  не считаются «исчерпанными».

Строго лучше прежнего: чинит ложный блок код-пуша последним шагом (зелёные критерии),
случай реального провала критерия не ухудшен. Спека §3.4.

+2 теста (ленивое снятие + репро «печать не снята синхронно»), свод 4320 passed / 2 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 14:49:33 +03:00
Дмитрий b47a71c66b feat: D2 — канал коммита под ревью (агент коммитит под commit:<hash>)
Опечатанный ревью-план (GO наставника+судьи, judge_mode=live-block) + одно
согласие владельца `FLOOR-ESCAPE: commit:<plan-hash>` → агент делает git
add/commit/push без терминала владельца. Гейт ПРИСУТСТВИЯ (router-gate
git-approval) отходит; гейты КАЧЕСТВА (criterion-gate/verify-gate) НЕ тронуты —
код-коммит всё равно требует по-критерийный GREEN и свежую расписку. Согласия
деплоя (ops-runbook:) и коммита (commit:) — раздельные кнопки.

- escape-grant: обобщён plan-scoped загрузчик (loadPlanScopedGrants/
  planScopedGrantOpen, окно = существование плана); D1 ops-runbook стал тонкой
  обёрткой; добавлены commit: COMMIT_GRANT_PREFIX/loadCommitGrants/commitGrantOpen.
- commit-grant (новый мост план↔router-gate): commitGrantOpenForSession —
  открыт ли commit:<hash> на валидный sealed live-block план сессии.
- shell-content-rules classifyGitCommand: conditional-git пускается при
  ctx.commitGrantOpen; GIT_HARD (force-push/--no-verify/-c) блокирует ПЕРВЫМ
  (качество/безопасность не ослаблены).
- enforce-router-gate: main кладёт ctx.commitGrantOpen (gated через мост).

План: docs/superpowers/plans/2026-06-18-agent-commit-channel-plan.md
Спека: docs/superpowers/specs/2026-06-18-agent-commit-channel-design.md §3.1-3.2.

ОТЛОЖЕНО (требует решения владельца, в хвосте плана):
- §3.3 docs/ops без criterion/verify: .md уже пропускается; расширение на
  не-.md ops-артефакты конфликтует с CLAUDE.md §13 v2.40 — нужен явный список.
- §3.4 десинк push-последним-шагом: рискованная правка снятия печати стены.

+22 теста, свод 4319 passed / 2 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 13:58:05 +03:00
Дмитрий bbc053e0a6 feat: D1 — благословлённый ops-runbook (деплой выполняет агент под ревью)
Деплой, помеченный **Kind:** deploy и опечатанный (наставник+судья GO,
judge_mode=live-block), агент выполняет по белому списку шагов под ОДНИМ
согласием владельца `FLOOR-ESCAPE: ops-runbook:<plan-hash>` — без аварийного
выхода на каждую команду. «Ядерный» набор (rm -rf/force-push/migrate:fresh/
db:wipe) остаётся на per-command escape.

- plan-lock: freezePlan принимает kind (в подписанную базу + хеш, как delivery);
  не-'normal' добавляет поле, обычные планы байт-идентичны старым печатям.
- plan-skills: parsePlanKind (**Kind:** deploy|normal, default normal).
- seal-orchestration: sealablePlan/sealPlan прокидывают kind в печать.
- escape-grant: loadOpsRunbookGrants (окно = существование плана, БЕЗ 5-мин
  фильтра) + opsRunbookGrantOpen (точный матч на plan_id).
- floor-decide: floorDecide получает инъектируемый blessedOps(cmd); content-block
  команда из набора пропускается, ЯДЕРНЫЙ набор (bashIsFloor) исключён из послабления.
- blessed-ops (новый модуль-мост): buildBlessedOps + loadBlessedOpsForSession —
  знает план+пол, чтобы СОХРАНИТЬ Δ9 (enforce-floor не зависит от модуля печати плана).
  Предикат пускает команду только дословно из Bash-листов опечатанного deploy-плана.
- enforce-floor: gated — blessed-ops грузит план/гранты ТОЛЬКО при открытом
  ops-runbook-гранте; без согласия владельца пол плана не касается (Δ9 цел).

План: docs/superpowers/plans/2026-06-18-blessed-ops-runbook-plan.md
Спека: docs/superpowers/specs/2026-06-18-blessed-ops-runbook-design.md §3.1-3.7.
+33 теста, свод 4299 passed / 2 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 13:19:22 +03:00
Дмитрий bc1d2a370a feat: B+C часть 2 — сеанс осмотра op:"session" под стеной
Новый тип шага плана op:"session" {goal, tools, produces} для интерактивного
осмотра (логин/формы/чужой сайт) под планом: внутри сеанса смотреть/кликать по
живым ref свободно, указатель не двигается; сеанс закрывает запись последнего
produces (матч-якорь). Снят дедлок op:"Skill"-как-шаг.

- plan-lock: sessionProduces, actionMatchesStep матчит последний produces,
  validatePlanTree валидирует session (produces>=1) и запрещает op:"Skill",
  sanitizeSessionTools (предохранитель §3.3: дроп Write/Edit/Bash/floor + warn).
- enforce-supreme-gate decide: ветка указатель-на-сеансе — tools сеанса и
  промежуточные produces allow без сдвига, пол применяется (defense-in-depth).
- plan-steps-parse: распознаёт op:"session" (goal/tools/produces, без object/ref),
  отвергает op:"Skill" с явным сообщением.
- mentor-verdict: наставник понимает op:"session" — не заворачивает как непонятный шаг.
- сеанс+tools/produces в хеше и подписи плана (подмена ломает печать).

Спека: docs/superpowers/specs/2026-06-18-wall-interactive-session-design.md §3.2-3.3.
+37 тестов, свод 4266 passed / 2 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 11:54:42 +03:00
Дмитрий e9ba6fb9a2 feat: B+C part1 - смотрящие инструменты свободны под/без плана (isQueryOnly)
Новый предикат isQueryOnly (ToolSearch/WebFetch/WebSearch/read-only браузер:
navigate/snapshot/wait/screenshot) проведён во все ветки стены: смотрящие и
спрашивающие инструменты проходят и в разговорном режиме (осмотр чужого сайта
без плана), и под опечатанным планом, не двигая указатель шагов. Действующие
инструменты (клик/ввод) сюда не входят - они пойдут через сеанс осмотра
(часть 2 B+C). Свод зелёный: 4229 passed, 2 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 10:52:47 +03:00