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