Хуки решают по цели записи + регрессионный корпус хуков (#6, B1+B2, 0.4.0) #12
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/6-guard-main-target"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Refs #6 — B1 + B2 + решение владельца 1. Спека:
openspec/changes/hooks-write-target/(proposal, specs/hook-guards, design). План:docs/superpowers/plans/2026-10-16-hooks-write-target.md.Что сделано
guard-main решает по цели записи, а не по cwd и тексту команды (B1; RT-1, RT-2, RT-7). Цели:
/dev/*иN>&M) и команды записи с учётомcd,git -C,env -C,sh -c, префиксовsudo/timeout/nice…;Цель вне репозитория или в worktree на ветке — пропуск. Неразрешимый путь — пропуск. Git-мутация с неопределённым репозиторием — блок.
git pushблокируется, только если пушит в main.git switch -c/git checkout mainв той же команде меняют ветку для последующих целей.Несовместимо: исключение openspec-only и
openspec archiveна main удалено — архив только отдельным PR (решение владельца 1).require-plan берёт корень, ветку,
.claude/code-paths,.boundedи планы из репозитория правимого файла.Ядро —
hooks/harness_target.py(python3 stdlib, 3.8+)..sh— обёртки,settings.hooks.jsonне менялся.python3 hooks/harness_target.py targets '<cmd>' <cwd>показывает, какие цели видит хук.Сообщения:
BLOCKED [guard-main]: …/BLOCKED [require-plan]: …— цель, корень, выход.Регрессионный корпус (B2, RT-6): 126 записей из транскриптов пилота + 3 живых случая, разметка по спеке в
docs/retro/scripts/hook_cases_build.py. Прогон в песочнице —tests/test-hook-corpus.sh(источники) и строка «корпус хуков» вdoctor.sh(установленные копии).hook_blocks_export.pyиretro_blocks.pyсчитают только ошибки хуков (O-1).Метрика (корпус в песочнице)
main)Четыре блока — архивные коммиты openspec прямо в main с push в main (c031, c069, c070, c103). O-1: из 126 выгруженных записей настоящих ошибок хука 76, остальные — вывод команд со словом BLOCKED, поэтому счёт RT-1 в ретро завышен. «Единственный реальный перехват
sed -i» из ретро (c083) правил файл памяти, а не docs.Задержка хука: 26 мс на вызов без целей, 39 мс с git.
Проверка
bash tests/run.sh— passed 472, failed 0 (было 157). Новые тесты:test-hook-parse(91),test-hook-guard-main(62),test-hook-require-plan(17),test-hook-corpus(132),test-hook-export(3).openspec validate hooks-write-target --strict— valid.2f96a13по TDD (тест красный → зелёный, весь набор зелёный).Находки
cd, нет регрессионных тестов, каскад классификатора87f2c95,3d54932git checkout main && … && git pushпроходил2f96a13timeout 60/nice -n 5/sudo -u uпряталиgit commit/push(регрессия)2f96a13rm/ln -sfnссылки workspace на main-checkout блокировались (снос worktree awp-ca); переоценена в Important2f96a13src/[slug].ts(регрессия); переоценена в Important2f96a13git push -u origin "$(git branch --show-current)"из worktree блокировался,push --tagsс main — тоже; переоценена в Important2f96a132f96a13retro_blocks.pyсчитали блокировкой вывод команд со словом BLOCKED3d54932cwd→ exit 2 (Claude Codecwdпередаёт всегда)test-hook-corpusпроходит вхолостую, если раннер упал (страхуетtest-doctor)function f { … },$'…',(( a << 2 ))push?нет корня репозитория; «запись в .» дляnpm install/tar -xбез операцииhook_corpus.pyсобирает песочницу с глобальным git-конфигом (на этой машине ключей нет)npm --prefix/pnpm -C/yarn --cwd: значение опции как подкоманда;perl -Mstrictложно какperl -iwhyне проверяется, block одной формы — добавить живые block-случаиrm -rf link/с косой чертой иmvв ссылку на каталог оцениваются по месту ссылки (пробел M-3)gitв тексте — не наш кодRulings I made
.superpowers/sdd/<план>/old-hooks, а не в$TMPDIR: изоляция worktree запрещаетgit showс выводом за его пределы. Цена: нет.fetch origin main:main,branch -f main,update-ref— не мутации (спека); удалённый main защищён правилами push. Цена: локальный main расходится с origin.git clean -fdx,checkout .,checkout -fна main не блокируются: ветка и история не меняются, старый хук их тоже пропускал. Цена: потеря неотслеживаемых файлов main-checkout.mkdir -p .worktreesи запись в игнорируемые пути main блокируются (design.md, безcheck-ignore). Цена: ложный блок.python3 -c,make,find -delete— Non-Goals.tea pulls merge/gh pr merge— правило процесса, не хук.worktree add --detachблокируются как detached HEAD (спека).git stashна main блокируется (спека).git tag/config/remote/notes/gc— не мутации (design.md).cd /x &считается обычнымcd./private/tmp/...разрешаются по ФС хоста — стабильно вне репозиториев.roles/dev.md, п. 3 чеклиста).Решения, принятые без обсуждения на этапах спеки и прототипа, — в
design.md, раздел «Decisions made without discussion».После merge
bash install.shна каждой машине: подменит тела хуков и положитharness_target.py,settings.jsonне меняется. Затемbash ~/.claude/skills/harness-doctor/scripts/doctor.sh— ожидаетсяok корпус хуков: 129/129.🤖 Generated with Claude Code