claude-harness/docs/PILOT-2026-09-27.md

4.7 KiB
Raw Blame History

Пилот: obsidian-voice-note, core-recording-lifecycle

Первая подсистема плагина голосовых заметок для Obsidian (жизненный цикл записи и очередь отправки) прошла цикл целиком за один день: фраза → issue #1 → brainstorming → спека → план на 10 задач → SDD → PR #2 → merge → archive → close.

Показатель Значение
Brainstorming → утверждённая спека ~35 мин, 5 вопросов, 3 подхода, дизайн в 4 частях
План 2528 строк, 10 задач с полным кодом, Review Focus 5 пунктов, spec coverage
Исполнение SDD 1 ч 35 мин, без вопросов к человеку
Ревью с первого раза 8 из 10; 2 раунда фиксов (один косметический: подпись коммита)
Финальное ревью (opus) 0 critical, 1 important, 3 minor, одна волна фиксов, 7/7 addressed
Тесты 125/125, golden сошёлся с первого прогона; src/core 670 строк
Модели исполнителей haiku 7 задач, sonnet 3; ревьюеры sonnet, финал opus
Решения без обсуждения 36 в design.md (28 спека/план, 8 исполнение)
Обрыв контроллера случайная остановка перед Task 1; возобновился из ledger без потерь

Что подтвердилось

  • Автотриггер brainstorming без вызова по имени; skills OpenSpec его не перехватили.
  • Спека легла в openspec/changes/, issue завёл агент, worktree создал сам после блокировки хуком.
  • Раздел «Decisions made without discussion» ведётся на всех этапах, включая контроллер SDD; агент сам убрал из него пункт, который предложил человек.
  • Контроллер следовал спеке как источнику истины против плана (рулинг F-1) — правильно.
  • Подробный план с кодом → большинство задач на haiku без брака.

Находки и что изменено

  1. Контроллер «на среднем уровне» запустился на Opus. Сессия поняла фразу как «уровнем ниже». → CLAUDE.md: контроллер — сабагент на sonnet, явно.
  2. codegraph в worktree возвращал пусто даже после codegraph init; implementer-ы читали файлы напрямую. → CLAUDE.md: при пустом ответе отметить в ledger и не тратить раунды. Причина (индекс привязан к корню репо) — открытый вопрос.
  3. Push в main через detached HEAD. При архивации агент сделал git switch --detach origin/main и запушил; git branch --show-current пуст, хук пропустил. → guard-main: detached HEAD защищён, коммит/push в main только с файлами openspec/; архивация объявлена единственным исключением.
  4. Хвосты закрытия (ветка, worktree, pull main) оставались человеку. → чеклист закрытия из 6 пунктов в CLAUDE.md.

Мелкие наблюдения

  • Первый тест хука: агент обошёл блокировку Write через echo >. Bash добавлен в matcher.
  • Вставленный текст без своей строки вызывает вопрос-подтверждение; добавлять слово перед вставкой.
  • haiku дважды подписал коммит своим именем вместо трейлера из плана.
  • Версии зависимостей не зафиксированы (TypeScript 7, vitest 5, esbuild 0.28).

Отложено до следующей фичи

  • T1: Node-глобалы (process, Buffer) проходят проверку типов в src/core; страж ловит только импорты. Bounded-фикс до обёртки.
  • Зафиксировать версии зависимостей. Bounded-фикс.
  • Провайдер распознавания (AITUNNEL, OpenAI-compatible) — issue #2. Обёртка Obsidian — issue #3.