Several AIs worked on this project. Here is who did what.

Modern projects are relay races: one AI drafts, another pulls the numbers, a third screens the result, and the shared thread blends them into a single voice. Then a client asks who produced a part, or one part turns out wrong, and the thread cannot answer. The final summary was written by one of the AIs, about the others, from memory. The step record answers instead: every step names the tool, the time, and the AI the producer stated, and carries a verifiable receipt of its own. Zambo is the verifiable work layer for AI, and this is what its handover record keeps.

See the pattern first: the live demo runs one real call and hands you its verifiable receipt, no signup. For $0.99, get the record that shows which AI did what on the next multi-AI job, so the blame question answers itself: get the Day Pass

Published October 17, 2026. The handover steps, labels, and receipts quoted below were read live from the handovers' own JSON records on the day this page was written. Updated October 17, 2026. Written against AER-1, IETF Internet-Draft revision 23: draft-zambo-aer1-23. AER-1 is an IETF Internet-Draft, not a finalized standard.

Why attribution disappears

Three habits erase it. The work happens in one thread, so every output arrives wearing the same chat identity. The steps are described afterward, in a summary written by whichever AI finished last, and summaries round off authorship: "we checked the prices" says nothing about who checked which one. And when the work moves between AIs, the handoff is usually a paste, so the receiving AI's steps and the sending AI's steps end up in one undifferentiated list.

The fix is not a better summary. It is attribution recorded at the step level, when the step runs: the tool, the timestamp, a label for the AI that produced it, and a receipt that fixes the saved result. Read back later, that record separates the relay runners again.

How a handover keeps attribution

  • One record per step. Each tool call in the job becomes a step with its own receipt: the tool name, the timestamp, the output hash, and a receipt page at zambo.dev/run/<id> that anyone can open.
  • The AI label rides on the step. The producer states which AI ran the step, and the label is stored on the step itself, not in a covering note. Where the producer states nothing, the step reads Unspecified AI.
  • The set is closed. A summary receipt folds the ordered step receipts into one Merkle root, so the list of steps is itself committed: a step cannot be dropped or swapped afterward without breaking the record.
  • The count is generated, not written. The handover's AI-use statement counts steps per label from the receipts themselves, so "Claude helped with 1 of 3 steps" is arithmetic over the record, not a claim in a delivery email.

The mechanics of gathering a session into a handover are documented at zambo.dev/docs/handover.

One job, two named AIs: handover 3ba7cb75

Read the steps, not the summary

Handover 3ba7cb75 holds a job titled "Daily crypto price check for the demo portfolio," created October 16, 2026 and delivered to a receiving agent named Night-shift agent. Its JSON twin lists the steps in order:

  • 20:11:53 UTC: live_price returned BTC at $81,577.00, step labeled Claude, receipt 8f49dd82.
  • 20:12:06 UTC: live_price returned ETH at $2,411.80, step labeled Grok, receipt 0fc0e687.
  • 20:12:18 UTC: prompt_shield screened the package and returned safe, step labeled Unspecified AI, receipt 81d7409c.

The set is closed by summary receipt 60ea400c, and the receiving agent accepted the delivery: an agent_acceptance event with receipt 1600adb6, recorded at 20:12:32 UTC. Nobody has to take a summary's word for the split. The two price steps sit under two different labels, each with a receipt a stranger can verify, and the unlabeled step is labeled as exactly that.

Labels can name an agent, not just a model

Handover 7a335b3b, a market snapshot handed from one agent to another the same evening, labels both of its price steps sender-agent (receipts 2c268ea3 and 5dd5cd64), with a prompt_shield step labeled Unspecified AI (receipt ee949f94). The receiver accepted it, acceptance receipt eb32d2e4. Attribution follows whatever identity the producer works under, a model name, an agent name, or an honest blank.

Both handovers are public and live. Open one, press Verify all, and read the steps in order.

What attribution does not prove

The labels are producer-stated. The handover records which AI the producer said ran each step; it does not independently establish which model truly produced the output, and every handover prints that limit in its not_proven list, which names issuer identity alongside outside timestamp and result correctness. A mislabel is possible in principle, and this page does not claim otherwise.

What the record changes is when the statement is made and whether it can be revised. The label is fixed at delivery time, under a receipt, next to the saved result it describes. A producer who later wants a different story has to argue against their own delivered record. And the narrow claim underneath every step holds regardless of labels: a verifiable receipt proves the saved result has not changed since it was recorded; it does not prove the result was correct. Attribution tells you whose work to re-check. The receipts let you actually re-check it.

Questions, answered

Multiple AI agents worked on the same project. How do I see who did what?

Run the work through Zambo and deliver it as a handover. Every step in the record carries the tool that ran, the timestamp, the AI label the producer stated for that step, and a verifiable receipt of its own. In the live example on this page, handover 3ba7cb75 shows a live_price step labeled Claude and a live_price step labeled Grok, each with its own receipt, closed by a summary receipt and accepted by the receiving agent with an acceptance receipt of its own. Attribution stops being a summary someone wrote and becomes a per-step list anyone can open.

Are the AI labels on the steps verified?

No, and the record does not pretend otherwise. Labels are producer-stated: the handover records which AI the producer said ran each step. Every handover prints a not_proven list, and issuer identity is on it. The receipt under each step proves the saved result has not changed since it was recorded; it does not prove which model truly produced it. What you get is a stated attribution, fixed at delivery time, that the producer cannot quietly rewrite later.

What does a step with no AI label look like?

It reads Unspecified AI, and nothing is invented to fill the gap. In handover 3ba7cb75 the third step, a prompt_shield screen, carries exactly that label. The generated AI-use statement on a handover does the same accounting across the whole job, counting steps per label from the receipts themselves, so a delivery where two AIs split the work reads as two named lines plus the unspecified remainder.

Can I check one AI's work without trusting the whole record?

Yes. Each step is its own receipt with its own page at zambo.dev/run/<id>, and the handover page's Verify all re-checks every step in your browser. You can open only the steps labeled for one AI and verify those. The set is closed by a summary receipt over the ordered step receipts, so a step cannot be dropped from the list without breaking the record.

Does this work if the AIs ran in different apps?

The record is built from the work connection, not from one app. Steps are recorded as the calls happen through Zambo, whichever AI or app drove them, and the handover gathers that session's receipts into one page with the labels as stated. The receiver, human or agent, reads the same page. The handover documentation at zambo.dev/docs/handover covers how a session becomes a delivered record.