Which sources did my AI actually check? Make it show both lists.

The draft your AI hands you is full of citations, and every citation is a claim the model wrote, not a record of anything it opened. The scale of the failure is public: a database that tracks AI-hallucinated material in court filings counts 2,199 decisions, 871 of them involving lawyers, a sanctions database counts about $1.4 million in reported penalties, and news reports describe the errors spreading into judges' orders and prosecutors' briefs. Checking harder inside one tool does not change the shape of the problem. What changes it is a delivery where the research happened as recorded tool calls, each with a verifiable receipt, and where what was not checked is printed on the delivery itself.

See the pattern first: the live demo runs one real call and hands you its verifiable receipt, no signup.

Published October 16, 2026. Updated the same day for the v5 publishes: steps can now carry sources that resolve live, and the page header and the acceptance record add the steps' sources up, documented below from live test handovers. Written against AER-1, IETF Internet-Draft revision 23: draft-zambo-aer1-23. AER-1 is an IETF Internet-Draft, not a finalized standard.

A citation is text. A check is a record.

When research runs as tool calls, a fetch, a search, a lookup, a live price, the executing layer writes a record at call time: the tool that ran, the inputs, the saved output, a hash of that output. A source the AI actually opened has one of these records behind it. A citation it invented has nothing behind it but the sentence itself. The two look identical in prose. They look nothing alike when you ask for the record.

That is why the penalties keep landing on professionals who did check, in the colloquial sense: they read the draft, the citations looked right, and reading is not checking. Checking means comparing the claim against something the model did not write. The receipt is that something.

The claim-to-record test

  1. Pick the claims that carry weight. Every citation, figure, and quotation the delivery depends on.
  2. For each one, ask: which call produced this? If the work ran as recorded calls, there is a step receipt. Open it. The saved output either contains the source material or it does not.
  3. Anything with no call behind it goes on the unchecked list, in writing, before the work ships. Not as an admission extracted later, as part of the delivery.

If your AI cannot produce the record for a citation, treat the citation as unchecked, because that is what it is, however confident the sentence sounds.

A live delivery that names what it did not check

Handover bd7e5325, read it yourself

This public handover, bd7e5325, holds five steps and is still open. Three steps carry receipts anyone can open: a live BTC price ($82,309.00, fetched at 14:33 UTC), a live DOGE price, and a prompt_shield screen that came back safe. Then the honest half: its not_checked list names two steps, aa725980 and 75253fbc, with the reason given in the record itself, "tool did not complete successfully". The unchecked steps are not buried in a log or confessed under questioning. They ship with the delivery, next to the checked ones. Its JSON twin carries the same lists in machine-readable form, and the same page prints what the format does not prove: outside timestamp, issuer identity, result correctness.

Ask your AI to deliver research this way and the conversation changes. Instead of "trust me, I checked", the delivery says which calls ran, what they returned, and which parts nobody checked. A client, a partner, or a court clerk can verify the checked half in a browser, and can see the unchecked half without hiring anyone to find it.

Sources now carry their own states, per step

A handover can now be created with sources attached to a step: each source names a reference, and when the reference is a URL, Zambo checks it live at creation. The step then prints its own sources block, one row per source, with one of three states: resolved (the URL responded), not resolved (it did not), or not checked (a reference with no live check behind it, like an internal document). A source that was never checked is never shown as resolved. The steps' states are also added up in two places a receiver can read without opening a single step: the summary at the top of the handover page, and the sources block of its acceptance record.

A live test, read it on the page

Handover 46092ff4 was created during acceptance testing with three sources on one step: a live page, a dead address, and an internal reference. Its step prints "Sources: 1 resolved · 1 not resolved · 1 not checked", with the rows underneath: the zambo.dev address, resolved; a nonexistent-domain address, not resolved; "Internal spreadsheet Q3 figures", not checked. The page prints the client warning with it: "Not checked means nobody confirmed this source. Ask before you rely on it." And it prints what resolved means, word for word: "Resolved means the URL responded; it is not an assessment of its claims."

The totals add up too: handover 48479a33

