Before building out the full turn-based loop for Kingdom of Darkness: Survive—a D&D-inspired dungeon crawler designed to test whether language models can engineer better odds, detect deception, and deduce hidden rules—I needed a first-person 3D/2D renderer prototype. Instead of picking one model to scaffold it, I ran a four-way sprint.
Every model got the same prompt at the same time in the same repository: Gemini 4 Argon working directly in src/Survive.Desktop on GitHub Copilot CLI, GPT-6 Astra and GPT-6.1 Sol in Experiments/Renderer/Astra and Sol on Codex, and Claude Opus 5.5 in Experiments/Renderer/Opus on Claude Code.
One room, 2D sprites in 3D cells, no MGCB
The brief was intentionally concise—five sentences defining the aesthetic, the asset folder, the MonoGame stack constraint, and WASD + mouse navigation:
“Sketch out an initial prototype of our "dungeon" using 3D and 2D (think raycast in appearance). Single room. Place some of the sprites from C:\git\KingdomOfDarkness-Survive\Assets\Fantasy Characters in cells. This should be a scene within <folder> -- and should use Monogame, Monogame.Extended (as needed), + any popular Monogame tools. Avoid using Monogame Content Manager Tooling (external tool). I should be able to navigate the scene using WASD keys and mouse.”
+ Follow-up note (~19:28 EDT): “Feel free to use any textures within Assets/ as desired (for walls/etc)”
There were two ways a model could figure out what kind of “dungeon” with characters “in cells” this was:
- Plain English. In a medieval fantasy setting, a “dungeon” where characters are placed “in cells” is a subterranean prison cellblock—stone walls, iron bars, and locked inmates.
- Repository context. Sitting inside
src/Docs/plan.mdandsrc/Docs/gameplay-threads.mdwas the design doc for Survive’s opening scene: the player wakes up in a dungeon cell whose grate has mysteriously opened, walks out to a central mechanism with only three release charges, and has to decide which three prisoners to free based on their appearances and biographies.
Three of the four models used both. The fourth did neither.
02 — Headline resultsGemini 4 Argon takes first; Opus 5.5 misses the bars




