Commit Graph

138 Commits

Author SHA1 Message Date
Дмитрий ceda265a5d fix(secretary): границы спанов из сырья по ярлычку isMeta (корень бага со сдвигом)
Баг: границы спанов метились предсказанным номером хода (turnCount+1 в prompt-hook),
который уезжает под гейт-петлёй (coverage-хук вставляет служебные ходы, Claude Code
очередит промпт). Итог — служебный ход принимался за реальную просьбу (фантомный
«Ход 5» в тетради + ложные скрытые вопросы про coverage).

Корень: терялся структурный ярлычок isMeta (служебное vs владелец), который уже есть
в транскрипте. Теперь:
- parseLastExchange читает entry.isMeta -> userIsMeta;
- buildRawRecord пишет метку meta=1 в заголовок служебного хода;
- realBoundariesFromRaw определяет границы СТРУКТУРНО (meta=1; фолбэк по тексту) —
  это ОСНОВНОЙ источник; ненадёжный realPromptTurns/prompt-hook-механизм убран;
- разбор одного спана вынесен в общий distillSpan (stop-хук и пересборка из сырья).

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

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 18:02:52 +03:00
Дмитрий 2b6170313b feat(secretary): нарезка по спанам (реальный промпт владельца) + полное сырьё
Единица разбора — спан: реальный промпт владельца + вся активность ассистента
до следующего реального промпта. Системные ходы (гейт-фидбек, загрузка навыка)
приклеиваются к спану, не считаются отдельными. Разбор отложенный: закрытые
спаны разбираются один раз (курсор в флажке сессии); reconcile и аудитор
получают ПОЛНЫЙ склеенный спан (промпт + все ответы + все действия).

- Слой 1: снят обрез вывода действий (полная картина), защита структурных меток.
- Граница спана — событие UserPromptSubmit (prompt-hook метит realPromptTurns),
  фолбэк по sysLabel; выключение через mode:closing (финальный спан добивает Stop).
- Калибровка скрытых вопросов: страж-ноп (не мутировать при неизменном тексте) +
  кап показа родословной (~~первая~~ → текущая, данные целы).
- Шаги — по спанам («Ход (промпт) N [вобрал ходы X-Y]»); «висит N промптов».
- Новый модуль secretary-span.mjs (computeSpans/spansToDistill/recordRealPrompt/
  parseTurnBlock/assembleSpan).

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

