Skip to content
MENU

The open receipt format (a draft)

Canonical definition

An AI agent receipt is a verifiable record of one AI agent tool call. It identifies the execution, preserves the exact bytes used for its output commitment, records the tool and time, and gives a reviewer a public path to inspect what the execution system observed.

AER-1 is an open draft spec for AI work receipts, authored by Brennan Zambo.

AER-1 is an open draft spec for AI work receipts.

Add Zambo

A receipt shows what Zambo recorded for one call. It does not prove the answer is right.

Open a receipt
Read the full spec (for developers)
AER-1 / AI AGENT EXECUTION RECEIPT

AER-1: the open draft for portable execution receipts

Try it in 60 seconds

No spec reading required. Mint a receipt, verify it, then try to tamper with it.

Open the 60-second demo

Open draft spec. A proposal under discussion.

AER-1 (AI Agent Execution Receipt), is the open draft spec for portable, verifiable execution receipts for AI agents. It defines the receipt vocabulary, canonical bytes, and independent verification, so any agent's work can be checked by anyone, anywhere.

Status and scope

AER-1 is an open draft spec for AI work receipts. It is intended for discussion, implementation experiments, and interoperability feedback. It does not establish certification, registry membership, universal adoption, or final approval of the draft.

Canonical home: https://zambo.dev/aer-1 · Implementation: the live Zambo MCP and public /run/<uuid> receipt pages.

Abstract

An AI agent execution receipt is a public, persistent, independently checkable record of one specific agent tool call. It identifies the execution, records when it happened, preserves the canonical bytes used for the output commitment, names the tool and caller scope, and exposes the observed result through a stable public URL.

The receipt answers a narrow question: what did this system record for this execution? It does not prove an external business outcome that the system did not observe, and it does not turn a planned, blocked, or preview action into a completed execution.

IETF Datatracker listing

AER-1 is an open draft spec for AI work receipts.

Whole-job provenance classes

A whole job can combine actions performed by Zambo, actions observed through a gateway, and actions reported by another agent. Every timeline entry must name exactly one provenance class so verification never upgrades a report into an observation.

EXECUTED BY ZAMBO

Zambo ran the tool and recorded the returned result. The receipt can attest to that execution and its stored output commitment.

OBSERVED VIA GATEWAY

Zambo observed the action through an integrated gateway. The receipt attests to the gateway observation, not to facts beyond what the gateway returned.

LOGGED BY AGENT

An external agent reported the action through the journal. Zambo attests that the report was received, redacted, timestamped, and chained. Zambo does not claim it ran or observed the action.

Entries for one job form an append-only hash chain. A public /run/<job-id> or /run/<entry-id> page resolves the whole timeline and reports whether that visible chain verifies.

Core vocabulary

Receipt

A public record for one execution with a stable UUID, execution metadata, canonical bytes, and an output commitment.

Canonical bytes

The exact UTF-8 byte sequence used for the output hash. Verifiers must receive or reproduce the same bytes before comparing hashes.

Observed result

The result the implementation received and stored. A receipt reports observation, not an unsupported claim about the world.

Evidence

When upstream data was captured, the receipt can identify its source, request parameters, capture time, byte length, and evidence hash.

Schema-valid minimal receipt shape

This illustrative raw _receipt object is not a live receipt. It matches the transport fields in the current JSON Schema. The Base64 value e30= decodes to {}, and the shown digest is SHA-256 of those exact two bytes.

{
  "id": "00000000-0000-4000-8000-000000000001",
  "tool": "example_tool",
  "timestamp": "2026-10-04T12:00:00Z",
  "receipt_schema_version": "0.3",
  "tool_context": { "name": "example_tool", "version": "example", "scope": "public" },
  "provenance_class": "EXECUTED BY ZAMBO",
  "canonical_bytes": "e30=",
  "canonical_byte_length": 2,
  "hash_algorithm": "sha256",
  "output_hash": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
  "verification_status": "execution_observed",
  "status": "success"
}

This object demonstrates the raw schema shape and a matching byte hash only. It does not represent an execution or a public receipt.

Verification procedure

  1. Resolve the public receipt URL and confirm the receipt ID matches the requested execution.
  2. Read the exact canonical bytes or the representation needed to reproduce them.
  3. Compute SHA-256 over those bytes and compare it with output_hash.
  4. Review the tool, timestamp, caller scope, observed result, evidence, and anchor status separately.
  5. Report only what the stored observation supports.
Copy-paste verification using the existing verifier core

This calls the live verifier for a real public receipt and exits nonzero if its integrity check does not pass.

