claude-harness/docs/retro/2026-10-24.md

16 KiB
Raw Blame History

Ретроспектива обвязки claude-harness — 24.10.2026

Период: 2026-10-11 — 2026-10-24, полигон — репозиторий cc-harness на машине разработчика обвязки. Предыдущая точка сравнения — docs/retro/2026-10-11.md (полигон awp-ca, другая машина).

Источники:

  • 2 сессии Claude Code (-Users-andrejepifancev-Projects-cc-harness, …--claude-worktrees-retro-2026-10-24), 69 МБ. Одна из них идёт с 15.10 по 24.10 — вся работа над #6, #19, #22, #24, #25, #29 — с одной компакцией;
  • auto-memory проекта — пусто, 0 файлов;
  • состояние репозитория (retro_leftovers.py --fetch);
  • блокировки среза, размеченные в корпус: docs/retro/fixtures/hook-labels-2026-10-24.json, 6 записей.

Количественная часть посчитана docs/retro/scripts/retro_metrics.py (первый прогон /harness-retro), качественная — по кандидатам в поправки, выгрузкам и истории задач в Gitea.

Маркировка находок: RT-n, продолжение нумерации ретро 11.10. Приоритет: P1 — теряет время каждую неделю или ломает процесс; P2 — трение; P3 — наблюдение.

О сравнимости. 11.10 — workspace awp-ca, 44 сессии; сейчас — cc-harness, 2 сессии. Абсолютные числа несравнимы. Сравнимы:

  • доли (ложные блокировки, explore);
  • стартовый контекст на сессию;
  • наличие хвостов закрытия.

Строки 11.10, которые считались иначе, помечены в таблице: по строкам транскрипта, без сабагентов, широким регэкспом.

1. Цифры

Показатель Сейчас Прошлое ретро Δ
Сессий 2 44 -42
Промптов владельца 43 613 -570
Прерываний 2 — —
Ходов модели 832 12 121 (по строкам транскрипта, не по сообщениям) —
Вызовов инструментов 1 200 6 583 (без сабагентов) —
Запусков сабагентов 6 61 -55
Токенов вывода 928 148 18 300 000 (по строкам транскрипта) —
Чтение из кэша, токенов 287 121 430 3 820 000 000 (по строкам транскрипта) —
Запись в кэш, токенов 3 509 921 145 000 000 (по строкам транскрипта) —
Компакций контекста 1 4 -3
Стартовый контекст, медиана 48 484 56 000 -7 516
Стартовый контекст, мин 44 149 52 000 -7 851
Стартовый контекст, макс 52 820 61 000 -8 180
Блокировок хуков 6 76 (без сабагентов) —
Ложных блокировок 5 72 -67
Доля ложных блокировок 0.83 0.95 -0.12
Ложных, уже исправлено 5 72 -67
Ложных, ещё не исправлено 0 0 +0
Отказов классификатора 4 6 (без сабагентов) —
Отказов владельца 3 6 -3
codegraph init 10 43 (без сабагентов) —
Вызовов codegraph_explore 4 15 (без сабагентов) —
Чтений кода (Read/Grep/Glob/Bash) 50 — —
Доля codegraph_explore 0.07 — —
Кандидатов в поправки владельца 4 — —
Промптов «перечитай память/контекст» 0 9 (широкий регэксп, со сводками компакции) —
MEMORY.md, байт 0 — —
Файлов памяти 0 47 -47
Память, байт 0 183 296 -183 296
cd в основной checkout на main — — не считается: хуки 0.4.0 не зависят от cwd (RT-2); считалось по именам репозиториев awp-ca, было 84
  • Инструменты: Bash 675, Edit 245, Write 108, Read 93, Skill 17, EnterWorktree 12, AskUserQuestion 11, ExitWorktree 10, WebFetch 10, Agent 6
  • Роли: dev 2
  • Сабагенты по моделям: не указана 4, opus 2
  • Skills: superpowers:brainstorming 5, role 2, superpowers:writing-plans 2, superpowers:executing-plans 2, superpowers:test-driven-development 2, superpowers:finishing-a-development-branch 2, harness-doctor 1, harness-retro 1
  • Блокировки по хукам: guard-main(Bash) 5, guard-main(Edit/Write) 1
  • Отказы классификатора: Self-Modification 4

