Mechanical verification

Mechanical verification: what it means and how to re-run it

Every formal claim on this site names the check that produced it, and every check can be re-run by anyone with a clone of the public repository. This page explains what mechanical evidence means here, walks through the evidence files for each of the five kernels that carry a formal claim, and lists the commands that re-run every check.

The standard

What counts as mechanical evidence

Evidence counts as mechanical when three things hold. The claim names the check that produced it, so there is never a verdict floating free of its instrument. The check reads artifacts committed in the public repository, so what it read can be re-read later, byte for byte. And the check is deterministic, so anyone who re-runs it gets the same verdict: pass, fail, or a specific finding.

Where a human judgment genuinely exists, chiefly whether a written specification faithfully reads the regulation it claims to implement, we do not paper over it with a signature. The spec is instead validated mechanically: it must reproduce the kernel's committed fixtures, and where a regulator publishes its own worked examples (the APR rules in Regulation Z Appendix J, for instance), the spec must reproduce those too. What remains judgment after that is stated on the claim itself. An unauditable signature from the same party that drafted the spec would add nothing a third party could distinguish from signing every spec automatically, so the evidence has to stand on its own.

Stacking independent mechanical evidence sources is standard practice where correctness claims have to survive auditors: conformance suites built from the rule-maker's own computed answers (the approach NIST's cryptographic validation program takes), differential testing against an independently built implementation, metamorphic identities that must hold across whole input families, and machine-checked proofs discharged by a small trusted checker. The checks below use all of these.

The claim ladder

The three claim tiers

Every formal claim about a kernel carries one of three tier statements, word for word, so the strength of the claim is never implied by vocabulary. These are the tiers; the kernels currently carrying each one are named on the formal-verification evidence guide, and no kernel outside that list carries a formal claim of any kind.

Tier 1 enumeration
Verified by exhaustive enumeration (all N inputs). The kernel's declared input space is finite and small enough to compute completely: every combination is run and checked against a mechanically validated specification, with zero failures. Nothing is sampled: the full run's record is the evidence.
Establishes the output matches the validated spec for every input in the declared space. The space is stated on the claim, and the count is part of the wording for a reason.
Tier 2 property testing
Property-tested over stated ranges. Properties that must hold for every input, identities, invariants, boundary behavior, are checked over stated ranges by a property floor that runs in CI on every kernel edit. A failure is tagged as a property failure or an oracle disagreement, and a property that can never fail is tracked in a public backlog rather than counted as coverage.
Establishes the properties held everywhere the ranges reached. It is evidence over the ranges rather than a proof over all inputs, and the ranges are part of the claim.
Tier 3 machine-checked proof
Machine-checked proof (Dafny). The algorithm is ported to Dafny and the Z3 solver discharges stated proof obligations against a specification written from the regulation text directly, never from the kernel's code. The port is then differentially tested against the shipped kernel, because the proof covers the port and the differential covers the gap between port and kernel.
Establishes the stated obligations hold for all inputs, under the proof's assumptions, which are published next to the claim: spec validation status, the port gap, and the pinned prover toolchain.
The claim records fv-status
Which tier a kernel carries is recorded machine-readably: a digest-named JSON in fv-status holds per-kernel tier, the scope and assumptions behind it, and a check of the record against the public errata feed, and per-kernel pilot records sit under chaingraph/fv-pilot. Four of the five pilot kernels carry their tier there; the fifth, art-335, has its tier stated on the evidence guide.
Establishes a single answer to what exactly has been verified, readable by a script instead of by trust. A kernel absent from these records is one that has not been assessed.
The evidence

Where each piece of evidence lives

Every layer of evidence behind these claims is a file (or a whole directory of files) committed to the public repository. These are the paths, and what each one carries.