The rollup counts the steps' sources, on the page header and in the acceptance record. Handover 48479a33 was created with three sources on its steps: the live zambo.dev address, a nonexistent-domain address, and the reference "Internal spreadsheet Q3 figures", which has no URL to check. Its page header reads "Sources: 1 resolved · 1 not resolved · 1 not checked", and its acceptance record carries the same counts in its sources block: 1 resolved, 1 not resolved, 1 not checked. Right after a handover is created, the counts settle within seconds while the resolve checks finish; then the header, the acceptance record, and the per-step rows agree.

Run your research this way

  1. Connect once. Add https://zambo.dev/mcp to your AI (Claude, ChatGPT, Grok, Cursor, Gemini, VS Code, Windsurf, or any MCP client). One paste, no key, no signup.
  2. Do the research as calls, not as recollection. Every source the AI consults goes through a tool, so it leaves a receipt with the saved output. Attach the sources a claim rests on to its step, and each URL is resolved live and printed on the delivery with its state.
  3. Hand the work over, and say the quiet part. Tell your AI: use zambo to hand this over to the client, and include what you did not check. That instruction is the handover flow's own pattern, and the delivery carries a not_checked list because of it.
  4. Let the receiver verify. The client opens one link, presses Verify all, reads the steps and the unchecked list, and accepts or flags the delivery. Their answer gets a receipt of its own.

The mechanics are documented at zambo.dev/docs/handover.

The honest limits, stated on the record itself

Today, a handover step records a tool call and its output, and a step can carry sources that Zambo resolves live, shown per source on the page. What the record still does not do: attach a verdict to a citation buried in a document's prose that was never attached to a step as a source, or prove the AI read a checked source correctly or drew the right conclusion from it. Resolved means the URL responded; it is not an assessment of its claims. A verifiable receipt shows the saved output of a call has not changed since it was recorded; it does not prove the output was right. AER-1 (draft-zambo-aer1-23) has no issuer authentication. What the record settles today is the thing the fake-citation problem actually turns on: which calls ran, what they returned, and which parts were not checked, stated by the delivery instead of discovered by the victim.

Questions, answered

How do I show a client which sources my AI actually checked?

Run the research as tool calls through Zambo, so each source your AI touches leaves a verifiable receipt with the tool, the time, and the saved output. Then deliver the work as a handover: one link where the client opens each step, presses Verify all, and reads the receipts behind the claims, plus the list of steps that were not checked. The checked sources are the ones with a call record behind them. Everything else is a claim, and the handover format makes the delivery say which is which.

How do I know my AI actually opened the sources it cited?

Ask for the call record behind each citation. When a source is opened by a tool, the executing layer writes a receipt at call time that the agent cannot edit afterward. If a citation has no matching call record, the honest conclusion is that it was not checked, however real it looks. Models produce plausible citations fluently; the record is the only part of the output that cannot be produced by fluency.

What record shows which parts of AI work were not checked?

The handover's not_checked list. When work is handed over through Zambo, the delivery carries a list of the steps that did not complete or were not checked, in plain sight, next to the steps that were. In one live public handover, the list names two steps with the reason: tool did not complete successfully. The list ships with the delivery, so a client sees the weak points without having to dig for them or take the producer's word that there are none.

Can a handover prove a specific citation is correct?

No, and it does not claim to. A verifiable receipt proves the saved output of a call has not changed since it was recorded. It does not prove the source was right, that the AI read it correctly, or that the conclusion drawn from it follows. Every handover prints its own not_proven list: outside timestamp, issuer identity, result correctness. If a citation was attached to a step as a source, the step shows whether its URL resolved at creation; resolved means the URL responded, not that the source is accurate. What the record settles is narrower and still valuable: which calls actually ran, what they returned, and which parts nobody checked.

Why do fake AI citations keep reaching courts and clients?

Because the citation is usually the only artifact. A public database tracking AI-hallucinated material in court filings counts 2,199 decisions, and the filings kept surging even as sanctions grew, because nothing in the normal workflow forces a claim to carry its record. When research is delivered as prose, checking means redoing the research. When it is delivered as recorded calls with an unchecked list, checking means opening receipts, which takes minutes.