v0.4

Retrobench — AI model decompilation benchmark and leaderboard

Byte-identical or it doesn't count.

Retrobench measures whether an AI agent can genuinely reverse-engineer compiled code. Each task hands the agent the raw MIPS assembly of an N64-era game function; the agent must write C that, recompiled with the original 1990s IDO compiler, reproduces the original machine code byte for byte. The score is the byte-match percentage against the original object — 100% means a perfect match.

10
models
evaluated
5
targets
leaf → module
25
build budget
enforced at cc
2
targets with
no 100% yet

Results

Mean byte-match across 5 targets. Iterative mode: agents compile, diff, and retry against the target binary.

#
Model
Byte match (%)
Score
1
Claude Fable 5Claude Code
81.8
2
Claude Opus 5Claude Code
81.6
3
GLM-5.3Claude Code
80.2
4
GPT-5.6 SolCodex CLI
80.1
5
Kimi K3 (1M)Claude Code
79.5
Kimi K3 (1M)v0.1 · time-limited
56.7
6
Claude Opus 4.8Claude Code
71.9
7
Claude Sonnet 5Claude Code
67.5
8
GPT-5.6 TerraCodex CLI
62.9
9
GPT-5.6 LunaCodex CLI
58.8
10
Claude Haiku 4.5Claude Code
26.9

v0.4 re-measures the whole field on one instrument. The previous board was assembled across five days of harness changes — a compile meter that landed between two runs, one vendor's reasoning effort re-pinned mid-board, the build report's match percentage relabelled partway through — so its rows were never strictly comparable to each other. Every row here comes from a single sweep on one harness state, one prompt and the same 25-build budget — the only set in which the whole field ran on one instrument. GLM-5.3 joins the board. Carried over from v0.2: every compile counts against a budget enforced at the compiler, and the per-task clock is relaxed so slower-served models are bounded by their build budget rather than the wall. The dimmed Kimi K3 (1M) · v0.1 row shows why that matters: under v0.1's one-hour cap its slower API completed fewer iterations on the hard targets and it scored 56.7; given its full build budget it reaches 79.5.

How to read the numbers. A score is the best result across a target's run lineage — a run cut short by the clock or a provider quota is resumed rather than counted as a verdict. Run-to-run variation on the hardest targets is real and can reach low double digits, so close averages are ties, not an ordering; the ranking is meaningful at the top and bottom of the table, less so between neighbours a few points apart. The two hardest non-leaked targets still have no demonstrated 100% solution, so their ceilings remain unproven — there is real headroom for future models.

Every model × every target

The same results broken out per target. Difficulty is graded, not binary: every model clears the leaf function, only some reach byte-identity on a full module, and the two hardest targets remain unsolved by everyone.

Byte-match percentage for each model on each target, with per-model average.
ModelPEBBLEATLASFORGETEMPESTunsolvedCOLOSSUSunsolvedAvg
Fable 510010079676381.8
Opus 510010076686481.6
GLM-5.310010089753780.2
GPT-5.6 Sol10010076883680.1
Kimi K3 (1M)100100100623679.5
Opus 4.810010076632171.9
Sonnet 51009963571967.5
GPT-5.6 Terra1001007639062.9
GPT-5.6 Luna1008772231358.8
Haiku 4.5861425026.9
100 = byte-identicaldeeper tint = closer to matchingdifficulty▚ unsolved = no model has matched it

How it works

The agent gets the target's assembly, the headers it needs, and a compiler. Nothing else — no source, no network. It then runs the loop a human decompiler runs.

01Read the targetDisassembled machine code, plus the exact compiler flags it must reproduce.
02Write CA hypothesis about the source that produced those instructions.
03Compile & diffBuild with the original 1990s compiler; compare byte for byte.
04Read the diff, fixRestructure the C where the codegen diverged, and go again.
↻ repeat until byte-identical, or the build budget is spent
!

The compiler has to match exactly. Byte-identity depends on the precise compiler version and the precise flags — optimisation level, architecture, ABI. Change one and the same C produces different machine code. Every target is therefore extracted with the very compiler the agent is given, and the flags ship with the task, so a failure is always the agent's, never a toolchain mismatch.

Why byte-identical

