Direct answer
How to Implement AER-1 in Your Agent
Implementing AER-1 means four things, in order: emit a receipt with the core fields for each agent tool call, publish the canonical bytes its output hash commits to, run the open conformance kit until your verdicts match the corpus, and report your implementation so others can check against it. The draft is the specification, the kit is the test, and both are open: no permission, account, or keys are needed at any step.
Updated October 20, 2026.
Step 1: Emit the core fields for each tool call
Wrap the execution layer where tool calls actually run, not the model's narration of them. For each call, capture the core fields the draft defines: a receipt id as the record's locator, the tool that ran, an inputs reference, the saved result, and timestamps. One receipt records one tool call. Emit at the moment the call runs, from what the system observed, so the record covers the work itself and not a summary written afterwards. The field by field explanation is on the AER-1 receipt JSON schema page.
Step 2: Publish canonical bytes and the output hash
Reduce each record to the canonical bytes the draft specifies: one exact byte form for the record, so harmless JSON variation cannot change the commitment. Compute the output hash over those bytes and commit it in the receipt. Then publish the receipt in a form checkers can actually work with: the record, its canonical bytes or an exact way to rebuild them, and the hash, together. A receipt nobody can recompute is a claim, not a receipt. Remember the draft -21 rule while you wire ids: the receipt id sits outside the committed payload and binds only via an externally supplied expected id or Section 9 resolution with digest comparison, so report an unbound id as unverified.
Step 3: Run the open conformance kit
git clone https://gitlab.com/rambozambodotdev/zambo.git
python3 aer-1/conformance.py
The kit ships runners in 7 languages, so start from the runner closest to your stack, including the Python runner above and the Node runner for TypeScript and JavaScript builds. At draft -24 the corpus is 119 test vectors exercised as 122 checks: valid receipts that must verify, altered receipts that must fail for the stated reason, id-binding outcomes, and anchor outcomes including the 6 vectors in anchor-vectors.json. Run the corpus against your verifier and your emitter's real output. Conformance is agreement on every check, and a failing check names the rule to re-read. The full walkthrough is on the conformance test page.
Step 4: Anchors, when you add them
Anchors are optional. Add an external anchor, such as a SCITT registration or an RFC 3161 timestamp, both permitted since draft -18, only when you actually create the external registration or timestamp. Report every anchor with its Section 6 outcome under draft -24: verified, verification failed, or rejected: unresolvable record when evaluated; not checked when not evaluated; and absent when a receipt carries no anchor. Never report an evaluated outcome for an unevaluated anchor.
Step 5: Report your implementation
When the corpus passes, report the implementation: what it is, which draft revision it targets, which runners it was checked against, and its results as recorded. Reported implementations and their conformance results are collected on the AER-1 implementation report page, which names the independent Node.js implementation built from the draft text alone, a Java verifier, a Perl verifier at 68 of 68 checks, and a public production validator, each in its recorded role. Reporting honestly includes the edges: list parity checks as parity checks and partial coverage as partial. The draft's own history rewards that honesty: findings filed by implementers shipped in drafts -20, -21, and -23, with credit in Section 18.
Cite this draft
Cite AER-1 as the IETF Internet-Draft draft-zambo-aer1, current revision -24, posted October 20, 2026 and expiring April 23, 2027, at datatracker.ietf.org/doc/draft-zambo-aer1.
@misc{zambo-aer1,
author = {Brennan Zambo},
title = {AER-1: Agent Execution Receipt, version 1},
howpublished = {IETF Internet-Draft draft-zambo-aer1-24},
year = {2026},
url = {https://datatracker.ietf.org/doc/draft-zambo-aer1/}
}Honest limits
AER-1 is an IETF Internet-Draft, current revision -24, not a finalized standard, so an implementation conforms to a revision, not to a finished specification: name the revision you target. Conformance also has a ceiling: passing the kit proves your code reads, rebuilds, and checks receipts the way the draft specifies. It does not prove the work your agent records was done well. A receipt proves the saved result was not changed after the fact, never that the work was correct, and an implementation that reports more than that is misreporting, however good its code is.
Frequently asked questions
How do I implement AER-1 in my agent?
Four steps. Emit a receipt with the core fields for each tool call, captured in the execution layer as the call runs. Publish the canonical bytes and the output hash the receipt commits to. Run the open conformance kit, runners in 7 languages, until your verdicts match the corpus: 119 vectors and 122 checks at draft -24. Then report your implementation and its results as recorded.
What do I need to start implementing AER-1?
The draft and the kit, both open. The draft is draft-zambo-aer1, current revision -24, at datatracker.ietf.org/doc/draft-zambo-aer1/. The kit is at gitlab.com/rambozambodotdev/zambo, folder aer-1, with the schema, test vectors, and runners. No permission, account, or keys are needed to read, implement, or test.
How do I know my AER-1 implementation conforms?
Run the conformance corpus against it and compare verdicts check by check: valid receipts must verify, altered receipts must fail for the stated reason, id-binding outcomes must match the draft -21 rule, and anchor outcomes must use the draft -24 Section 6 vocabulary. Agreement on all 122 checks at draft -24 is conformance to that revision.
How do I report my AER-1 implementation?
Report what it is, which draft revision it targets, which runners it was checked against, and its results as recorded, including the edges: parity checks listed as parity checks and partial coverage as partial. Reported implementations and conformance results are collected on the AER-1 implementation report page on this hub.
What does implementing AER-1 let me claim?
That your receipts can be checked by anyone: the saved result recomputes to the output hash committed over its canonical bytes, so a changed result is detected. It never lets you claim the work itself was correct. A receipt proves the saved result was not changed after the fact, and an honest implementation claims exactly that and no more.