An AI coding agent says it fixed the bug. Expectrail plays the game and watches to find out.

"The tests pass" proves only what someone wrote a test for, and the agent's own word proves less. Expectrail replays the changed game, has Meta's vision models find what each plain-English check names in the frames, and measures that against the engine's own record. The change is accepted only if every check passes, and the agent can't reach the checks.

In your browser, with no keys: pick any of twelve cases from the benchmark and see its captured clip, its checks and the verdict.

Two fixes that both stop the fall

Game frame: the robot stands with its feet on the top edge of the grass floor.

Muse Code's fix

Accepted

Written from a plain bug report, in one line: the robot's body collides with the ground again. Every check passes, on the public route and the private ones.

Game frame: the robot has stopped falling, but its legs are drawn inside the floor, well below the grass edge.

A fix that only looks right

Rejected

The same line, plus one that draws the robot lower than its body. The fall stops, and the robot is drawn inside the ground.

Real frames: frame 5 of each replay, from the recorded reviews of runs 41223748922 (review) and 41123758768 (review). The right-hand fix was written by us for the judge benchmark. The yellow line is drawn here at the floor's edge; the verdicts are the runs' own.

Every correct fix accepted. No fake fix accepted.

Fifteen fixes with known answers: seven that only look right, eight correct. Expectrail accepted all eight correct ones and none of the seven, in every run. Claude and GPT judged those fixes from the same screenshots Muse Code saw. They accepted none of the seven either, but turned down correct fixes.

JudgeFake fixes acceptedCorrect fixes turned down
Expectrail, with SAM 3.1 0 of 210, 0 and 0 of 7, in three runs 0 of 240, 0 and 0 of 8
Claude Fable 5.1, from screenshots 0 of 210, 0 and 0 of 7, in three passes 5 of 242, 2 and 1 of 8: it read both sinking fixes as a robot floating
GPT-6 Astra, from screenshots 0 of 210, 0 and 0 of 7, in three passes 1 of 240, 1 and 0 of 8
Muse Code, from screenshots 6 of 212, 2 and 2 of 7, in three runs 5 of 242, 1 and 2 of 8

Expectrail and Muse Code: three runs of the judge benchmark. Claude and GPT: three passes in one run, given Muse's prompt and frames byte for byte. We wrote the fake fixes, and each judge decides from its own evidence: Expectrail from the engine's record and SAM's boxes on public and private routes, the others from ten screenshots and the bug report. On fifteen cases, the gap from GPT is one judgment.

One of the seven, up close

Three judges saw the fix that sinks the robot. Two of them said it worked.

Expectrail with vision off, on the engine's position log Accepted The engine says the robot stopped on the floor, which is true. Where it is drawn is not in the log.
Muse Code, shown before-and-after screenshots Accepted It wrote that the player stays in view in all frames and that the fall was fixed.
Expectrail, with SAM 3.1 Rejected SAM found the robot's feet below the floor's edge, on the public route and the private ones.

The same decisions in all three runs of the judge benchmark.

Why a second opinion

Coding agents now change code faster than anyone can review it. Existing checks still matter, but they cannot cover failures nobody thought to look for.

  1. "The tests pass" is not proof

    A test checks what someone already thought to write a test for. The bugs that matter most are the ones nobody anticipated, and a game's worst ones show only on screen: a robot through the floor, coins that are not drawn, a character hidden behind trees. The demo game we use ships with no tests at all.

  2. The agent grades its own homework

    Ask a fixer to judge its own patch, and it may approve a change that looks convincing but is still wrong. Shown before-and-after screenshots of a fix that draws the robot inside the ground, Muse Code said the fall was fixed.

  3. So the judge has to be independent

    Expectrail verifies by observation, not by trust. Evidence comes from running the changed game and watching it. Models observe; plain code decides. And the agent that wrote the change cannot reach the checks, the held-out routes or the key that signs a release.

We built and measured it on a game first because a game shows the gap plainly, then pointed the same verifier at a web checkout page to see whether the engineering carries. It adds a verification step alongside CI, tests and QA; it does not replace them.

How it works

People write the checks that decide: a person approves, in one sentence, what the player should see. Code, not a model, decides whether each check passes. Advisory discovery adds checks nobody wrote, read from the game's own code; for now they report, they don't reject.

  1. Play

    A harness replays a fixed route through the changed game and captures every frame, the same way every time.

  2. See

    SAM 3.1, or the open-weight Muse Glimmer, finds what the check names. The engine logs where things really are.

  3. Decide

    A deterministic evaluator compares the two. A missing or uncertain observation is "needs review", never a pass.

  4. Fix

    Muse Code gets a plain bug report and patches the game in a sandbox. If an attempt fails, the next one gets Expectrail's evidence; the two sinking bugs needed it.

  5. Hand over

    Every check passes on public and private routes, or nothing ships. A signed release candidate waits for a person.

