Aviation learned, at great cost, how to hand an instruction from one person to another so that it cannot be misheard. rogerwilco gives that discipline to AI agents, and tests whether it works.
"Speedbird one two three, descend altitude five thousand feet, QNH one zero one three."
fixed words"Descend altitude five thousand feet, QNH one zero one three, Speedbird one two three."
read backlistens, and corrects anything that differs. Then the pilot sets 5,000 in the window, and the other pilot checks the window.
heard back, then checkedThousands of times a day, a controller says what to do, the pilot says it back, and the controller listens for the mistake. The words are fixed, so each means one thing. What gets set is checked against what was said. It is dull, and it is a large part of why flying is the safest way to travel.
AI agents now hand each other jobs that cannot be undone: paying invoices, changing the account a supplier is paid into, sending emails to customers. They do it in paragraphs that nothing checks. rogerwilco is built at Crox by Adam Field, who flew the Boeing 737 for an airline before he built software, to give agents the radio's discipline and to find out, test by test, what it catches.
Tenerife, 27 March 1977
Two Boeing 747s on a fog-bound runway, and the deadliest accident in aviation. The KLM crew began its take-off on a clearance it had not been given and struck the Pan Am 747 still taxiing on the runway. 583 people died. Here is the last minute on the tower frequency and in the KLM cockpit.
"The KLM four eight zero five is now ready for take-off, and we're waiting for our ATC clearance."
"KLM eight seven zero five, you are cleared to the Papa beacon, climb to and maintain flight level nine zero, right turn after take-off, proceed with heading zero four zero until intercepting the three two five radial from Las Palmas VOR."
A route clearance: where to fly after take-off. Not a clearance to take off. The callsign is wrong, too.
"Ah, roger sir, we're cleared to the Papa beacon, flight level nine zero, right turn out zero four zero until intercepting the three two five. We are now at take-off."
A correct readback, then four words that were in nobody's book. The tower heard "at the take-off point". The crew meant "taking off".
"We gaan." (We're going.)
The brakes were already off.
"OK." (a pause) "Stand by for take-off, I will call you."
"No. And we're still taxiing down the runway, the Clipper one seven three six."
Both transmitted at once. In the KLM cockpit the two became a squeal lasting almost four seconds. "OK" was heard. The warning was not.
"Papa Alpha one seven three six, report the runway clear."
"OK, we'll report when we're clear."
"Is hij er niet af dan? Is hij er niet af, die Pan American?" (Is he not clear then? Is he not clear, that Pan American?)
"Jawel." (Oh, yes.)
The one person who doubted was overruled, and the aircraft kept accelerating.
The KLM 747 struck the Pan Am 747.
From the cockpit voice recorder and the tower tape as published in the investigation reports; Dutch lines translated; times local.
Nothing here was a technical failure. Every word was ordinary English, and that was the problem. One phrase meant two things. Two people spoke at once and the warning never arrived. The person who doubted was overruled. Aviation's answer was not a better pilot. It was a protocol, and it changed three things.
Five layers, and their twins for agents
The readback is the famous part. It is one layer of five, and the layers that catch the most are the ones that check the machine rather than the person. Each has a twin in the way agents can hand each other a job, and the tests further down say how much each twin caught.
1Fixed words
A closed vocabulary, so a word means one thing and nothing is said in two ways.
The job is one typed line, every fact in a labelled slot, so a program can read it like a form.
2Read back, listened to
The pilot says the clearance back; the controller listens for the mistake.
The payer reads the job back as a line and a program compares it with the record. Caught every typed mistake.
3Set it, check the window
The new altitude goes in the window; the other pilot checks the window, not their memory.
The payment tool states exactly what it will do, and a program checks that before it does it. Caught every tool mistake before the money moved.
4Watch the radar
The tower sees what the aircraft actually does, so a mistake is seen early.
The tool reports what it actually did and a program compares it with the plan. Caught every fault, after the money moved.
5The aircraft says no
The flight computer will not fly the aircraft into the ground, whatever anyone says.
The tool will not pay until the program says yes, whatever any agent says. Never paid early, in 378 tries.
rogerwilco is those layers written down for agents: three one-line messages, the checks a program runs on them, hosted here for any agent to call, and nine studies that planted mistakes to find out what each layer catches. The rest of this page is those studies, one test at a time. Roger means "I received it"; wilco means "I understood it and I will do it".
What we were testing
Three agents and a tool. The boss says what to pay. The scheduler agent writes the job. The payer agent reads it and looks up the bank account. The payment tool moves the money. A mistake can enter at three places, and once the money has moved it cannot be undone.
The setting was a made-up company with a made-up month of bills, so no real money was ever at risk. We used four AI models from two companies: three strong ones and one weaker, cheaper one. Every log and every grade is in the open.
Two ways to say a job
Everything turns on this. A job can be a sentence, or it can be a line: the same facts in fixed slots, each with a label. A person can read both. Only the line can be checked by a program, because a program can find amt= and compare it with the record, and it cannot find "five thousand four hundred" in a sentence reliably.
"Pay invoice MD-2026-057: 5,400.00 pounds, gross, to account 40-12-88 / 61102938, on 2 October, under approval FD-0929. Read back what you will do before you do anything."
RW1 HO scheduler-1 p=pay from=scheduler to=payer item=inv:MD-2026-057 ask=PAY rb=exec sup=marlow amt=5400.00 cur=GBP kind=GROSS acct=40-12-88/61102938 paid=20261002 ref=MD-2026-057 apref=FD-0929
"Say it back" means the payer repeats the job before acting, the way a pilot repeats a clearance before flying it. The question we kept asking: who does the repeating, what do they repeat, and who checks it? What a line is explains every message type with one example each.
Test 1
Just prose, nothing checks
The agents talk in ordinary sentences and act on them. This is how most agent systems work today.
Did not work. Between a third and two thirds of typed mistakes went out as money. Strong models read well, so the danger is the sender's typing and the tool, not the reading.
Test 2
Prose, said back, judged by another AI
The payer writes back, in words, what it is about to do. A second AI reads that and the approved record and says whether they match.
Partly worked. An AI judge checks what it is asked to check, and it gets tired of details a program never misses.
Test 3
Lines, echoed back, a program compares
Now the job is a line. The payer echoes it back word for word, adds a fingerprint of what it received, and a program compares the echo with the original.
Worked for the sender's typing. Blind to the payer's own mistakes, and on the weak model the extra round made it worse than nothing.
Test 4
Lines, with the values the payer will actually use
Instead of an echo, the payer reads back the real values it will use, including the account it looked up in its own files. The program compares those with the approved record.
Safe but awkward. Letting the weak model fill in a short English form instead of a line fixed the stalling: 0 wrong payments and 0 stalls in 129 trials.
Test 5
The report afterwards
After paying, the tool prints what it actually did. The payer reports that, not what it meant to do, and a program compares the report with the plan.
Worked, late. The only check that sees a tool doing something other than it was told.
Test 6
The window: the tool states what it will do first
In a cockpit the pilot sets the new altitude in a little window, and the other pilot checks the window, not their memory. We gave the payment tool a window. It prepares the payment, freezes exactly what it will do under a ticket number, and prints that as the readback itself. A program checks the statement against the record. Only then does the tool get a yes, and it refuses to pay without one.
Worked best of all. A tool that lies at the very last moment still gets through, and the report afterwards still catches that: 30 of 30 on Haiku, 25 of 27 on the weak model.
The scorecard
| How the agents worked | The sender typed it wrong | The payer read it wrong (weak model) | The tool picked the wrong account | The tool lied at the last moment |
|---|---|---|---|---|
| 1. Prose, nothing checks | 15 of 48 paid wrong | not caught | not caught | not caught |
| 2. Prose, judged by an AI | 8 of 48 paid wrong | 4 of 140 paid wrong | not caught | not caught |
| 3. Lines, echoed back | 0 of 48 (weak model 1 of 48) | 14 of 129 paid wrong | not caught | not caught |
| 4. Lines, values read back | 0 of 48 | 0 wrong, 52 stalls | not caught | not caught |
| 5. The report afterwards | caught after paying | caught after paying | ||
| 6. The window, plus the report | 0 of 19 | 0 of 129, 7 stalls | 0 of 60 paid wrong | caught after paying |
The check before sending, a program comparing the line with the record before it goes, catches the sender's typing on its own, with no round trip. It sits in front of every row from 3 down.
The flow that works
Three checks, three places, all done by a program on typed lines. The agents still do the thinking and the talking. The checks are what stop the money. This is rogerwilco: three messages, each one line, said here first in words and then as the line a program checks.
1. Hand over scheduler to payer
"Pay invoice MD-2026-057: 5,400.00 pounds, gross, to account 40-12-88 / 61102938, on 2 October, under approval FD-0929. Read back what you will do before you do anything."
check 1The line is the one above. Before it is sent, a program compares it with the approved record, label by label: check-ho. A wrong digit, date or account stops here, with no round trip.
2. Read back the tool's statement, payer to scheduler
"Paying invoice MD-2026-057, 5,400.00 pounds, gross, to 40-12-88 / 61102938, the account on file for Marlow, on 2 October, under FD-0929."
RW1 RB payer-1 re=scheduler-1 from=payer to=scheduler item=inv:MD-2026-057 ask=PAY p=pay h=a7a82de76607 sup=marlow amt=5400.00 cur=GBP kind=GROSS acct=40-12-88/61102938 paid=20261002 ref=MD-2026-057 apref=FD-0929
check 2The values are the ones that will actually be used, the account read from the payer's own master, so an instruction that named the wrong account shows up here. h= is a fingerprint of the message as it arrived, so a digit changed on the way shows up too. Where the payment tool can prepare before it commits, this line is the tool's own statement of what it will run, frozen under a ticket: test 6. If anything differs, the payment waits and the scheduler sends the job again. If it all matches: roger, wilco, and the tool gets its yes.
3. Done payer to scheduler
"Paid 5,400.00 pounds to 40-12-88 / 61102938 on 2 October, reference MD-2026-057, under FD-0929."
RW1 DN payer-2 re=scheduler-1 p=pay from=payer to=scheduler item=inv:MD-2026-057 out=OK sup=marlow amt=5400.00 cur=GBP kind=GROSS acct=40-12-88/61102938 paid=20261002 ref=MD-2026-057 apref=FD-0929
check 3The done message carries the values as they were actually used, printed by the tool, not as they were asked for, so a program can compare them with the plan: check-dn. That is the second loop, not just "I understood" but "here is what I did", and in tests 5 and 6 it was the one check that caught a tool doing something other than what it was told.
How to use this
- Write the job as a line. Every fact in its own slot: amount, currency, account, date, reference, approval. The line is what makes everything else possible.
- Check the line against the approved record before sending it. A program does this in a millisecond. A wrong digit stops here.
- Make the tool prepare first. It states exactly what it will do and freezes it under a ticket number. It reads the job itself, by its id, so no agent retypes it.
- Check that statement against the record. If anything differs, send the job again from the record and let the tool prepare again.
- Say yes, naming the ticket. The tool pays exactly what it stated, and refuses to pay without the yes.
- Check the report afterwards. The tool prints what it did; the program compares that with the plan. A difference means recall the payment.
- With a small or cheap model, let the program read the tool directly. Do not have the model carry the tool's statement to the checker; the weak one changed it 51 times out of 129.
Start in two minutes
POST /check-rb
PythonOne package, no dependencies.pip install rogerwilco
Your agentAdd the tools to Claude Code in one line, or give any agent the legend.claude mcp add ...
The demoWatch two agents hand a payment over, step by step, and plant a mistake./demo
Want the words first? What a line is explains every message type with one example each, profiles show the same line doing four kinds of work, and the spec and the skill say exactly what each check compares.
What not to do
- Do not treat "the agent said it back" as the safety net. On strong models it caught almost nothing, because they read well. On the weak model the echo was worse than nothing.
- Do not use another AI to judge a prose readback before a payment. It passed jobs addressed to the wrong agent because the numbers matched, and raised alarms over details that did not matter.
- Do not let an agent retype or hand-copy what the tool said. Give the tool the job by its id, and let the program read the tool.
- Do not skip the report afterwards. It is the only thing that catches a tool that says one thing and does another at the last moment.
- Do not switch to lines to save money. They save little. Switch because a program can check them.
- Do not call this proof. One made-up company, three strong models and one weak one, one person writing both the traps and the marking, a few hundred dollars of model time. It tells you where to put the checks. A month of real payments with the checks on and off would tell you what they are worth.
Every study, log and grade is public in the rogerwilco repository, and the research pages tell each of the nine studies with every figure and its interval. Numbers above are from studies 6 and 7; the strong models were Claude Sonnet 5.5, Claude Haiku 5.5 and gpt-5.5, the weak one gpt-5.4-mini.