You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
An undetermined outcome no longer exits as a plain failure. A write whose response was lost carries botherror and outcomeUnknown, and the harness deliberately judges unknown first when writing the audit row — the change may have taken effect, so a blind retry could apply it twice. The CLI guard judged error first, so the audit said "may have taken effect" while the exit status told a script it had not happened. The two layers now agree (exit 2, not 1), and a test pins the ordering so it cannot silently flip back.
The CLI reported a refused or failed governed write as a success. 16 write call sites printed the governed twin's payload and exited 0 whatever it said — and @tool_errors flattens every refusal, guard rejection and upstream failure into {"error": ...} rather than raising, so nothing downstream of a && chain or a CI step could tell a blocked write from a landed one. The dry-run path already exited non-zero, which made the asymmetry worse: the preview was stricter than the write it previews. Results now route through a checked() helper — exit 1 on an error payload, exit 2 on an undetermined outcome, unchanged on success. This defect class had been fixed repo-by-repo several times and kept coming back; an audit across the whole line found it live in 18 of the 24 tools at once (87 call sites), so each tool now carries an invariant test that fails if any future CLI command prints a governed result without checking it.