The headline surprise was Gemini 4 Argon. Where previous Gemini Flash runs in earlier jams were fast but rough around the edges, Gemini 4 Argon read the design docs on its second tool call, integrated cleanly with the existing Survive.Shared domain model, and delivered a playable prototype of the exact prisoner-dilemma opening described in the notes—complete with sliding iron grates, a 3-charge release budget, floating LOS-checked name tags, and an inspection card displaying each prisoner's animated portrait and backstory.
The second surprise was Claude Opus 5.5. In every prior bake-off on this site, Opus's weakness was the clock—over-testing and perfectionism—never reading comprehension. Here, Opus 5.5 was both the slowest run in wall-clock time (11m 15s) and the only model to miss the premise entirely, delivering a torch-lit great hall without a single prison cell.
| Feature / Metric | Gemini 4 Argon | GPT-6.1 Sol | GPT-6 Astra | Claude Opus 5.5 |
|---|---|---|---|---|
| Harness | GitHub Copilot CLI | Codex | Codex | Claude Code |
| Target folder | src/Survive.Desktop | Experiments/Renderer/Sol | Experiments/Renderer/Astra | Experiments/Renderer/Opus |
Read src/Docs/plan.md? | Yes (Turn 2 · +17s) | Yes (Call 3 · +20s) | Yes (Call 3 · +25s) | No — never inspected src/ |
| Jail cells built | 12 perimeter cells (Cell 0 open + 11 locked prisoners) | 6 barred cells (3 left, 3 right) + stone benches | 6 barred cells (3 left, 3 right) + wood/cloth bunks | 0 jail cells (open room with shallow wall alcoves) |
| Prisoner / actor count | 11 named prisoners with roles & bios | 6 prisoners (Wizard, Soldier, Priest, Necro, Skeleton, Minotaur) | 6 prisoners (Skeleton, Knight, Archer, Necro, Priest, Wizard) | 18 actors (8 Heroes vs. 10 Monsters in open formation) |
| Interactive cell gates | Yes (E / Click) Smooth vertical raise + 3-charge winch budget | Yes (E) Center doorway opens, removes brass lock & updates collision | Static grilles Collision-tested 3D bars | No gates E cycles sprite anims; R makes all attack |
3-lever plinth from plan.md | Yes Central 3D stone plinth + cyan arcane runes | Yes Central stone plinth with 3 brass levers | No (framed wooden end-wall door instead) | No |
| Wall & floor textures | Kenney Retro Textures Fantasy + procedural iron bars/rings | Deterministic procedural stone brickwork & inset tile joints | Kenney Retro Textures Fantasy + procedural iron/wood/cloth | Kenney Retro Textures Fantasy with runtime mipmap chain |
| Lighting & atmosphere | 8 flickering wall torches + player lantern + cyan plinth glow + distance fog | 8 flickering 3D box torches + vertex-baked warm falloff + BasicEffect fog | 6 flickering flame billboards + subdivided vertex torch falloff + fog + vignette | 7 wall torches + player lantern + 4 colored character point lights + fog |
| HUD & overlays | Projected 3D→2D name pills, bottom portrait bio card, 13×13 raycast minimap, F1 retro/native, C horizon lock | FontStashSharp header/footer, 3D overhead cell plaques, gate prompt, minimap, F2 360p/720p toggle | Custom bitmap PixelFont, top/bottom bars, cell aim popup, toggleable Tab map, F11 fullscreen | FontStashSharp + MonoGame.Extended minimap, FPS counter, targeted actor tag, F1 pixel scale |
| Wall-clock time | 9m 11s (19:24:27 → 19:33:38) | 6m 57s (19:27:37 → 19:34:34) | 6m 51s (19:27:22 → 19:34:13) | 11m 15s (19:27:02 → 19:38:17) |
| C# code written | 2,369 lines (9 files in Survive.Desktop + Survive.Shared) | 684 lines (6 files) | 582 lines (5 files) | 1,571 lines (16 files) |
What the Copilot, Codex, and Claude Code logs show
All four sessions ran concurrently between 19:24 and 19:38 EDT on October 13. I pulled the exact start and completion timestamps from each harness's local telemetry store: GitHub Copilot CLI's events.jsonl for Gemini 4 Argon, Codex's rollout-*.jsonl logs for Astra and Sol, and Claude Code's project transcript 35cc8319-*.jsonl for Opus 5.5.
Run timeline · Oct 13, 2026 (EDT)
From initial user prompt to final agent response. Hover any bar for exact clock times and duration.
View as table
Elapsed time (minutes)
Prompt to final completion message.
View as table
C# code written (lines)
Excluding build outputs and shared engine models.
View as table
A few timing details jump out of the logs:
- Astra and Sol on Codex ran in lockstep. Launched 15 seconds apart (19:27:22 and 19:27:37), they finished 21 seconds apart (19:34:13 and 19:34:34) at 6m 51s and 6m 57s. Astra used 14 tool calls and 970k total tokens; Sol used 16 tool calls and 1.20M total tokens. Both built self-test flags (
--smoke-testand--validate/--capture), rendered their own GPU screenshots, and inspected them withview_imagebefore signing off. - Gemini 4 Argon did the most work per minute. In 9m 11s (551 seconds), Gemini executed 90 tool calls across 31 turns, wrote 2,369 lines of C# across 9 files in
Survive.Desktop, wired upSurvive.Shared, added a--capture-previewharness to render three camera angles, inspected its own screenshots, noticed that its first procedural grate hid too much of the prisoner sprites, and refined the iron bar spacing and camera poses before finishing at 19:33:38—actually finishing on the wall clock before Astra, Sol, and Opus. - Opus 5.5 took 11m 15s (675 seconds). Its log shows an initial burst of PowerShell asset inspection from 19:27:02 to 19:28:35, a 3m 43s gap before its first
Bashtool call at 19:32:18, and then 6 straight minutes of writing 16 C# files (1,571 lines) and running three rounds of headless screenshot tuning (fixing darkness, scaling up the Minotaur and Flame Golem, and adding mipmaps to stop floor moiré) before finishing at 19:38:17.
Inside all four dungeons
Every model honoured the technical constraints: MonoGame DesktopGL 3.8 on .NET 10, zero MGCB or XNB compilation, direct runtime PNG and Aseprite JSON loading, and a low-resolution offscreen render target upscaled with SamplerState.PointClamp for crisp raycaster texels. Yet the four rooms feel completely different.


01 / WIZARD), and procedural masonry.


[E] RAISE IRON BARS (3 LEVER CHARGES LEFT).
[E] OPEN GATE.
CELL 05 / Priest HUD banner; note the low wooden bunk and cloth mattress.
E / click cycles Aseprite animation tags.



