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 update or 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 init fits 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 init to fit the knobs to your layout and triage the first reds. Nothing to do.
  • delegation-kit check-gate-tamper — the install manifest checkwright.lock at the repository root now counts as meta-layer for gate-edit isolation, so update and 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 with git reset --hard and run the upgrade again.
  • drift-kit --emit file-install — a leading --author files the line into a second record, the new knob DRIFT_KIT_AUTHOR_INSTALL_RECORD (default ${DRIFT_KIT_METRIC_DIR}/author-install-observations.log), which --emit install-evidence never 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 last DRIFT_KIT_PRICE_COVERAGE_DAYS days of transcripts that your price table has no row in force for. With the new command knob DRIFT_KIT_PRICE_PAGE_CMD set (off by default), it also hashes your pricing page’s DRIFT_KIT_PRICE_PAGE_SECTION section and compares it with the table’s # price-page-hash: header, under a DRIFT_KIT_PRICE_PAGE_TIMEOUT bound; drift-kit/SPEC.md owns the defaults. Nothing to do; to opt in, set the command and section knobs and transcribe the printed hash with priced-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 prices 0.0000 rather than n/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-coverage where 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-kit kpi-gate-runtime — only an unfiltered run of the configured registry writes <tmp-dir>/gate-timings.txt; a --only or --for run, 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.