Checkwright v0.11.0

2026-07-22

Checkwright is the verification layer under agent orchestration, and this release makes the stage-economics meter honest about what it measures. The per-stage cost figures it emitted before this release double-counted any session that spanned more than one stage and omitted the supervising session’s burn, so they were not safe to read a model-tiering decision off. They are now, and a new advisory KPI watches the one input the meter cannot verify for itself — the price table it prices against.

Tightened gates

None. The KPI below is advisory and never joins gates.list.

Renamed knobs

None.

Behavior changes

  • drift-kit/bin/stage-economics.sh — the join that attributes transcript usage to lifecycle stamps now keys on the session, not the stamp. A session bearing several stamps is summed once and attributed to the (iteration, stage) of its last stamp, and the stages it yielded take no row, named in a caveat instead. Previously each stamp resolved the same transcript independently and billed one session’s whole burn to both stages in full, so any per-stage comparison read off pre-v0.11.0 rows may be comparing a number against a copy of itself. What a consumer reconciles: figures already written to DRIFT_KIT_STAGE_ECONOMICS_LOG were produced under the old rule and are not comparable with rows produced after the upgrade; re-run the meter before reading a trend across the boundary.
  • DRIFT_KIT_SUPERVISION_LABEL — new knob; its default is in drift-kit’s SPEC knob roster, which owns the value. Under a split-lead posture the lead session dispatches, verifies, and runs batteries while carrying no stamp, so its cost previously landed in no row and every per-stage total understated the iteration by the whole supervision line item. The meter now derives the supervising session from the nested transcript path and emits it as a distinct row under this label. The <stage> column of the trend log therefore reads stage or cost-bearing role: a consumer treating that column as roster-closed will misread a supervision row as roster drift. No lifecycle change — the lead still stamps nothing and moves no cursor.
  • scripts/price-table.tsv — the shipped template gains an optional prices-valid-through: header beside the existing priced-as-of:. A consumer price table without the new header keeps pricing exactly as before; only the KPI below reports the absence, as n/a (no prices-valid-through: header). Nothing in the meter’s arithmetic reads either header.
  • drift-kit/kpis/kpi-price-table-age.sh — a new advisory KPI joins drift-kit/templates/kpis.list, reporting both the age of the price table’s priced-as-of: date and the time to or past its prices-valid-through: date. Both, because at the moment that matters they point opposite ways: a table retyped the day before a known introductory-pricing row lapses reads freshest exactly when it is least trustworthy, so an age-only reading would reassure at the one moment it was built to flag. What a consumer reconciles: a KPI roster change moves the generated docs projections — regenerate them as part of the phase-A step below.
  • delegation-kit/smoke/install.sh — the smoke now pins DELEGATION_KIT_PAUSE_PCT and DELEGATION_KIT_PAUSE_PCT_7D around its 95%-reading usage-verdict.sh assertion, the way the sibling test runner already did. Without the pin the assertion inherited whichever thresholds the ambient session environment carried and could invert its own expected verdict. Nothing a consumer configures changes; the smoke is simply no longer environment-sensitive at that assertion.

Upgrading

Replace the vendored kit directories wholesale at v0.11.0, then regenerate the generated artifacts — the pre-commit hook, the graph projection, and, because this release adds a KPI to the roster, the enforcement map and the value rollup that derive from it. Then run the full battery.

No allowed reds. Tightened gates is empty, so a clean upgrade turns no gate red; a red after this sync is a defect, not a migration step.

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.