v0.8.0 — trust layer
v0.8.0 — the trust layer
Turns "a check passed" into "the required checks passed," and makes a
completion claim shareable. Built cross-engine (bash + PowerShell + Node), zero
new dependencies, and dogfooded through the gate itself: 77 passing, 0 failed
(incl. the PowerShell parity suite).
Added
- Required-checks policy — an optional
agent-done.jsondeclares required
labels, each with an optionalcommand_regex, plusttl.assertreads it
when no--labelis given. Resolution order: explicit--label(legacy) →
policy → most-recent receipt. Policy mode searches all run dirs per label,
so checks captured in separate runs still count. New--policy/--no-policy
flags;assert --jsongains apolicykey. Parsed dependency-free in bash +
PowerShell. Documented in the newpolicy.schema.json. A present-but-unparseable
policy fails closed — it never silently degrades to the latest receipt. - Wrong-check detection — a label strength taxonomy (strong: test/build/
typecheck/e2e/smoke…; weak: lint/format/style/manual/docs). When the only
passing evidence is weak,assertandreportemit an advisory
latest proof is lint-only — …warning. Advisory only; never changes an exit code. report --format pr— a sticky, paste-ready PR comment wrapped in
<!-- agent-done-or-not:proof -->markers, plus a human "Proof of Done" card
on the markdown report.- Action PR comment —
pr-comment+github-tokeninputs upsert a sticky
proof comment viagh api, without changing the job's pass/fail (assert still decides). initpolish —--claudealias for--claude-hook;--policyscaffolds
anagent-done.json(never overwriting an existing one).
Changed
assert --jsonnow includes a top-levelpolicyfield (empty in legacy/--labelmodes). All existing keys unchanged.
Hardening (from an adversarial cross-model review, all with regression tests)
- Present-but-unparseable policy now fails closed (was a wrong-PASS that fell back to latest-receipt).
report --format prescapes</>so a crafted command can't inject the proof marker.- PowerShell
-matchon an invalidcommand_regexis now caught (was throwing → no JSON);--ttlnon-integer fails exit 2 in both engines (parity).
Release
- Tag
v0.8.0pushed;agent-done-or-not@0.8.0published to npm. - Homebrew + Scoop pinned to the v0.8.0 tarball (
sha256 25bf2050…).
🤖 Generated with Claude Code