What the fixer can reach

  • The game's editable files, in its own worktree
  • The bug report: the failing check's sentence, screenshots, the route and its log
  • After a failed attempt, Expectrail's evidence: the failing check's approved spec (read-only), the verdict and the first failing frame

In the live runs Muse Code works inside bubblewrap with only its worktree mounted; without bubblewrap it falls back to a plain worktree. Since Oct 30 its only network is a key gateway to Meta's API, which holds the key; it shares the host's kernel, so this is a boundary by absence, not a VM.

Kept out of its reach

  • The held-out bugs, the private routes, and why a guard failed
  • The evaluator's code, and write access to any check
  • The key that signs a release

If the vision model doesn't answer, the same candidate is judged again (unless the key was refused or is out of credit), then by Glimmer checked against the engine. It is never sent back to the fixer. When Glimmer decides, the report says so, because the ground is then judged on the engine's log alone.

Measured, with the run behind every number

The three headline results come from CI output recorded in the repository, with the commands needed to rerun each one.

8 of 8

Held-out bugs caught

Eight bugs kept from the fixer, across four families, judged with SAM 3.1. No false alarm on the clean game. Run 41003749744

0 of 7

Fixes that only look right, accepted

Seven bad fixes, three runs, the same answer every time. The position log alone let 3 through; Muse Code judging from screenshots let 2 through. Judge benchmark

8 of 8

Correct fixes accepted, every run

No correct fix turned down. Claude Fable 5.1 and GPT-6 Astra, judging the same screenshots, turned down correct fixes 5 and 1 times in 24. Outside models

All results, with the run behind every number

Held-out bugs caught

Eight bugs kept from the fixer, across four families: falling through the floor, missing textures, hidden behind scenery, sinking.

Expectrail with SAM 3.18 of 8No false alarm on the clean game. Run 41003749744
Expectrail with Muse Glimmer, no SAM8 of 8Open weights, checked against the engine. Run 41003751876
Engine and gameplay checks only4 of 8Missing textures and hidden robots pass every non-vision check.

Fixes that only look right, accepted

Seven bad fixes, judged three times; fewer is better. Expectrail also accepted all eight correct fixes, each an exact revert of a seeded bug, in every run.

Expectrail with SAM 3.10 of 7Judge benchmark
Expectrail with Muse Glimmer, no SAM0 of 7One run. One of the seven passed every public check and was stopped only on a private route, where SAM stops it on a public check. Run 41230177124
Expectrail, position log only3 of 7The same verifier with its vision checks off.
Muse Code from screenshots2 of 7It also turned down one or two of the correct fixes.

Claude Fable 5.1 and GPT-6 Astra, shown the same screenshots, also accepted none of the seven, but turned down correct fixes: 5 and 1 times in 24. Outside models

A mutation bench, registered first

