The specification

Evidence

No figure on this site was typed by hand. Each one below is read from an artifact in the repository at build time and is stated with what it does not establish.

FigureValueArtifactLimit
Specification version2.1spec/VERSION, tag spec-2.1A version names a rule set, not a chant release
chant pin0.73.0root package.jsonThe engine under test, not necessarily the corpus’s revision
Reference implementation2.1.0packages/reference/package.jsonSame author as chant; not an independent implementation
Conformance suite2.1.0packages/conformance/package.jsonCarries the fixtures at the declared spec version
Rules with a fixture135 of 139spec/fixtures/UNCOVERED.mdThe rest are listed with a reason each
Fixtures127, of which 65 whole-buildspec/fixtures/Cases somebody chose
Corpus109 projects, 441 fileschant 0.73.0 at 8ccbf3f4chant’s own examples, not a sample of real-world source
Comparable files440, verdicts agreepackages/conformance/corpus-report.mdVerdict agreement, which is the weaker claim; 1 loads no package
Both fold, identical namespaces304sameEntities compared as class plus properties, on one shared host
The evaluator as WebAssembly1255 KB, no importsevaluators/rust built for wasm32-unknown-unknown; rust-wasm-agreement.test.tsThe same crate as the binary; it proves embedding, and the profile’s proof is the column below
The data-host column441 of 441 agree, 142 fold on bothsame, with evaluators/rust builtTwo evaluators on one profile, sharing an author and one specification text, so agreement shows the text is implementable rather than right. Writing the Rust one found the reference reviving and tainting in a profile that does neither, both fixed in the reference

The claims, and the scenarios that check them

Each claim on what it enables has a scenario under scripts/smoke/scenarios/ that runs on a throwaway Forgejo and prints one verdict line per step. The weekly demo workflow runs every scenario twice and commits the result here. The second run sets BREAK=1, which sabotages the setup so the scenario has to catch it.

ClaimCommandHeldBroken case caught
Folding and running the same policy give the same values, and a file that would differ is refused before either is trusted. ~1 min.just smoke fold-equals-runpasscaught
The fold produces the plan without running the file, so a side effect the file carries never happens. ~1 min.just smoke no-executionpasscaught
After an apply, reading live back and diffing against the declared source finds nothing; a drift is named exactly. ~1 min.just smoke round-trippasscaught
A rule over the declared values, the removal cap, holds a plan that removes too much before anything is applied. ~1 min.just smoke rules-over-valuespasscaught

Last run at 3304d9a on 2026-09-14, against forgejo-warden 86dc6406.

What the consumer is running

The site presents forgejo-warden as the demonstration that this specification is usable by a platform that is neither this repository nor chant, and a demonstration is worth what it actually runs. Warden pins its own evaluator, so the version it demonstrates is that repository’s lockfile rather than this one’s. Nothing here read it until #192, and it had drifted six minors behind unnoticed.

No weekly run has recorded the consumer's declared version yet. scripts/consumer-skew.mjs reads it from the evaluator the consumer itself installed, and the demo workflow commits the result.

Read rather than gated. Which version a consumer pins is that repository’s decision, and no gate here can see its lockfile between runs. Nothing had to be added to warden for this: spec/README.md already asks an implementation to declare the version it implements, and the evaluator warden installs already carries the declaration. What was missing was something on this side that looked.

paper/measurements.md is the full statement of each measurement and the history of what changed. The chant-side measurements (the fold differential, the execution-boundary profile) live in chant’s repository and are cited there.