Failure patterns: what breaks, what the verifier says, and how to fix it.

Failures are only useful when they are named precisely. This index groups the failure patterns for AER-1 verification and Zambo calls by the verifier outcome taxonomy: wrong digest, missing field, expired time window, bad chain link, and unknown version. Every class below is built only on first-hand evidence fetched from zambo.dev on 2026-10-24: vectors from the published conformance corpus, the live x402 payment challenge, and a live receipt verify record. Where a pattern has no first-hand evidence, it is described here and gets no page of its own.

Evidence on this page was fetched first-hand from zambo.dev on 2026-10-24. Part of the failure patterns index.

The outcome vocabulary these classes report in

AER-1 Section 6 gives checks a fixed vocabulary, so an unevaluated check is never reported as an evaluated one:

  • verified: the check was evaluated and passed.
  • verification failed: the check was evaluated and did not pass.
  • rejected: unresolvable record: the record could not be resolved into what the check needs, so there was nothing complete to evaluate.
  • not checked: the check exists but was not evaluated. The only honest report for an unevaluated check.
  • absent: the thing a check would evaluate is not on the record at all, for example a receipt with no anchor.

The five classes

1. Wrong digest

Outcome: verification failed. The recomputed SHA-256 does not match the hash the receipt carries. Evidence: the corpus vectors hash-mismatch.json ("output_hash does not match sha256(canonical_bytes)") and input-hash-mismatch.json, plus commit-digest-mismatch in the commitment set. Read the wrong digest page.

2. Missing field

Outcome: rejected: unresolvable record. A required member is absent, so the record cannot be reconstructed and the verifier must fail closed. Evidence: missing-output-hash.json ("missing required member: output_hash"), missing-inputs.json, and a workflow vector rejected because the missing output_hash means a leaf cannot be formed. Read the missing field page.

3. Expired time window

Outcome: the server refuses the payment and orders a fresh challenge. An x402 authorization presented after validBefore, or past the challenge's 900 second maxTimeoutSeconds, is refused and nothing activates. Evidence: the live challenge fetched from zambo.dev/api/x402/day-pass on 2026-10-24 and its verbatim retry policy. Read the expired time window page.

4. Bad chain link

Outcome: verification failed. An entry's prev_digest does not match the digest of the previous entry's bytes. Evidence: chain-vectors.json (chain-tampered-middle, expected failure "link broken") and the 28 vector v07 chain file. The same page records an honest limit: hosted receipt verification reports the chain as not checked. Read the bad chain link page.

5. Unknown or wrong version

Outcome: rejected under the declared rule, or not checked when the version is not implemented. A record relabeled, or a workflow close evaluated under the other merkle_version rule, must be rejected. Evidence: the two cross-version must-fail workflow vectors, version-downgrade.json, and anchored-bad-id-version.json. Read the version page.

Documented, with no standalone page: the quota wall and the other x402 refusals

The quota wall is a limit, not a verification outcome

Zambo's free tier is 20 free calls per day, then they upgrade. That is documented behavior, and it is visible on a real record: the live verify record for receipt ad57d3ca-2561-4aaa-b51e-dd6367888eac carries the fields free_limit 20, free_used 0, and free_remaining 20. When the day's free calls are used, the documented next step is a pass: the Day Pass is $0.99 for 24 hours, and the Zambo Pass options are on the day-pass page at zambo.dev/day-pass. No quota-error receipt is exhibited in this page set, so the quota wall is documented in this section, from Zambo's own pages and that live record, and gets no page that pretends to evidence it does not have.

The other documented x402 refusal reasons

The hub's x402 guide documents a fixed refusal reason list for the Day Pass payment: malformed payload, wrong amount, wrong asset, wrong network, expired challenge, duplicate payment, and policy blocked, with a retryable flag that decides whether a corrected retry is allowed. Only expired challenge is one of the five verifier classes above, so only it has its own page here. The wrong network, wrong asset, and wrong amount classes are documented server refusals with a plain fix each: sign for the network, asset, and amount the live challenge names (eip155:8453, the USDC contract the challenge quotes, and 990000 atomic units), as laid out on x402 agent payments. No causes beyond that documentation are claimed for them.

Method note

Every exhibit in this set was fetched first-hand on 2026-10-24: the corpus files from zambo.dev/aer1/corpus/v1.5.7/ (the local copies of the chain, commitment, anchored, and missing-inputs files recompute to the exact SHA-256 values in the published corpus index), the x402 challenge from the live endpoint, and the receipt verify record from the public v2 verify endpoint. A pattern with no first-hand evidence was not built. Nothing in this set invents a failure cause for any third-party tool.

Put your own calls on a checkable record

Start at zambo.dev/add

Add Zambo to your AI at https://zambo.dev/add/. The free tier is 20 free calls per day, then they upgrade. A Day Pass is $0.99 for 24 hours. Every call returns a verifiable receipt, including a call that is rejected, so a failure like the ones on this page leaves a record you can open, check, and learn from instead of a claim you have to trust.

A verifiable receipt proves the saved result was not changed since it was saved. It does not prove the result was right.

Questions

What are the five AER-1 failure classes?

Wrong digest (verification failed), missing field (rejected: unresolvable record), expired time window (the x402 server refuses and orders a fresh challenge), bad chain link (verification failed), and unknown or wrong version (rejected under the declared rule, or not checked when a verifier does not implement the version). Each class on this index is supported by first-hand evidence fetched from zambo.dev.

What does not checked mean, and how is it different from absent?

Not checked means the check exists and was not evaluated: the only honest report for an unevaluated check. Absent means there was nothing to evaluate, for example a receipt carrying no anchor. AER-1 Section 6 keeps verified, verification failed, rejected: unresolvable record, not checked, and absent as separate reports so a reader can tell them apart.

Why is there no page for the quota wall?

The quota wall is documented behavior, not a verifier outcome: the free tier is 20 free calls per day, then they upgrade, and a Day Pass at $0.99 covers 24 hours. It is documented in full on this index, from Zambo's own pages and the quota fields on a live receipt record. No quota-error receipt is exhibited in this set, so no standalone page claims evidence it does not have.

Proof works best when it travels with the work itself. The AER-1 badge kit turns verifiable receipts into an embeddable badge for project pages, docs, and profiles, so anyone who sees the claim can reach the check in one click.