Follow-ups from #29 #31

Closed
opened 2026-10-24 09:09:05 +03:00 by aep · 1 comment
Owner

Отложенные находки из #29 (PR #30, merge 1697c77, 0.6.0). Все — из финального ревью ветки (opus), M-n — minor.

Сборка корпуса и экспортёр:

  • M-1 — hook_cases_build.py: запись выгрузки без id → TypeError, разметка без expected/skip → KeyError вместо сообщения; expected не проверяется на allow|block; вывод потоковый — ошибка в сегменте ретро при > hook-cases.jsonl оставляет корпус усечённым. Собрать сегменты, проверить, потом печатать.
  • M-7 — экспортёр и retro_metrics считают блокировку по-разному: экспортёр — любая hook error без BLOCKED и только Bash/Edit/Write/MultiEdit; метрики требуют BLOCKED и берут любой инструмент; экспортёр не дедуплицирует сессию в нескольких каталогах. Один предикат и один отбор файлов.
  • M-10 — hook_corpus.py: вердикт error (сломан python3, ошибка хука) у записи с known даёт KNOWN и считается «хорошим»; error всегда должен быть ошибкой прогона.

retro_metrics.py:

  • M-3 — валидная JSON-запись неожиданной формы (message строкой, usage или input списком, command не строкой, Skill.args словарём, cwd числом) роняет весь срез; design обещает пропуск. isinstance-проверки или try/except на запись со счётом в bad_lines.
  • M-4 — шаблон grep трактуется как путь (grep -rn hooks docs/ при code-paths = hooks/ — чтение кода); "codegraph init" in cmd засчитывает codegraph init --help и grep по строке.
  • M-5 — --since — локальная дата, метки транскрипта — UTC: сессия в 01:30 МСК дня D по UTC — D-1. Переводить метку в локальное время или написать «даты — UTC».
  • M-6 — отказ владельца в разрешении сопровождается записью [Request interrupted by user for tool use]: +1 к прерываниям и второй кандидат в поправки на одно событие.
  • M-12 — роль, выбранная вручную слеш-командой /role dev (<command-name>/role + <command-args>), не считается — только tool_use Skill.
  • M-13 — решения без обсуждения не записаны в design.md: сессии без промптов и ходов не считаются сессиями (sources.bytes при этом их включает); промпт исключается по isSidechain и userType != external.

retro_leftovers.py:

  • M-2 — git status --porcelain переписывает .git/index (берёт index.lock), вопреки «только чтение»; нужен git --no-optional-locks status или GIT_OPTIONAL_LOCKS=0, в тест — mtime индекса.
  • M-11 — ветка, слитая fast-forward и совпадающая с origin/main, считается «свежей» и не выводится, пока main не уйдёт вперёд (так вливает adopt-project.sh).

Skill и тесты:

  • M-8 — SKILL.md: «битых строк больше 1 %» — в sources нет общего числа строк; после проставления known не сказано пересобрать корпус и снова прогнать hook-corpus.
  • M-9 — test-doctor.sh не проверяет выво�� KNOWN-FIXED и хвост «, известных ошибок K» в doctor (обещано в proposal, Impact).
Отложенные находки из #29 (PR #30, merge 1697c77, 0.6.0). Все — из финального ревью ветки (opus), M-n — minor. Сборка корпуса и экспортёр: - M-1 — `hook_cases_build.py`: запись выгрузки без `id` → `TypeError`, разметка без `expected`/`skip` → `KeyError` вместо сообщения; `expected` не проверяется на `allow|block`; вывод потоковый — ошибка в сегменте ретро при `> hook-cases.jsonl` оставляет корпус усечённым. Собрать сегменты, проверить, потом печатать. - M-7 — экспортёр и `retro_metrics` считают блокировку по-разному: экспортёр — любая `hook error` без `BLOCKED` и только Bash/Edit/Write/MultiEdit; метрики требуют `BLOCKED` и берут любой инструмент; экспортёр не дедуплицирует сессию в нескольких каталогах. Один предикат и один отбор файлов. - M-10 — `hook_corpus.py`: вердикт `error` (сломан python3, ошибка хука) у записи с `known` даёт KNOWN и считается «хорошим»; `error` всегда должен быть ошибкой прогона. `retro_metrics.py`: - M-3 — валидная JSON-запись неожиданной формы (`message` строкой, `usage` или `input` списком, `command` не строкой, `Skill.args` словарём, `cwd` числом) роняет весь срез; design обещает пропуск. `isinstance`-проверки или try/except на запись со счётом в `bad_lines`. - M-4 — шаблон grep трактуется как путь (`grep -rn hooks docs/` при `code-paths` = `hooks/` — чтение кода); `"codegraph init" in cmd` засчитывает `codegraph init --help` и grep по строке. - M-5 — `--since` — локальная дата, метки транскрипта — UTC: сессия в 01:30 МСК дня D по UTC — D-1. Переводить метку в локальное время или написать «даты — UTC». - M-6 — отказ владельца в разрешении сопровождается записью `[Request interrupted by user for tool use]`: +1 к прерываниям и второй кандидат в поправки на одно событие. - M-12 — роль, выбранная вручную слеш-командой `/role dev` (`<command-name>/role` + `<command-args>`), не считается — только `tool_use` Skill. - M-13 — решения без обсуждения не записаны в design.md: сессии без промптов и ходов не считаются сессиями (`sources.bytes` при этом их включает); промпт исключается по `isSidechain` и `userType != external`. `retro_leftovers.py`: - M-2 — `git status --porcelain` переписывает `.git/index` (берёт `index.lock`), вопреки «только чтение»; нужен `git --no-optional-locks status` или `GIT_OPTIONAL_LOCKS=0`, в тест — mtime индекса. - M-11 — ветка, слитая fast-forward и совпадающая с `origin/main`, считается «свежей» и не выводится, пока main не уйдёт вперёд (так вливает `adopt-project.sh`). Skill и тесты: - M-8 — `SKILL.md`: «битых строк больше 1 %» — в `sources` нет общего числа строк; после проставления `known` не сказано пересобрать корпус и снова прогнать `hook-corpus`. - M-9 — `test-doctor.sh` не проверяет выво�� `KNOWN-FIXED` и хвост «, известных ошибок K» в doctor (обещано в proposal, Impact).
Author
Owner

Сведено в #70 (консолидация follow-ups обвязки, 24.10.2026). Все маркеры и статусы перенесены туда.

Сведено в #70 (консолидация follow-ups обвязки, 24.10.2026). Все маркеры и статусы перенесены туда.
aep closed this issue 2026-10-24 21:15:39 +03:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

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