Спека/план: docs/superpowers/{specs,plans}/2026-06-23-secretary-span-redesign*.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 14:45:31 +03:00
Дмитрий 3be6cedd23 fix(secretary): срез впечённой метки «[зачёркнуто]» из текста записей
Модель копировала служебный префикс «[зачёркнуто] » (которым запрос помечает
зачёркнутые строки) в поле text, и он компаундился ([зачёркнуто] [зачёркнуто] …),
плодя марочные клоны. canonicalClauses теперь срезает ведущий маркер перед
сборкой канона: метка не персистится, клоны сливаются с чистой записью (ходы
объединяются). Только ведущий наш маркер — реальный текст с него не начинается.
Дедуп/История/провенанс/Шаги не тронуты. Свод секретаря 113/113.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 11:54:39 +03:00
Дмитрий c778d10d10 fix(secretary): выключение не затирает модельные «Шаги» (слияние по ходу)
Task 5/5 плана. Ветка off prompt-hook звала buildStepsFromRaw, перезатирая
модельные формулировки шагов детерминированными. Новая mergeStepsPreservingText:
существующий шаг сохраняется, из сырья достраиваются только пропущенные ходы.
Свод секретаря 112/112.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 09:33:14 +03:00
Дмитрий b846c0c57f feat(secretary): шаг из модельной сути с фолбэком, step не персистится
Task 4/5 плана. stop-hook берёт updated.step (модельная суть хода) как essence
для buildStepLine; нет step — прежний firstSentence-фолбэк. step срезается из
updated перед записью (транзитное, в protocol.json не оседает). Доказано
smoke-прогоном; свод секретаря зелёный.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 09:30:14 +03:00
Дмитрий 124dbeef95 feat(secretary): reconcileTurn прокидывает step в результат
Task 3/5 плана. stampProvenance отдаёт фиксированную форму без step, поэтому
reconcileTurn оборачивает результат: finish() прикладывает parsed.step к
возвращаемому объекту (транзитно), при отсутствии — поля нет. Свод 111/111.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 09:28:14 +03:00
Дмитрий ff16d05ec3 feat(secretary): buildStepLine принимает готовую суть (essence)
Task 2/5 плана. Если передан essence{user,assistant} — берём его дословно
(+ чистка пробелов); иначе прежний фолбэк firstSentence. «делал: <tools>»
остаётся детерминированным. Свод секретаря 110/110.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 09:25:55 +03:00
Дмитрий 503ddaeab2 feat(secretary): reconcile возвращает step{user,assistant}
Task 1/5 плана. parseReconcileResponse читает поле step (суть хода) →
{user,assistant} или null; buildReconcilePrompt просит это поле (правило 8).
Свод секретаря 108/108.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 09:23:42 +03:00
Дмитрий 4d7f355dca fix(secretary): схлопывание дублей протокола (идемпотентный канон)
Конвейер reconcile только ДОПИСЫВАЛ строки (модель копит, restoreLostLines
возвращает) — раздел «Решения» рос вечно (на «линзе» 714 записей, на
«протоколе» 40+ копий одного решения; «История» спамила [<-9][<-9]...).

Добавлен collapseProtocol: канон по кускам строки (split ' — ', убираем
ДОСЛОВНЫЕ повторы кусков, порядок и первое вхождение храним), слияние по
канону+статусу (struck/done), объединение ходов (union). Идемпотентно и
lossless — контроль смысла: ни одна уникальная строка не теряется и не
выдумывается. События Истории дедупятся по (turn,dir).

Вшит в reconcileTurn (вход = самолечение раздутого дела, выход = дубли не
копятся) и в stop-hook перед записью (финальный чокпоинт: ловит срыв
reconcile / работу без ключа / уже накопленный мусор).

9 новых тестов (вкл. идемпотентность и контроль смысла); свод секретаря
106/106 зелёных. Реестр СВ (hidden/nextSvId), шаги, тема — не трогаются.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 06:37:14 +03:00
Дмитрий 2772b197b3 feat(secretary): аудитор скрытых вопросов (9 линз) — второй проход + изоляция реестра
secretary-audit.mjs (новый): 9 линз, buildAuditPrompt -> {system,user}, parseAuditResponse,
applyAudit (новые СВ с номером от хука, мутация+родословная, close/тихо/partial, горящие
блоки Л8/Л9), preserveRegistry (реестр СВ изолирован от reconcile).
protocol: поля hidden/acceptance/tails/nextSvId + рендер горящих блоков и раздела
«Скрытые вопросы (фон)». stop-hook: второй проход после reconcile + снимок реестра ДО
reconcile (reconcile не владеет СВ). + дизайн-спека и план.

