Repository navigation
v0.25.1
Stops the announce guard from blocking a turn whose next step belongs to the user. Its regexes now only nominate an ending; a Sonnet judge that reads your last request decides.
Changed
stop-guard-announce.shasks a judge before it continues a turn. Over its first day live it blocked 18 stops and about 10 of them were handoffs the regexes cannot tell from an announcement: "order the parts, build it, tell me the result", "run/ac:install --dry-runyourself", a peer session's next step, "bekliyorum" meaning "I expect". A regex match now goes to an isolatedclaude -pon Sonnet (hooks/lib/announce-judge.md) that reads the ending together with the user's last request (a slash command counts as its name and arguments; a long request is sent as its head and tail), and only a parsed"ok": falsecontinues the turn. A session pointed at another endpoint throughANTHROPIC_BASE_URLskips the judge, sincesonnetwould resolve to that provider's model. On 44 unseen regex-positive stops that cut wrong blocks from 24 to 5 and missed 3 of 20. Haiku was measured and rejected: it flipped 8 of 107 decisions between identical runs and repeated the regexes' handoff mistakes. An offer of extra work the request did not ask for is no longer blocked. A missingclaudeorperl, a 20 second timeout (AC_ANNOUNCE_JUDGE_TIMEOUT), an error or an unparsable verdict ends the turn normally;AC_ANNOUNCE_JUDGE_MODELoverrides the model.- The announce guard continues a turn through
additionalContextrather thandecision: "block", so the transcript shows hook feedback instead of a "Stop hook error", with the same loop protections. It continues at most once per stall and 3 times per prompt (was 2 and 4), and its instruction tells the model to end with one line, without repeating the report, when the next step belongs to the user. - A
type: "prompt"Stop hook was the obvious alternative and was rejected on 2.1.281 evidence: its evaluator receives the whole conversation, trimmed only above half the model's context window, under a system prompt that answersok: falseon insufficient evidence, on every stop of every session includingclaude -p.
Fixed
hooks/lib/wake-count.jqstrict mode counts a shell that runs undertimeout N(N above 0, optional-k,-s,--foregroundand leadingVAR=assignments) as finite, whatever it wraps, provided N is at most one hour and no;,&,|or newline sits outside quotes, sotimeout 86400 npm run devstill does not switch a run guard off. An/ac:executerun was blocked twice on 2026-09-23 whiletimeout 110 zsh /tmp/wait-step.shwaited in the background, and the model then waited in the foreground. The run guards' block text now says a self-started wait is seen only undertimeout N. AMonitorrunning an opaque script withouttimeoutstill does not count, because the payload carries no Monitor timeout.