ab8abe2c87
- 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>
33 KiB
33 KiB
Решения
- Требуется проверка наличия apiKey в post-reboot окружении через свежую запись в _debug.log — Две записи показывают apiKey=НЕТ, но обе до ребута; post-reboot проверка запишется после завершения текущего хода [→1]
- Если apiKey остался НЕТ после ребута — переделать секретарь на чтение ключа из файла вместо env переменных — Хук читает файл каждый раз, что исключит проблему с env переменными [→1]
- Оставить Хайку (200 токенов) вместо Sonnet — быстро и дёшево, небрежность по категориям приемлема — Хайку поймал суть верно, ошибки в сортировке категорий некритичны для MVP [→20]
- Исправить баг в secretary-transcript.mjs — tool_result теряет текст юзера и действия — tool_result это сообщения с ролью user, разбор берёт не тот индекс [→20]
- Хук должен форсить реальный номер хода в провенансе, не
[→1]— Хайку не знает номер и угадывает, хук это знает — должен сам подставить [→20] - Активировать штатный режим с экономией 100% и всеми паттернами — Пользователь запросил штатный режим [→1]
- После подтверждения выполнить багфиксы в порядке: баг 1 (действия + текст юзера на ходах с инструментами) → провенанс (реальный номер хода вместо [→1]) → кириллица в имени дела → удаление временного debug-лога — Системный план работ по TDD где возможно [→2]
- Оставить модель Хайку с возможностью поднятия до Sonnet одной правкой переменной SECRETARY_LLM_MODEL — Выбор пользователя; архитектура позволяет менять без изменения кода [→2]
- Баг 1 (корневой) в parseLastExchange固定: пропускал tool_result, теряя действия и текст промпта — TDD: RED тест показал потерю текста при tool_result, найдена и исправлена логика разбора [→22]
- Провенанс хука форсит реальный номер хода вместо [→1] — Убрана временная разметка, хук теперь показывает точный turn [→22]
- Кириллица в имени дела теперь обрабатывается корректно — Добавлена поддержка в prompt-hook, дело 'тест' не уходит в general [→22]
- Удален временный debug-лог из stop-hook — Очистка кода перед финализацией [→22]
- parseLastExchange пропускает tool_result, ищет настоящий промпт выше [→22]
- Коммит
4253cd7запушен в gitea (liderra/brain.git) с обходом pre-push hooks (LEFTHOOK=0) — Бэкап всех 5 коммитов секретаря; github недоступен [→23] - Слой 1 (сырьё) — новый файл на каждую сессию (docs/secretary/raw/<id-сессии>.log) — Резерв данных не смешивается между сессиями [→23]
- Протокол по делу (docs/secretary/<дело>/protocol.md) — сквозной, накапливается через все сессии — Единица организации — дело, не сессия; память не теряется при смене сессии [→23]
- Подготовить промпт для следующей сессии, который обеспечит контекст и продолжение работы — Пользователь запросил промпт для следующей сессии с чтением гайда, CLAUDE.md, слоя 1 и графа проекта [→24]
- Секретарь протокола работ собран, развернут и работает вживую на aitunnel с Haiku — Подтверждение статуса: 8 модулей, 3 хука, 26 тестов green, функциональность проверена [→24]
- Требуется добавить строку coverage в начало ответа — Хук enforce-coverage-verify обнаружил мутирующие вызовы без отчета о покрытии [→1]
- Формат: coverage: skill: или coverage: direct: — Стандарт проверки для валидации реально вызванных компонентов [→1]
- Выбрать между живой демонстрацией (включить → 1–2 хода → выключить → протокол + steps/turn-N.md) или сразу за качество (Sonnet / промпт Хайку) — Ассистент запрашивает явный выбор пользователя для продолжения работы [→2]
- Формат оглавления дел: [<дело>](<дело>/protocol.md) — <тема одна строка> · <статус> · <ГГГГ-ММ-ДД ЧЧ:ММ> — Оглавление нужно компактным и информативным для быстрого поиска и понимания сути; текущий шаблон выводит заглушку '(дело)' вместо темы и дату без времени [→3]
- Добавить поле 'тема' в выжимку модели (secretary-extract.mjs), парсер протокола (secretary-protocol.mjs) и хук остановки (secretary-stop-hook.mjs) — Источник реальной темы дела — последняя непустая строка сути от модели; нужна сквозная цепь: мотор → протокол → оглавление [→3]
- title: work, goal: реальная тема из протокола, status: текущий статус, date: ГГГГ-ММ-ДД ЧЧ:ММ [→3]
- Спека docs/superpowers/specs/2026-06-22-secretary-index-subject-time-design-v2.md получила вердикт GO от наставника и судьи — Проверка через Grep mentor-verdict-*.json подтвердила одобрение; баннер degraded не является блокером [→4]
- Тесты produce-verify-receipt охватывают секретарские файлы и пригодны для RED/GREEN цикла — Конфиг свода исключает только ruflo-* и subagent-prompt-prefix; базовый свод зелёный [→4]
- Коммит отложен до завершения исполнения плана TDD — Результат показывается владельцу без коммита; коммит вне области текущей правки [→4]
- Удалить при финализации (остаётся только -v2) [→4]
- Требуется добавить coverage-отчет в начало ответа при мутирующих вызовах — Хук enforce-coverage-verify обнаружил отсутствие строки
coverage:в ответе [→1] - Требуется добавить строку coverage в начало ответа при мутирующих вызовах — Enforce-coverage-verify hook не получает информацию о покрытии в ответе [→5]
- Первой строкой: coverage: skill: или coverage: direct: [→5]
- Требуется первой строкой ответа указывать coverage-метрику (skill: или direct:) — Hook enforce-coverage-verify проверяет наличие строки
coverage:в ответах с мутирующими вызовами [→2] - Требуется указать coverage в первой строке ответа — Инструмент enforce-coverage-verify обнаружил отсутствие строки coverage: в ответе ассистента [→6]
- Требуется выбрать вариант решения: 1) выполнить в терминале, 2) уступить наставнику, 3) предложить своё [→6]
- JSON дороже Markdown для контекста из-за служебных символов, повторения названий полей и встроенного балласта (base64 embeddings) — Каждая кавычка, скобка, двоеточие — отдельный токен; названия полей повторяются в каждой строке; machine-readable данные (embeddings) не нужны человеку [→3]
- Правильная тактика — не глотать сырые JSON-логи целиком, а запросить итог через фильтр (скрипт или помощник) — Экономия на 10-20x раз по токенам; сессия остаётся лёгкой; сохраняется память на осмысленный контекст [→3]
- protocol.json и protocol.md содержат одно и то же дело, различаются только форматом — JSON для машинной обработки, MD для чтения человеком [→4]
- JSON тяжелее MD на ~37% (25401 vs 18530 байт) при идентичном содержании — Служебная обвязка структуры: кавычки, ключи, скобки на каждый пункт [→4]
- Оба файла протокола (protocol.md и protocol.json) содержат идентичный контент — 5 разделов и одинаковые пункты — Результат сверки через file-compare (чтение и сравнение без изменений) [→5]
- JSON представление на ~37% больше по объему (25401 vs 18530 байт) из-за служебной обвязки — Техническая характеристика формата [→5]
- В штатном режиме ассистент работает автономно без промежуточных вопросов до полного результата — Пользователь требует максимальной автономности и эффективности [→8]
- Активны все паттерны обработки по умолчанию с 100% экономией токенов — Оптимизация ресурсов при самостоятельной работе [→8]
- Активировать штатный режим с экономией 100% и всеми паттернами — Пользователь запросил штатный режим [→9]
- Стена (ограничение) снимается только при второй фразе-подтверждении — Первая фраза — только триггер, требуется подтверждение [→9]
- Остановить все действия до явного указания пользователя — Пользователь запретил менять содержание; ассистент поспешил с изменениями [→10]
- Ожидание выбора: откатить все правки ИЛИ оставить правки кода [→10]
- Формат содержания остаётся markdown, JSON только во внутреннем обсуждении — Пользователь уточнил требование [→11]
- Удаление черновиков через node-скрипт с unlinkSync, обход ограничения PowerShell — Правило 8 блокирует удаление через PowerShell, гайд §3 предписывает способ [→11]
- Тему генерирует модель в выжимке (новое поле), время ставит хук — Обеспечить динамическое наполнение оглавления актуальными данными [→11]
- Секретарь не активирован из-за опечатки в команде — Детектор ищет точное совпадение 'включи секретар...' но получил 'включи секреторя' (через 'о' вместо 'а') [→12]
- Секретарь включён на дело general — Пользователь дал команду 'включи секретаря', система активировала протоколирование [→13]
- Флажок секретаря (~/.claude/runtime/secretary-mode.json) — глобальный на всю машину, не привязан к сессии — Единственный файл без id сессии в имени, содержит одно поле work и mode — общие для всех сессий [→14]
- При двух параллельных сессиях память/протокол/оглавление перемешиваются в одно дело — Stop-хук читает work из глобального флажка, последняя сессия перезатирает его — обе сессии пишут выжимку в один protocol.md [→14]
- Вкл/выкл секретаря — общий рубильник для обеих сессий — mode=off в глобальном файле гасит секретаря везде одновременно, нарезка steps идёт по состоянию последней трогавшей сессии [→14]
- Сырьё (raw) не смешивается — хранится отдельно по session.log — Raw пишется по реальному id сессии из события, восстановление данных возможно [→14]
- Правка 1 — флажок secretary-mode-.json вместо глобального, использовать ev.session_id в обоих хуках — Убирает смешивание дел между сессиями, каждая сессия ведёт своё независимо [→15]
- Правка 2 — дедуплификация при записи решений: не добавлять пункт, если его нормализованный текст уже есть и не зачёркнут — Убирает накопление дубликатов одного и того же решения, реализует сверку вместо свалки [→15]
- 1 протокол = 1 сессия (как Слой 1), стартовый промпт содержит пересказ прошлой сессии для континуитета — Убирает смешивание данных на корню, экономит память, полная картина в последнем протоколе [→16]
- Картина дела должна быть проговорена текстом в первом ответе ассистента, не просто Read — Хук видит только текст обмена; содержимое файлов в выжимку не попадает [→16]
- Реализовать по TDD одним чистым коммитом с полным набором изменений — Избежать полу-шагов, схема меняет маршрутизацию [→16]
- Протокол дела должен накапливаться автоматически хуком без пересказа агентом — stop-хук уже читает и дополняет protocol.json перед записью, механизм работает, нужна только маршрутизация [→17]
- Использовать session-specific флажок вместо глобального для каждой сессии — Два параллельных процесса перетирают единый secretary-mode.json, разделение по сессии предотвращает смешивание [→17]
- Добавить дедуп при записи — не писать пункт, если его текст уже есть — Копящийся хлам от дублей; сверка перед дозаписью решает [→17]
- Атомарная запись протокола (temp + rename, опционально файл-замок) — Закрыть край race condition при одновременной записи из двух сессий в одно дело [→17]
- У каждого окна своя записка-флажок (не одна на весь компьютер) — Избежать перезаписи флажка и смешивания дел из разных окон в одну тетрадь [→18]
- Включить дедупликацию — одна строка на решение/намерение вместо дублей — Избежать хлама в тетради, если решение или действие повторилось несколько раз в одном разговоре [→18]
- Название дела работает как кодовое слово для включения/выключения секретаря — Простой и без техники способ управления записями [→19]
- Одно слово без пробелов — правило именования дела — Избежать ошибок парсинга при вводе команды [→19]
- Одно слово = одна тетрадь; повторное использование слова в новом окне продолжает то же дело — Обеспечить накопление памяти дела через сессии [→19]
- При отсутствии слова используется дело по умолчанию 'general' — Предотвратить потерю данных и обработать неполные команды [→19]
- Каждое новое окно секретарь стартует выключенным — Требовать явного включения, контролировать запись [→19]
Твоя воля / запреты
- Ассистент прочитает свежую запись _debug.log после получения одного слова от пользователя [→1]
- Чинить баг 1 (действия) + провенанс + кириллицу в имени дела
- Коммит после чистого рабочего состояния
- Ожидание подтверждения: ровно «да, штатный» [→2]
- Финальная живая проверка на следующем Stop: проверить в raw файлах появление [ДЕЙСТВИЕ] и текста [→22]
- Секретарь включен (Хайку каждый ход ~0.5₽) — ждёт команды 'выключи секретаря' [→23]
- Подтвердить вживую, что действия ([ДЕЙСТВИЕ]) теперь пишутся в raw (фикс бага 1) [→24]
- Рассмотреть использование Sonnet вместо Haiku для повышения качества выжимки категорий [→24]
- Возможно добавить .gitignore на docs/secretary/ (рантайм-данные) [→24]
- Начинать ответы с coverage-строки при наличии мутирующих операций [→1]
- Первой строкой ответа добавить coverage tag (coverage: skill: или coverage: direct:) [→2]
- Напечатать спеку контракта оглавления (файл -design-v2.md прошёл печать наставника) [→3]
- Напечатать план TDD: тесты → изменения в трёх модулях → проверка сводом → show результат (без коммита) [→3]
- Исполнить TDD план: 7 шагов (тесты → RED → реализация → GREEN) для полей secretary-extract.mjs, secretary-protocol.mjs, secretary-stop-hook.mjs [→4]
- Подать результат владельцу без коммита [→4]
- Начинать ответы со строки coverage: skill: или coverage: direct: при выполнении мутирующих операций [→1]
- При следующих мутирующих вызовах указывать coverage с реально вызванным навыком или ролью [→5]
- Ассистент ждёт уточнения: показать ту же строку целиком в обоих видах coverage или остановиться [→2]
- Промерить точные цифры токенов: сырой JSON-лог vs. человеческая версия [→3]
- Фиксировать оглавление (тема + время) по TDD методологии [→8]
- Подготовить зелёный свод результатов [→8]
- Удалить 6 черновиков спек и планов [→8]
- Показать готовый результат без остановок [→8]
- При получении подтверждения 'да, штатный' молча выполнить окончательный фикс [→9]
- Протестировать живой ход с включённым секретарём для проверки вывода темы и времени [→11]
- Написать команду ровно: 'включи секретаря' (через 'а') [→12]
- Сделать один любой ход для примера [→12]
- Выключить секретаря командой 'выключи секретаря' [→12]
- Провести один обычный ход для демонстрации работы секретаря [→13]
- Выключить секретаря после демонстрационного хода [→13]
- Сделать флажок секретаря привязанным к сессии (secretary-mode-.json) чтобы параллельные сессии не топтали друг друга [→14]
- Закоммитить готовый фикс оглавления отдельно (31 тест зелёные), потом новым делом Правка 1 + 2 по TDD [→15]
- Добавить флажок по сессии: secretary-mode-.json [→16]
- Структурировать протокол по сессии: docs/secretary//protocol.md + steps/ [→16]
- Создать содержание.md со строкой на сессию (тема + дата/время + ссылка) [→16]
- Добавить дедуп при записи в applyExtraction (спека D5) [→16]
- Реализовать 3 детерминированные правки в хуке под TDD [→17]
- Внедрить две правки одним делом по TDD (ждёт подтверждения «делай») [→18]
- Сделать 3 правки: записка-флажок на окно, дедуп, атомарная запись [→19]
Открытые вопросы
- Ожидается ввод одного слова от пользователя для триггера чтения post-reboot логов [→1]
- Добавить runtime-данные secretary (raw/, general/) в .gitignore опционально [→22]
- Качество выжимки Haiku небрежное по категориям — требует оценки и потенциального улучшения [→24]
- claude-mem: /plugin в текущей среде недоступен — отложено на потом [→24]
- Определить какие skills/roles были реально задействованы в текущем ходе для coverage-отчета [→1]
- Выбор стратегии демонстрации: живая демонстрация целиком vs сразу за качество [→2]
- Обеспечить корректный coverage tag в следующем ответе с документированием реально вызванных функций [→2]
- Ожидание вердикта наставника по спеке (асинхронно, таймер ~2,5 минуты) [→3]
- Ожидание печати плана от наставника и судьи (таймер ~3 минуты); затем автономное исполнение 7 шагов TDD [→4]
- Реализовать логику отслеживания вызванных навыков/ролей для coverage-отчета [→1]
- Implement coverage reporting format в responses с мутирующими операциями [→5]
- Требуется ли демонстрация полного формата coverage-метрики (оба варианта: skill и direct) на примере? [→2]
- Арбитраж: какой вариант действия выбрать для разрешения конфликта coverage-верификации [→6]
- Проверить точное соответствие MD, собранного из JSON (нет ли рассинхрона, потерянных пунктов) [→4]
- Требуется ли точная построчная сверка JSON и MD на предмет потери пункта между форматами или сверка завершена? [→5]
- Ожидание подтверждения 'да, штатный' для активации режима [→8]
- Ожидание второй фразы-подтверждения 'да, штатный' для снятия стены [→9]
- Выбор пользователя: 1) откатить все правки + обсудить план ИЛИ 2) оставить правки кода [→10]
- Уточнить требования к формату содержания и обновлению тем в оглавлении [→10]
- Оценить качество темы, генерируемой Хайку; рассмотреть переход на Sonnet если результат будет небрежным [→11]
- Активировать режим секретаря с корректной командой [→12]
- Показать содержание.md с реальной темой и временем [→13]
- Показать нарезанные steps/turn-N.md файлы [→13]
- Нужно ли срочно фиксить глобальный флажок или это отдельная задача? [→14]
- Редкий край: две сессии на одно дело одновременно требуют замка/слияния — отложить на потом если понадобится [→15]
- Обеспечить поиск и быстрый доступ к нужному протоколу из архива [→16]
Сделано / дальше
- Проверить наличие apiKey в свежей записи _debug.log [→1]
- По результату: либо подтвердить успех ребута, либо переделать секретарь на файловое чтение ключа [→1]
- Убрать временный debug-лог из хука
- Коммит
4253cd7встал: 4 файла, 26 тестов GREEN, баг 1 FIXED [→22] - Выключить секретаря после теста (экономия 0.5₽ за ход на Haiku) [→22]
- Опционально: подтвердить в следующий ход, что фикс действений работает (просмотр свежего raw-файла) [→23]
- Скопировать готовый промпт и использовать его первым сообщением в следующей сессии [→24]
- По желанию: выключить секретаря командой «выключи секретаря» + «выключи штатный» для аккуратного завершения [→24]
- Добавить coverage-строку в следующий ответ согласно формату [→1]
- Получить явный выбор пользователя по стратегии работы [→2]
- Проверить вердикт по спеке и напечатать план работ [→3]
- Выполнить шаги плана (TDD: тесты → код → зелёный свод) [→3]
- Показать результат (без коммита, после одобрения) [→3]
- Реализовать поле «тема» в secretary-extract.mjs с привязкой к реальной теме и времени [→4]
- Обновить secretary-protocol.mjs для обработки темы и времени в оглавлении [→4]
- Модифицировать secretary-stop-hook.mjs для кормления оглавления реальными данными [→4]
- Запустить RED/GREEN через node tools/produce-verify-receipt.mjs [→4]
- Проверить журнал выполнения и указать корректное имя вызванного навыка или роли [→1]
- Добавить coverage:: в начало ответа при вызове tool/enforce-coverage-verify [→5]
- Пояснить различие между coverage: skill и coverage: direct на примере одной строки лога [→2]
- Получить решение от пользователя по трём вариантам разрешения [→6]
- Получить дословное подтверждение активации штатного режима [→8]
- Молча выполнить фикс до конца при получении подтверждения [→9]
- Ждать явной команды пользователя перед любыми действиями с файлами [→10]
- 31 тест зелёные (добавлено 5 по TDD) [→11]
- Синтаксис хука проверен [→11]
- 6 черновиков удалены, скрипт убран [→11]
- Повторить команду активации с правильной орфографией [→12]
- Сделать демонстрационный ход (описание или вопрос по делу) [→13]
- Выбрать вариант: коммитить оглавление отдельно (вариант 1) или сложить всё в одну пачку (вариант 2) [→15]
- Реализовать схему: флажки + по-сессионная структура + дедуп + содержание [→16]
- Заменить secretary-mode.json на secretary-mode-.json [→17]
- Добавить applyExtraction дедуп: проверка наличия текста перед дозаписью [→17]
- Внедрить атомарную запись с temp-файлом и rename [→17]
- Получить подтверждение пользователя на запуск реализации [→18]
История (заменено, не стёрто)
parseLastExchange ловил tool_result как настоящий промпт→ parseLastExchange пропускает tool_result, ищет настоящий промпт выше [→22]title: work, goal: '(дело)', status: 'открыто', date без времени в secretary-stop-hook.mjs→ title: work, goal: реальная тема из протокола, status: текущий статус, date: ГГГГ-ММ-ДД ЧЧ:ММ [→3]Черновик спеки ...-design.md→ Удалить при финализации (остаётся только -v2) [→4]Ответ без строки coverage:→ Первой строкой: coverage: skill: или coverage: direct: [→5]coverage: direct:secretary-index-design→ Требуется выбрать вариант решения: 1) выполнить в терминале, 2) уступить наставнику, 3) предложить своё [→6]Правки в 5 файлах кода/тестов (содержание.md остаётся markdown)→ Ожидание выбора: откатить все правки ИЛИ оставить правки кода [→10]