Two agents, one job
Watch AI agents pass work to each other
Think about a visit to the doctor. First the receptionist listens and fills in a form: what is wrong, and when it started. Then they give the form to the nurse. The nurse reads it, decides how urgent it is, and asks about anything the form is missing.
Many AI systems work the same way. Instead of one AI doing everything, several agents each do one job and pass the work along. That is what "multi-agent" means. On this page, two agents turn a messy bug report into a tidy one:
- Agent 1, the Drafter — fills in a bug-report form from your words: title, description, severity, steps, device.
- Agent 2, Triage — reads the form, decides how urgent it is (HIGH, MEDIUM or LOW), and asks for anything that is missing.
Passing the form from one agent to the other is called the handoff. The form can be sent as JSON, a strict format that is checked before it is passed on. Or it can be sent as plain text, which nobody checks. Here, both agents follow simple rules, not real thinking, so you can see every step.
6 examples: how urgent is it?
Each example shows a bug report, the form the Drafter filled in, the handoff, and what Triage decided.
-
Bug report:
the app crashes when I upload big files📋 Rule-based — both agents follow simple, visible rules. Handoff format: json [AGENT 1: Drafter] Received: "the app crashes when I upload big files" [AGENT 1: Drafter] Output → { "title": "The app crashes when I upload big files", "description": "the app crashes when I upload big files", "severity": "unknown", "steps": "not provided", "environment": "not provided" } [HANDOFF] Passing draft to Triage Agent as JSON... [HANDOFF] Checked: valid JSON with all 5 fields ✓ [AGENT 2: Triage] Reviewing draft... [AGENT 2: Triage] Priority: HIGH ("crash" reported) [AGENT 2: Triage] Missing info flagged: "steps to reproduce", "device / browser", "file size tested" [FINAL OUTPUT] Structured, triaged bug report ready for a human.
✅ HIGH, and that is right: "crash" is a HIGH word. Triage also asks for the 3 things the report doesn't say: how to make it happen, which device, and how big the file was.
-
Bug report:
Checkout is slow in Chrome. Steps: 1. add item 2. click pay📋 Rule-based — both agents follow simple, visible rules. Handoff format: json [AGENT 1: Drafter] Received: "Checkout is slow in Chrome. Steps: 1. add item 2. click pay" [AGENT 1: Drafter] Output → { "title": "Checkout is slow in Chrome.", "description": "Checkout is slow in Chrome. Steps: 1. add item 2. click pay", "severity": "unknown", "steps": "see description", "environment": "chrome" } [HANDOFF] Passing draft to Triage Agent as JSON... [HANDOFF] Checked: valid JSON with all 5 fields ✓ [AGENT 2: Triage] Reviewing draft... [AGENT 2: Triage] Priority: MEDIUM ("slow" reported) [AGENT 2: Triage] Missing info flagged: none [FINAL OUTPUT] Structured, triaged bug report ready for a human.
✅ MEDIUM ("slow"), and nothing is missing. The Drafter spotted the browser (Chrome) and the steps, and wrote them into the form.
-
Bug report:
The settings button colour is slightly off on my iPhone📋 Rule-based — both agents follow simple, visible rules. Handoff format: json [AGENT 1: Drafter] Received: "The settings button colour is slightly off on my iPhone" [AGENT 1: Drafter] Output → { "title": "The settings button colour is slightly off on my iPhone", "description": "The settings button colour is slightly off on my iPhone", "severity": "unknown", "steps": "not provided", "environment": "iphone" } [HANDOFF] Passing draft to Triage Agent as JSON... [HANDOFF] Checked: valid JSON with all 5 fields ✓ [AGENT 2: Triage] Reviewing draft... [AGENT 2: Triage] Priority: LOW (no crash, error or slowness mentioned) [AGENT 2: Triage] Missing info flagged: "steps to reproduce" [FINAL OUTPUT] Structured, triaged bug report ready for a human.
✅ LOW, and that is right. A slightly wrong colour is worth fixing, but it is not urgent.
-
Bug report:
the app keeps closing by itself when I open photos📋 Rule-based — both agents follow simple, visible rules. Handoff format: json [AGENT 1: Drafter] Received: "the app keeps closing by itself when I open photos" [AGENT 1: Drafter] Output → { "title": "The app keeps closing by itself when I open photos", "description": "the app keeps closing by itself when I open photos", "severity": "unknown", "steps": "not provided", "environment": "not provided" } [HANDOFF] Passing draft to Triage Agent as JSON... [HANDOFF] Checked: valid JSON with all 5 fields ✓ [AGENT 2: Triage] Reviewing draft... [AGENT 2: Triage] Priority: LOW (no crash, error or slowness mentioned) [AGENT 2: Triage] Missing info flagged: "steps to reproduce", "device / browser" [FINAL OUTPUT] Structured, triaged bug report ready for a human.
❌ Too low. An app that closes by itself has crashed. But the report never says "crash", so the rule calls it LOW.
-
Bug report:
my payment page looks great, just a small typo📋 Rule-based — both agents follow simple, visible rules. Handoff format: json [AGENT 1: Drafter] Received: "my payment page looks great, just a small typo" [AGENT 1: Drafter] Output → { "title": "My payment page looks great, just a small typo", "description": "my payment page looks great, just a small typo", "severity": "unknown", "steps": "not provided", "environment": "not provided" } [HANDOFF] Passing draft to Triage Agent as JSON... [HANDOFF] Checked: valid JSON with all 5 fields ✓ [AGENT 2: Triage] Reviewing draft... [AGENT 2: Triage] Priority: HIGH ("payment" reported) [AGENT 2: Triage] Missing info flagged: "steps to reproduce", "device / browser" [FINAL OUTPUT] Structured, triaged bug report ready for a human.
❌ False alarm. It is only a typo, but "payment" is on the HIGH list, so it jumps to the top of the queue.
-
Bug report:
the app crashes when I upload big files📋 Rule-based — both agents follow simple, visible rules. Handoff format: text [AGENT 1: Drafter] Received: "the app crashes when I upload big files" [AGENT 1: Drafter] Output → Title: The app crashes when I upload big files Description: the app crashes when I upload big files Severity: unknown Steps: not provided Environment: not provided [HANDOFF] Passing draft to Triage Agent as plain text... [HANDOFF] Nothing checks its shape — the Triage Agent reads it as-is. [AGENT 2: Triage] Reviewing draft... [AGENT 2: Triage] Priority: HIGH ("crash" reported) [AGENT 2: Triage] Missing info flagged: "steps to reproduce", "device / browser", "file size tested" [FINAL OUTPUT] Structured, triaged bug report ready for a human.
✅ The same bug as example 1, sent as plain text instead of JSON. The result is the same, but this time nothing checked the form before passing it on.
The lesson: each agent is only as good as its own rules, and a mistake in one gets passed to the next. Real AI agents understand far more than a word list. But they make mistakes too, and the handoff is where those mistakes travel.
What a real AI did
On this page, both agents follow simple rules, so the Drafter always fills in the form perfectly. A real AI might not. It could add extra chat around its JSON, or leave out a box. Then the JSON check stops the handoff with [HANDOFF FAILED], and the broken form never reaches Triage. So what happens when two real AIs do this job? Here is one real run.
📅 A real run in the terminal (with --key) on 26 September 2026, using gpt-oss-20b, run by Groq. It is saved here, because this page never talks to an AI. A real AI can answer differently every time.
Bug report: When I click "Save" the page says: Error "null" -- and then the app freezes. Also the logo looks weird.
Agent 1, the Drafter (a real AI), sent back:
{"title":"Save button triggers null error and application freeze, logo distortion","description":"When the user clicks the 'Save' button, the page displays an error message containing \"null\" and subsequently freezes. Additionally, the application’s logo appears distorted.","severity":"unknown","steps":["Navigate to the relevant page in the application.","Click the 'Save' button.","Observe the error message that reads \"null\" and the application freezing.","Notice the logo appears distorted or incorrect."],"environment":"not provided"}
The handoff check, run live on that reply in your browser:
✓ Valid JSON with all 5 fields — passed. The form goes on to Triage.
Agent 2, Triage (a real AI), said:
Priority: HIGH, app freezes on critical action causing data loss risk. Missing: environment
- ✅ Good work: it turned a messy sentence into a clear title and description. Triage also asked which device was used.
- ❌ Made-up steps. The report gives no steps, and the Drafter was told to write "not provided". Instead, it invented 4 steps, like "Navigate to the relevant page in the application."
- ❌ A made-up risk. Triage says "data loss risk", but nobody said anything was lost.
- ❌ And the check let it all through. It only makes sure the 5 boxes are there. It didn't notice that "steps" came back as a list instead of text. And it can't tell a true step from a made-up one.
The lesson: a strict format catches a broken form, but not wrong information. Real AI agents write much better reports than simple rules. But they can make things up, and the next agent passes it on as fact. That is why real systems still have a person check anything important.
Try it yourself
Tap an example to put it in the box, then describe your own bug. Try the words "crash", "slow" or "payment", a device like "iPhone", or "Steps: 1." Then watch how Triage changes its mind.
Getting the agents ready in your browser…
What the agents do:
Everything on this page runs on your own device. Nothing you type is sent anywhere, and nothing is saved. This page never talks to an AI. Both agents are a few lines of Python, running on your device.
Curious how it works? The Python code behind this page is on GitHub. In a terminal, both agents can also be real AIs.
See the code on GitHub Run it in a terminal instead