The sample, the oracle (any difference from the clean game, in positions or in frames) and its thresholds were committed before any case in the study was judged, and only public checks decide. Bugs nobody wrote are where Expectrail is weakest (what it can't do yet). The bench and its limits

Wrong fixes caught31 of 39Made by five operators, 24 caught only with SAM. The 8 misses are one operator that changed nothing in the running game. A sixth made 8 right fixes, a correct fix plus a comment, and all 8 were accepted. Run 41268021760
Muse Code's fixes for those bugs, accepted10 of 10Bugs the checks had already caught, reported in the catching check's words. Each was fixed on the first attempt and each fix was correct on six routes, five of which the judge never sees, so there was nothing to catch. Muse from screenshots rejected 5 of the same 10. Run 41330361829

The whole loop, live

Live runs accepted10 of 10One seeded bug, ten times: Wonder triage, Muse Code given the evidence first, the verifier and a signed report. Each accepted on the first attempt, median 14.5 minutes. Run 40990485265
Live runs, report first3 of 3The same bug on the loop as it ships, Muse Code starting from the plain report. Each fix accepted on the first attempt, its review a demonstrated repair. Run 41223748922

Checks nobody wrote: advisory discovery

Twenty-two generic probes replayed on each build, judged by rules read from the game's code, with no rule written for any one bug. A finding has to repeat three times out of three. It doesn't gate yet. The blind rows are fresh defects written after its rules were frozen; the reported bugs are a development result, because its rules were chosen after reading those reports.

Fresh defects found, blind7 of 16Two sets, each written after a freeze and drawn at random from a committed list. Runs 41248745687, 41319184209
Intentional changes flagged, blind0 of 4Deliberate design changes, two in each set; the clean game wasn't flagged either.
Fixes that disable the feature, flagged4 of 4A "fix" that switches the feature off; two healthy retunes weren't flagged. Written knowing the guards. Run 41326269491
With the Muse Spark planner, set 24 of 8One more than the templates alone, no false alarm. Run 41319197682
Reported Godot bugs found4 of 4No false alarm on the clean game. Run 41238187197
Development bugs it wasn't written for2 of 8Both fall-through variants, by a symptom; the visual and ground-contact bugs were missed. Discovery

Beyond games: a web checkout page

The same evaluator, contracts and fixer, with Chromium in place of the game engine and the page's layout in place of the position log. The checks were tuned on the development bugs and changes below; the four private bugs are the test they were not tuned on.

Bugs caught with SAM8 of 84 of 8 without SAM; no false alarm. Run 41109233666
Private bugs caught with SAM4 of 4Written by a separate agent that never saw the checks; 2 of 4 without SAM. Run 41130091655
Bad changes accepted0 of 5All 5 good changes accepted. A pixel diff also rejected the bad ones, and rejected 4 of the 5 good. Web judge
Live repairs accepted16 of 16Muse Code on all 8 bugs, with Expectrail's evidence and from screenshots alone. Fix matrix

What we have not shown yet. We gave Muse Code four bugs that other people reported in Godot games, in the reporters' own words, five times each. Expectrail accepted all 20, each bug's own check passed, and no guard fired; Muse from screenshots rejected one that we have not yet judged ourselves. Given 10 generated bugs the checks had already caught, Muse Code fixed all 10 correctly, so there was nothing to catch there either. There is no blind catch on a real-world bug yet. One of the eight held-out catches came from a check built after that bug was first missed. Discovery's blind tests are sixteen defects in two sets, a small sample, written by AI agents from a prompt we wrote, and its Muse Spark planner has one blind run. All results and their limits

Seven Meta models, and what each does

The models look, write and fix. None of them decides whether a change passes.

  • SAM 3.1Finds what a check names in the frames of a replay: the robot, the coins, the checkout button.
  • Muse Glimmer 30B open weightsJudges the vision checks with no SAM key, its boxes checked against the engine. Its boxes are too loose for the ground check, which then uses the engine's log. Also the fallback when SAM doesn't answer.
  • Muse SparkDrafts a test spec from a one-sentence check, for a person to tighten and approve, and sorts playtest remarks into draft checks. For discovery it proposes probes and rules in a closed language, each tested against the clean game first; blind, it added one defect to the templates' three on a set of eight.
  • Muse Spark Open open weightsThe same two jobs on open weights, served on Baseten.
  • Muse CodeThe fixer. It patches the game in a sandbox, and can neither change the checks nor see the held-out ones.
  • Muse WonderTriage: turns failure evidence into a bug report and a repair request.
  • Muse Voice TranscribeTurns a recorded playtest into who said what. Raw speech never becomes a check, and a request to switch one off is refused and queued for a person. Built; not yet run live.

Why open weights matter here: an unreleased game build is confidential. With Glimmer, the vision checks could run on a studio's own hardware; so far we have run it only on a Fireworks deployment. How we use them

What it can't do yet

  • It checks a change; it doesn't explore. It replays fixed routes and 22 fixed discovery probes, so a bug where none of them goes is invisible to it. Of 77 generated single edits that differ from the clean game, its checks caught 10, and none that move, resize or re-layer scenery; weighted by how common each kind of edit is, that is 0.9%. Bugs nobody wrote are where it is weakest, and we measured it on purpose (the mutation bench).
  • Only checks people wrote can reject a change. Three approved checks guard the game. Discovered checks only report, reach just the four mechanics their profile describes, and flagged 7 of 16 fresh defects blind.
  • One game and one web page. Mostly with bugs we seeded. A teammate wrote the game's held-out bugs; the page's private bugs came from an AI agent of the same model family that tuned its checks.
  • The sandbox isn't a hard boundary. The fixer reaches Meta's API through the key gateway and shares the host's kernel.

Known limits in detail, and what we would build next