guard-main по цели записи + регрессионные тесты хуков (B1+B2) #6

Closed
opened 2026-10-12 14:26:15 +03:00 by aep · 2 comments
Owner

Architectural. Источник: ретро docs/retro/2026-10-11.md — бэклог B1, B2; решение владельца 1 (раздел 5); находки RT-1, RT-2, RT-6, RT-7. Спека пишется в openspec/changes/<id>/ по итогам brainstorming.

Корень (RT-1): guard-main решает по cwd сессии, а не по цели записи. 103 блокировки за 10 дней, около трёх четвертей ложные, реальных нарушений main — ноль.

Пункты:

  • B1. guard-main по цели записи. Не считать записью N>/N>& (36 случаев); для Edit/Write брать ветку репозитория самого файла; записи вне git-репозиториев не блокировать (scratchpad, память); для Bash учитывать git -C <dir> и пути в команде; исключения для git -C … worktree add, mkdir -p .wt/; хук не должен ломаться от чужого cd (RT-2).
  • B2. Регрессионные тесты хуков на реальных командах из транскриптов: фикстуры с ожидаемым вердиктом, запуск из tests/run.sh и самотест в doctor.sh (RT-6).
  • Решение владельца 1: архив OpenSpec — всегда отдельным PR. Убрать исключение openspec-only из guard-main и из global/CLAUDE.md, docs/HARNESS.md; правило «в main только через PR» без исключений. Пункт 1 чеклиста закрытия переписать.
  • docs: HARNESS.md, CHANGELOG, CLAUDE.md репозитория (раздел «Текущая работа», «Тесты»).