97 юнит-тестов зелёные. Живьём подтверждены: наполнение, мутация под тем же номером,
routing Л9 в горящий блок. Известно: старый реестр в деле «линза» уже искажён до фикса.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 22:42:04 +03:00
Дмитрий b0fe431e61 fix(router): выровнять max_tokens по потолку модели (65536)
66000 был на 464 токена выше предела вывода deepseek-v4-flash (65 536)
→ запрос отбивался ошибкой 400. Выставлено ровно 65536 в обоих форматах
запроса; тесты обновлены. Совпадает и с потолком Claude-моделей судьи/
наставника, идущих через тот же транспорт.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 22:12:24 +03:00
Дмитрий 507164e229 fix(router): поднять max_tokens транспорта до 66000
callAnthropicAPI слал max_tokens 15000 — это резало длину ответа всех
LLM-потребителей общего транспорта (роутер/наставник/судья/секретарь),
а не лимит реселлера. Поднято до 66000 в обоих форматах запроса
(legacy-строка и {system,user}); тесты обновлены.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 21:48:19 +03:00
Дмитрий b527f26a37 feat(secretary): разделитель сессий в разделе «Шаги»
В сквозной тетради дела между ходами разных сессий рендер вставляет строку
«—— сессия <id> ——» (граница рабочего захода) — навигация по длинному делу.
Не перед первой сессией; только на смене session между соседними шагами. TDD, свод зелёный.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 18:46:57 +03:00
Дмитрий 229b9c443e feat(secretary): атомарная запись протокола (temp -> rename) против полузаписи
Закрывает открытый вопрос «Атомарная запись протокола» — актуально при параллельных
сессиях (общий содержание.md пишут оба окна).

- writeFileAtomic: пишем во временный файл рядом с целью, затем rename (атомарен в пределах ФС);
  параллельная сессия не увидит полузаписанный protocol.json/protocol.md/содержание.md
- стоп-хук пишет три файла протокола/оглавления через writeFileAtomic
- полный свод зелёный

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 18:35:57 +03:00
Дмитрий 735c433868 fix(secretary): reconcile возвращает потерянные строки вместо отклонения хода
Причина срыва reconcile подтверждена логом _reconcile.log: guard-lost каждый ход
(слабая модель роняет 2-15 строк при переписывании всего протокола), страж отклонял
весь ход -> тетрадь не обновлялась.

- restoreLostLines: пропавшую старую строку хук дописывает обратно в её исходный раздел
  (со struck/why), что модель обновила — сохраняется. Reconcile перестаёт зависеть от
  точности модели — работает хоть с Хайку.
- reconcileTurn: один вызов модели + восстановление вместо 2 ретраев и null;
  diag сообщает guard-restored (информационно) вместо guard-lost (срыв).
- полный свод зелёный.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 18:28:25 +03:00
Дмитрий 08846e770a feat(secretary): видимый сигнал срыва reconcile + целостность «Шагов»
- reconcileTurn зовёт callback diag на каждом пути срыва (model-threw / bad-json / guard-lost);
  раньше срыв был тихий (fail-quiet) и причина нигде не писалась
- стоп-хук пишет причину в docs/secretary/<дело>/_reconcile.log (+ no-key)
- mergeTurnIntoProtocol: шаг хода пишется ВСЕГДА, даже при срыве reconcile -> нет дыр в «Шагах»;
  protocol.json/md/содержание обновляются каждый ход когда секретарь включён
- успешный путь reconcile не тронут, diag опционален (обратная совместимость), полный свод зелёный

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 18:18:57 +03:00
Дмитрий f8a40da56c feat(secretary): захват выдачи инструмента (N3) + сверка имени дела при включении (N2)
- parseLastExchange привязывает результат инструмента к действию по tool_use_id,
  склеивает text-блоки, усекает до 1200 симв.; [ВЫДАЧА] в Слое 1 теперь наполняется
- resolveCaseActivation: похожее имя дела (опечатка/подстрока) -> переспросить,
  не заводя дело-двойник; хук secretary-prompt-hook выводит подсказку с кандидатами
