DEV Community

Cover image for How an AI agent receipt gets verified: the digest check, step by step
rambo
rambo

Posted on Edited on

How an AI agent receipt gets verified: the digest check, step by step

People ask how an AI agent receipt is verified, usually right after an agent has sworn a job is done and the output says otherwise. Here is the whole check, in plain steps, with a real receipt you can open and recheck yourself while you read.

The short answer: a verifiable receipt is verified by recomputing the SHA-256 digest of the exact saved result and comparing it with the digest the receipt recorded at the moment the work ran. If the two digests match, the saved result was not changed after the fact. If they differ, the record was altered, and the check says so. Nothing about the check requires trusting the agent, the platform, or this article.

Step 1: open the receipt

Every call run through Zambo leaves a receipt at a public link, zambo.dev/run/ followed by the receipt id. The receipt shows the tool that ran, the inputs, the saved result, and the time. No account is needed to open one.

Use this real one as the worked example for the rest of the article: receipt a233dfc7-ac28-4d4c-87e9-2b7d0499a775, a live_price call saved on October 23, 2026. Its saved result was a BTC price: $81,652.00 USD, down 0.10% over 24 hours, market cap $1,641.43B, with a live timestamp. Open it here: https://zambo.dev/run/a233dfc7-ac28-4d4c-87e9-2b7d0499a775

Step 2: recompute the digest of the saved result

The receipt does not ask you to trust the result text. It records the result as exact bytes, called the canonical bytes, and records a digest of those bytes: sha256:07688fec8f514088482b5265b910db1c4329d03674af5591d35fda9fa03bb778 for the example above.

Verification recomputes the digest from the saved bytes, using the same public rules the receipt was written under. This is the step anyone can run: the verifier at https://zambo.dev/verify/ does it in the browser, and the standalone verifier packages (aer1-verify on PyPI, aer-1 on npm) do it locally, without calling Zambo at all.

Step 3: compare

Two outcomes are possible, and the format names them plainly:

  • Verified. The recomputed digest matches the recorded digest. The saved result is the result the execution layer wrote at run time.
  • Verification failed. The digests differ. Something in the saved record changed after the fact: a value edited, a field swapped, a timestamp moved. The check does not guess what changed or why. It reports that the record in front of you is not the record that was saved.

Try the failure case mentally on the worked example: change the price in the saved result from $81,652.00 to $81,652.01 and the recomputed digest is a completely different string. One cent of editing is enough to fail the check, which is the point.

Step 4: walk the record around the receipt

A single receipt sits inside two larger structures, and verification covers both.

First, the sequence. Receipts for one job are written in order, and each step can be checked on its own, so a job with forty calls has forty checkable records rather than one summary written afterward.

Second, the anchor. A receipt can point at an external record of itself. The outcome vocabulary for that pointer is fixed: verified, verification failed, rejected: unresolvable record, not checked, or absent. An unevaluated anchor is reported as not checked or absent, never dressed up as verified.

There is one more receipt type worth knowing: the refusal. A call the endpoint rejects, wrong arguments or a spend limit reached, still leaves a receipt recording the refusal and its reason. A gap in the record is therefore visible as a gap. Silence is not an outcome the format allows.

Why the check cannot quietly drift

The rules for the check are published as an open format, AER-1, IETF Internet-Draft draft-zambo-aer1-26. Revisions closed at 26, so the target a verifier is built against does not move. The conformance corpus is public at https://zambo.dev/aer1/corpus.json: 126 vectors and 129 checks, kit v1.5.7, and any verifier can be run against it to prove it applies the rules the same way.

Independence is not a slogan here. One verifier was written from the draft text alone, without reading the reference code, and agreed with the kit on 119 of 119 checks across the base vector files. Two pieces of software that share no code agreeing on every check is what makes the verification worth more than the platform's own say-so.

The scale this runs at

As of November 1, 2026, Zambo has issued 92,515 public receipts, 2,442 of them today, across 80,599 tool calls. Every one of them is checkable by the four steps above, by a stranger, for free. Verification is not a premium feature bolted onto the record. It is the record's whole design.

What verification does not prove

A verified receipt proves the saved result was not changed since it was saved. It never proves the result was right. A price can be verified and still be a bad price. A report can be verified and still be a weak report. The judgment stays with whoever reads the work. What the receipt removes is the argument about whether the record itself was rewritten after the fact, and it removes it mechanically, in about the time it takes to open a link.


Try it free: add Zambo to your AI in one step at zambo.dev/add. 20 calls plus 1 wrap-up free every day, no card and no signup wall. Picking up in another AI is always free.

Top comments (0)