Баг: границы спанов метились предсказанным номером хода (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>