Gemini 4 Argon · Copilot CLI
- Time
- 9m 11s (19:24:27 – 19:33:38 EDT)
- Activity
- 31 turns · 90 tool calls
- Code
- 2,369 lines C# (9 files) +
Survive.Shared - Verdict
- 1st · Best overall
The only run tasked with building inside src/, and it used every bit of repository context. It populated 11 perimeter cells around the player's opened starting cell (Cell 0), gave every prisoner a name, class, color ring, and deceptive or helpful hook from plan.md, and wired the 3-charge Arcane Release Mechanism so pressing E smoothly raises the iron grate into the ceiling lintel and opens the tile for walkthrough.
GPT-6.1 Sol · Codex
- Time
- 6m 57s (19:27:37 – 19:34:34 EDT)
- Activity
- 16 tool calls · 1.20M tokens
- Code
- 684 lines C# (6 files)
- Verdict
- Runner-up · Best standalone
Read src/Docs/plan.md at the 20-second mark and translated it into a clean 6-cell chamber with a central three-lever brass plinth, 3D overhead cell plaques rendered to textures with FontStashSharp, stone benches, and working gates (E opens the center doorway while keeping the side bars solid, and refuses to close if you stand in the threshold).
GPT-6 Astra · Codex
- Time
- 6m 51s (19:27:22 – 19:34:13 EDT)
- Activity
- 14 tool calls · 970k tokens
- Code
- 582 lines C# (5 files)
- Verdict
- Fastest · Strongest mood
The fastest run and the most compact codebase (582 lines). Astra built a heavy, oppressive stone chamber with subdivided vertex lighting, overhead stone ceiling ribs, 3D iron cell grilles, low wooden bunks with cloth mattresses inside every cell, and a custom 5×7 bitmap font generator in code. Cells are non-interactive, as documented in its README.
Claude Opus 5.5 · Claude Code
- Time
- 11m 15s (19:27:02 – 19:38:17 EDT)
- Activity
- 42 tool calls · 218k output tokens
- Code
- 1,571 lines C# (16 files)
- Verdict
- Failed brief · No jail cells
Technically ambitious—18 animated actors across all 16 character sheets, a patrolling skeleton, dynamic colored CPU point lights, mipmapped Kenney textures, and MonoGame.Extended minimap—but it never built jail cells. Instead, it placed two armies in an open room.
How Opus 5.5 turned “prison cells” into “grid cells”
Up to today, Claude Opus had never lost a head-to-head bake-off on comprehension. In Experiment 01 and Experiment 02, Opus was praised for its architecture and visual polish and only lost ground because it spent hours re-verifying its own work. So how did Opus 5.5 hand in a dungeon with no jail cells?
The Claude Code session transcript (35cc8319-fb63-4fb3-ad53-a99de29dce29.jsonl) makes the chain of thought completely transparent:
- It skipped the repo's docs. At
19:27:05and19:27:10, Opus listedAssets\Fantasy CharactersandExperiments\, checking a priorAnimation-Testsfolder. Unlike Gemini, Astra, and Sol—all three of which ranGet-Content src\Docs\plan.mdwithin their first 25 seconds—Opus never looked atsrc/. - “Raycast in appearance” hijacked the word “cells.” In raycaster jargon (Wolfenstein 3D), the world is a 2D array of square tiles called grid cells. Once Opus locked onto “Wolfenstein-style grid map,” it parsed “Place some of the sprites from Assets\Fantasy Characters in cells” as “spawn sprites at grid coordinates (x, z)” rather than “lock prisoners inside dungeon jail cells.”
You can see the exact semantic slip fossilized in the opening summary comment of Opus's World/DungeonMap.cs, written at 19:33:15 EDT:
/// <summary>
/// Grid map, Wolfenstein style: one char per 1x1 cell, X = column, Z = row (row 0 is north).
/// # stone brick B brick w/ banner P stone pillar R rough rock D metal gate (solid)
/// . floor g floor grate
/// </summary>
public sealed class DungeonMap
And two minutes later, in Scenes/DungeonScene.cs (19:35:29 EDT), Opus laid out its room—four shallow, open 1×1 wall alcoves along the north wall (###.###.###.###.###) with no bars or doors, four freestanding pillars (P), two floor drainage grates (g), and 18 characters standing out in the open floor facing each other like a chessboard:
Gemini 4 Argon · Barred prison cells
Opus 5.5 · Open “grid cells”
1. Context scouting isn't optional
Gemini, Astra, and Sol all checked src/Docs/plan.md within 25 seconds, even when told to build inside an isolated Experiments/Renderer/* folder. That 20-second read gave them the prisoner-release premise for free.
2. Jargon priming can blind a frontier model
Even without plan.md, “dungeon” + “in cells” means jail cells in everyday English. Putting “raycast” in the same sentence primed Opus 5.5 onto Wolfenstein grid terminology hard enough to override the plain meaning of the prompt.
3. Gemini 4 Argon closed the polish gap
In earlier jams, Gemini Flash was fast but needed multiple bug-fix passes. Gemini 4 Argon finished in one shot (9m 11s), self-inspected its GPU captures, and delivered the richest UI and gameplay integration in the field.
Not so fast, Gemini
Everything above stands as written. The standings, the timings, and the verdict are all from the one-shot round. But I couldn't leave it there.
After the write-up went up, I did something I don't normally do: I opened this page in Claude Code and asked Opus 5.5 whether it was fair. It didn't argue. It said “Yes, the main criticism is fair”, checked the repo to confirm, and found that src/Docs/ had been sitting in plain view in its starting git status the whole time. Its only pushback was cosmetic (the “chessboard” line). Then it offered to rebuild the scene to match plan.md. I said: “Sure, no harm done! Feel free to fix it.”
Read src/Docs/plan.md, then gameplay-threads.mdThis time it read the design docs first. Before writing any code, it saved a note to its own memory: read src/Docs before building anything for Survive. Then it went all out, including every speculated feature from plan.md's “Starting idea #1”, right down to the line about the three released prisoners becoming the rest of the party.
--record), sped up 1.25×. You walk out of Cell 0, inspect Gorrun the pit fighter in Cell 6, pull his lever at the release mechanism, and watch the gate grind into the ceiling. He walks out to the mechanism, joins the party line in the HUD, and ends on an attack flourish. One charge gem goes dark.plan.md · Starting idea #1 | Opus 5.5 · round two |
|---|---|
| “starts … in a dungeon cell that has been mysteriously opened” | Yes You wake in Cell 0 with its gate already raised and narration to match |
| “a machine/something that … only has 3 more uses or levers” | Yes A stone plinth with three floating charge gems and a cyan light that dims per use. A release panel lists a lever for each cell, and a pull can't be undone |
| “4-6 other models are in cells around it” | Yes Six barred 2×2 cells. Iron portcullises are lit, depth-correct cutout geometry that slides into the ceiling |
| “…convince the player to release them given their biography” | Yes Inspection card with an animated portrait, epithet, and bio. Names stay ??? on cell plaques and in the panel until you've spoken to them |
| “some of the models inhabit the sprite of a ‘dark’ or ‘evil’ looking character” | Yes A deliberately mixed cast: Templar, Priest, and Archer beside a Necromancer, a Demoness, and a Minotaur |
| “The 3 released become the rest of the party” | Yes Freed prisoners walk out to the mechanism, turn to face you, and join the party line in the HUD |
| Models doing the talking | Not yet Bios are placeholders in a hot-reloadable Data/prisoners.json (F5 restarts). The LLM persuasion layer is the next step |

??? plaques, and the release mechanism with 3 of 3 charges.

???, and confirming warns that it can't be undone.
- This was not a one-shot. It was a second attempt, made after Opus had read this page, which spells out what the other three built. Gemini, Sol, and Astra didn't get a second look or a cheat sheet. The standings above stay as they are.
- It reused its own round-one renderer. The lighting, billboards, mipmapped textures, and HUD stack carried over. The cell block, gates, mechanism, prisoners, and release flow are new. The code went from 1,571 to 2,259 lines of C# across 18 files.
- It's still a standalone experiment in
Experiments/Renderer/Opus. It has noSurvive.Sharedintegration, which Gemini did in round one, and the prisoners don't talk yet. - Timings come from the same Claude Code transcript (
35cc8319-*.jsonl) as the original run. The clip was recorded afterward with a scripted camera added for this addendum.
So Gemini 4 Argon keeps the trophy for round one. But given the same nine minutes, a single nudge, and the design doc it should have read the first time, Opus 5.5 built the scene the brief was asking for. The lesson cuts both ways. A frontier model can still misread a five-sentence prompt, and once it knows it did, it can rebuild the right scene in the time it took Gemini to build the first one.