B12: /harness-retro — срез метрик, поправки владельца, хвосты закрытия, корпус по сегментам (#29, 0.6.0) #30

Merged
aep merged 10 commits from feat/29-harness-retro into main 2026-10-24 09:08:01 +03:00
Owner

Closes #29 — B12 из бэклога ретро и решение владельца 3 (замер codegraph). Architectural.

  • Спека: openspec/changes/harness-retro/ — proposal, specs/harness-retro (новая capability), specs/hook-guards (MODIFIED «Регрессионный корпус хуков»), design с «Decisions made without discussion».
  • План: docs/superpowers/plans/2026-10-24-harness-retro.md, 4 задачи, исполнение — executing-plans (Native).

Что сделано

  • /harness-retro <папка проекта или workspace> [--since ГГГГ-ММ-ДД] — проектный skill (.claude/skills/harness-retro/, ставить не нужно).

    • Запускается в сессии в этом репозитории и идёт по циклу фичи: issue, EnterWorktree, PR.
    • Результат — черновик docs/retro/<дата>.md по шаблону и docs/retro/<дата>.metrics.json.
  • docs/retro/scripts/retro_metrics.py — срез метрик по транскриптам и памяти проекта.

    • Метрики:
      • сессии, промпты, прерывания, ходы и токены (по message.id, без синтетических сообщений об ошибке API), инструменты, роли, сабагенты, skills, компакции;
      • стартовый контекст;
      • блокировки хуков, отказы классификатора и владельца;
      • codegraph против чтения кода;
      • «перечитай», память.
    • Транскрипты сабагентов входят в сессию-родителя.
    • Период режется по меткам времени записей.
    • --markdown --prev даёт таблицу «Цифры» со сравнением, --from рисует её из сохранённого среза, --corrections выдаёт кандидатов в поправки владельца с контекстом.
    • Заменяет retro_stats.py и retro_blocks.py, они удалены.
  • docs/retro/scripts/retro_leftovers.py — хвосты чеклиста закрытия по состоянию репозиториев (git-проект или workspace):

    • слитые ветки на сервере и локально, worktree на них;
    • SDD workspace закрытых задач;
    • неархивные changes в origin/main;
    • отставший или грязный main.

    Только чтение; --fetch — по запросу.

  • Корпус хуков по сегментам (дельта hook-guards): у сегмента своя раскладка песочницы.

    • Запись с known — известная ошибка хуков: расхождение не валит тест, совпадение даёт KNOWN-FIXED, чтобы пометку сняли. Doctor показывает число известных ошибок.
    • hook_blocks_export.py --since --id-prefix выгружает блокировки среза вместе с сабагентами.
    • hook_cases_build.py собирает сегменты из hook-labels-<дата>.json и падает на неразмеченной или несовпадающей выгрузке.
  • docs/retro/2026-10-11.metrics.json — метрики ретро 11.10, перенесены из таблицы.

    • Блокировки — 76 ошибок хука, из них 72 ложные (O-1).
    • Несравнимое помечено: ходы и токены считались по строкам; блокировки, отказы, codegraph — без сабагентов; «перечитай» — широким регэкспом.
  • Документация: CLAUDE.md, HARNESS.md (раздел «Ретро»), README, CHANGELOG 0.6.0.

Живой прогон на этой машине (только чтение)

retro_metrics.py ~/Projects/cc-harness --since 2026-10-15 --markdown --prev docs/retro/2026-10-11.metrics.json:

Сессий 2
Промптов владельца 41
Стартовый контекст, медиана 48 484 (11.10: 56 000, −7 516)
Блокировок хуков 6 (вместе с сабагентами)
Вызовов codegraph_explore 4
Чтений кода 50
Доля codegraph_explore 0.07
Кандидатов в поправки 3
Хвостов закрытия нет

Проверка

  • bash tests/run.sh — passed 623, failed 0 (было 519). Новые тесты:
    • test-retro-metrics (40): синтетические транскрипты — split-сообщения, сабагенты, длинная сессия на стыке, сводка компакции, | в кавычках, секреты на границе обрезки, --from и повторный --out;
    • test-retro-leftovers (18): песочница с голым origin, клоном, worktree, workspace;
    • test-retro-skill (28);
    • в test-hook-corpus: сегменты, known, KNOWN-FIXED, разметка ретро, выгрузка без разметки;
    • в test-hook-export: --since по записям, --id-prefix, сабагенты, импорт без побочного вывода.
  • Корпус хуков — 129/129, сборка совпадает с файлом байт в байт.
  • openspec validate harness-retro --strict — valid.
  • Финальное ревью ветки — opus: Critical 1, Important 7, Minor 13. Critical и Important исправлены одним проходом в 3d2ce3f, у каждого исправления сначала был красный тест.

Находки

Маркер Что Статус
O-18 синтетическое сообщение об ошибке API (model: <synthetic>) считалось ходом, стартовый контекст 0 (живой прогон) fixed dde5756
O-19 SDD workspace активного плана выводился хвостом (живой прогон) fixed 4bbf6eb
C-1 транскрипты сабагентов не читались — замер codegraph в режиме SDD пуст fixed 3d2ce3f
I-1 | внутри кавычек резал команду, треть grep-чтений кода терялась fixed 3d2ce3f
I-2 каталог src в аргументе не считался кодом fixed 3d2ce3f
I-3 redact после обрезки — обрывок токена утекал в черновик fixed 3d2ce3f
I-4 черновик текущего ретро сдвигал период по умолчанию fixed 3d2ce3f
I-5 выгрузка без разметки молча пропускалась при сборке корпуса fixed 3d2ce3f
I-6 сводка компакции считалась промптом, «перечитай» — по любому «контекст» fixed 3d2ce3f
I-7 фильтр периода по первой метке сессии терял длинные сессии (изъян спеки) fixed 3d2ce3f, спека и design обновлены
M-1 hook_cases_build: TypeError и KeyError вместо сообщений, нет проверки expected, усечение корпуса при ошибке deferred
M-2 retro_leftovers: git status пишет .git/index deferred
M-3 запись неожиданной формы (message строкой и т. п.) роняет срез deferred
M-4 шаблон grep трактуется как путь; codegraph init --help deferred
M-5 --since — локальная дата, метки — UTC deferred
M-6 отказ владельца даёт ещё и прерывание и второго кандидата deferred
M-7 разные предикаты блокировки в экспортёре и метриках deferred
M-8 SKILL.md: «1 % битых строк» без числа строк; пересборка корпуса после known deferred
M-9 test-doctor не проверяет KNOWN-FIXED и «известных ошибок K» deferred
M-10 known маскирует вердикт error хука deferred
M-11 ff-слитая ветка на вершине origin/main не видна как хвост deferred
M-12 ручной /role не считается ролью сессии deferred
M-13 пустые сессии и фильтр isSidechain/userType не записаны в Decisions deferred

Rulings I made

  • Task 2: параметр name генератора теста конфликтовал с полем EnterWorktree; переименован в tool. Это ошибка плана в тестовом коде. Цена: нет.
  • Task 2, O-18: синтетические сообщения об ошибке API — не ход модели. Цена: если Claude Code так пометит настоящий ход, он выпадет из подсчёта.
  • Task 3, O-19: SDD workspace в worktree неслитой ветки — не хвост. Цена: брошенная неслитая задача скрипту не видна.
  • Final, I-7: период режется по меткам записей. Ревьюер отнёс это к решению владельца; я исправил, спека и design обновлены, на ревью можно откатить. Цена: сессия на стыке делится между двумя ретро.
  • Final, I-1: shlex с punctuation_chars вместо Lexer хука. Цена: heredoc и $(…) разбираются грубее.
  • Final: несравнимые метрики 11.10 помечены. Цена: в сравнении у них нет Δ.
  • Final: исправил неточную цену O-19 в design.md, это часть M-11. Цена: нет.

Решения без обсуждения на этапах спеки, плана и исполнения — в design.md, «Decisions made without discussion».

Для владельца

  • Список слов-признаков поправок задаёт спека. Типичная поправка «сделай сам» — агент перекладывает работу на владельца — в него не входит. Добавить?
  • Доля explore на этой машине — 0.07: 4 вызова против 50 чтений кода. Это первая точка замера по решению 3, срез по awp-ca даст основную.

После merge

Ставить ничего не нужно: skill проектный. bash install.sh --no-permissions обновит doctor и раннер корпуса (строка известных ошибок). Первое ретро по полигону — /harness-retro <путь к awp-ca> в сессии в cc-harness на той машине.

🤖 Generated with Claude Code

Closes #29 — B12 из бэклога ретро и решение владельца 3 (замер codegraph). Architectural. - Спека: `openspec/changes/harness-retro/` — proposal, specs/harness-retro (новая capability), specs/hook-guards (MODIFIED «Регрессионный корпус хуков»), design с «Decisions made without discussion». - План: `docs/superpowers/plans/2026-10-24-harness-retro.md`, 4 задачи, исполнение — executing-plans (Native). ## Что сделано - **`/harness-retro <папка проекта или workspace> [--since ГГГГ-ММ-ДД]`** — проектный skill (`.claude/skills/harness-retro/`, ставить не нужно). - Запускается в сессии в этом репозитории и идёт по циклу фичи: issue, `EnterWorktree`, PR. - Результат — черновик `docs/retro/<дата>.md` по шаблону и `docs/retro/<дата>.metrics.json`. - **`docs/retro/scripts/retro_metrics.py`** — срез метрик по транскриптам и памяти проекта. - Метрики: - сессии, промпты, прерывания, ходы и токены (по `message.id`, без синтетических сообщений об ошибке API), инструменты, роли, сабагенты, skills, компакции; - стартовый контекст; - блокировки хуков, отказы классификатора и владельца; - codegraph против чтения кода; - «перечитай», память. - Транскрипты сабагентов входят в сессию-родителя. - Период режется по меткам времени записей. - `--markdown --prev` даёт таблицу «Цифры» со сравнением, `--from` рисует её из сохранённого среза, `--corrections` выдаёт кандидатов в поправки владельца с контекстом. - Заменяет `retro_stats.py` и `retro_blocks.py`, они удалены. - **`docs/retro/scripts/retro_leftovers.py`** — хвосты чеклиста закрытия по состоянию репозиториев (git-проект или workspace): - слитые ветки на сервере и локально, worktree на них; - SDD workspace закрытых задач; - неархивные changes в `origin/main`; - отставший или грязный main. Только чтение; `--fetch` — по запросу. - **Корпус хуков по сегментам** (дельта `hook-guards`): у сегмента своя раскладка песочницы. - Запись с `known` — известная ошибка хуков: расхождение не валит тест, совпадение даёт `KNOWN-FIXED`, чтобы пометку сняли. Doctor показывает число известных ошибок. - `hook_blocks_export.py --since --id-prefix` выгружает блокировки среза вместе с сабагентами. - `hook_cases_build.py` собирает сегменты из `hook-labels-<дата>.json` и падает на неразмеченной или несовпадающей выгрузке. - `docs/retro/2026-10-11.metrics.json` — метрики ретро 11.10, перенесены из таблицы. - Блокировки — 76 ошибок хука, из них 72 ложные (O-1). - Несравнимое помечено: ходы и токены считались по строкам; блокировки, отказы, codegraph — без сабагентов; «перечитай» — широким регэкспом. - Документация: `CLAUDE.md`, `HARNESS.md` (раздел «Ретро»), README, CHANGELOG 0.6.0. ## Живой прогон на этой машине (только чтение) `retro_metrics.py ~/Projects/cc-harness --since 2026-10-15 --markdown --prev docs/retro/2026-10-11.metrics.json`: | | | |---|---| | Сессий | 2 | | Промптов владельца | 41 | | Стартовый контекст, медиана | 48 484 (11.10: 56 000, −7 516) | | Блокировок хуков | 6 (вместе с сабагентами) | | Вызовов `codegraph_explore` | 4 | | Чтений кода | 50 | | Доля `codegraph_explore` | **0.07** | | Кандидатов в поправки | 3 | | Хвостов закрытия | нет | ## Проверка - `bash tests/run.sh` — passed 623, failed 0 (было 519). Новые тесты: - `test-retro-metrics` (40): синтетические транскрипты — split-сообщения, сабагенты, длинная сессия на стыке, сводка компакции, `|` в кавычках, секреты на границе обрезки, `--from` и повторный `--out`; - `test-retro-leftovers` (18): песочница с голым origin, клоном, worktree, workspace; - `test-retro-skill` (28); - в `test-hook-corpus`: сегменты, `known`, `KNOWN-FIXED`, разметка ретро, выгрузка без разметки; - в `test-hook-export`: `--since` по записям, `--id-prefix`, сабагенты, импорт без побочного вывода. - Корпус хуков — 129/129, сборка совпадает с файлом байт в байт. - `openspec validate harness-retro --strict` — valid. - Финальное ревью ветки — opus: Critical 1, Important 7, Minor 13. Critical и Important исправлены одним проходом в 3d2ce3f, у каждого исправления сначала был красный тест. ## Находки | Маркер | Что | Статус | |---|---|---| | O-18 | синтетическое сообщение об ошибке API (`model: <synthetic>`) считалось ходом, стартовый контекст 0 (живой прогон) | fixed dde5756 | | O-19 | SDD workspace активного плана выводился хвостом (живой прогон) | fixed 4bbf6eb | | C-1 | транскрипты сабагентов не читались — замер codegraph в режиме SDD пуст | fixed 3d2ce3f | | I-1 | `\|` внутри кавычек резал команду, треть grep-чтений кода терялась | fixed 3d2ce3f | | I-2 | каталог `src` в аргументе не считался кодом | fixed 3d2ce3f | | I-3 | redact после обрезки — обрывок токена утекал в черновик | fixed 3d2ce3f | | I-4 | черновик текущего ретро сдвигал период по умолчанию | fixed 3d2ce3f | | I-5 | выгрузка без разметки молча пропускалась при сборке корпуса | fixed 3d2ce3f | | I-6 | сводка компакции считалась промптом, «перечитай» — по любому «контекст» | fixed 3d2ce3f | | I-7 | фильтр периода по первой метке сессии терял длинные сессии (изъян спеки) | fixed 3d2ce3f, спека и design обновлены | | M-1 | `hook_cases_build`: TypeError и KeyError вместо сообщений, нет проверки `expected`, усечение корпуса при ошибке | deferred | | M-2 | `retro_leftovers`: `git status` пишет `.git/index` | deferred | | M-3 | запись неожиданной формы (`message` строкой и т. п.) роняет срез | deferred | | M-4 | шаблон grep трактуется как путь; `codegraph init --help` | deferred | | M-5 | `--since` — локальная дата, метки — UTC | deferred | | M-6 | отказ владельца даёт ещё и прерывание и второго кандидата | deferred | | M-7 | разные предикаты блокировки в экспортёре и метриках | deferred | | M-8 | SKILL.md: «1 % битых строк» без числа строк; пересборка корпуса после `known` | deferred | | M-9 | `test-doctor` не проверяет `KNOWN-FIXED` и «известных ошибок K» | deferred | | M-10 | `known` маскирует вердикт `error` хука | deferred | | M-11 | ff-слитая ветка на вершине `origin/main` не видна как хвост | deferred | | M-12 | ручной `/role` не считается ролью сессии | deferred | | M-13 | пустые сессии и фильтр `isSidechain`/`userType` не записаны в Decisions | deferred | ## Rulings I made - **Task 2:** параметр `name` генератора теста конфликтовал с полем `EnterWorktree`; переименован в `tool`. Это ошибка плана в тестовом коде. Цена: нет. - **Task 2, O-18:** синтетические сообщения об ошибке API — не ход модели. Цена: если Claude Code так пометит настоящий ход, он выпадет из подсчёта. - **Task 3, O-19:** SDD workspace в worktree неслитой ветки — не хвост. Цена: брошенная неслитая задача скрипту не видна. - **Final, I-7:** период режется по меткам записей. Ревьюер отнёс это к решению владельца; я исправил, спека и design обновлены, на ревью можно откатить. Цена: сессия на стыке делится между двумя ретро. - **Final, I-1:** `shlex` с `punctuation_chars` вместо `Lexer` хука. Цена: heredoc и `$(…)` разбираются грубее. - **Final:** несравнимые метрики 11.10 помечены. Цена: в сравнении у них нет Δ. - **Final:** исправил неточную цену O-19 в design.md, это часть M-11. Цена: нет. Решения без обсуждения на этапах спеки, плана и исполнения — в `design.md`, «Decisions made without discussion». ## Для владельца - Список слов-признаков поправок задаёт спека. Типичная поправка «сделай сам» — агент перекладывает работу на владельца — в него не входит. Добавить? - Доля explore на этой машине — 0.07: 4 вызова против 50 чтений кода. Это первая точка замера по решению 3, срез по awp-ca даст основную. ## После merge Ставить ничего не нужно: skill проектный. `bash install.sh --no-permissions` обновит doctor и раннер корпуса (строка `известных ошибок`). Первое ретро по полигону — `/harness-retro <путь к awp-ca>` в сессии в cc-harness на той машине. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 9 commits 2026-10-24 01:02:48 +03:00
OpenSpec change harness-retro: proposal, specs (harness-retro — новая
capability; hook-guards — MODIFIED «Регрессионный корпус хуков»: сегменты
и known), design с Decisions made without discussion. По итогам
brainstorming 24.10.2026: черновик ретро, срез одного проекта, запуск из
репозитория обвязки, разметка блокировок агентом в корпус, хвосты по
текущему состоянию, поправки владельца по процессу, подход A.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Синтетические сообщения об ошибке API (model <synthetic>) не считаются ходом модели (O-18, живой прогон).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SDD workspace в worktree активной задачи хвостом не считается (O-19, живой прогон).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- C-1: транскрипты сабагентов (<сессия>/subagents/*.jsonl) вливаются в
  сессию-родителя — ходы, токены, инструменты, codegraph, блокировки,
  отказы; промпты, роль, стартовый контекст — только из основного.
  hook_blocks_export.py выгружает их блокировки с сессией-родителем.
- I-7: период режется по меткам времени записей; сессия на стыке
  делится между ретро, стартовый контекст — если первый ход в периоде.
- I-1: простые команды Bash — shlex с punctuation_chars, «|» в кавычках
  команду не делит. I-2: правило src/ ловит и сам каталог src.
- I-3: clip() — redact до обрезки (кандидаты, выгрузка), роль — redact.
- I-4: без --since период берётся из существующего --out; --from рисует
  «Цифры» из сохранённого среза. SKILL.md передаёт период явно.
- I-5: выгрузка ретро без разметки — сборка корпуса падает.
- I-6: сводка компакции — не промпт; «перечитай» — побуждение перечитать.
- 2026-10-11.metrics.json: несравнимое помечено (без сабагентов, широкий
  «перечитай»). Спека и design.md (Decisions) обновлены.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep added 1 commit 2026-10-24 09:07:31 +03:00
Author
Owner

H-1 (владелец): «сделай сам» добавлен в признаки поправок владельца — fixed 1325045 (тест RED→GREEN, весь набор 624/0; спека и SKILL.md обновлены).

H-1 (владелец): «сделай сам» добавлен в признаки поправок владельца — fixed 1325045 (тест RED→GREEN, весь набор 624/0; спека и SKILL.md обновлены).
aep merged commit 1697c77a83 into main 2026-10-24 09:08:01 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/claude-harness#30
No description provided.