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 a close-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, since check-md-refs resolves paths and check-spec-pointer resolves 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/*.txt glob 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 *.txt is 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 the close-surface: declarations rather than a hand-written enumeration; the housekeeping step runs the roster tool, and the runtime-artifact check reads each row’s reclaim= 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.sh now 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-out file-gap.sh or enter-stage.sh carries 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-tiering clears once each tracked .workflow/ member carries its # contract: header and the partition is total.
  • check-close-surfaces clears once every close-surface capture row is declared and well-formed in its owning section.
  • check-tracking-claim clears 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.