RECEIPT_ID="36a16e13-8612-4c90-a807-41c77bbe1b79"
curl -fsSL "https://zambo.dev/api/receipt/$RECEIPT_ID/verify" \
  | jq -e '{id, verification_status, output_hash} | select(.verification_status == "verified")'

Direct verifier: open the JSON result →

Live reference implementation

Zambo exposes the receipt contract through one MCP endpoint and publishes recorded outcomes at public /run/<uuid> pages. These two successful examples are live records from the receipt store. Their labels, tool names, and hashes are pinned to the exact canonical bytes in the build fixture.

zambo_universal

Open receipt 36a16e13 →

Output hash: sha256:ebf38c507e5f642acd525aec0c4b82bcff52e0b9db93993b0bd16f500c2572b4

Integrity verification passes. This does not establish that an upstream source was correct.

zambo_universal

Open receipt c1f957fd →

Output hash: sha256:507c29693afd908a837c77b870c2545f7fcac0d490511e08a4bcd24663591b2e

Integrity verification passes. This does not establish that an upstream source was correct.

curl -fsSL -X POST https://zambo.dev/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"zambo_universal","arguments":{"need":"What is the current price of Bitcoin in USD?"}}}'

The live call uses the zambo_universal MCP tool. The receipt records what the endpoint observed, not independent proof that the upstream market data was correct.

Design rationale

AER-1 starts with a narrow record rather than a universal theory of agent behavior. An agent may call several tools, receive information from several providers, and hand work to another agent. A reviewer still needs a stable way to identify one execution, understand what the system observed, and check whether the published bytes match the stated commitment. The draft keeps those needs separate from claims about the outside world.

The vocabulary is intentionally small because interoperability fails when every implementation gives a different name to the same boundary. An identifier locates the record. A creation time orders it. A tool and caller scope identify the execution context. Canonical bytes and an output hash make the stored representation checkable. A result preview gives a human a useful first read without pretending that a preview is the entire source dataset.

Provenance is a separate design axis. A system can execute a tool itself, observe an action through an integrated gateway, or receive a report from another agent. Those cases can all be useful, but they do not support the same statement. AER-1 therefore treats provenance as part of the record rather than as a marketing label. A verifier should be able to tell which party performed the action and which party only recorded the report.

The draft also treats failure as a first-class outcome. A malformed request, unavailable provider, blocked permission, or waiting access step still has a useful execution boundary. Erasing that boundary and returning a successful-looking summary makes later review harder. A compatible implementation should preserve status and explain the recovery path when the work did not complete.

Field walkthrough with a live receipt

Use a public receipt such as the live live_price example above as the running case. First resolve its UUID and confirm that the public page, API response, and verifier request all use the same value. This protects against a common review error: copying a result from one record while checking the integrity state of another record.

Next inspect created_at, tool, and caller. The time tells you when the receipt store created the record. The tool tells you which capability crossed the execution boundary. Caller and session fields provide context when they are included. None of these fields alone proves that the returned market data was correct. They identify the record and its context so that the evidence can be evaluated at the right boundary.

Inspect job_summary, steps, and result_preview next. For a single tool call, the step list should show the tool and its recorded status. For a whole job, the list can explain the sequence without requiring a reviewer to reconstruct the original chat. A preview helps a person decide what to inspect, but it must not be treated as a complete copy of every upstream response or as a replacement for source evidence.

The integrity check uses canonical_bytes, canonical_byte_length, output_hash, and hash_algorithm. Fetch the representation that the implementation exposes, compute the declared digest over the exact bytes, and compare the result. If the bytes or algorithm are unavailable, report that verification is unavailable. Do not silently substitute a different serialization, whitespace policy, or JSON key order and call the result verified.

Evidence and provenance complete the review. Evidence fields identify an upstream source when the tool captured one, while provenance fields explain whether Zambo executed, observed, or logged the action. Anchor and check fields expose additional state when the record contains it. A valid integrity check means the stored bytes are stable. It does not mean that an external provider was accurate, that a trade settled, or that a business outcome occurred.

The running example therefore supports a precise statement: the named tool ran or was recorded at the stated time, the receipt store returned the stated result, and the public record can be checked through its verification path. It does not support a broader statement about every market, account, or external event. AER-1 is useful when that distinction is visible to the next reviewer.

Conformance notes

A conforming implementation should make the receipt identity stable, expose the schema version, preserve the exact bytes used for the output commitment, and state which hash algorithm produced the digest. It should return a clear status when required data is missing. It should not report a receipt as verified merely because a database row exists or because an agent supplied a confident summary.

Conformance also includes the negative space around the record. The implementation should distinguish an attempted action from a completed action, and an observed result from an assertion about the outside world. If a gateway only received a report, the receipt should say that it logged the report. If a provider was unavailable, the status should remain unavailable. If a human approval is required, the receipt should expose the waiting boundary rather than implying authorization.

