Checkwright v0.30.0
2026-09-29
Checkwright is the verification layer under agent orchestration, and this release checks a Spec Kit or OpenSpec task list against the tree it describes and lets each install choose the kits and gates it carries.
In brief
- If Spec Kit or OpenSpec writes your specs, the recipe now holds the task list to your tree: a ticked task naming a path that does not exist reds, and on Spec Kit so does a
[USn]label with no matching user story beside the list. The Spec Kit extension installs thefullprofile when you ask for it. - One install can now add or drop kits and gates:
initandupdatetake--with-kit,--without-kit,--with-gate,--without-gateand--no-selection, and a re-run keeps the choice. - The git hooks now hand off to the gate binary, so an edit to a
# graph:manifest or the gate registry needs no hook regeneration. - Close drains a capture log to a file it reads before removing it, so lines logged while a close runs are no longer lost.
- You may have steps to take after upgrading. Register the two new canon-kit task-list gates or declare them unregistered, move any hand-written hook region into a shell gate, and spell a gitignored close-surface reclaim with
--emit capture-drain. The allowed reds below name each.
Tightened gates
check-close-surfaces— a new assertion D reds a gitignored roster row whosereclaim=does not rotate its log, since close reads every row before reclaiming it and a truncation erases the lines appended in between. Spell the reclaim<gate binary> --emit capture-drain <path>, and read the drain file it prints rather than the live log.check-task-path-claim— new in canon-kit: a ticked task in a task listCANON_KIT_TASK_LIST_GLOBSnames reds on each path it names that does not exist. It registers disarmed and asserts nothing until that knob is set; a path absent by design takestask-path-exempt: <reason>on the task’s line or the one above.check-task-label-resolution— new in canon-kit: a label a task list cites, per a family inCANON_KIT_TASK_LABEL_CITESandCANON_KIT_TASK_LABEL_DEFINES, reds unless a markdown file beside the list defines it. It registers disarmed and asserts nothing until the cite knob and the task-list knob are set; the two knobs must carry one key set of one-group EREs, or every canon-kit gate exits 2.check-gate-substrate-parity— reds after upgrading through assertion I, which holds every gate the binary carries for a kit you vendor to be registered in yourgates.listor declared# unregistered:there. If you vendor canon-kit, the newcheck-task-path-claimandcheck-task-label-resolutionare such gates: register each, or declare# unregistered: <gate> — <reason>.check-graph— reds on a# graph:manifest that still carriesgen=, the keygen=manualretired with the hook handoff. Delete the key, and move any hand-written hook region into atrigger=*shell gate that reads the staged set itself.
Renamed knobs
None. Knobs were added, not renamed.
Behavior changes
- delegation-kit/SPEC.md §The turn-end liveness hook and §bin/wait-probe — the turn-end hook’s log and the probe’s evidence file now reclaim by
--emit capture-draininstead of truncation, so close reads the drain file it prints and removes it with--done. A consumer allowlisting the old: > <log>clear may drop that entry. - gate-sdk/SPEC.md §git-hook — the generated hooks become a two-line handoff to the gate binary’s
--git-hookarm, which reads the# graph:manifests at commit time, so a manifest or registry edit no longer needs a regeneration, andupdaterewrites an adopter’s hooks. The lines the hooks print are unchanged. - gate-sdk/SPEC.md §The
# graph:manifest —gen=manualis retired and a manifest carryinggen=redscheck-graph; a hand-written hook region becomes atrigger=*shell gate that reads the staged set itself. update— itsusage:line names[--recipe <name>]...and[--no-recipe], the recipe flags it already forwarded toinit; nothing an adopter runs changes.initandupdate— five selection flags,--with-kit,--without-kit,--with-gate,--without-gateand--no-selection, adjust a profile’s kit set and registry per install, recorded under the manifest’s newselectionkey and re-applied by a bare re-run (installer/SPEC.md §Selecting kits and gates). An install passing none records none and changes nothing.- the Spec Kit extension’s install command — it installs
fullwhen the user’s input asks for it, namingfull’s costs first, andproseotherwise; aproseinstall is unchanged. - the Spec Kit and OpenSpec recipes — each arms
check-task-path-claimon its toolkit’s task lists, and the Spec Kit recipe binds the user-story label family forcheck-task-label-resolution. A tree applying either recipe from this release reds on a ticked task naming a missing path, and on Spec Kit on a[USn]label with no### User Story nin thespec.mdbeside it; correct the task, untick it, or valve it. - site-kit/SPEC.md §check-docs-liquid-parse — the Liquid template set is the new knob
SITE_KIT_LIQUID_TEMPLATES, repo-relative pathspecs defaulting to the three directories the gate read before (docs/_layouts/*,docs/_includes/*,docs/_posts/*), so a site that renames its template directories or moves its docs dir sets it.
Upgrading
Replace the vendored kit directories wholesale at v0.30.0, or run checkwright update, which also rewrites your git hooks as the handoff. Regenerate your generated artifacts; each freshness gate that reds prints its own regen command. Then run the full battery.
The allowed reds. check-gate-substrate-parity reds if you vendor canon-kit, until you register check-task-path-claim and check-task-label-resolution in your gates.list or declare each # unregistered: with a reason. check-task-path-claim and check-task-label-resolution red only once armed, as a Spec Kit or OpenSpec recipe arms them, on a ticked task naming a missing path or a label with no definition beside the list; correct the task, untick it, or valve it. check-close-surfaces reds on a gitignored roster row whose reclaim= truncates its log; spell it --emit capture-drain <path>. check-graph reds on a manifest still carrying gen=; delete the key and move any hand-written hook region into a trigger=* shell gate.
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.