Benchmarks

November 8, 2026

Real Unreal Bench

Large multi-system changes in complete, private Unreal Engine 5 games: fixing bugs, correcting work and building features across code, maps, materials and assets. A run is scored only on how the running game behaves, by deterministic checks; no model judges pass or fail.

TL;DR

The best score is 12 of 15 change requests in real, human-made games. The median model passes 9.

  1. Claude Sonnet 5.580% ±19%
  2. GPT-6.1 Sol73% ±21%
  3. Claude Opus 5.567% ±22%
  4. Gemini 4 Argon60% ±22%
  5. GPT-6 Astra60% ±22%
  6. Claude Haiku 5.553% ±23%
  7. Qwen3.8 Max33% ±22%
  8. Grok 4.720% ±19%

The share of runs that passed every required check; whiskers show its 95% intervals. 15 tasks × 1 run per model, version v1.

Version
v1
Date
November 8, 2026
Models
8
Tasks
15
Runs per model
1
Harness
game-agent/3, game-agent-tools/1

Why we built it

A one-line bug fix is a question with an answer. A change request in a real game is an afternoon that goes wrong in four places.

Picture one (it's ours, not from the set): in the second act a door won't open, enemies spawn through the floor, and saving crashes on the last level. Nobody tells you which of those live in code, which in a map, and which in an asset a text editor can't open. Fixing it means reading a project you've never seen, changing C++ and content together, rebuilding, launching the game, playing to the broken moment and finding the second problem hiding behind the first. A human developer knows the job is done when the game plays right, not when the compiler goes quiet.

Most published game-development benchmarks test smaller units of that work, or let a language model read the result and decide if it's right. We wanted to test the afternoon itself: large multi-system changes in complete private games, graded only by what the running game does.

Here's the scale of one version of the benchmark, and why each number is there. The ranges matter more than the averages: a small task and a big one test different things.

15

tasks across eight games in eight genres

Several games, so one project isn't the whole score.

7–1091

game files in each recorded fix, generated and re-saved assets included

A fix rarely fits in one file, so the model has to find its way around first.

2–5

systems touched

Code, maps, materials and assets break in different ways and need different tools.

8–45

required checks per task

A task passes only when every required check does, so fixing the easy half can't earn a pass.

300

turns per run, at most

Enough for the full loop of edit, build and play, many times over.

480

minutes per run, at most

A real build-and-play loop is slow, and the budget has to leave room for it.

How we built it

Where the tasks come from

Every task is a real change in a complete, private, licensed, human-made Unreal Engine 5 game. We call the tasks large multi-system changes, by the size of each recorded fix and its checks.

The benchmark draws on our private collection of 1,000+ games. The task pool by genre, as a share of its tasks:

Arcade
17%
Simulation
13%
Action
12%
Puzzle
10%
Vehicle combat
8%
Racing
8%
Sports
7%
Strategy
7%
First-person shooter
4%
Platformer
4%
Horror
3%
Stealth
2%
Tabletop
2%
Action RPG
1%
Fantasy battle
1%
A small kart leads the race on an orange track winding through a toy-like green world, with gift-box item pickups ahead and lap, position and speed readouts on screen.
One of the games behind the tasks, in a screenshot from the people who made it.

How the tasks were chosen

We picked this version's tasks from a much larger private pool before any model ran, and fixed the checks and the settings in advance. The pick used one earlier validation run of each task with Codex: tasks it didn't solve, and the ones it took longest to solve. Every game builds and plays on Linux.

The tasks come from eight games in eight genres. The rest of the pool stays private, held out for later versions.

Action RPG
6 tasks · 1 game
Arcade
2 tasks · 1 game
Sports
2 tasks · 1 game
Fantasy battle
1 task · 1 game
Puzzle
1 task · 1 game
Racing
1 task · 1 game
Simulation
1 task · 1 game
Stealth
1 task · 1 game
A hooded hero with a shield faces a towering horned demon in a red-lit brick dungeon, with the boss's health bar above.
Another game in the set. The tasks span genres, so no single playbook carries across them.

How big the work is

A median task changes 46 game files, but one average hides what matters here: the smallest fix touches 7 files and the largest 1091. Tasks span up to 5 systems. Those counts include generated and re-saved assets.

Game files changed
71091
Systems touched
25
Required checks
845
An athlete sprinting down a long jump runway toward the sand in a stadium, with a full crowd behind and speed and angle gauges on screen.
A third game. Everything on screen is the kind of thing a request can touch: code, maps, materials and interface.

The environment

Each run gets its own Linux VM with one L4 GPU and a working copy of the game. The agent can read and edit the project, build it, launch it and play it, the way a human developer would. It can't see the reference solution, and it's told each task's milestones in words but not how they're measured. Nothing it leaves running on its VM survives into grading.

A small yellow helicopter trailing black smoke hovers over a construction site beside a crane and a blue warehouse, with a colorful low-poly town behind.
A fourth game. Each is a complete project, built and played on the run's own machine.

Every model runs in the same harness. Our game agent gives each model the same tools and the same prompt (game-agent/3, game-agent-tools/1), with a budget of 300 turns per run, 64,000 output tokens per turn, thinking effort set to high on every model that takes it, and a time limit of up to 480 minutes and a cost cap set per task. No model runs in its maker's own agent, and no other model ever answers a turn for the one being tested. We ran eight models and one run of each per task, because a run can take hours on a GPU.

Findings

Three things stood out in this version's results. Each comes with its chart.

The price of a pass is set by GPT-6.1 Sol and Claude Sonnet 5.5.

Every other model is beaten on both axes: another model passes at least as many tasks for less money. Cost per task runs from $3.13 to $33.07, a spread of 11×, and the leader's $19.95 is the price of the top of the chart. If you're buying volume instead, the cheapest model on the frontier, GPT-6.1 Sol, still passes 73%. Cost covers each model's own calls; Limitations has the details.

Pass rate (%)

0%20%40%60%80%100%$5$10$20most efficient ↗Claude Sonnet 5.5: 80% passed, $19.95 per taskClaude Sonnet 5.5GPT-6.1 Sol: 73% passed, $3.13 per taskGPT-6.1 SolClaude Opus 5.5: 67% passed, $33.07 per taskClaude Opus 5.5Gemini 4 Argon: 60% passed, $14.19 per taskGemini 4 ArgonGPT-6 Astra: 60% passed, $13.73 per taskGPT-6 AstraClaude Haiku 5.5: 53% passed, $9.70 per taskClaude Haiku 5.5Qwen3.8 Max: 33% passed, $12.94 per taskQwen3.8 MaxGrok 4.7: 20% passed, $8.98 per taskGrok 4.7

Mean model cost per task (US dollars, log scale)

The line joins the points nothing beats on both axes, among those that pass at least one run. 15 tasks × 1 run per model, version v1.

Models that work longer pass less: Spearman's ρ is −0.65 across 8 models.

The relationship runs the wrong way for anyone hoping time buys quality: the longest runs are the ones that are lost, not the ones that are thorough. Median runs go from 76 to 300 turns.

Pass rate (%)

0%20%40%60%80%100%50100150200250300350faster and better ↗Claude Sonnet 5.5: 80% passed, median 127 turnsClaude Sonnet 5.5GPT-6.1 Sol: 73% passed, median 77 turnsGPT-6.1 SolClaude Opus 5.5: 67% passed, median 131 turnsClaude Opus 5.5Gemini 4 Argon: 60% passed, median 102 turnsGemini 4 ArgonGPT-6 Astra: 60% passed, median 76 turnsClaude Haiku 5.5: 53% passed, median 285 turnsClaude Haiku 5.5Qwen3.8 Max: 33% passed, median 197 turnsQwen3.8 MaxGrok 4.7: 20% passed, median 300 turnsGrok 4.7

Median turns per run

15 tasks × 1 run per model, version v1.

Two of the 15 tasks beat every model.

Tasks sit in rows, the hardest kind at the top, and models in columns. By kind, 38% of finished runs pass on feature requests, against 81% on change requests, over few tasks each. Partial credit is where the near misses show: 89% of failed runs still fixed something, with a median of 79% of the checks a change could earn. That is the gap between starting a request and closing it.

AllClaude Sonnet 5.5GPT-6.1 SolClaude Opus 5.5Gemini 4 ArgonGPT-6 AstraClaude Haiku 5.5Qwen3.8 MaxGrok 4.7
Model avg83%94%83%92%91%87%79%74%68%
Feature
Task 177%77%79%82%94%82%77%79%44%
Task 240%40%70%60%40%50%40%0%20%
Task 391%91%100%91%100%100%91%82%73%
Task 484%100%100%100%95%95%90%0%90%
Task 588%100%100%100%100%93%27%93%87%
Task 683%100%100%80%100%100%100%60%20%
Task 788%100%100%100%100%100%100%60%40%
Correction
Task 851%100%0%67%78%89%0%56%22%
Task 975%100%0%100%100%0%100%100%100%
Task 10100%100%100%100%100%100%100%100%100%
Bug fix
Task 1188%100%100%100%80%100%60%80%80%
Task 1298%100%100%100%80%100%100%100%100%
Task 1397%100%100%100%100%100%100%100%75%
Change
Task 1497%100%100%100%100%100%100%93%86%
Task 1597%100%100%100%100%100%100%100%79%

Each cell is a run's partial credit: green passed, red through amber didn't. Hatched cells weren't counted. 15 tasks × 1 run per model, version v1.

Tasks

How it's graded

What an end-state check is

When a run stops, we throw away the agent's container. A clean copy of the project at its final commit gets our own probe plugin put back, and then it's built and played in a fresh container. The checks read what happens in that play: whether a thing appears, moves, responds, triggers or ends the way the request asked.

So an agent can't talk its way to a pass. Nothing it wrote about its work is read, and nothing it changed in the probes survives the clean copy. A game that doesn't build fails everything that needs it to play.

A first-person view over a drawn bow at night, with searchlights sweeping from two steel watchtowers across a rocky canyon under a starry sky.
A fifth game. A check judges what a game like this does when it runs, not what the agent says it did.

Required checks decide the pass

Each task has 8 to 45 required checks: the build, the start, and measurements of the played game. A task passes only when all of them pass. That is the number on the leaderboard, and it's deliberately unforgiving: nine of ten checks passed is a failed request.

Partial credit shows the rest

Partial credit is the second number, on the heatmap, so a model that gets most of the way shows it. It counts only the checks the untouched start fails: partial = (checks passed − checks the start passes) ÷ (checks − checks the start passes), floored at 0.

Doing nothing scores 0. Say a task has eight required checks and the start already passes two of them. A run that passes five earns (5 − 2) ÷ (8 − 2) = 50%, and it does not pass.

Rules every check follows

Before this version ran, every check was tried against real validation runs. Each time one judged a run wrongly, the check was fixed, never the request. These are the rules that came out of that work, and the checks are held to them.

A fix goes in the check, never in the request. A fix can make grading more accurate. It can't make a task easier.

Results, not methods. A check doesn't look for the reference solution's names, positions, fonts or kinds of parts. Any way of producing the asked-for result passes, and each result is read one way however it was made: whether something is lit, whether it changed, what's on screen.

Thresholds are calibrated. A threshold sits between the untouched start and the reference, with room for run-to-run noise. It's never the reference's own number.

The untouched start scores 0, and the reference passes every required check. A check the start already passes only guards that existing features still work, and it carries no weight.

No luck. The same project gets the same result every time, on any machine.

A failed check is the run's failure. A check is called unreadable only on independent evidence, such as frames or logs, from a reviewer who hadn't seen it.

Every task has a reference solution, so it's shown to be solvable before it's scored.

No model decides a pass

Required checks are deterministic code, not opinions. Where a task also carries a model's review, it's advisory: it never decides a pass and it isn't in the partial score. The reason is simple. A judge that reads the output can be charmed by it, and a running game can't.

Two scripted agents

Two scripted agents ran the same tasks through the same grading. One changes nothing and passes 0 of 15 tasks. One applies the reference solution and passes 15 of 15 tasks.

Which runs count

One run per model per task, 120 runs in all. A model's own result counts against it: a bad edit, a broken build, the budget running out, a refusal. Another one run was lost to our infrastructure, a VM or a capacity outage. One of those ran again, and none counts against a model.

The project builds from clean
KindRequired
WeightGate
ResultPassed
First issue: the behavior now happens in play
KindRequired
WeightEqual share
ResultPassed
Second issue: the broken state is gone
KindRequired
WeightEqual share
ResultPassed
Third issue: the new feature responds to input
KindRequired
WeightEqual share
ResultFailed
An example run, in general terms: not a real task or its checks. One required check failed, so this run doesn't pass. It still shows as partial credit: the checks it earned beyond what the start already passed.

Limitations

  • 15 tasks and one run per model make wide intervals, so models a task or two apart aren't ranked apart.
  • Output per turn is capped at 64,000 tokens for every model, and a run the cap ends counts as a failure.
  • Costs are the model's own calls at list prices, without the VMs.

What comes next

Later versions may add tasks from the held-out pool and more runs per model, so the intervals can start separating models. We plan to publish the leaderboard's tasks, with their games, reference solutions and checks, so anyone can run and grade them. The rest of the pool stays private.

Versions

  • v12026-11-08Second version: 15 tasks chosen before any model ran, eight models with the same settings. Kimi K3 was taken out before any of its results, as a newer Kimi had shipped.
  • v02026-11-05First public version: fifteen tasks, nine models, one run per model.

Cite it

@misc{superposition2026unreal,
  title        = {Real Unreal Bench: a benchmark of large multi-system changes in complete private games},
  author       = {{Superposition}},
  year         = {2026},
  howpublished = {\url{https://research.superposition.ai/benchmarks/unreal-game-dev}}
}