Checkwright v0.13.0
2026-07-22
Checkwright is the verification layer under agent orchestration, and this
release gives the .workflow/ directory a stated surface contract, derives the
close stage’s inbound-triage roster from that contract instead of a hand-written
list, and teaches the battery to check a prose tracking claim against git. Each
lands as a new gate; the workflow directory stops being a folder of convention
and becomes a partitioned surface each member is classified against.
Tightened gates
check-workflow-tiering— the workflow directory now carries a stated contract (gate-sdk): a two-tier membership partition keyed on tracking, a ruled# contract:header on every tracked member (a spec pointer or a wire-format version marker), and an extension rule keyed on writer and reader. The gate enforces partition totality plus header presence and payload shape. A consumer whose tracked.workflow/members lack the header form, or whose partition is incomplete, reds here — reconcile by adding the header the note’s contract section names.check-close-surfaces— the close stage’s triage roster is now derived (lifecycle-kit): each capture surface declares itself with aclose-surface: <path> <mode> [reclaim=<command>]directive in the section that already owns it, and the gate requires every row well-formed and every capture-tier surface declared. A consumer with a missing or malformed declaration, or an undeclared capture surface, reds here.check-tracking-claim— a fixed-vocabulary predicate (is committed / is tracked / is gitignored / is local-only / is two-tier) bound to the backticked path it directly follows is now checked against the index and the ignore rules (canon-kit). A consumer doc whose sentence asserts a path’s tracking status contrary to git reds here — the case every other gate was blind to, sincecheck-md-refsresolves paths andcheck-spec-pointerresolves headings but neither reads what the sentence claims about the path.
Renamed knobs
None. New knobs were added (LIFECYCLE_KIT_CLOSE_SURFACE_GLOBS,
LIFECYCLE_KIT_ROSTER_BASENAME), but nothing was renamed or removed.
Behavior changes
.workflow/tracked members — the canon comment/pointer surface widened from a.workflow/*.txtglob to the directory’s tracked members whatever the extension, so the consumer whitelist retains only the version-marker file. Two evidence files (release-sweep-evidence.txt,validate-baseline.txt) moved to pointer-form# contract:headers with their grammar preserved as the em-dash tail, and the release-sweep evidence’s per-release block heading lost its#lead-in (the header now states it). What a consumer reconciles: a tracked.workflow/member outside*.txtis now subject to the comment/pointer surface, and a copied-out evidence-file grammar re-syncs to the header form.lifecycle-kit/bin/close-surfaces.sh+ the close skill — close now derives its inbound-triage roster from theclose-surface:declarations rather than a hand-written enumeration; the housekeeping step runs the roster tool, and the runtime-artifact check reads each row’sreclaim=as the named drain for a workflow-directory capture surface. What a consumer reconciles: a copied-out close template carries the old enumerated step; re-sync it to run the roster.lifecycle-kit/bin/file-gap.sh+bin/enter-stage.sh— the gap inbox’s post-close filing window is closed.file-gap.shnow reads the cursor and warns at the point of capture which drain consequence the filer is buying (an ordinary filing blocks the next first-stage entry; a filing made while the cursor sits at the last stage has no drain left) — a warning on stderr, not a refusal, so the stamped bullet stays the tool’s stdout contract and no finding is pushed back into session.enter-stage.sh’s boundary refusal stops describing a stage that is not coming back and names both recoveries: the closing stage’s drain, or — when it has already run — dispositioning the bullets in the entering session and promoting each to the deferred queue before truncating. What a consumer reconciles: a copied-outfile-gap.shorenter-stage.shcarries the old single-path text; re-sync for the new warning and refusal.
Upgrading
Replace the vendored kit directories wholesale at v0.13.0, then regenerate the
generated artifacts — the pre-commit hook and the graph projection. Then run the
full battery.
The allowed reds. The gates landing this release, listed under Tightened gates above, are the clean upgrade’s allowed-red set:
check-workflow-tieringclears once each tracked.workflow/member carries its# contract:header and the partition is total.check-close-surfacesclears once every close-surface capture row is declared and well-formed in its owning section.check-tracking-claimclears once each doc sentence binding a tracking predicate to a path agrees with git — correct the claim or the state it names.
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.