Период 2026-10-11 — 2026-10-24; сессий 2; каталоги транскриптов: -Users-andrejepifancev-Projects-cc-harness, -Users-andrejepifancev-Projects-cc-harness--claude-worktrees-retro-2026-10-24; битых строк 0.

Как читать блокировки. Все пять ложных случились до установки хуков 0.4.0 на эту машину (23.10, 19:06): четыре — 15.10, одна — 23.10 в 19:05. После установки за срез одна блокировка, и она настоящая: ручная проверка Write в main. Все пять ложных текущие хуки пропускают, и все шесть теперь записи корпуса — 135/135. Ложных после 0.4.0: 0 из 1.

Подсчёт вне скрипта — docs/retro/scripts его пока не умеет:

  • 22 отказа изоляции worktree Claude Code («This session is isolated in the worktree…»): 13 — 15.10, 2 — 16.10, 7 — 23.10;
  • 2 промпта владельца, отправленных вместе с результатом инструмента; скрипт их не видит (RT-23).

Хвосты чеклиста закрытия:

Хвостов закрытия нет.

2. Находки

RT-21 (P1, fixed). Шаги цикла фичи спрашивали подтверждение у владельца.

  • Что было: вход в worktree ../<repo>.wt/ спрашивал разрешение при каждом входе. Шаги tea issues/pulls create/comments, push фичевой ветки и удаление веток не были покрыты allow-правилами.
  • Две поправки владельца подряд: «почему мне нужно это каждый раз подтверждать?» и «но опять спрашивает разрешение».
  • Исправлено:
    • #24 (0.5.0): install.sh ставит allow-правила цикла фичи;
    • #25 (0.5.1): worktree живут в <repo>/.claude/worktrees/ и открываются через EnterWorktree без запроса.
  • После 0.5.1 входы в worktree шли без подтверждений.
  • Источники: кандидаты в поправки, PR #26, #27.