Golden fixtures chaingraph/kernels/fixtures
One committed JSON per kernel: fixed inputs together with the exact output the kernel must produce for them. A gate replays every fixture on every change and fails the build if an output moves. Browse the fixtures ↗
Re-run node chaingraph/kernels/golden-parity.test.mjs
The property floor chaingraph/kernels/__proptests__
One property-test file per kernel, plus the shard manifests that staged them, over six hundred files. The runner executes each as its own process and aggregates verdicts; the floor's denominator is derived from git's index, so deleting the directory turns the floor red. Browse the property files ↗
Re-run node scripts/run-proptests.mjs (zero-dependency Node)
Compute-proof coverage gate
scripts/check-compute-proof-coverage.mjs is the gate behind the Groth16 receipts: it classifies every node's receipt, rejects malformed ones (including a valid seal over a failed run, caught structurally since August 2026), and holds coverage to a committed ratchet baseline that can only improve. Read the gate ↗
Re-run node scripts/check-compute-proof-coverage.mjs --summary
The full gate suite scripts/preflight.mjs
Every hard gate, run in CI order: JS syntax, hash parity, index sync, dead links, count drift, spec conformance, copy rules. This is the same suite CI runs on a pull request, so a change that passes locally passes there. Read the runner ↗
Re-run node scripts/preflight.mjs
Corrections errata.json
A public, dated errata feed, and a page that renders it. The claim records carry a trust check against this feed, so a claim whose basis has been corrected does not keep circulating as trusted. Read the errata
Establishes corrections travel with the claims they correct, instead of living in a changelog nobody connects.
The method docs
How the pipeline works end to end, with the same wording as the claims: the formal-verification evidence guide, a seven-panel process explainer, the public note on how the property floor is run and scored, and the methods overview that places all of it next to the other checking mechanisms.
Establishes the same claims are worded the same way on every public surface that makes them.
Step by step

The five evidenced kernels, file by file

Five kernels carry a formal claim, and the evidence guide states each claim's wording. This section walks through the evidence files behind each one: what to open, what the file actually contains, and the command that re-runs it. Links go to GitHub, and the same paths work in a local clone.

EMIR lifecycle event validator art-157 enumeration
Claim: verified by exhaustive enumeration (all 24 inputs).
  1. Open the floor file. The header states the class, the kernel digest at authoring time, and that the file imports the kernel's own compute() read-only with zero dependencies.
  2. Inside, the kernel's LEGAL table (3 prior states by 8 action types) is copied verbatim as a declared constant, and check P1 drives all 24 combinations through compute(), comparing action_legal and the allowed list against that table cell by cell.
  3. Open the fixtures file: named vectors, each carrying inputs (policy_parameters), the expected output_payload, and a golden_hash. The fixture oracle replays each vector before the properties run.
  4. The same shape appears in the pilot record, which states the claim tier and the kernel digest the claim was made against.
Re-run node chaingraph/kernels/__proptests__/art-157-emir-lifecycle-event-validator.proptest.mjs
Agentic readiness diagnostic art-27 enumeration
Claim: verified by exhaustive enumeration (all 531,441 inputs).
  1. Two files matter: the full enumeration sweep and the pilot record.
  2. The sweep's header explains its own history: the original 2026-08-09 pilot ran from a harness outside the repository, so the sweep was ported in-repo to be re-runnable by anyone. The .exhaustive.mjs suffix deliberately keeps this 312 sweep out of the property floor's trial-sampling glob.
  3. Inside: 12 questions with three answers each are looped over completely, 531,441 states, and an independent oracle (specExpected()) recomputes the grade from the raw answers in a deliberately different way from the kernel's own loop, so a bug shared by both implementations would still surface as a divergence. Fourteen boundary states are checked on top of the grid.
  4. The sweep is wired into preflight as its own step, so every push to main re-runs all 531,441 cases.
Re-run node chaingraph/kernels/__proptests__/art-27-agentic-readiness-diagnostic.exhaustive.mjs
DTI ratio calculator art-335 property testing
Claim: property-tested over stated ranges.
  1. Open the floor file; for this kernel the floor file is the evidence, and the checks are named for the property each one enforces.
  2. P1 is monotonicity: back_end_dti_pct never decreases as other monthly debts rise, with income held fixed. P2 is boundedness plus fixed-threshold tier agreement: the reported tier must match the band the ratio falls in. P3 is a metamorphic identity: scaling income and debts by the same factor leaves both percentages unchanged. P4 forces floating-point boundary inputs at the ULP level.
  3. Each property runs over the file's TRIALS constant of 10,000 randomized trials from a hand-rolled deterministic PRNG, and the fixture oracle replays the kernel's committed vectors from the fixtures file first.