- TDD: тесты secretary-transcript/flag/prompt-hook; полный свод зелёный

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 17:21:06 +03:00
Дмитрий 99ca60777b feat(secretary): 5 минут на ответ модели в Stop-хуке (perAttemptTimeoutMs 300s, maxRetries 0)
Секретарь пишет длинный протокол — 30с/попытку мало. Даём один заход на 5 минут
без ×5 повторов (иначе потолок раздувается до 25 мин). Общий 30с-дефолт
router/судьи/наставника не тронут — override только в callModel секретаря.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 16:25:46 +03:00
Дмитрий ab8abe2c87 feat(secretary): История+многоходовый провенанс в хуке, нарезка сырья по ходам, обезвреживание маркеров, все Шаги
- stampProvenance ведёт История-таймлайн (in/out) и многоходовый провенанс при смене зачёркивания строки
- splitRawIntoTurns/prepareTurnFiles: нарезка raw на <дело>/ходы/turn-N.log; Шаги ссылаются на файл хода
- buildStepsFromRaw + обработчик off: Шаг на КАЖДЫЙ ход (без пропусков выкл-ходов)
- neutralizeMarkers в buildRawRecord: защита от самозагрязнения лога копиями маркеров
- полная форма протокола (9 категорий) + дело создание-секретаря приведено к виду; набор секретаря 56/56

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 13:24:20 +03:00
Дмитрий 9c8dbfde35 feat(secretary): раздел «Шаги (Слой 1)» — все ходы человекочитаемо + ссылка на сырьё в конце
- buildStepLine: кратко «спросил -> ответил» (служебные строки экономия/coverage/вердикт отброшены)
- protocol.steps: хук ведёт по строке на КАЖДЫЙ ход; рендер — список + одна ссылка raw в конце
- reconcile (stampProvenance) сохраняет steps (модель их не трогает)
- stop-хук добавляет шаг текущего хода

41 тест green, exit=0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 11:34:25 +03:00
Дмитрий cb9e14f51b feat(secretary): полная форма протокола — 9 категорий (§D7) + Шаги->Слой 1 + стабильная тема
- renderProtocol: шапка «Дело» (статус/дата/хозяин/цель) + Альтернативы + Последствия/цена
  + раздел «Шаги (Слой 1)» (навигация по ходам в raw/<session>.log)
- EMPTY_PROTOCOL: +status, +alternatives, +consequences (аддитивно, старое цело)
- reconcile: parse/prompt/guard/stamp учитывают alternatives и consequences
- стабильная тема: subject держит хук (первая непустая), не уезжает на тему хода
- stop-хук: рендер с шапкой {work, date}

39 тестов green, exit=0. Ничего из прежнего не удалено — только расширение.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 11:21:45 +03:00
Дмитрий 67fecd7149 feat(secretary): reconcile — модель-редактор правит весь протокол, хук-сторож против потерь
- secretary-reconcile.mjs: buildReconcilePrompt (весь протокол+обмен), parseReconcileResponse,
  reconcileGuard (ни одна старая строка не пропала), buildGuardRemark (обоснованный возврат),
  stampProvenance (turn+session по тексту), reconcileTurn (вызов->сторож->до 2 возвратов)
- stop-хук: вместо applyExtraction вызывает reconcileTurn; мотор инъектируется
- renderProtocol: зачёркивание во ВСЕХ разделах (закрытые вопросы видны ~~struck~~)
- ретайр: applyExtraction/buildExtractionPrompt/parseExtractionResponse (secretary-extract удалён)
- Слой 1, провенанс @session, флажок по сессии, оглавление — без изменений
- спека + план reconcile в docs/superpowers

33 теста green (мотор замокан, без сети). Модель для prod — Sonnet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 10:54:20 +03:00
Дмитрий d44254a0e1 feat(secretary): качество выжимки — тема+время, флажок по сессии, дедуп, промпт без шума, стабильная тема, навигация протокол->Слой 1
- оглавление: реальная тема (поле «тема» в моторе) + дата со временем вместо заглушки (дело)
- флажок по сессии secretary-mode-<session>.json — параллельные сессии не смешиваются
- дедуп при записи (applyExtraction) — не плодим одинаковые пункты
- промпт-дисциплина: игнор служебного шума, «воля» только у [ЮЗЕР], решения не вопросы
- стабильная тема (первая непустая, не уезжает на тему хода)
- провенанс несёт сессию (@<session>) -> навигация в raw/<session>.log; steps/ убраны как дубли
- мёртвый код снят: secretary-slice + computePeriod + buildStepLinks

37 тестов green.

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