Свежие случаи 12.10.2026 (сессия закрытия #2, cwd = основной checkout на main):

  • Write в ~/.claude/projects/…/memory/roles-and-memory-prs.md — вне репозитория, заблокирован как «you are on main».
  • grep -rniE 'guard-main' docs/… 2>/dev/null — только чтение, заблокирован как «shell write on main».
  • git fetch origin --prune 2>&1 | tail -3 — то же.

Сырьё для B2: блокировки выгружаются скриптом docs/retro/scripts/hook_blocks_export.py из транскриптов ~/.claude/projects/-Users-andrey-epifancev-projects-awp-ca/ — транскрипты есть только на рабочей машине, выгрузку сделать там до переезда (см. комментарий).

Не входит: B10 (workspace-хук awp-ca живёт в workspace awp-ca), B3 (allow-правило удаления веток), B4 кроме решения 1.

Architectural. Источник: ретро `docs/retro/2026-10-11.md` — бэклог B1, B2; решение владельца 1 (раздел 5); находки RT-1, RT-2, RT-6, RT-7. Спека пишется в `openspec/changes/<id>/` по итогам brainstorming. Корень (RT-1): guard-main решает по cwd сессии, а не по цели записи. 103 блокировки за 10 дней, около трёх четвертей ложные, реальных нарушений main — ноль. Пункты: - [ ] **B1. guard-main по цели записи.** Не считать записью `N>`/`N>&` (36 случаев); для Edit/Write брать ветку репозитория самого файла; записи вне git-репозиториев не блокировать (scratchpad, память); для Bash учитывать `git -C <dir>` и пути в команде; исключения для `git -C … worktree add`, `mkdir -p .wt/`; хук не должен ломаться от чужого `cd` (RT-2). - [ ] **B2. Регрессионные тесты хуков** на реальных командах из транскриптов: фикстуры с ожидаемым вердиктом, запуск из `tests/run.sh` и самотест в `doctor.sh` (RT-6). - [ ] **Решение владельца 1: архив OpenSpec — всегда отдельным PR.** Убрать исключение openspec-only из guard-main и из `global/CLAUDE.md`, `docs/HARNESS.md`; правило «в main только через PR» без исключений. Пункт 1 чеклиста закрытия переписать. - [ ] docs: HARNESS.md, CHANGELOG, CLAUDE.md репозитория (раздел «Текущая работа», «Тесты»). Свежие случаи 12.10.2026 (сессия закрытия #2, cwd = основной checkout на main): - Write в `~/.claude/projects/…/memory/roles-and-memory-prs.md` — вне репозитория, заблокирован как «you are on main». - `grep -rniE 'guard-main' docs/… 2>/dev/null` — только чтение, заблокирован как «shell write on main». - `git fetch origin --prune 2>&1 | tail -3` — то же. Сырьё для B2: блокировки выгружаются скриптом `docs/retro/scripts/hook_blocks_export.py` из транскриптов `~/.claude/projects/-Users-andrey-epifancev-projects-awp-ca/` — **транскрипты есть только на рабочей машине**, выгрузку сделать там до переезда (см. комментарий). Не входит: B10 (workspace-хук awp-ca живёт в workspace awp-ca), B3 (allow-правило удаления веток), B4 кроме решения 1.
Author
Owner

Сырьё для B2 выгружено на рабочей машине: docs/retro/fixtures/hook-blocks.jsonl в ветке feat/6-guard-main-target (2549e86). 126 блокировок из 42 сессий: guard-main(Bash) 109, guard-main(Edit/Write) 11, require-plan 4, прочие 2. У каждой записи есть cwd и ветка; поле expected пустое — вердикт (block/allow) размечается в рамках B2. В ретро было 103: разница — сессии claude-harness и сессии после среза. Транскрипты на другой машине для #6 не нужны.

Сырьё для B2 выгружено на рабочей машине: `docs/retro/fixtures/hook-blocks.jsonl` в ветке `feat/6-guard-main-target` (2549e86). 126 блокировок из 42 сессий: guard-main(Bash) 109, guard-main(Edit/Write) 11, require-plan 4, прочие 2. У каждой записи есть cwd и ветка; поле `expected` пустое — вердикт (block/allow) размечается в рамках B2. В ретро было 103: разница — сессии claude-harness и сессии после среза. Транскрипты на другой машине для #6 не нужны.
Author
Owner

Закрыто PR #12 (merge d245e50, 0.4.0). Все пункты выполнены:

  • B1 — guard-main решает по цели записи (RT-1, RT-2, RT-7): 87f2c95, исправления финального ревью I-1, I-2, M-3, M-5 — 2f96a13.
  • require-plan по репозиторию правимого файла: 1620d1e, M-4 — 2f96a13.
  • B2 — регрессионный корпус хуков, 126 записей пилота + 3 живых (RT-6), экстрактор только по ошибкам хука (O-1): 3d54932.
  • Решение владельца 1 — исключение openspec-only удалено, архив только отдельным PR: 87f2c95.
  • Docs, install, doctor: 2fd2396, M-7, M-8 — 2f96a13.

Метрика на корпусе: старые хуки — 41 блок (37 ложных), новые — 4 блока, ложных и пропущенных нет.

Архив OpenSpec — PR #14 (ждёт merge). Отложенные находки — #13.

Закрыто PR #12 (merge d245e50, 0.4.0). Все пункты выполнены: - B1 — guard-main решает по цели записи (RT-1, RT-2, RT-7): 87f2c95, исправления финального ревью I-1, I-2, M-3, M-5 — 2f96a13. - require-plan по репозиторию правимого файла: 1620d1e, M-4 — 2f96a13. - B2 — регрессионный корпус хуков, 126 записей пилота + 3 живых (RT-6), экстрактор только по ошибкам хука (O-1): 3d54932. - Решение владельца 1 — исключение openspec-only удалено, архив только отдельным PR: 87f2c95. - Docs, install, doctor: 2fd2396, M-7, M-8 — 2f96a13. Метрика на корпусе: старые хуки — 41 блок (37 ложных), новые — 4 блока, ложных и пропущенных нет. Архив OpenSpec — PR #14 (ждёт merge). Отложенные находки — #13.
aep closed this issue 2026-10-16 09:16:54 +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#6
No description provided.