NES Eval

An AI coding agent gets an empty Rust project, the NES hardware documentation and a black-box reference emulator, and has 24 hours to write an NES emulator that compiles to WebAssembly. The emulator is then run in lockstep with the reference on 23 test ROMs and 6 recorded homebrew playthroughs, and every one of 44,980 frames of picture and sound is compared.

It is a port of Mechanize's GBA Eval to a different console. The grader and metrics are theirs; the reference (RustyNES), the ABI, the corpus and the agent environment are new, and so are the problems the NES raised. How the port works · Did any model hack the grader? · Run the emulators in your browser

Leaderboard

#ModelTimeOverall ProceduralReplayAudio
1GPT-6.1 Sol
codex 0.162.1 · high thinking
24 h0.98600.93001.00001.0000
2DeepSeek V4.1 Flash
omp 18.11.0 · max thinking
24 h0.92720.77000.99550.8797
3Space Bunny Free
opencode 1.18.35 · medium thinking
2 h0.05940.00000.00980.2673
—Qwen3.8 27B
omp 18.10.1 · medium thinking
24 h—never compiled

v1.0 results. Each attempt repository holds the model's working directory saved every 15 minutes, the full transcript and every graded checkpoint. The grader is deterministic: rebuilding a model's final commit and grading it reproduces these numbers to the last digit.

Reference points

CandidateOverallProceduralReplayAudio
nes-core baseline
0.9426 once the first-call convention is matched; why
0.58110.83000.45690.7050
RustyNES against itself1.00001.00001.00001.0000
Reference + no triangle/noise channel0.94521.00001.00000.7261
Reference + A and B swapped0.53891.00000.32820.7100
Reference + picture one scanline late0.32570.00000.20951.0000
Reference + all three bugs0.19480.00000.15000.5241
Blank screen0.00390.00000.00650.0000
ReferenceGPT-6.1 SolDifference
GPT-6.1 Sol's emulator replaying Nova the Squirrel next to the reference. The difference panel is black because every frame matches. More clips.

How it is graded

overall = 0.60 × replay + 0.20 × procedural + 0.20 × audio, GBA Eval's weights.

60%

Replay

Six homebrew games, 5,400–6,000 frames each, driven by recorded button presses. Every frame is compared with block SSIM; one frame of timing drift desynchronises the whole playthrough.

20%

Procedural

23 self-checking test ROMs (blargg, kevtris's nestest, Holy Mapperel) for the CPU, PPU, APU and mappers, scored on their final verdict screen.

20%

Audio

Per-frame log-mel spectral distance against the reference's PCM, on the four APU mixer tests and all six games.

Candidates hand over 9-bit palette indices rather than RGB, so a different colour palette cannot cost points, and the power-on state is pinned in the ABI so a correct emulator can match the reference exactly. Full rubric: README; per-testcase scores: Results.

Blog