Commit Graph

115 Commits

Author SHA1 Message Date
Дмитрий 4253cd7114 fix(secretary): разбор хвоста пропускает tool_result (ловит промпт+действия), провенанс по реальному ходу, кириллица в имени дела
Корень бага: в формате Anthropic tool_result — сообщения role:user; parseLastExchange
брал их вместо настоящего промпта, теряя текст юзера и действия. + хук форсит реальный
turn (Хайку его не знает) + work-slug принимает кириллицу.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 07:21:09 +03:00
Дмитрий aca831eb54 feat(secretary): 3 хук-переходника (stop/prompt/sessionstart) + разбор хвоста стенограммы
Мотор stop-hook на отдельном SECRETARY_LLM_KEY. Переходники смоук-проверены (импорт),
поведенческая проверка — после вписки в settings.json + ключа.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 05:59:28 +03:00
Дмитрий 101c08d447 feat(secretary): layer1 + чистое ядро обёрток (extract prompt/parse, encoding/links/period/index-context, TDD)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 05:48:40 +03:00
Дмитрий bb7633b318 feat(secretary): ядро — детект команды, протокол (reconcile), нарезка, оглавление (TDD)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 04:30:38 +03:00
Дмитрий 3aa08c45cb feat(graphify): scope авто-обновления под пост-сплит — tools/ в scope, app/ убран, *.test.mjs исключён (амендмент ADR-017)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:04:10 +03:00
Дмитрий 06441fd79b fix(hooks): gitleaks-full-history чисто пропускается без бинаря (шелл-агностичный guard, без exit-127)
Хрупкий guard `test -f ./bin/gitleaks.exe || exit 0` падал exit-127, когда команда test недоступна
в шелле git-хука → шаг pre-push падал вместо чистого пропуска. Новый tools/run-if-exists.mjs (node,
всегда доступен в контексте хука): бинарь отсутствует → skip exit 0; присутствует → запуск с
пробросом кода. lefthook gitleaks-full-history переведён на него. Разведка: bin/gitleaks.exe и
.gitleaks.toml в репо отсутствуют → реальный скан невозможен, наблюдался именно exit-127, не
настоящая находка; .gitleaksignore без бинаря/конфига/отпечатков не составить. gitleaks #1 и lychee
#14 — тот же паттерн, отдельный инфра-долг. Эпик роутер-реестр этап 3, item 6.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:02:47 +03:00
Дмитрий 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