Re-run node chaingraph/kernels/__proptests__/art-335-compute-dti-ratios.proptest.mjs
Reg Z Appendix J APR art-215 machine-checked proof
Claim: machine-checked proof (Dafny).
  1. Three places to look: the floor file, the pilot record, and the fv-status entry. The Dafny model is not vendored into the repository; its result, the pinned toolchain (Dafny 4.11.0, Z3 4.12.1 and 4.14.1), and the known divergence with its measured size are stated in the records.
  2. Inside the floor file: a fixture-oracle gate over the committed vectors (five of them, in the fixtures file), then P1 convergence-or-report, where every trial either converges or reports no rate and a silent guess is a failure, P2 termination, and P3 a differential: the kernel's converged rate must match a rate re-derived independently from the (b)(8) residual at the reported rate.
  3. The differential leg is where the real finding came from: the pilot's differential surfaced an odd-days compounding divergence (0.456 percentage points at 387.9% APR), the kernel was fixed, and the re-run differential now agrees to under 0.0001 percentage points across the APR range exercised.
Re-run node chaingraph/kernels/__proptests__/art-215-reg-z-appendix-j-apr.proptest.mjs
Payee name-match score art-376 hand proof + property testing
Claim: verified against the stated termination and recurrence-correctness properties, never machine-checked.
  1. Two files: the floor file and the pilot record. The record's class and label fields carry the verbatim tier wording, and its kernel_digest_at_authoring is recomputed live by the badge gate, which drops the badge if the kernel drifts.
  2. The formal claim is a hand proof of loop termination and of the Wagner-Fischer edit-distance recurrence; the pilot record states plainly that it never ran through a proof assistant.
  3. The floor file exercises the properties behind that proof: P1 termination, running the dynamic program over string lengths from 0 to 2,000; P2 boundedness, the score staying inside [0,100] over 3,000 trials; P3 symmetry, score(A,B) equaling score(B,A) under symmetric Levenshtein; and P4 forced categorical boundaries such as empty inputs.
  4. This kernel is the standing case of complementarity: its string-matching cost exceeds what in-guest zk proving can currently handle, so it carries a formal claim and no compute receipt, and both facts are stated on its records.
Re-run node chaingraph/kernels/__proptests__/art-376-score-payee-name-match.proptest.mjs
Re-run

Four commands from a fresh clone

The checks are plain Node with no package installation. Clone the repository and run any of them; each exits zero on pass and non-zero on any failure, which is the whole interface.

git clone https://github.com/PostOakLabs/ainumbers
cd ainumbers

node chaingraph/kernels/golden-parity.test.mjs        # replay every golden fixture
node scripts/run-proptests.mjs                        # run the property floor, every kernel
node scripts/check-compute-proof-coverage.mjs --summary   # compute-proof coverage vs its ratchet
node scripts/preflight.mjs                            # the full gate suite CI runs

The last one drives the complete pipeline and touches more surface than the three above it; the three targeted checks are the fastest way to see the evidence machinery move. Results are deterministic, so your run should match CI's verdict for the same commit.

Relation to the receipts

How this relates to the Groth16 receipts

Mechanical verification is about the logic: does the kernel compute what its validated specification says, for the inputs the claim covers. The Groth16 receipts are about the execution: was this published output actually produced by running this program. A kernel can carry either, both, or neither, and the coverage gate knows which. Neither kind of evidence substitutes for the other, and the payee-matching kernel above is the standing example: it carries a formal claim and no compute proof, and both facts are stated on its records. This evidence does not answer whether the regulation means what its worked examples show, a question neither a machine nor a signature has ever answered, and it stays inside the input spaces and ranges named in each claim. Whether a tool is right for your situation is a different question; see Terms & Reliance for the full disclaimer.

Sources: on oracle-aware evidence stacking, Chen, Kuo, Liu, and Zhou, Metamorphic Testing: A Review of Challenges and Opportunities, ACM Computing Surveys, 2018. On small trusted checkers, Klein et al., seL4: formal verification of an OS kernel, SOSP 2009, project documentation at sel4.systems. Dafny: Leino, Dafny: an automatic program verifier for functional correctness, 2010, tool and documentation at dafny.org. NIST cryptographic validation program, csrc.nist.gov, accessed September 2026. All statements on this page are as of September 2026.