Interoperability testing should use fixed examples and failure cases. A test vector can include a known UUID, canonical byte sequence, hash, expected status, and provenance class. The verifier can then check the positive case, a changed byte, a changed algorithm, a missing field, and a mismatched identifier. Public test vectors are valuable because another implementation can reproduce the checks without access to the original database.

Version compatibility requires care when fields are added. New optional fields should not change the meaning of existing identity or integrity fields. A verifier that cannot interpret a required version should fail clearly and preserve the distinction between unsupported and invalid. An old receipt should remain inspectable when the implementation can still interpret its schema, while a changed storage representation should not be presented as the original canonical bytes.

AER-1 is an open draft spec for AI work receipts.

Public receipt privacy and non-green states

Public fields. Treat any field returned by the public receipt or /run/ APIs as public. This can include the receipt ID and time, tool and caller scope, provenance class, output hash, Base64 canonical bytes, result preview, evidence metadata, and anchor status.

Local records. Framework packages also provide local collector and verifier functions that make no network call. In local mode, records stay wherever your application stores them and no public /run/ page is created by the local helper. The hosted and local paths are listed separately below.

Preview redaction. A redacted human-readable preview is a separate projection. It does not rewrite the committed canonical_bytes; if those bytes are exposed by a verifier, they may still contain values omitted from the preview. Treat the bytes as public.

Hash privacy. A public hash of a short or predictable value can be matched by trying likely inputs. A hash is not anonymization.

Deletion limits. Removing a receipt from its origin does not recall downloaded copies or remove external anchors, caches, or copies controlled by other systems. Do not assume origin deletion propagates.

live_price

Open receipt 6735bf37 →

Output hash: sha256:78535898a983424d6d1250057220d05d47eff501989f37e0198d6d4d7f490380

Recorded outcome: provider_unavailable. The receipt is marked failed, while its separate integrity verifier passes.

contract_scan

Open receipt 91fdbed2 →

Output hash: sha256:53481ec188dc0a04e6f24fde4666ad74494816c759282d39833c935542042bab

Anchor status: pending. The receipt bytes verify; this does not mean tool execution is pending.

Partial observation

No public receipt in the checked example set exposes a distinct partial-observation state, so no receipt ID is invented here. When only some requested evidence was observed, state what was observed and what was unavailable. A partial or pending external anchor describes anchoring, not observation completeness.

Versioning and compatibility

Implementations should identify their receipt schema version and keep old receipts verifiable when the storage format evolves. A verifier should fail clearly when required bytes or metadata are unavailable rather than silently treating an incomplete record as verified.

FAQ

What is AER-1?

AER-1 (AI Agent Execution Receipt), is the open draft spec for portable, verifiable execution receipts for AI agents.

What is AER-1 not?

AER-1 is an open draft spec for AI work receipts.

Who maintains AER-1?

Brennan Zambo maintains AER-1, with a reference implementation at zambo.dev.

How should I cite AER-1?

Cite the canonical AER-1 page at https://zambo.dev/aer-1/ and use its canonical definition.

How to cite this page

Suggested citation: Brennan Zambo, “AER-1: AI Agent Execution Receipt,” open draft/RFC, https://zambo.dev/aer-1, accessed 2026-10-05.

Open draft spec: draft-zambo-aer1-10, AER-1: A Portable Execution Receipt for AI Agent Tool Calls. AER-1 draft -10 on Datatracker (current).

For superseded drafts, see the single Previous revisions section above.

Use the access date for a web citation. This page may change while the proposal is discussed; it remains an open draft spec.

