I found a 17-point result.
Then I fixed the baseline and it vanished.

A retraction, and what it says about reading anyone's agent benchmark. 1,100 runs.

17 points, retracted

The original study reported that a deterministic executor was more brittle under a transient tool failure than a free-form agent: 81.2% against 98.2%, p = 0.0025.

Then somebody pointed out that no production finance system treats a single 503 as fatal. My executor had no retry policy. Every RPA platform has one.

The correction

Three lines of retry logic closed the entire gap

The identical 768 trials, re-run with the error handling a real integration has:

naive → retry   +18.8 pts  p = 0.0005  significant
retry → react   -1.8 pts  p = 0.46  not significant

A well-built deterministic executor is statistically indistinguishable from a free-form agent on this task. The original headline was measuring missing error handling.

Evidence

Outcome correctness by perturbation

Measured against ground truth. Dots are point estimates, bars are 95% Wilson intervals.

deterministic, no retrydeterministic, 3 retriesfree-form agent
60% 70% 80% 90% 100% baseline baseline: 100.0% [94.3, 100.0], n=64 baseline: 100.0% [94.3, 100.0], n=64 baseline: 100.0% [94.3, 100.0], n=64 paraphrase paraphrase: 100.0% [94.3, 100.0], n=64 paraphrase: 100.0% [94.3, 100.0], n=64 paraphrase: 100.0% [94.3, 100.0], n=64 distractor distractor: 100.0% [94.3, 100.0], n=64 distractor: 100.0% [94.3, 100.0], n=64 distractor: 98.3% [90.9, 99.7], n=58 decoy tools decoy tools: 100.0% [94.3, 100.0], n=64 decoy tools: 100.0% [94.3, 100.0], n=64 decoy tools: 100.0% [89.8, 100.0], n=34 sampling sampling: 100.0% [94.3, 100.0], n=64 sampling: 100.0% [94.3, 100.0], n=64 sampling: 100.0% [93.6, 100.0], n=56 tool fault tool fault: 81.2% [70.0, 88.9], n=64 81.2% tool fault: 100.0% [94.3, 100.0], n=64 100.0% tool fault: 98.2% [90.6, 99.7], n=56 98.2%
Paraphrasing, distractor text, decoy tools and sampling variation broke nothing, in any of the three. Only the injected tool fault separated them, and only when the executor could not retry.
perturbationsystemcorrect95% CIn
baselinedeterministic, no retry100.0%94.3 – 100.064
baselinedeterministic, 3 retries100.0%94.3 – 100.064
baselinefree-form agent100.0%94.3 – 100.064
paraphrasedeterministic, no retry100.0%94.3 – 100.064
paraphrasedeterministic, 3 retries100.0%94.3 – 100.064
paraphrasefree-form agent100.0%94.3 – 100.064
distractordeterministic, no retry100.0%94.3 – 100.064
distractordeterministic, 3 retries100.0%94.3 – 100.064
distractorfree-form agent98.3%90.9 – 99.758
decoy toolsdeterministic, no retry100.0%94.3 – 100.064
decoy toolsdeterministic, 3 retries100.0%94.3 – 100.064
decoy toolsfree-form agent100.0%89.8 – 100.034
samplingdeterministic, no retry100.0%94.3 – 100.064
samplingdeterministic, 3 retries100.0%94.3 – 100.064
samplingfree-form agent100.0%93.6 – 100.056
tool faultdeterministic, no retry81.2%70.0 – 88.964
tool faultdeterministic, 3 retries100.0%94.3 – 100.064
tool faultfree-form agent98.2%90.6 – 99.756

The same fault, both executors

One retry is the whole difference

Invoice INV-7002 is clean; the correct action is to pay $4,500.00. A transient 503 was injected into the same tool call in both runs.

no retry policy

any tool error is a blocking condition
· interpret_request {"invoice_id": "INV-7002"}
· fetch_invoice {"invoice_id": "INV-7002"}
× match_purchase_order {"invoice_id": "INV-7002"}
↳ 503 upstream temporarily unavailable
· check_duplicate {"invoice_id": "INV-7002"}
· check_vendor_status {"vendor_id": "V-101"}
· flag_exception {"invoice_id": "INV-7002", "reason": "503 u…
· post_audit_log {"invoice_id": "INV-7002", "action": "excep…
✗ held a clean invoice
the 503 was treated as a blocker

3 retries

transient faults retried, permanent ones escalate
· interpret_request {"invoice_id": "INV-7002"}
· fetch_invoice {"invoice_id": "INV-7002"}
· match_purchase_order {"invoice_id": "INV-7002"}
· check_duplicate {"invoice_id": "INV-7002"}
· check_vendor_status {"vendor_id": "V-101"}
· schedule_payment {"invoice_id": "INV-7002", "amount": 4500.0…
· post_audit_log {"invoice_id": "INV-7002", "action": "paid"…
✓ paid $4,500.00
retried, succeeded, continued

What this is actually evidence for

The baseline was the result

This is not evidence that determinism wins, and not evidence that it loses. It is evidence about how agent benchmarks are built.

Everything downstream of the baseline was correct. The confidence intervals were correct. The permutation test was correct. The control condition was correct and showed the effect localised to one perturbation, which is exactly what a real effect looks like. The result was still an artifact, and no amount of statistical rigour would have caught it, because the flaw was upstream of the statistics.

Only domain knowledge finds it. Somebody who had shipped a payments integration looked at the setup and said no production system behaves that way.

Every agent benchmark has a baseline somebody chose. When you read one, the question that decides whether the number means anything is not which statistical test they used. It is whether the thing they compared against is a system anyone would actually deploy.

Limits

What this does not show

One model (claude-haiku-4-5), one domain, one policy. Perturbations are a chosen finite set: passing them is evidence, not proof, and as the retraction shows, so is the choice of what to compare against.

Neither architecture failed under paraphrasing, distractors, decoy tools or sampling variation. That is a real observation and a narrow one: this task is well within the model's ability, and a harder domain might separate them. A richer AP domain with 20 invoices across 13 exception classes exists in the repository and has not yet been run against a live model.