Checkwright v0.4.0
2026-07-17
Checkwright is the verification layer under agent orchestration, and this release closes a fail-open hole in the consumer-smoke contract: the smoke scripts that mutate the invoking tree now refuse to run outside their harness, and a new meta-gate holds that refusal across the roster. One gate landed new, so the Tightened gates section names it and the upgrade smoke carries it as the release’s one allowed red.
Tightened gates
check-smoke-entry-guard— new gate. Everysmoke/install.shandsmoke/violation.shthat mutates the invoking tree must open with the entry-point guard: "${SMOKE_KIT_ROOT:?…}"before its first mutating command, so a bare invocation outsiderun-consumer-smoke.shrefuses instead of writing into the caller’s repo. The gate asserts guard presence across the roster (position stays review’s — gate-sdk/SPEC.md §check-smoke-entry-guard states the honest limit). The nine shipped kitviolation.shscripts gained the guard this release, so a clean upgrade stays green; the gate reds only against a kit whose smoke scripts you have copied out or authored without the guard. It reusesGATE_SDK_KIT_DIRS— no new knob.
Renamed knobs
None — nothing was renamed or removed.
Behavior changes
Two changes this release moves no gate — they land here, the fixed section for what shifts outside the battery, and neither asks anything of a clean tree.
- lifecycle-kit lead template — the budget-guard block-vs-advise override note moved to its point of use in the lead template (documentation residency, nothing to reconcile).
- scope boundary scratch wipe — now spares a live lead’s
.tmp/session-rolemarker, so a lead outliving an iteration boundary keeps its role suppression (context-kit’s session-context signal — a fix, no knob or schema change).
Upgrading
Sync the vendored kit directories wholesale at v0.4.0 and regenerate the
generated artifacts (the pre-commit hook and the graph projection), then run the
full battery. On a clean tree it stays green: the fail-open fix inserted the
entry-point guard into all nine shipped violation.sh scripts and promoted it
to a gate-sdk Consumer-smoke contract clause, so the shipped roster satisfies
the new gate.
The one allowed red. If you have shadowed a kit or copied its smoke/
scripts into your own tree, check-smoke-entry-guard reds any mutating smoke
script of yours that lacks the ${SMOKE_KIT_ROOT:?…} guard. The fix is the
guard line the note names, placed before the script’s first mutating command —
the same one-line refusal the shipped scripts now carry.
The Tightened gates section is the mechanical allowed-red set: the gates a clean upgrade may turn red. The behavior changes above are declared for reading, not a mechanical scan. If a gate reds that this note does not name, the upgrade smoke was supposed to catch it first — open an issue, because that is a defect in the release rather than work for you.