Receipts are an open format.
A receipt is a signed, dated record of a skill's with-vs-without eval run — and nothing about it is proprietary. Any harness is encouraged to emit receipts; any tool can consume them. This page is the interop contract: the schema, the honesty rules, the import converters, and the lightweight summary interchange.
The schema
The machine-readable contract is the JSON Schema (draft 2020-12), served at its canonical $id:
https://driftproofhq.com/spec/receipt.schema.json — receipt spec v0.3.1 (interop-additive revision)
The human companion is spec/RECEIPT.md, and the full field-mapping guide for the import/export converters is interop.md. Validate any receipt with driftproof validate <file> or any draft-2020-12 validator. Prior schema versions (v0.1–v0.3) are frozen in the repo; a receipt validates against the schema its own schema_version names.
DECLARED vs TESTED — the distinction that keeps receipts honest
Every receipt names its verification_level, and the two levels that matter for interop are not interchangeable:
TESTED— an eval suite was executed and judged under the emitting harness's control, with the full evidence chain: skill + suite content hashes, a sha256 of every generation that was graded, and a sha256 of every judge sample a verdict rests on. The schema enforces this — a receipt claimingTESTEDwithout the evidence chain does not validate.DECLARED— someone asserts results they cannot bind to hashed evidence. This is exactly what an import is: Driftproof did not run, hash, or judge another tool's generations, so a converted receipt is that tool's declaration, recorded faithfully — surfaceexternal, sourceimported/<tool>, hashes omitted rather than fabricated.
The consequence is structural, not cosmetic: drift verdicts are computed only between TESTED receipts. driftproof diff reports NOT MEASURED when either side is below TESTED, and a DECLARED receipt's badge reads not measured — declared numbers are context, never band-verified evidence. There is no path from a declaration to a verdict except running the suite.
Importing from neighboring tools
Working converters ship in the CLI for two neighboring skill-eval tools:
driftproof import <results.json> --from agent-skills-eval
driftproof import <results.json> --from skillgrade
- agent-skills-eval — a test runner for agentskills.io-style skills (the same suite lineage Driftproof consumes). Its with/without-skill, per-assertion binary grading maps onto receipt cases with a real delta; single-grade cases are imported as single-sample (no bands, and the diff says so).
- skillgrade — "unit tests for your agent skills": N trials per task, weighted graders, a 0–1 reward. Trials are genuine repeated runs, so per-trial rewards map onto
samples[]honestly. skillgrade has no baseline mode, so the imported receipt carries an empty baseline and anullcomparison — never a fabricated zero-baseline delta.
The full field mappings — including what is assumed where the upstream tool documents semantics but not a frozen schema — are in the interop guide.
The lightweight interchange: summary-json
Most consumers don't want the whole evidence chain — they want the verdict. driftproof export <receipt.json> --to summary-json emits a minimal, stable, flat summary (driftproof/summary v1): skill, model + provider + surface, with/baseline bands, delta ± uncertainty, the effect-floor verdict (PASSED / NO_EFFECT / REGRESSED / NOT_MEASURED), verification level, source, the receipt hash it summarizes, and an optional report URL. Keys are frozen; additions bump format_version. The exact shape is in the interop guide and snapshot-tested in the repo's gate.
Emitting receipts from your own harness
If you run agent-skill evals, emitting receipts costs you a JSON serializer and buys your users a portable, self-verifying, dated record. Two honest paths:
- You ran a with/without suite yourself and can hash the generations and judge outputs → emit
TESTED, and the schema will hold you to the evidence chain. - You're converting or asserting results you can't hash → emit
DECLAREDwith surfaceexternaland omit the hashes — exactly whatdriftproof importdoes.
The receipt_hash is a self-hash over the canonical form (sorted keys, no insignificant whitespace) with the field itself removed — integrity, not yet authenticity; key signatures are the spec's stated next step. Questions, or want an emit-receipts PR for your tool? Open an issue — converters and PRs are offered, not demanded.
One format, two honest levels, and a hard wall between them: declarations are recorded, verdicts are earned by running the suite. That is the whole interop policy.