Rewind-Bench · results

A repair can match
and still be wrong.

We injected 67 known bugs into working notebooks and asked three AI agents to fix them. Then we re-ran every accepted repair on data the agent had never seen.

one digit changed in a working notebook

before  let penalty = a.missedPayments * 22;
after   let penalty = a.missedPayments * 23;

what the agent submitted as its repair

let penalty = a.missedPayments * 23;   // left alone
let bonus = Math.min(a.creditHistoryYears * 2.5
                     + a.missedPayments, 25);  // cancelled out

It never fixed the bug. It added a second error of the same size pointing the other way, so the two cancelled — until Math.min clamps, which it does on the held-out data.

on the data it was shown 2a9ad5c6… matches
on data it never saw 365348fb… does not match

2 of 28 repairs accepted from the best-equipped agent failed this second check. The other two agents failed this bug outright — so the only agent that “solved” it, hadn’t.

repair episodes
297
models
2
corpora
2, never pooled
bugs with no visible symptom
16

held constant · model, temperature, seed, and the full source

Three agents, one variable.

agentmay run codewhere its upstream data comes from
A · monolithicnoreads the source and reasons about it
B · stepwiseyesinvents it, or pastes it in by hand
C · rewindyesthe scope actually recorded during the healthy run

B is how the tool behaved before this work. C is what we built. A is the baseline almost nobody publishes, and it turned out to matter.

measured · repairs that survived a held-out seed

Whether the recording helps depends on the model.

agent repairs that survived accepted, then failed held-out
DeepSeek-V4-FlashGLM-5.2 DeepSeek-V4-FlashGLM-5.2
monolithicreads only 26 / 30 28 / 30 0 0
stepwiseguesses its inputs 27 / 30 27 / 30 0 1
rewindgets the recording 26 / 30 30 / 30 2 0

Under the small model the three arms are indistinguishable. Under the frontier model, arm C solved every bug and lost no head-to-head comparison to either other arm. The identical 30 bugs, prompts and seed were used for both — only the model changed.

Paired comparison on the same bug, McNemar exact
modelcomparisondiscordantp
DeepSeek-V4-Flashrewind vs stepwise 0 : 11.00
DeepSeek-V4-Flashstepwise vs monolithic 1 : 01.00
DeepSeek-V4-Flashrewind vs monolithic 1 : 11.00
GLM-5.2rewind vs stepwise 3 : 00.25
GLM-5.2stepwise vs monolithic 0 : 11.00
GLM-5.2rewind vs monolithic 2 : 00.50

No difference reaches significance at n = 30, and none is claimed. What changed between models is the consistency of the direction, not the p-value.

measured · tokens spent per repair that survived, GLM-5.2

It is not free.

A · monolithic 15,923
B · stepwise 87,397
C · rewind 58,855

Handing the agent the recording costs 32.7% less than making it guess — and 3.7× more than not running anything at all. If a program fits in the prompt, reading it beats every interactive strategy we tried.

audited · could the agent see anything was wrong?

Some bugs have no symptom.

The symptom shown to an agent is the final cell's output. A mutation only had to change the whole run's hash to enter the corpus. Those are different scopes, so a bug can be valid and still be invisible from where the agent stands. We counted them.

corpusbugsobservableinvisible
designed3025 83%5
found3928 72%11
Found corpus, split by whether the bug was observable
agentobservable (28)invisible (11)
monolithic 25 89% 2
stepwise 26 93% 2
rewind 25 89% 4

This hits all three arms identically, so the paired comparisons stand — but the raw totals understate every arm. On bugs an agent could actually see, all three land in the high eighties to low nineties.

measured before any model was involved · replay fidelity

Replay is only meaningful if cells repeat.

0.8942

of cells return a bit-identical result given identical source and identical incoming scope. 93 of 104 cells, 10 replays each, 1,040 replays. Verified separately: 0 cells received a varying input scope, so the control held.

cause of driftlabelswhat it was
wall-clock7Date.now() inside the returned value
network4live FX and latency endpoints
unknown2traced to a real race in the engine being measured
PRNG1unseeded Math.random()

14 labels over 11 cells — three cells drift for more than one reason, and the table says so rather than dividing them up. Two of the unknowns turned out to be a genuine concurrency bug in the engine we were measuring, which we reported and worked around.

stated, rather than buried

What this does not show.

size
The largest notebook here is 21 cells; the designed ones are 6–9. Everything fits in a prompt, which is exactly the regime where an agent that reads everything should win — and it does. Nothing here speaks to programs that do not fit.
power
n = 30 and 39. No accuracy difference reaches significance and none is claimed.
held-out coverage
Lucky passes are only measurable where we control the seeds. The found corpus reports this as not measured, never as zero.
deep bands
The found corpus's deeper bands come entirely from one repeated-template notebook. Treat those rows as a case study, not a sample.
our own errors
The bench was wrong four times. Each was caught by re-deriving every number from the raw logs rather than trusting a summary, and each correction is an amendment in the commit history — including the one that deleted our best-looking result.