"It behaves the same" is a judgement call. Byte-identity is the standard working decompilation projects actually use — and the only one an automated benchmark can trust.

CriterionByte-identical“Functionally equivalent”
VerifiableA binary compare answers itNeeds a human to adjudicate
ReproducibleSame compiler, same bytes, anywhereVaries by toolchain and test set
AutomatableOne deterministic checkRequires authored test cases
Hard to gameNo partial credit to argue forPlausible-looking code can pass

Why trust this benchmark?

Retrobench asks an agent to do what human decompilers do: read the compiled assembly of a real N64 game function and write C that rebuilds to the original object, byte for byte.

Why it's a sound benchmark

The grader is a byte comparison, not an opinion.

A submission scores 100 only if the recompiled object is bit-identical to the original. No LLM judge to sweet-talk, no tests to overfit, no partial credit for "plausible" code — the check can't be argued with or reward-hacked.

Contamination is measured, not assumed away.

Targets split into leaked (decompiled source in training data) and non-leaked (a title that isn't). The gap between them directly quantifies how much of a score is memory versus skill.

Memorization is actively punished.

One leaked target is a non-canonical variant, so recalling the famous source produces the wrong answer. Regurgitators score 20; models that verify against the binary and self-correct reach 91–100.

It separates capability tiers cleanly.

Suite means span 93.3 down to 35.6 across the nine models, with clear gaps between the top, middle, and bottom tiers. On the key non-leaked target the spread runs 56 → 63 → 72 → 76 → 76 → 90 → 100 — a clean capability gradient.

There is proven headroom.

The best model's overall score is 93.3, and the two hardest targets top out at 98.9% and 68% with no known 100% solution. Future models have room to demonstrate improvement, not just shuffle within a ceiling.

A perfect score is a real artifact.

Decompilation is genuine work — preservation, security research, modding — and a matched function is code that could merge into an actual project. With a deterministic compiler and exact byte compare, every score reproduces anywhere.

What it measures — and how well

Reverse-engineering optimized codegenmeasured sharply

Reconstructing register allocation, instruction scheduling, and stack layout from -O2 assembly with no source to lean on. The non-leaked frontier target spreads the models 56→100.

Resistance to recall biasmeasured directly

Trusting the binary in front of you over a memorized source. On the non-canonical leaked target, pure recall scores 20; verification-driven models score 91–100.

Long-horizon endurancemeasured · small-N

Keeping a large module coherent across many compile-diff-fix cycles. On a ~1,600-instruction target the field collapses to ≤27% and only the best model grinds out 68%. One target carries this signal today.

Iteration disciplinemeasured secondarily

Using the compile/diff loop efficiently instead of thrashing. Retries-to-match separate models even on targets everyone eventually solves — though it isn't yet a headline metric.

Calibrated self-reportingenforced by construction

A byte-identical oracle auto-falsifies any "it works" claim. Bluffing is impossible — though honesty isn't yet quantified as its own number.

Limitations & scope

These results come from a five-target suite — enough to show it discriminates, not enough to call it a definitive leaderboard. The two hardest targets have no proven 100% solution, so their true ceilings are unknown. Everything here is one compiler and one architecture (N64/MIPS/IDO); generalization to other toolchains — GameCube/PowerPC, GBA/ARM, PS1 — is planned but not yet measured, and neither is anything outside decompilation itself.

Target games and function names are never disclosed, to keep future training runs from contaminating the benchmark.

The 5 targets

Codenames only; games and functions are undisclosed. Bars are byte-match % by model; ✓ marks a perfect byte-identical match.

PEBBLELeakedUnoptimizedDifficulty: Baseline

A tiny leaf function with no calls — the sanity floor of the suite.

Probes: the basic loop — read assembly, write C, compile, diff, match.

Haiku 4.5
86.4
GPT-5.6 Luna
GPT-5.6 Terra
Sonnet 5
Opus 4.8
Kimi K3 (1M)
GPT-5.6 Sol
GLM-5.3
Opus 5
Fable 5

Best: 100% · GPT-5.6 Luna, GPT-5.6 Terra, Sonnet 5, Opus 4.8, Kimi K3 (1M), GPT-5.6 Sol, GLM-5.3, Opus 5, Fable 5

ATLASLeakedUnoptimizedDifficulty: Moderate

A large ~37-function module from a title in training data — but a non-canonical variant, so the memorized source is wrong.

Probes: sustained multi-function work and verifying against the binary instead of trusting recall.

Haiku 4.5
0.7
GPT-5.6 Luna
86.9
GPT-5.6 Terra
Sonnet 5
98.5
Opus 4.8
Kimi K3 (1M)
GPT-5.6 Sol
GLM-5.3
Opus 5
Fable 5

Best: 100% · GPT-5.6 Terra, Opus 4.8, Kimi K3 (1M), GPT-5.6 Sol, GLM-5.3, Opus 5, Fable 5

FORGENon-leaked-O2Difficulty: Hard

A mid-size optimized function with many external calls, from a title absent from training data — the suite's main discriminator.

Probes: genuine reverse-engineering of optimizer output and reconstructing call interfaces with no source to lean on.

Haiku 4.5
42.3
GPT-5.6 Luna
71.5
GPT-5.6 Terra
76.1
Sonnet 5
63.3
Opus 4.8
75.8
Kimi K3 (1M)
GPT-5.6 Sol
76.1
GLM-5.3
88.9
Opus 5
76.1
Fable 5
78.9

Best: 100% · Kimi K3 (1M)

TEMPESTNon-leaked-O2Difficulty: Very hard

A larger optimized function mixing floating-point math and spatial logic.

Probes: reasoning about FP code generation, register allocation, and instruction scheduling in aggressively optimized code.

Haiku 4.5
5.2
GPT-5.6 Luna
22.5
GPT-5.6 Terra
38.5
Sonnet 5
57.0
Opus 4.8
63.0
Kimi K3 (1M)
62.0
GPT-5.6 Sol
87.9
GLM-5.3
75.4
Opus 5
68.1
Fable 5
67.0

Best: 87.9% · GPT-5.6 Sol (no proven 100%)

COLOSSUSNon-leaked-O2Difficulty: Extreme

A very large (~1,600-instruction) graphics-pipeline module; the suite's headroom target.

Probes: long-horizon endurance — holding a large optimized module coherent across many compile-diff-fix iterations.

Haiku 4.5
0.1
GPT-5.6 Luna
13.2
GPT-5.6 Terra
0.1
Sonnet 5
18.6
Opus 4.8
20.7
Kimi K3 (1M)
35.6
GPT-5.6 Sol
36.4
GLM-5.3
36.8
Opus 5
63.9
Fable 5
62.9

Best: 63.9% · Opus 5 (no proven 100%)

Archive

Superseded boards, kept so the numbers that were once published stay traceable. Neither is comparable to the results above.

v0.3 · retired

The board published until August 2026. Its rows were produced across five days of harness changes — a compile meter that landed between two runs, one vendor's reasoning effort re-pinned from low to high mid-board, and the build report's match percentage relabelled after some agents had read it as an error rate. Only one of these rows is a clean like-for-like against v0.4. Retained for provenance; it is not a ranking.

#
Model
Byte match (%)
Score
1
Claude Fable 5Claude Code
93.3
2
Claude Opus 5Claude Code
84.4
3
GPT-5.6 SolCodex CLI
81.0
4
Kimi K3 (1M)Claude Code
78.1
5
Claude Opus 4.8Claude Code
70.9
6
Claude Sonnet 5Claude Code
63.6
7
GPT-5.6 TerraCodex CLI
62.8
8
GPT-5.6 LunaCodex CLI
58.3
9
Claude Haiku 4.5Claude Code
35.6

v0.1 · time-limited

The earliest reference run. Every cell ran under a 60-minute per-task wall clock, so slower models and the hardest targets were cut off by the clock rather than by their build budget.

#
Model
Byte match (%)
Score
1
Claude Fable 5Claude Code
82.2
2=
GPT-5.6 SolCodex CLI
60.8
2=
GPT-5.6 TerraCodex CLI
61.1
4
Claude Opus 4.8Claude Code
57.4
5
Kimi K3 (1M)Claude Code
56.7
6
Claude Sonnet 5Claude Code
51.3
7
Claude Haiku 4.5Claude Code
30.1

Built by Sinan Onur Altınuç

LinkedIn@sinanonurPrometheusAIContact