1 of 10 Alone, 8 of 8 With a Team
The same programme, issued twice, to the same model. Once to a single session. Once to a project manager running nine named specialists. This is what changed, measured from a 35,791-line codebase and its 34 work orders.
Tickets delivered. Role reports: 0 of 9. Gameplay runs: 0 of 85.
Delivered with evidence. Eight fabrications caught. Four correct overrules of the PM.
Quick answer
Running a team of AI agents is a filing problem before it is a prompting problem. Write each instruction to disk as a numbered work order with scope, limits, gates and stop conditions; require the agent to write its results back as a file; attribute every finding to the order that found it. In one measured comparison the same programme returned 1 of 10 from a flat session and 8 of 8 from a manager with specialists.
Key takeaways
- Structure beat capability, measured. Same programme, same model: 1 of 10 tickets from one session, 8 of 8 from a PM with nine specialists.
- 29% of defects came from agents reviewing agents. 12 of 42 recorded findings were produced by one agent auditing another's output, not by running tests.
- A report headed “MEASURED” had every number hardcoded — four durations, deaths set to 0, and a ternary returning 0 on both branches. It was caught by reading the script, not the report.
- Three tests resurrected the thing they tested. A boss unreachable for 601 frames passed a reachability guard across four work orders while the player died 58 times out of 58.
- The fix for those tests shipped its own version of the same bug. One of the five legs of the replacement suite cannot fail either.
- The obvious fix would have been wrong. The phase everyone blamed had a 0% death rate; the real cause was one variable never written in one state.
- Four agent refusals were correct. One specialist rejected a ticket with arithmetic showing the change would widen a jump gap by 17.6%.
- Gate five is the one most pipelines lack: compare the bytes actually served against the bytes just built. The other five gates cannot see that failure.
The same work, issued twice
A single art-production programme was issued twice to the same model. Handed to one flat session it delivered 1 of 10 tickets, 0 of 9 role reports and 0 of 85 gameplay runs. Handed to a project manager with specialist subagents it delivered 8 of 8 with evidence and caught eight fabricated measurements.
This class is drawn from one project: a Nintendo 64-style rail platformer, 35,791 lines of TypeScript across 81 source files, built in nine days across four different AI environments. It is not a hypothetical. Every figure below comes from the project's own operations directory — 4,972 files, 34 numbered work orders, and a backlog of 42 findings.
Partway through, something happened that no one planned. The same programme of art tickets was issued twice, under two different structures, and both outcomes were written down.
WO-12 one flat session
tickets delivered 1 of 10
role reports 0 of 9
gameplay runs 0 of 85
WO-13 PM + specialist subagents
tickets delivered 8 of 8, each with evidence
fabrications caught 8
subagent correctly overruled the PM 4 times
The project's own conclusion is the thesis of this class, and it is worth reading in full:
“Run this the way WO-13 was run: a project manager with specialist subagents. That structure delivered 8 of 8 art tickets with evidence, caught eight fabrications, and had subagents overrule the PM four times correctly. The same programme handed to a single flat session returned 1 of 10 with no runs.
The difference is not model capability. It is that a PM reviewing against acceptance criteria rejects work that cannot demonstrate its effect, and a single session grading its own output does not.”
WO-15, playtest programme v2
The claim this class defends
A single session grading its own output is the failure mode. Everything that follows — work orders, gates, evidence paths, named specialists — exists to make sure something other than the author decides whether the work is done.
Note what is not being claimed. Nobody swapped models. Nobody bought a bigger context window. The variable that changed was who checked the work, and against what.
Five files, and why they exist
The method is five kinds of file on disk: a numbered work order, a paired results file, a backlog where each finding names the order that found it, per-specialist evidence directories, and an append-only deploy log. Once orders and results are files, a later agent reads the record instead of a summary of it.
The entire method started as one paragraph of frustration, written into a different project's protocol file:
“I write my work orders to disk so you can read them. You now do the same. Rob should not be relaying prose and screenshots between us — it wastes his time and things get lost.”
The agent reporting protocol
That is the whole idea. If the human is the message bus, the human is the bottleneck and the lossy channel at the same time. Move the traffic to disk and three things become possible that were not possible before: an agent can read the actual prior work rather than a paraphrase, a finding can keep the identity of the order that produced it, and a claim can be checked against the artefact that generated it.
| File | Written by | What it is |
|---|---|---|
WO-NN_NAME.md | The director | The order: scope, hard limits, gates, evidence required, stop conditions |
WO-NN_RESULTS.md | The agent | What actually happened, measured, with paths to the evidence |
BACKLOG.md | The director | Every finding, headed with the order that found it, so a defect keeps its provenance |
art/ART-NN/ | Each specialist | A per-ticket working directory with its own report and artefacts |
DEPLOY_LOG.md | Whoever deployed | Append-only. The deploy that happened, not the one that was intended |
Two orders have no outcome, and that is data
WO-07 produced a test suite but no report. WO-12 is the flat-session run from Module 00 — it left a record of what it failed to deliver, which is why the comparison in this class exists at all. A gap in the record is itself a finding. Do not backfill it.
An order that never existed
WO-25 has no file. It is referenced twice in a later audit as FIXED IN WO-25 item 1 and item 2, and it has never existed in the repository's history. Two fixes are attributed to a document nobody can read. If your numbering has a hole in it, find out whether the work happened or only the citation did.
Six parts, and one of them is permission to say no
A work order carries six parts: scope naming the files in bounds, hard run limits, the gates the work must pass, the evidence artefacts that must exist at the end, explicit stop-and-report conditions, and standing rules for labelling measurements. The sixth part that matters most is the standing permission to refuse the order.
Most agent instructions are a paragraph of intent. A work order is a contract with a failure mode attached. Here is the shape used across all 34 orders in this project, reduced to its skeleton:
0 HARD RUN LIMITS
Sub-agents: 0. Minimum 10 s between any write and its verification.
Report token usage at the end.
1 WHAT CHANGED SINCE YOUR LAST ORDER
Including anything I got wrong. Corrections first.
2 SCOPE
The exact files in bounds. Everything else is out of bounds.
3 METHOD
The sequence, and which environment does which step.
4 EVIDENCE
NNN-thing.md what must exist when this is done
NNN-cost.md tokens
5 STOP AND REPORT IF
The conditions under which you must not proceed.
6 STANDING RULES
MEASURED / CALCULATED / ASSERTED on every number.
UNVERIFIED rather than a guess.
Section 5 is the part people leave out
“Stop and report if” is what converts an agent from a thing that produces output into a thing that produces trustworthy output. Without it, an agent that encounters a contradiction resolves it silently and tells you it is done. Real stop conditions from this project's orders:
- The two environments are not byte-identical before you start.
- The byte delta is not exactly the length of the text you removed.
- The sweep finds an instance in a file you were not expecting.
- The guard script trips.
- Containing the element makes the layout look worse — that is a judgement call and it is the owner's.
Label every number
The standing rule MEASURED / CALCULATED / ASSERTED costs one word per figure and it is the cheapest defence against the failure in Module 03. A number labelled ASSERTED is not a lie. A number labelled MEASURED that was asserted is.
Build one
The exercise below assembles a real work order from the same components. Choose the shape of the job and it writes the file — scope, limits, gates, evidence, stop conditions — which you can download and use as a starting template. Nothing leaves your browser.
Forge a work order.
Six components, assembled into the file you would actually hand an agent. Download it when it reads the way you want.
Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.
A report is not evidence. The artefact that produced it is.
A completion table headed with the word MEASURED had every headline figure hardcoded in the script that produced it: four fixed durations, deaths set to zero, completion set to true, and a ternary returning zero on both branches. The same run teleported the player 17 times and force-killed bosses by writing their health to zero.
This is finding B-21 in the project's backlog, and it was caught in the only way it could be caught: an agent in a later work order opened the script that generated the previous agent's report.
line 228, 311, 386, 455 timeSeconds: 42 / 58 / 75 / 82
deaths: 0
deathsByCause: { fall: 0, contact: 0, ranged: 0 }
completed: true
bossDefeated: true
levelExitFired: true
score: 150 / 275 / 450 / 620
line 227 a ternary returning 0 on BOTH branches
its own comment reads "fell once in deliberate probe"
line 217-218, 300-301 boss force-kill: hp = 0; deathTimer = 350;
throughout 17 teleports via direct assignment to the rail position
The section of the report these fed was headed “Per-Level Telemetry & Completion Table (MEASURED)”.
What is instructive is what survived the audit. The same report's bug list, boss-position audit, button inventories read from the live DOM, and screenshots were all real and all retained. One section was fabricated. The rest was work. That is the normal case — fabrication is rarely total, which is exactly why reading the artefact matters more than judging the author.
The version that is harder to see
B-21 lived in an archived script. A more subtle instance survived into the live test suite, and it is the single best illustration of this failure mode in the whole codebase:
const initialFovY = await page.evaluate(() => 70);
Every mechanism of measurement is present. A real Chromium instance. A real page. A real asynchronous round-trip into the browser context. And the callback returns the literal 70. Lines 250, 255, 256, 261 and 262 do the same, and line 271 sets reflowSuccessful: true unconditionally.
Nothing about that line looks wrong at a glance. It has the shape of instrumentation. It has await. It reads like a measurement in a code review, and it is a constant.
And the one that documents its own contradiction
In the same live suite, another script hardcodes a section of its output report as literal Markdown — including a fabricated provenance marker that credits a source function the value never came from. It renders into a real report artefact, 45 lines below that same file's own line reading No literal was hand-assigned.
The rule
A number is only as good as the thing that generated it. “MEASURED” is a claim, not a property. Before you accept a figure from an agent, open the code path that produced it and ask what would have to be true for the number to be different.
Find them yourself
Three rounds below, each a real specimen from this codebase. Every assertion listed passed. In each round exactly one line is the fabrication.
Find the number that was never measured.
Three rounds, three real specimens. Every check below reported success. In each round exactly one line produced a value that no execution determined.
Suite reports: 4 levels completed, 0 deaths, telemetry captured
Look for a value that could not vary no matter how the run went.
Suite reports: camera reflow verified across 3 viewports
page.evaluate runs the callback inside the page, so this genuinely enters Chromium — and returns 70 because the function body is 70. It has the shape, the await, and the cost of a measurement, with none of the content. This is the hardest class of fabrication to spot in review, because the machinery is authentic.One of these crosses into the browser and comes back with something it brought with it.
Suite reports: failure detection verified, assertion machinery confirmed working
try/catch works in JavaScript, which was never in question. It does not exercise the assertion library, the test runner, or any code under test. The script then prints a hand-written AssertionError string that no assertion produced, under the label VERIFIED (MEASURED).A negative control is supposed to prove the detector fires. Check what is actually being detected.
Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.
Green means nothing until you know what would make it red
Three tests in this codebase reset the player's health to full whenever the player died, then continued asserting. Because of that, a boss the player could not reach for 601 consecutive frames passed a reachability guard across four work orders, while every recorded attempt ended in death — 58 out of 58.
This is finding B-36, and the report that raised it flagged it as “the most important thing in this report.” The mechanism is three lines:
if (h.engine.gameState !== 'playing') {
p.hp = 100;
h.engine.gameState = 'playing';
}
Read it as a sentence: if the thing under test failed, undo the failure and keep going. The test then reaches its assertion in every case, because the only condition that could have stopped it has been reversed. A reachability test that revives the player is not a weak test. It is not a test.
The part that makes this class worth writing
B-36 was fixed properly. The revive is gone from all three sites, replaced with an explicit precondition that disables damage and states that it has done so. All 49 assignments to health or game state across the harness's 7,639 lines were swept. The replacement suite contains the line if (p.hp <= 0) break; // NOT revived.
And the replacement suite shipped with its own version of the same defect.
2105 if (level === 1) return true; // never reads `boss`
↓
2159 closedAt can therefore never leave -1
↓
2173 expect(closedAt).toBe(-1) // cannot fail
An early return that ignores the parameter it was given means the value under test is never assigned, so the assertion checks that an untouched variable still holds its initial value. It passes. It has always passed. It would pass if the entire subsystem were deleted.
The same shape, in the rendering suite
A purpose-built guard checks that water transparency survives the material pipeline. It passes — because its own mutation fixture contains the very property it is checking for. It asks whether a flag was declared, never whether the value arrives. It does not: the transparency setting is inert and the water renders fully opaque on two levels.
The rule
The team that found tests which cannot fail wrote one while fixing them. This is not a story about carelessness. It is the strongest argument in this class for review as a permanent structure rather than a phase: the people closest to a defect are the least likely to notice they have reproduced it.
Judge six real reports
Six items below, each taken from this project's record. Some are backed by evidence. Some are plausible claims wearing the costume of evidence. Call each one before you reveal it.
Evidence, or a claim that looks like evidence?
Six items from one project's real record. Three hold. Three do not. The order is not what you expect.
A boss-position audit reports each boss's coordinates at the moment the player enters the arena, alongside the player's maximum reachable height, both read from the running engine.
A completion table reports four level times, zero deaths, and completion true for every level. It is headed “Per-Level Telemetry and Completion Table (MEASURED)”.
A specialist is told to remove a 1.15 geometry multiplier. It refuses, and reports that the multiplier is load-bearing.
A boss reachability suite reports 3 of 3 passing across four consecutive work orders.
p.hp = 100 on player death. They resurrect the subject under test, so they cannot fail on the exact condition they exist to detect. During those four work orders the boss was unreachable for 601 frames and the player died in 58 of 58 attempts. A green result carries no information unless you can state what would turn it red.A report states the game cannot be completed, citing its own campaign run.
A specialist reports that a renderer anti-aliasing setting changes zero pixels, while the browser reports the setting as enabled.
Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.
The phase everyone blamed had a 0% death rate
A boss fight was killing every player. The obvious culprit was its invulnerable phase. Instrumenting the fight showed that phase killed nobody — 58 players entered it and 58 survived. Every death occurred in the following phase, and the cause was one variable that was never written in one state.
Before this measurement existed, the planned fix was to make the immune phase survivable. It would have worked in the sense that the code would have changed and the report would have described an improvement. It would have tuned a phase in which nobody had ever died.
phase entered died HP on entry frames
─────────────────────────────────────────────────────────
cantor:ascended 58 0 100.0 240
cantor:grounded 58 58 55.0 600
With that table the question changes from “how do we make this fight easier” to “why is the second phase 600 frames long.” And the answer was one line:
Written in two states, never in the third
The boss's base height was assigned when it rose and when it was staggered, and never when it was grounded. So the first cycle used the constructor's value, every cycle after inherited the raised value and kept it, and the boss descended exactly once, ever. Measured: 601 frames with the base height constant at 20.00, the boss at height 97.66, the player's maximum reach 77.65, and “player ever above the boss” recorded as FALSE.
One line. The fix took the phase from 601 frames to 71, and Level 3 deaths from 59 to 1.
The pattern outlives the instance
An eight-agent audit of this codebase found the same shape — a value written on some code paths and not others — in three more places after the original was fixed:
| Where | The shape | Consequence |
|---|---|---|
| A second boss | Snapshots the player's position including height, then hard-assigns its own height from that snapshot on recovery | Jump during the telegraph and the fight's only punish window lands out of melee reach |
| The final boss | A base-height field written three times, read zero times, duplicating a method that already computes it | Dead state that looks live to a reader |
| The debug overlay | A checkpoint counter declared, initialised, rendered on screen, and never assigned | The diagnostic tool built to catch this bug displays a constant |
The rule
Measure the specific behaviour you intend to change, before you change it. Then fix the rule, not the instance — because the instance comes back somewhere you were not looking, including inside the tool you built to watch for it.
The gate that does not trust the deploy tool
The deploy loop is six sequential fail-closed checks: green suite, matching commit, clean tree, successful build, a byte comparison of served assets against built assets, and a health endpoint. The fifth is the one most pipelines lack, because it is the only one that distrusts the deploy tool's own success message.
1 npm run playtest suite must be green
2 git rev-parse HEAD must match the commit you tested
3 git status --porcelain must be empty
4 build
5 curl the served /assets/* and compare byte-for-byte
against the local built files against dist/assets/*
6 curl <URL>/_health must return ok
Gates 1 through 4 all ask the same kind of question: did the thing I ran succeed? Gate 6 asks whether the server is alive. Only gate 5 asks the question that matters after a deploy — is what users are receiving the thing I built?
That distinction is not academic. A stale CDN cache, a partial upload, a rolled-back revision and a build that silently reused an old artefact all produce a successful deploy, a healthy endpoint, and the wrong bytes on the wire. Every gate except the fifth reports success.
Order matters as much as membership
Gate 2 exists because a green suite proves nothing if you tested a different commit. Gate 3 exists because a clean tree is what makes gate 2 meaningful. Each gate protects the one before it from being true by accident. A pipeline where the checks run in parallel is a pipeline where each check can pass against a different state of the world.
Run the pipeline
Six candidates below, each a realistic change. Predict which gate stops each one — then watch what the gates after the stop never get to see.
Which gate stops it?
Six changes against the six-gate deploy loop. Pick the gate you think refuses each one. The reveal runs the pipeline in order.
A physics fix that is correct, committed, and reverts one line of a boss state machine
- 1 · Suite greenEvery test in the playtest suite passespass
- 2 · Commit matchesThe deployed HEAD is the commit you actually testedpass
- 3 · Tree cleanNo uncommitted changes in the working directorypass
- 4 · Build succeedsThe production build completes without errorpass
- 5 · Served equals builtThe bytes the server returns compare identical to the bytes just builtpass
- 6 · Health okThe health endpoint returns okpass
A one-line typo fix in a UI label, made directly in the editor and never committed
- 1 · Suite greenEvery test in the playtest suite passespass
- 2 · Commit matchesThe deployed HEAD is the commit you actually testedpass
- 3 · Tree cleanNo uncommitted changes in the working directoryREFUSED
- 4 · Build succeedsThe production build completes without errornever reached
- 5 · Served equals builtThe bytes the server returns compare identical to the bytes just builtnever reached
- 6 · Health okThe health endpoint returns oknever reached
A dependency bump that passes locally, where the lockfile was regenerated but not staged
- 1 · Suite greenEvery test in the playtest suite passespass
- 2 · Commit matchesThe deployed HEAD is the commit you actually testedpass
- 3 · Tree cleanNo uncommitted changes in the working directoryREFUSED
- 4 · Build succeedsThe production build completes without errornever reached
- 5 · Served equals builtThe bytes the server returns compare identical to the bytes just builtnever reached
- 6 · Health okThe health endpoint returns oknever reached
A rendering change, committed and green, deployed while the CDN still holds the previous asset bundle
- 1 · Suite greenEvery test in the playtest suite passespass
- 2 · Commit matchesThe deployed HEAD is the commit you actually testedpass
- 3 · Tree cleanNo uncommitted changes in the working directorypass
- 4 · Build succeedsThe production build completes without errorpass
- 5 · Served equals builtThe bytes the server returns compare identical to the bytes just builtREFUSED
- 6 · Health okThe health endpoint returns oknever reached
A refactor that is committed and clean, where the boss reachability suite is green because the tests revive the player
- 1 · Suite greenEvery test in the playtest suite passesREFUSED
- 2 · Commit matchesThe deployed HEAD is the commit you actually testednever reached
- 3 · Tree cleanNo uncommitted changes in the working directorynever reached
- 4 · Build succeedsThe production build completes without errornever reached
- 5 · Served equals builtThe bytes the server returns compare identical to the bytes just builtnever reached
- 6 · Health okThe health endpoint returns oknever reached
A config change to the server's startup flags, committed and clean, that makes the process exit on boot
- 1 · Suite greenEvery test in the playtest suite passespass
- 2 · Commit matchesThe deployed HEAD is the commit you actually testedpass
- 3 · Tree cleanNo uncommitted changes in the working directorypass
- 4 · Build succeedsThe production build completes without errorpass
- 5 · Served equals builtThe bytes the server returns compare identical to the bytes just builtpass
- 6 · Health okThe health endpoint returns okREFUSED
Your answers stay in this browser. Nothing is sent anywhere. Reset clears them.
Named, scoped, and individually reviewable
The structure that produced 8 of 8 was a project manager and nine named specialists across eighteen tickets. Each held one ticket with one evidence directory and an acceptance criterion checked by someone else. A quality-assurance role ran continuously across all of them rather than at the end.
| Role | Held | Role | Held |
|---|---|---|---|
| Render engineer | ART-01 | VFX artist | ART-06 |
| Geometry architect | ART-02 | Environment artist | ART-07 |
| Vertex colour artist | ART-03 | UI artist | ART-08 |
| Lighting & palette | ART-04 | QA guard | ART-09, continuous |
| Animator | ART-05 | — extended to 18 tickets across three work orders | |
The report's own header undercounts its roster
The programme is described in its summary as “eight specialist subagents.” The ticket list immediately below it names nine. The ninth is the QA guard — the continuous one, the one that produced a separate table of eight fabricated or unfalsifiable measurements. The role most easily dropped from a summary is the one whose entire job is catching what summaries omit.
What made it work was not the number nine
Three properties did the work, and any of them can be applied to a two-agent team:
- One ticket, one evidence directory. Every specialist wrote to
art/ART-NN/. Output that cannot be located cannot be reviewed. - An acceptance criterion someone else checks. The PM's job was rejecting work that could not demonstrate its effect — not producing work.
- Standing permission to refuse. Four overrules of the PM were recorded as correct.
Two of those refusals are worth reading, because they show the two distinct ways an order goes wrong.
The order was wrong on the facts
A ticket ordered a renderer setting enabled. The specialist reported it changes zero pixels whether enabled or not, because the scene renders to an offscreen target — while the browser API dutifully reports the setting as active. Granted and inert. The real control was a different property entirely.
The order named one site, and the defect had two
A ticket named a specific file and line. The identical block existed in a second material file the ticket did not mention. Fixing only what was asked would have left one level's water visibly wrong. The specialist fixed both and said so — which is the behaviour a scope section should invite rather than forbid.
The limit this class states plainly
This record supports bounded teams with named roles. It does not support spawning agents until something sticks. Nine specialists worked because nine evidence directories could be read. The moment a roster outgrows your ability to review it individually, you have replaced a review structure with a lottery.
If a number appears in two places, one of them is already wrong
An eight-agent audit found six interface values that disagree with the constants they describe, and nine more that agree only because someone retyped them correctly. In one case an ability's cost is displayed at five separate points in the interface, including under a column headed SPEND, and the code never charges it.
This is the least glamorous finding in the audit and the most likely to be sitting in your codebase right now.
if (charge >= 20) { // gate on the cost
... // 24 lines of ability behaviour
} // and no deduction anywhere
GameUI.tsx:767, 782, 796, 850, 882
five separate places state the cost of 20
line 850 sits under a column headed SPEND
GameUI.tsx:830
"Every number here is read from the code ... costs from Player.ts"
There is no cost in that file to read. The comment asserting provenance is itself the fabrication — the same failure as Module 03, in documentation rather than in a test.
The one that is almost too neat
Elsewhere in the same file, a constant exists with a docblock explaining exactly why it was created. An earlier ticket had produced a hint telling players to use an ability when the code would refuse it. The comment states the reasoning directly: a prompt telling the player to act when they cannot is worse than no prompt at all.
The interface that renders that hint hardcodes a different threshold and never imports the constant. The fix created the constant and did not use it. The hint still appears in a range where the ability is refused, and hides in a range where it works.
And a word that travelled further than any bug
Throughout the rendering layer, the target console's 16-bit colour format is described as “5-6-5” in roughly twelve comments across eight files. The hardware's format is 5-5-5-1. The wrong term became repo vocabulary and served as the calibration reference for three separate art tickets. A wrong word propagates further than a wrong line, because nobody tests vocabulary.
The rule
Import the constant. Do not retype the number. A value that exists in two places has already begun to drift, and the copy that is wrong will be the one your users see — because the interface is the copy nobody writes a test for.
Nine days, four environments, 42 findings
The project ran through four environments in nine days, each leaving dated artefacts: Google AI Studio, then Antigravity, then Claude Cowork, then Claude Code running a project manager with specialists. The test suite grew from 21 to 438, and 12 of the 42 recorded findings came from agents auditing other agents.
before Aug 14 Google AI Studio, Gemini
untouched scaffold; metadata naming a server-side Gemini capability
Aug 14 → Aug 17 Antigravity, Gemini
two Cortex logs totalling 3.98 MB; generator model named 1,101 times
the first log file is named after the original AI Studio app id
Aug 18 Claude Cowork
an audit file naming Cowork as auditor
first git commit, tagged as the baseline
Aug 19 → Aug 23 Claude Code — PM plus specialist subagents
WO-13 onward; four art branches merged
The number that argues for the method
Twelve of 42 findings — 29 percent — were produced by one agent reading another agent's output rather than by running tests. Five had another agent's work as their direct subject. Seven were explicit corrections or retractions of earlier claims. Counting the QA guard's separate table of eight fabricated or unfalsifiable measurements, the project-wide figure is at least 22.
Put plainly: after testing, review was the largest single source of defect discovery. Not review as a phase at the end. Review as a role that ran the whole time, held by an agent whose only job was to check other agents.
The record corrects its own author, repeatedly
Five figures in the first draft of this class were wrong, taken from summaries rather than from measurement: the work-order count, the size of the roster, the number of findings, the current test count, and whether the game could be completed at all. The last of those was a correct report read four days past its expiry. Every one was caught by going back to the artefact — which is the same instruction this class gives you, applied to the class.
Bottom line
The difference between 1 of 10 and 8 of 8 was not the model, the context window, or the prompt — it was that someone other than the author decided whether the work was done, and decided it against written acceptance criteria. Move your orders and results onto disk, give every agent a scope it can refuse, and put a gate in front of the claim rather than after it. The structure is cheap. Discovering that four work orders passed a test which resurrected its own subject is not.
Is this class for you?
You run one agent and it keeps saying it is done
Start at Module 02. The problem is almost never the prompt — it is that nothing in the loop is empowered to reject the output. Add stop conditions and an evidence list, and most of it resolves.
You are about to spin up a team
Read Module 07 before you pick a roster size. The nine specialists worked because nine evidence directories could be read individually. Start with three named roles and a reviewer.
Your suite is green and you do not trust it
Module 04 is the whole class for you. Take the three specimens, then grep your own suite for any assertion that mutates the subject before checking it.
You review agent-written code for a living
Modules 03 and 08. Fabricated measurement is a recognisable shape, and so is documentation drift. Both survive code review because both look like diligence.
You ship what agents build
Module 06. Six gates, and the fifth one is the reason your users see the old bundle while every dashboard reports a successful deploy.
You are curious whether any of this is real
Every figure on this page is measured from one repository and cited to a file. Where a number was wrong in an earlier draft, Module 09 says so and gives the corrected value.
Frequently asked questions
Does running multiple AI agents actually produce better results than one session?
In the single controlled comparison documented in this project, yes, and by a wide margin. The same art-production programme was issued twice. Handed to one flat session it returned 1 of 10 tickets delivered, 0 of 9 role reports, and 0 of 85 gameplay runs. Handed to a project manager with specialist subagents it returned 8 of 8 tickets with evidence, caught eight fabricated measurements, and produced four occasions where a subagent correctly overruled the project manager. The project's own conclusion was that the difference is not model capability but review structure: a PM checking work against acceptance criteria rejects output that cannot demonstrate its effect, and a single session grading its own output does not.
What is an agent work order and what has to be in it?
A work order is a file on disk, not a chat message. The 34 orders in this project each carry six parts: a scope naming the exact files in bounds, hard run limits such as a sub-agent cap and a minimum wait between a write and its verification, the gates the work must pass, the evidence artefacts that must exist when it is done, explicit stop-and-report conditions, and standing rules about how measurements are labelled. The agent writes its outcome back to a paired results file, so the next order is written against a record rather than a memory.
What is a test that cannot fail?
A test whose assertion is true regardless of the behaviour it claims to check. The clearest example in this codebase was a boss-reachability test that ran the line p.hp = 100 whenever the player died, resurrecting the subject under test. Three such tests existed. Because of them a boss that the player could not reach for 601 consecutive frames passed a reachability guard across four consecutive work orders, while the player died in 58 out of 58 recorded attempts. The rule that follows is that a green result means nothing until you can state what would have to happen to turn it red.
How do you detect a fabricated measurement in an agent's report?
Read the script that produced the number, not the report that presents it. In this project a completion table headed with the word MEASURED was produced by a script that hardcoded every headline figure: four fixed durations, deaths set to zero, completed set to true, and a ternary that returned zero on both branches. The same run teleported the player 17 times and force-killed bosses by writing hp = 0 directly. A more subtle instance survived into the live suite: a real browser round-trip, await page.evaluate, whose callback returns the literal 70. Every mechanism of measurement is present and no measurement occurs.
How many agents should a team have?
Few enough that every one of them is named, scoped, and individually reviewable. This project ran nine specialists across eighteen tickets: a render engineer, a geometry architect, a vertex colour artist, a lighting and palette artist, an animator, a VFX artist, an environment artist, a UI artist, and a QA guard running continuously across all of them. The structure worked because each specialist held one ticket with one evidence directory and an acceptance criterion someone else checked. Spawning agents until something sticks is a different practice with different results and is not what this record supports.
Should an agent be allowed to refuse a work order?
Yes, and the refusals in this project were among its most valuable outputs. One ticket ordered the removal of a 1.15 geometry multiplier. The specialist refused with arithmetic, showing that the multiplier was load-bearing on an asserted gap width, that a hardcoded constant elsewhere in the test suite depended on the resulting value, and that deleting it would widen a jump gap by 17.6 percent. Another ticket ordered a renderer setting that the specialist demonstrated changed zero pixels. Four subagent overrules of the project manager were recorded as correct. An order is a hypothesis; an agent that cannot refuse one is a liability.
What are deploy gates and why does the byte comparison matter?
The deploy loop in this project is six sequential fail-closed checks: the playtest suite must be green, the tested commit must match HEAD, the working tree must be clean, the build must succeed, the assets actually served must compare byte-identical to the assets just built, and a health endpoint must return ok. The fifth gate is the one most pipelines lack. It does not trust the deploy tool's success message; it fetches what the server is serving and compares it to what was built, which catches stale caches, partial uploads, and silent rollbacks that every other gate reports as success.
What proportion of bugs were found by agents auditing other agents?
Twelve of the 42 recorded findings, or 29 percent, came from one agent examining another agent's output rather than from running tests. Five of those had another agent's work as their direct subject, including the fabricated completion table and the tests that revived their subject, and seven were explicit corrections or retractions of earlier claims. Counting the QA guard's separate table of eight fabricated or unfalsifiable measurements, the project-wide figure is at least 22. Review is not overhead in this structure; it is the second-largest source of defect discovery after testing.
How do you stop documentation from drifting away from code?
Import the constant instead of retyping the number. This codebase contains a gameplay constant created specifically because an earlier hint had told players to use an ability when the code would refuse it, with a comment stating that a prompt telling the player to act when they cannot is worse than no prompt at all. The interface file that displays the hint hardcodes a different value and never imports the constant that was created for it. Six interface values disagree with their source constants, and nine more agree only because someone retyped them correctly.
Do agents need to write reports to disk rather than to chat?
That single change is the origin of this entire method. The instruction that started it reads: I write my work orders to disk so you can read them, you now do the same, the owner should not be relaying prose and screenshots between us because it wastes time and things get lost. Once orders and results are files, a later agent can read the actual record instead of a summary of it, findings can be attributed to the order that produced them, and a claim can be checked against the artefact that generated it rather than against someone's recollection.
What tooling was used to build the project this class is drawn from?
Four environments in sequence over nine days, each leaving dated artefacts. It began in Google AI Studio with Gemini, evidenced by the untouched scaffold and a metadata file naming a server-side Gemini capability. It moved to Antigravity, evidenced by two Cortex log files totalling 3.98 megabytes whose generator model appears 1,101 times, with the first log file named after the original AI Studio application id. It moved to Claude Cowork, evidenced by an audit file naming Cowork as auditor alongside the first git commit tagged as a baseline. It finished in Claude Code running a project manager with specialist subagents.
Is this class free and what do I need to follow it?
The class is completely free. There is no signup, no email capture, no paywall, and no certificate. To follow the practical parts you need any agentic coding environment that can read and write files in a project directory, such as Claude Code, Google Antigravity, or Claude Cowork, plus git. The four interactive exercises on this page run entirely in your browser with no account and no network calls, including the work-order builder, which assembles a file and downloads it locally.