Everything behind a published number: for each row of Table 1 and Table 2, the base game, the build that was actually scored, and the judge's own records for that build.
Nothing here is a summary. For every row, the per-task reward column of
manifest.csv, averaged over the 140 benchmark tasks (a task without a reward
counts as 0, as in the paper), is the Overall published in Table 1 or Table 2,
and the per-family means are the appendix breakdown tables. All nineteen rows
reproduce to the second decimal (last checked 2026-09-26).
<table>/<generator>/<method>/
games.tar.gz <task>/… base project, or the build that was scored
scores.tar.gz <task>/p1..p3/ breakdown.json, judge_log.json, ctrf.json,
reward.txt, build.log
<task>/summary.json the 3-pass rewards
manifest.csv task, reward, champion round, and where each came from
games_addendum.tar.gz (some rows) game trees added after the first release
| row | Overall in the paper | tasks | game trees | champion = round 0 |
|---|---|---|---|---|
t1/glm/base — GLM-5.3-Flash · Base (frozen P0) | 29.46 | 140 | 140 | — |
t1/glm/play2code — GLM-5.3-Flash · Play2Code | 38.59 | 140 | 140 | — |
t1/glm/rsigame — GLM-5.3-Flash · RSIGame | 49.72 | 140 | 140 | 4 |
t1/gpt55/base — Codex + GPT-5.5 · Base (frozen P0) | 50.26 | 140 | 140 | — |
t1/gpt55/play2code — Codex + GPT-5.5 · Play2Code | 50.74 | 140 | 140 | — |
t1/gpt55/rsigame — Codex + GPT-5.5 · RSIGame | 64.53 | 140 | 140 | 12 |
t1/kimi/base — Kimi-K2.6 · Base (frozen P0) | 29.63 | 140 | 140 | — |
t1/kimi/play2code — Kimi-K2.6 · Play2Code | 35.19 | 140 | 140 | — |
t1/kimi/rsigame — Kimi-K2.6 · RSIGame | 44.77 | 140 | 140 | 21 |
t1/qwen/base — Qwen3.8-27B · Base (frozen P0) | 37.07 | 140 | 140 | — |
t1/qwen/play2code — Qwen3.8-27B · Play2Code | 40.53 | 140 | 139 | — |
t1/qwen/rsigame — Qwen3.8-27B · RSIGame | 47.77 | 140 | 139 | 49 |
t1/qwen_sft/base — Qwen3.8-27B (SFT) · Base (frozen P0) | 48.22 | 140 | 140 | — |
t2/gpt55/base — OpenGame + GPT-5.5 · Base (frozen P0) | 49.44 | 140 | 140 | — |
t2/gpt55/play2code — OpenGame + GPT-5.5 · Play2Code | 55.10 | 140 | 140 | — |
t2/gpt55/rsigame — OpenGame + GPT-5.5 · RSIGame | 58.21 | 140 | 140 | 61 |
t2/qwen/base — Qwen3.8-27B · Base (frozen P0) | 40.03 | 139 | 139 | — |
t2/qwen/play2code — Qwen3.8-27B · Play2Code | 48.70 | 137 | 137 | — |
t2/qwen/rsigame — Qwen3.8-27B · RSIGame | 50.24 | 138 | 138 | 65 |
tasks counts tasks with a reward; the rest of the 140 count as 0 in the paper
(Phaser tasks that shipped no demo script, and one Phaser base game never scored).
champion = round 0 means the Global Quality Monitor never promoted a new
build: development ran its budget and nothing beat the game it started from. The
scored build for those tasks is the base game, and that is what the archive
holds — not a missing file. 49 of the Qwen3.8-27B RSIGame tasks end that way,
which is a result, not a gap.
dist/ in Phaser projects. A build output; npm run build regenerates it
from the src/ and public/ that are here. Keeping it doubled the Phaser rows.| row group | base games | scored build | judge records |
|---|---|---|---|
| Base | r0_trees/<arm>/<task> — the tree each scoring's own source field names | the base itself | r0_scores/<arm>/<task>/p1..p3/ |
| Play2Code | same | the scoring copy _tree (run dirs keep only changed files) | p2c_scores/<arm>/<task>/p1..p3/ |
| RSIGame | same | runs/<task>/round_<champion>/tree, or the base when champion = 0 | that round's score_official/p1..p3/ |
The trap: r0_scores/<arm>.csv in the working tree is a stale by-product of
a scoring run that failed (missing libXcursor, partial imports). For the Qwen
arm it carries 18 zeros for games the rescored directory scores at 50 on
average. The per-task directories are authoritative; that CSV is not, and
nothing in this release was built from it.
Three independent replay-and-score passes by a Qwen3.8-27B judge against each
task's own rubric (12–21 items, most often 18), Q = BUILD × (0.15M + 0.35D + 0.15V + 0.35A).
judge_log.json holds one entry per (demo, rubric item) with the rationale —
which is how one can see an item scored 0 because the recording never showed the
screen it asks about.
.godot/ import cache is dropped — it stores the toolchain path
of the machine that built it and regenerates on first open.user:user, uid/gid 0.Game content, rubric text, judge rationales, rewards and timings are untouched.
Everything behind a published number: for each row of Table 1 and Table 2, the base game, the build that was actually scored, and the judge's own records for that build.
Nothing here is a summary. For every row, the per-task reward column of
manifest.csv, averaged over the 140 benchmark tasks (a task without a reward
counts as 0, as in the paper), is the Overall published in Table 1 or Table 2,
and the per-family means are the appendix breakdown tables. All nineteen rows
reproduce to the second decimal (last checked 2026-09-26).
<table>/<generator>/<method>/
games.tar.gz <task>/… base project, or the build that was scored
scores.tar.gz <task>/p1..p3/ breakdown.json, judge_log.json, ctrf.json,
reward.txt, build.log
<task>/summary.json the 3-pass rewards
manifest.csv task, reward, champion round, and where each came from
games_addendum.tar.gz (some rows) game trees added after the first release
| row | Overall in the paper | tasks | game trees | champion = round 0 |
|---|---|---|---|---|
t1/glm/base — GLM-5.3-Flash · Base (frozen P0) | 29.46 | 140 | 140 | — |
t1/glm/play2code — GLM-5.3-Flash · Play2Code | 38.59 | 140 | 140 | — |
t1/glm/rsigame — GLM-5.3-Flash · RSIGame | 49.72 | 140 | 140 | 4 |
t1/gpt55/base — Codex + GPT-5.5 · Base (frozen P0) | 50.26 | 140 | 140 | — |
t1/gpt55/play2code — Codex + GPT-5.5 · Play2Code | 50.74 | 140 | 140 | — |
t1/gpt55/rsigame — Codex + GPT-5.5 · RSIGame | 64.53 | 140 | 140 | 12 |
t1/kimi/base — Kimi-K2.6 · Base (frozen P0) | 29.63 | 140 | 140 | — |
t1/kimi/play2code — Kimi-K2.6 · Play2Code | 35.19 | 140 | 140 | — |
t1/kimi/rsigame — Kimi-K2.6 · RSIGame | 44.77 | 140 | 140 | 21 |
t1/qwen/base — Qwen3.8-27B · Base (frozen P0) | 37.07 | 140 | 140 | — |
t1/qwen/play2code — Qwen3.8-27B · Play2Code | 40.53 | 140 | 139 | — |
t1/qwen/rsigame — Qwen3.8-27B · RSIGame | 47.77 | 140 | 139 | 49 |
t1/qwen_sft/base — Qwen3.8-27B (SFT) · Base (frozen P0) | 48.22 | 140 | 140 | — |
t2/gpt55/base — OpenGame + GPT-5.5 · Base (frozen P0) | 49.44 | 140 | 140 | — |
t2/gpt55/play2code — OpenGame + GPT-5.5 · Play2Code | 55.10 | 140 | 140 | — |
t2/gpt55/rsigame — OpenGame + GPT-5.5 · RSIGame | 58.21 | 140 | 140 | 61 |
t2/qwen/base — Qwen3.8-27B · Base (frozen P0) | 40.03 | 139 | 139 | — |
t2/qwen/play2code — Qwen3.8-27B · Play2Code | 48.70 | 137 | 137 | — |
t2/qwen/rsigame — Qwen3.8-27B · RSIGame | 50.24 | 138 | 138 | 65 |
tasks counts tasks with a reward; the rest of the 140 count as 0 in the paper
(Phaser tasks that shipped no demo script, and one Phaser base game never scored).
champion = round 0 means the Global Quality Monitor never promoted a new
build: development ran its budget and nothing beat the game it started from. The
scored build for those tasks is the base game, and that is what the archive
holds — not a missing file. 49 of the Qwen3.8-27B RSIGame tasks end that way,
which is a result, not a gap.
dist/ in Phaser projects. A build output; npm run build regenerates it
from the src/ and public/ that are here. Keeping it doubled the Phaser rows.| row group | base games | scored build | judge records |
|---|---|---|---|
| Base | r0_trees/<arm>/<task> — the tree each scoring's own source field names | the base itself | r0_scores/<arm>/<task>/p1..p3/ |
| Play2Code | same | the scoring copy _tree (run dirs keep only changed files) | p2c_scores/<arm>/<task>/p1..p3/ |
| RSIGame | same | runs/<task>/round_<champion>/tree, or the base when champion = 0 | that round's score_official/p1..p3/ |
The trap: r0_scores/<arm>.csv in the working tree is a stale by-product of
a scoring run that failed (missing libXcursor, partial imports). For the Qwen
arm it carries 18 zeros for games the rescored directory scores at 50 on
average. The per-task directories are authoritative; that CSV is not, and
nothing in this release was built from it.
Three independent replay-and-score passes by a Qwen3.8-27B judge against each
task's own rubric (12–21 items, most often 18), Q = BUILD × (0.15M + 0.35D + 0.15V + 0.35A).
judge_log.json holds one entry per (demo, rubric item) with the rationale —
which is how one can see an item scored 0 because the recording never showed the
screen it asks about.
.godot/ import cache is dropped — it stores the toolchain path
of the machine that built it and regenerates on first open.user:user, uid/gid 0.Game content, rubric text, judge rationales, rewards and timings are untouched.