Секретарь перестал терять промпт владельца при обрыве (сбой API / ручной стоп /
жёсткий крах). Источник правды — транскрипт на диске: сырьё (Слой 1) пересобирается
из всего транскрипта на каждом завершении, а не дописывается по последнему обмену.
- classifyEntry/assembleExchanges: распознавание машинных меток (isApiErrorMessage,
[Request interrupted by user] обе формы, isCompactSummary, isMeta) — метка не считается
настоящим промптом; промпт после обрыва помечается продолжением (cont=1), хвост — tail=1.
- realBoundariesFromRaw: продолжение не открывает новый спан (одна работа не дробится).
- честные пометки спана: «(связь прерывалась — продолжено)» / «(прервана, не завершена)».
- stop-хук: пересборка сырья из транскрипта + догон недоразобранного хвоста прошлых
(умерших) сессий дела при «включи секретаря <дело>» (_sessions.json, secretary-sessions).
- parseLastExchange → тонкая обёртка над assembleExchanges (без дубля логики).
Свод секретаря зелёный: 172 теста / 12 файлов.
Спека: docs/superpowers/specs/2026-06-23-secretary-interruption-resilience-spec.md
План: docs/superpowers/plans/2026-06-23-secretary-interruption-resilience.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Баг: границы спанов метились предсказанным номером хода (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>
Единица разбора — спан: реальный промпт владельца + вся активность ассистента
до следующего реального промпта. Системные ходы (гейт-фидбек, загрузка навыка)
приклеиваются к спану, не считаются отдельными. Разбор отложенный: закрытые
спаны разбираются один раз (курсор в флажке сессии); 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>
- 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>
Корень бага: в формате Anthropic tool_result — сообщения role:user; parseLastExchange
брал их вместо настоящего промпта, теряя текст юзера и действия. + хук форсит реальный
turn (Хайку его не знает) + work-slug принимает кириллицу.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Мотор stop-hook на отдельном SECRETARY_LLM_KEY. Переходники смоук-проверены (импорт),
поведенческая проверка — после вписки в settings.json + ключа.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>