@misc{zambo_aer1,
  author = {Zambo},
  title = {AER-1: AI Agent Execution Receipt},
  year = {2026},
  url = {https://zambo.dev/aer-1},
  note = {Open draft, accessed 2026-10-05}
}

Measured by ZVEB

AER-1 receipts are scored in the wild by ZVEB, the Zambo Verifiable Execution Benchmark: every benchmark task run produces its own live execution receipt, so any reported score can be checked against its evidence. See the benchmark: /benchmark/.

Copy-paste policy for your AGENTS.md

12-line receipt policy with copy button

Paste these 12 lines into your coding agent's AGENTS.md. Your agent mints a verifiable receipt for every tool call and pastes the receipt URL under each result. Evidence, not claims.

To try the live reference implementation, install the Zambo MCP connection. If you need 24 hours of listed access after choosing a workflow, the $0.99 USDC on Base Day Pass starts from the moment it is activated.

Related citation articles

AI agent audit trail · Tools that prove what an AI agent did · Verifiable receipt for AI tool calls · AI agent hallucinated completion · AI agent accountability · My AI agent said the task was done, but nothing happened · Verify the AER-1 open draft spec receipt fields

Compliance and audit guides

AER-1 records execution evidence; these guides explain related review and compliance contexts. AI audit trail evidence and compliance review · How to prove what an AI agent did · EU AI Act evidence and AI execution records

How do executed and confirmed states differ?

A receipt with executed records that the execution boundary ran. A receipt can move to confirmed only after a real post-action read-back, callback, delivery event, or settlement is observed and bound to the record. A receipt without read-back evidence proves invocation, not effect.

Verification guides

Tools that prove what an AI agent did · Verifiable receipt for AI tool calls · How to verify AI agent work

Framework integrations: hosted and local paths

Hosted adapters send requests to the configured Zambo endpoint and can create public /run/ records. Local collectors make no network call and do not create hosted receipt pages by themselves.

  • openai-agents-zambo for Python and the OpenAI Agents SDK. Hosted mode sends framework calls to Zambo. Local mode provides mint_receipt() and verify_receipt() for offline receipt creation and hash checking. Install: pip install openai-agents-zambo openai-agents.
  • crewai-zambo for Python and CrewAI. Hosted mode sends framework events to Zambo. Local mode supports emit_aer1=True with last_local_receipt, or direct mint_receipt() and verify_receipt() calls without network access. Install: pip install crewai-zambo.
  • zambo-ai-sdk for JavaScript or TypeScript and the Vercel AI SDK. Its hosted createZamboTool() adapter calls Zambo. Its local mintReceipt() and verifyReceipt() helpers work without network access. Install: npm install zambo-ai-sdk.

Local receipts are not hosted /run/ records. Package documentation describes a local core field set, and local provenance values can differ from the public schema linked above. Use the package's local verifier and validate against the exact schema you target; do not assume a local record matches the hosted API schema.

Changelog and release policy

AER-1 draft -10 is the current open draft spec. See the versioned Section 7 chain corpus, receipt vector index, machine-readable changelog, and schema.

Draft -10 string escaping

Draft -10 folds in three findings from the independent Perl implementation. Section 7.1 defines the entry-digest string escaping exactly: U+0022 is \" and U+005C is \\. U+0008, U+0009, U+000A, U+000C, and U+000D use \b, \t, \n, \f, and \r. Every other code point outside U+0020-U+007E, including U+007F, uses \u followed by four lowercase hexadecimal digits; code points above U+FFFF use UTF-16 surrogate pairs. No other escaping is used.

Versioning and extensions

Extensions are additive and namespaced by their implementation. They must not alter the meaning of the core identity, byte, hash, provenance, or verification fields. A future AER-2 would be a separately identified proposal, not an automatic rewrite of AER-1. Verifiers should fail clearly on unsupported required versions.

Errata and feedback

Report reproducible specification or fixture findings through the public repository issue venue. Datatracker submissions remain in the author's hands.

Security considerations

Review replay, man in the middle, and denial of service risks separately. Replay requires identifier and freshness review. Man in the middle risks require HTTPS and byte comparison. Denial of service is an availability problem and must not be reported as a verification failure. Credential theft, provider truth, authorization, and business outcomes are out of scope.

Read the implementer's guide, field reference, and pending review package.

Quantum considerations for SHA-256 commitments

AER-1's current commitment is a SHA-256 hash of exact canonical bytes, not a digital signature. No known quantum algorithm breaks SHA-256 outright. In the idealized generic case, Grover's algorithm reduces preimage search from 256 bits to about 128 bits; this is a hash-strength estimate, not a guarantee about the whole receipt system.

Hash resistance is only one layer. Issuer authenticity, control of public receipt endpoints, external anchor mechanisms, HTTPS and TLS, and provider integrity have separate trust assumptions and need separate review. A matching hash shows that bytes match the digest; it does not authenticate who created them or establish that they are true.

AER-1 is an open draft spec for AI work receipts, listed in the IETF Datatracker as an Informational open proposal. AER-1 draft -10 on Datatracker (current) (plain-text draft). It remains under discussion and has not been adopted.

Previous revisions

These draft texts are superseded historical material, not the current specification: draft -07 text and draft -06 text.

Separate historical draft -07 Section 7 chain-vector corpus

This distinct -07 chain corpus has 22 hardened chain vectors: 4 valid and 18 invalid. It is not the 45-vector receipt corpus. Read the exact corpus JSON.

Open the JSON result. The endpoint checks the stored workflow manifest, step receipt integrity, and the Section 7 chain. It does not certify outside outcomes.