Skip to content

v0.25.1

Choose a tag to compare

@anilcancakir anilcancakir released this 24 Sep 20:07
· 12 commits to main since this release

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.sh asks 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-run yourself", a peer session's next step, "bekliyorum" meaning "I expect". A regex match now goes to an isolated claude -p on 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": false continues the turn. A session pointed at another endpoint through ANTHROPIC_BASE_URL skips the judge, since sonnet would 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 missing claude or perl, a 20 second timeout (AC_ANNOUNCE_JUDGE_TIMEOUT), an error or an unparsable verdict ends the turn normally; AC_ANNOUNCE_JUDGE_MODEL overrides the model.
  • The announce guard continues a turn through additionalContext rather than decision: "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 answers ok: false on insufficient evidence, on every stop of every session including claude -p.

Fixed

  • hooks/lib/wake-count.jq strict mode counts a shell that runs under timeout N (N above 0, optional -k, -s, --foreground and leading VAR= assignments) as finite, whatever it wraps, provided N is at most one hour and no ;, &, | or newline sits outside quotes, so timeout 86400 npm run dev still does not switch a run guard off. An /ac:execute run was blocked twice on 2026-09-23 while timeout 110 zsh /tmp/wait-step.sh waited 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 under timeout N. A Monitor running an opaque script without timeout still does not count, because the payload carries no Monitor timeout.