v0.4.9

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.

13
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 Opus 5.5Claude Code
98.4
2
Claude Fable 5.1Claude Code
97.8
3
GPT-6.1 SolCodex CLI
94.9
4
GPT-6 AstraCodex CLI
94.3
5
Claude Sonnet 5.5Claude Code
84.2
6
GLM-5.3Claude Code
80.2
7
Kimi K3 (1M)Claude Code
79.5
8
Gemini 3.8 FlashAntigravity CLI
73.7
9
MiMo V2.6 ProClaude Code
72.1
10
GLM-5.3-FlashClaude Code
66.7
11
DeepSeek-V4.1-FlashClaude Code
63.5
12
GPT-6 LunaCodex CLI
60.4
13
Claude Haiku 5.5Claude Code
56.9

v0.4 re-measures the whole field on a common 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 the same harness, the same task set and the same 25-build budget. GLM-5.3 joined in v0.4, GLM-5.3-Flash in v0.4.1, DeepSeek-V4.1-Flash in v0.4.2, andv0.4.3 adds Gemini 3.8 Flash on that same basis, changing no other row. From v0.4.6 the board lists current-generation models only, every tier; earlier generations measured on this same instrument move to the archive below. v0.4.7 adds Claude Sonnet 5.5, v0.4.8 GPT-6.1 Sol and v0.4.9 Claude Haiku 5.5; Claude Sonnet 5, GPT-6 Sol and Claude Haiku 4.5 move to the archive. 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 v0.1 archive below shows why that matters: under v0.1's one-hour cap Kimi K3 (1M)'s 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
Opus 5.51001001001009298.4
Fable 5.11001001001009097.8
GPT-6.1 Sol100100831009394.9
GPT-6 Astra10010076989794.3
Sonnet 5.5100100100655684.2
GLM-5.310010089753780.2
Kimi K3 (1M)100100100623679.5
Gemini 3.8 Flash10010078692273.7
MiMo V2.6 Pro10010076592572.1
GLM-5.3-Flash1009978292866.7
DeepSeek-V4.1-Flash10010063391563.5
GPT-6 Luna100827735860.4
Haiku 5.5100706343856.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 5.5
✓
GPT-6 Luna
✓
DeepSeek-V4.1-Flash
✓
GLM-5.3-Flash
✓
MiMo V2.6 Pro
✓
Gemini 3.8 Flash
✓
Kimi K3 (1M)
✓
GLM-5.3
✓
Sonnet 5.5
✓
GPT-6 Astra
✓
GPT-6.1 Sol
✓
Fable 5.1
✓
Opus 5.5
✓

Best: 100% · all models

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 5.5
70.4
GPT-6 Luna
82.2
DeepSeek-V4.1-Flash
✓
GLM-5.3-Flash
98.5
MiMo V2.6 Pro
✓
Gemini 3.8 Flash
✓
Kimi K3 (1M)
✓
GLM-5.3
✓
Sonnet 5.5
✓
GPT-6 Astra
✓
GPT-6.1 Sol
✓
Fable 5.1
✓
Opus 5.5
✓

Best: 100% · DeepSeek-V4.1-Flash, MiMo V2.6 Pro, Gemini 3.8 Flash, Kimi K3 (1M), GLM-5.3, Sonnet 5.5, GPT-6 Astra, GPT-6.1 Sol, Fable 5.1, Opus 5.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 5.5
63.3
GPT-6 Luna
77.1
DeepSeek-V4.1-Flash
63.3
GLM-5.3-Flash
77.7
MiMo V2.6 Pro
76.1
Gemini 3.8 Flash
77.9
Kimi K3 (1M)
✓
GLM-5.3
88.9
Sonnet 5.5
✓
GPT-6 Astra
76.1
GPT-6.1 Sol
82.6
Fable 5.1
✓
Opus 5.5
✓

Best: 100% · Kimi K3 (1M), Sonnet 5.5, Fable 5.1, Opus 5.5

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 5.5
42.8
GPT-6 Luna
35.1
DeepSeek-V4.1-Flash
39.2
GLM-5.3-Flash
29.2
MiMo V2.6 Pro
59.4
Gemini 3.8 Flash
69.1
Kimi K3 (1M)
62.0
GLM-5.3
75.4
Sonnet 5.5
65.3
GPT-6 Astra
98.3
GPT-6.1 Sol
99.6
Fable 5.1
99.6
Opus 5.5
99.6

Best: 99.6% · GPT-6.1 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 5.5
8.1
GPT-6 Luna
7.8
DeepSeek-V4.1-Flash
14.8
GLM-5.3-Flash
28.2
MiMo V2.6 Pro
24.8
Gemini 3.8 Flash
21.5
Kimi K3 (1M)
35.6
GLM-5.3
36.8
Sonnet 5.5
55.8
GPT-6 Astra
96.9
GPT-6.1 Sol
92.5
Fable 5.1
89.6
Opus 5.5
92.2

Best: 96.9% · GPT-6 Astra (no proven 100%)

Archive

Superseded boards and models, kept so the numbers that were once published stay traceable.

v0.4 · earlier generations

Measured on the same instrument as the results above (same harness, targets and 25-build budget), and retired from the board when a newer generation of the same model family was added. Ranked within this list only.

#
Model
Byte match (%)
Score
1
Claude Fable 5Claude Code · → Fable 5.1
81.8
2
Claude Opus 5Claude Code · → Opus 5.5
81.6
3
GPT-5.6 SolCodex CLI · → GPT-6
80.1
4
Claude Opus 4.8Claude Code · → Opus 5.5
71.9
5
Claude Sonnet 5Claude Code · → Sonnet 5.5
67.5
6
GPT-6 SolCodex CLI · → GPT-6.1 Sol
67.0
7
GPT-5.6 TerraCodex CLI · → GPT-6
62.9
8
GPT-5.6 LunaCodex CLI · → GPT-6 Luna
58.8
9
Claude Haiku 4.5Claude Code · → Haiku 5.5
26.9

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