Driftproof

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:

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

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:

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.