RT-22 (P2). Советы по настройке Claude Code и внешних инструментов давались без проверки по документации. За срез три таких совета, и каждый стоил владельцу лишнего круга:

  • brew install codegraph — такой формулы нет, это ошибка в harness-doctor/SKILL.md (O-8, исправлено в #19);
  • пользовательские правила в ~/.claude/settings.local.json — такого пользовательского файла в иерархии настроек нет (O-13);
  • allow-правило EnterWorktree — запрос при входе вне .claude/worktrees/ оно не снимает (O-14).

Каждый раз ошибку нашли только после проверки агентом claude-code-guide по документации. Источники: PR #20, #26, ledger #29.

RT-23 (P2). retro_metrics.py не видит промпт владельца, отправленный вместе с результатом инструмента.

  • Если владелец пишет, пока висит окно разрешения или работает инструмент, Claude Code пишет его текст в ту же запись, что и tool_result. Определение спеки «сообщение без tool_result» такую запись отбрасывает.
  • В этом срезе пропущены 2 из 5 поправок по процессу — обе по RT-21, они найдены вручную. Число промптов тоже занижено на 2.
  • Источник: прогон --corrections, сверка с транскриптом.

RT-24 (P2). Изоляция worktree Claude Code отказывает командам, где слово git стоит в «сложном» тексте.

  • Где: heredoc, $VAR-аргументы, python3 -c, bash с переменной пути, git -C в основной checkout.
  • 22 отказа за срез, 13 из них в первый день работы в worktree.
  • Обход, найденный опытным путём: скрипты в файлах, литеральные пути, по одной команде; tea comments с телом из файла — через скрипт-обёртку.
  • Нигде в обвязке это не описано (O-5, #13). Код не наш, но рецепт — наш.
  • Источник: подсчёт по транскриптам.

RT-25 (P3, наблюдение к решению владельца 3). Доля codegraph_explore — 0.07: 4 вызова против 50 чтений кода.

  • В cc-harness codegraph индексирует только 9 Python-файлов. Bash — хуки-обёртки, install.sh, doctor.sh, тесты — в индекс не попадает (O-11, #21). Поэтому низкая доля здесь ожидаема и о пользе codegraph не говорит.
  • Решающий замер — ретро по awp-ca.
  • Источник: метрика codegraph.

3. Поправки владельца

Вид Сколько Пример (цитата, что было до неё) Что вышло Находка
Лишнее подтверждение на шаге процесса 2 «почему мне нужно это каждый раз подтверждать?», «но опять спрашивает разрешение» — после EnterWorktree в ../cc-harness.wt/ allow-правила в install.sh (#24), worktree в .claude/worktrees/ (#25) RT-21
Работа переложена на владельца 1 «сделай сам» — после «Что осталось вам: запустите bash install.sh» агент поставил сам; признак «сделай сам» добавлен в --corrections (H-1, #29) — (1 раз)
Варианты в окне вопроса без пояснения 1 прерывание и «повтори варианты опять» — после AskUserQuestion о месте worktree варианты повторены текстом с плюсами и минусами, выбран вариант 1 — (1 раз)

Два прерывания из --corrections к поправкам по процессу не относятся. Одно — пауза в brainstorming 15.10, после неё «продолжаю». Второе — то же событие, что «повтори варианты опять».

4. Что сработало (сохранить)

  • Хуки 0.4.0. После установки ни одной ложной блокировки. Корпус ловит регрессии: каждый ложный блок среза стал записью корпуса, 135/135.
  • Чеклист закрытия. Выполнялся целиком после каждого merge: архив отдельным PR, follow-up issue, удаление веток из worktree. Хвостов на конец среза нет — RT-3 из ретро 11.10 больше не воспроизводится.
  • Финальное ревью всей ветки на opus. Находило то, чего не видели тесты плана:
    • в #6 — 2 Important (checkout main && … && push, префиксы с опциями);
    • в #29 — C-1 (сабагенты не читались, замер codegraph был бы пустым) и 7 Important.
  • Живые прогоны на реальных транскриптах до ревью. Нашли O-18 (синтетическое сообщение об ошибке API давало стартовый контекст 0) и O-19 (рабочий каталог активного плана как хвост).
  • Одна длинная сессия. 10 дней работы, одна компакция. Работа продолжалась по сводке, ledger и issue без потери места.
  • Стартовый контекст — 44–53 К токенов против 52–61 К на 11.10.

5. Бэклог улучшений (по приоритету)

# Что Находки Оценка
B13 retro_metrics.py: считать текстовые блоки промпта владельца и в записях с tool_result; поправить определение в спеке harness-retro RT-23 0,5 дня
B14 roles/dev.md: совет о настройке Claude Code, правах или установке внешнего CLI — сначала сверить по документации (агент claude-code-guide) или явно пометить как непроверенный RT-22 0,25 дня
B15 HARNESS.md: рецепт команд в изолированной сессии — скрипты в файлах, литеральные пути, одна команда на вызов, обёртка для tea comments из файла RT-24 0,25 дня
B16 Отложенные мелкие находки /harness-retro #31 (M-1…M-13) 1 день
B17 Ретро по awp-ca — решающий замер codegraph (решение владельца 3) RT-25 на машине с полигоном

6. Решения владельца (24.10.2026)

  1. Бэклог B13–B17 принят в предложенном порядке (ревью PR #34).
  2. Где жить правилу B14 — в roles/dev.md или в глобальном CLAUDE.md — решается при его реализации. По умолчанию — roles/dev.md: глобальный CLAUDE.md уже 3058 Б при пороге 3 КБ.

7. Что не измерялось

  • Сторона Gitea чеклиста закрытия: открытые issue после слитого PR, пропущенные follow-up. На конец среза по Gitea их нет, проверено вручную.
  • Промпты владельца в записях с tool_result (RT-23). Поправки по ним найдены вручную, счёт промптов занижен на 2.
  • Память: auto-memory проекта на этой машине пуста. Память awp-ca (47 файлов на 11.10) здесь недоступна, поэтому сравнение строк памяти — между разными проектами.
  • Даты среза — по меткам транскрипта в UTC (M-5, #31).
  • Время, потерянное на каждую поправку и каждый отказ изоляции: в транскрипте есть факт, но нет длительности.