Checkwright v0.31.0
2026-09-30
Checkwright is the verification layer under agent orchestration, and this release lets a hooked install upgrade and change profile through its own hooks, and adds a way to price a commit and a check that your price table covers the models you run.
In brief
- An install with its git hooks on can now run
updateor move to another profile: the gate-tamper check no longer refuses the install’s own commit. - You can time what a commit costs in your own repository with the gate binary’s
--measure-commit, the arm behind the figure on the install page. - If you keep a price table for stage economics, a new arm names the models your sessions ran that it cannot price, and a price change becomes a dated second row instead of an edit.
- An agent walk after
initfits the knobs to your layout and triages your first reds. - Nothing to do after upgrading. No gate tightened and no knob was renamed, so a clean upgrade stays green.
Tightened gates
None. The one gate change, check-gate-tamper’s, admits a commit it refused before; it is under Behavior changes.
Renamed knobs
None. Knobs were added, not renamed.
Behavior changes
- gate-sdk/templates/adopt.md — a walk an agent follows after
initto fit the knobs to your layout and triage the first reds. Nothing to do. - delegation-kit
check-gate-tamper— the install manifestcheckwright.lockat the repository root now counts as meta-layer for gate-edit isolation, soupdateand a profile move commit through your installed hooks instead of being refused with the manifest listed as a co-staged path. Nothing to do; if a refused upgrade left its files staged, discard them withgit reset --hardand run the upgrade again. - drift-kit
--emit file-install— a leading--authorfiles the line into a second record, the new knobDRIFT_KIT_AUTHOR_INSTALL_RECORD(default${DRIFT_KIT_METRIC_DIR}/author-install-observations.log), which--emit install-evidencenever reads. Nothing to do; file an install you or someone acting for you ran with--author, so it stays out of the published figures. - drift-kit
--price-coverage— a new arm names the model ids with usage in the lastDRIFT_KIT_PRICE_COVERAGE_DAYSdays of transcripts that your price table has no row in force for. With the new command knobDRIFT_KIT_PRICE_PAGE_CMDset (off by default), it also hashes your pricing page’sDRIFT_KIT_PRICE_PAGE_SECTIONsection and compares it with the table’s# price-page-hash:header, under aDRIFT_KIT_PRICE_PAGE_TIMEOUTbound; drift-kit/SPEC.md owns the defaults. Nothing to do; to opt in, set the command and section knobs and transcribe the printed hash withpriced-as-of:. - drift-kit
--emit stage-economics, drift-kit/templates/price-table.tsv — the price table takes an optional sixth column,effective_from, and each cost cell is priced at the row in force on its row’s stamp date; a cell whose four token counts are all zero now prices0.0000rather thann/a, so a re-run re-prices such logged rows and drops their incomplete-pricing caveat. Nothing to do; a five-column table reads as before, and a price change is now a second row for the same id with a later date. - lifecycle-kit/templates/lead.md — the lead’s first step now runs
--price-coveragewhere drift-kit is vendored, and treats an id it names unpriced as a harness roster churn to re-judge tiers on. Nothing to do. - gate-sdk
run-gates, drift-kitkpi-gate-runtime— only an unfiltered run of the configured registry writes<tmp-dir>/gate-timings.txt; a--onlyor--forrun, or a foreign gates-dir run, leaves it as the last full battery wrote it, so the KPI no longer reports a subset as the battery total. Nothing to do. - gate-sdk
--measure-commit— a new arm times what your pre-commit hook would run if every tracked file were staged, three times, serially as the hook runs, and prints the median with the host it ran on; it stages nothing. Nothing to do; run it at your repository’s top level to price a commit in your own tree.
Upgrading
Replace the vendored kit directories wholesale at v0.31.0, or run checkwright update. Regenerate your generated artifacts; each freshness gate that reds prints its own regen command. Then run the full battery.
No allowed reds.
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.