This is the software package. Looking for Axiom's own receipts? axiom.org/receipts
Verifiable custody of agent-produced records
Agents produce records faster than any human can witness them — encoded law, signed rule corpora, release histories. The receipt package writes receipts for those records, and receipt verify is what happens when someone asks to see them: a clone, commodity tools, one offline, fail-closed verdict.
pip install receipt receipt verify --spec verification/spec.py --commit HEAD
on PyPI as receipt · source at github.com/TheAxiomFoundation/receipt · API reference · Working paper
Try to slip one past it
When an encoding is wrong, the discipline is to fix the pipeline and re-encode — never edit the published file by hand. The record shows which path a change took: pick one below and read the verdict. It is a verdict about the tree the named commit carries, never about whatever a working directory happens to hold.
The corpus exactly as its producer published it: two witnessed releases over three rule files.
the clone
rules/tax/rate.yaml value: 0.15tax/rate.test.yamlbenefit/amount.yaml.axiom/toolchain.toml attested, not contentreceipt/corpus-journal.jsonl append-only, witnessedrulespec/compile outcome: passimmutable-prefix.json sealed at genesisreleases/manifests/0000-a9f4956530a6b22c.json .producer.sig.alpha.tsr .beta.tsr0001-8e2318a7a183ff21.json .producer.sig.alpha.tsr .beta.tsrreleases/anchors/producer-ed25519.pubalpha-root.pembeta-root.pemthe auditor's own repo — out of the producer's reachspec.pyproducer SPKI 8595923745cbbef6…two RFC 3161 anchor roots, pinnedsha256 48722e00b717b1b6…
the verdict
$ receipt verify --spec /private/tmp/claude-501/-Users-maxghenis/582ab8c8-c5ec-4f48-8f2c-8cafa7906359/scratchpad/receipt-demo-061/demo/auditor/spec.py --root /private/tmp/claude-501/-Users-maxghenis/582ab8c8-c5ec-4f48-8f2c-8cafa7906359/scratchpad/receipt-demo-061/demo/pristine/corpus --commit HEADreceipt 0.6.1 — receipt test corpusroot /private/tmp/claude-501/-Users-maxghenis/582ab8c8-c5ec-4f48-8f2c-8cafa7906359/scratchpad/receipt-demo-061/demo/pristine/corpuscommit 324eaab3964f1a8d3aa20ea87d3b4037acade8a9 (tree 0b3400c8e44e864677d731088e0b8dc1bd65a484)names portableobjects not requestedspec /private/tmp/claude-501/-Users-maxghenis/582ab8c8-c5ec-4f48-8f2c-8cafa7906359/scratchpad/receipt-demo-061/demo/auditor/spec.pysha256 48722e00b717b1b6c3a384b836947df63a458c560e7601daff7eefaee8f3a2b2ESTABLISHED OFFLINE, FROM THIS CLONE ALONE[ok ] custody2 release(s), HEAD 0001-8e2318a7a183ff21.json; head 8e2318a7a183ff215d4cc68bdcb189992ce13eaa4f799128a6f1d013938e6c03; producer SPKI 8595923745cbbef6…; anchor set a3021009fb99d91430045c960871842f2b33aa4b99c9c786b38218f30551192a; witnesses alpha 2026-09-10T12:28:49Z · beta 2026-09-10T12:28:49Z[ok ] binding3 content file(s) and 1 attested file(s) match the witnessed journal exactly, closed-world[ok ] declaration3 gate declaration(s) well formed and complete against the loaded spec (1 public, 1 restricted, 1 ci-attested); none re-run hereDECLARED IN THE WITNESSED JOURNAL — NOT RE-RUN BY THIS COMMANDpublic: you can re-run these yourself from public inputs- rulespec/compilerestricted: reproducible only with restricted pinned inputs this command cannot obtain- oracle/licensed-parityci-attested: not reproducible; only the CI run's identity vouches- ci/repository-checksVERDICT: PASS — custody and corpus bindingThis proves the published rule files are exactly the bytes the loadedspec's producer key signed,and the 2 RFC 3161 authorities configured by that spec (alpha, beta)witnessed that each recorded prefix existed no later than those times.Custody is under the anchor set a3021009fb99d91430045c960871842f2b33aa4b99c9c786b38218f30551192a the verified tree carries.It does NOT prove the history was never rewritten — a producer holdingthe signing key can regenerate and re-witness a whole chain, and thisfirst-contact check would still pass; supply --base-ref against a headyou recorded earlier to bind against that. It doesNOT prove that any declared gate passed, it does NOT prove the encodingsare a correct reading of the law, it does NOT prove this clone holds theproducer's newest release, and it does NOT prove this is the only historythe producer maintains — a stale or equivocated but honestly witnessedclone may pass, and this verdict does NOT prove that files in any checkoutequal the verified tree.It does NOT establish that the spec's code was trusted.It does NOT establish that the anchor set is one the auditor trusts.Check freshness and uniqueness by comparing headdigests out of band.
exit 0 · receipt writes a refused verdict to stderr and a passing one to stdout; this one went to stdout
First contact: nothing but this clone and the auditor's own spec.
every verdict line is receipt 0.6.1's own output over the package's own signed corpus fixture · amber marks what this clone differs in, and every refusal · passes stop at the first failure
What it provides
receipt.release_chain
Append-only hash-chained manifests over record sets: enumerated genesis, content-addressed links, immutable-prefix verification.
receipt.canonical
ECMAScript-compatible canonical JSON: one byte stream per record, so producer and verifier hash and sign identical bytes.
receipt.append_gate
Append-only enforcement for governed record trees: a candidate state must extend committed history exactly, verified against trust anchors in the consumer's own code.
receipt.tsa
RFC 3161 dual-witness time verification against trust bundles committed in the consumer's repo, with explicit unavailable-witness outcomes.
receipt.sign
Ed25519 producer signatures verified against fingerprints pinned in the consumer's own committed code; N-of-M keyrings with legacy generations — retired keys verify immutable history only.
receipt.attest
Workflow-provenance verification with self-anchoring enforcement epochs and a full-history sweep over every protected-tree commit.
receipt.corpuscomposed, not extracted
Closed-world binding of a record tree to its witnessed journal: every content file present is bound, and every bound file is present.
receipt.verifycomposed, not extracted
The spanning command behind receipt verify: history, custody, binding and declaration over the tree one commit names, stopping at the first refusal.
receipt.ratchetpending extraction
Shrink-only exception registries recomputed from live state; an excused failure that starts passing is an error until removed.
receipt.chronologypending extraction
Record-vs-event ordering tiers: does witnessed time prove the record existed before the event it predicts or observes?
The design principle
Trust anchors live in the consumer's committed code, never in runtime configuration a producer could swap. The package ships machinery; consumers pin roots. Retiring or rotating a key is a reviewed change to the consumer's repository — not a setting.
Where it comes from
The machinery arrives by extraction from three production systems that each built it independently — a signed statute corpus, pre-registered forecast records, and an observation-ledger release chain — behind a byte-equivalence gate: the extracted verifier must reproduce the source verifier's verdict, pass and fail alike, on the live production chain before any system consumes the package. What receipt verify adds on top is composition, not a fourth extraction: it spans those modules and reports their verdicts, contributing no cryptography and no trust anchors of its own. The observation ledger runs on it in production today, with differential harnesses re-proving equivalence on every package change; adoption by the Axiom corpus is underway. We built it because we needed it. We publish it because everyone shipping agent-produced records will.
Axiom's own records carry them: axiom.org/receipts