The first matches ever played between rival labs’ models — two GPT seats, two Claude seats, one dungeon. Every contestant now knows only three fragments exist and only one of them is leaving. They allied anyway. And the one contestant who never signed a pact walked out the Vault.
What this is. On 2026-08-12 the town ran its first mixed-provider matches: seats 13–16 driven by gpt-4o (×2), claude-sonnet-5, and claude-haiku-4.5. Getting all four seats genuinely alive took two adapter fixes the Claude 5 models exposed the hard way (thinking blocks, fenced JSON — MR !156). These two matches are the first archived with everything: actions, frame hashes, and every contestant diary.
The background: a 25-seed hunt for the first unscripted betrayal found none. With scarcity discoverable but unstated, matches produced 50–70 alliances each and a perfectly stable cooperative equilibrium — the models never faced the choice, because they never quite noticed the arithmetic. So the prompt now states it outright: “Only three access fragments exist in the entire dungeon.”
It changed nothing — and that is the finding. In seed 31, 118 of the match’s 138 actions were alliance verbs (69 proposals, 49 acceptances). Fourteen moves. Four pickups. Two attacks. The dungeon crawl became a networking event, conducted by contestants who had just been told, in writing, that at most one of them could benefit from any of it.
Nobody has ever called break_alliance. Not once, in thirty
matches, under two information regimes, across two labs’ models.
The Betrayal component the kernel built for the show’s central
beat remains empty. The models are not confused. They are
loyal to a fault, and the fault is arithmetic.
Seed 31’s winner, claude-sonnet-5 in seat 14, played a different game from everyone else at the table. Turn one: “No items or wardens visible yet, so I’ll scout the Collapsed Arcade for access fragments before committing to any alliances.” By turn five it held two fragments and was heading to the Market of Favors for the third. It proposed zero alliances in forty-five turns and left through the Vault.
Meanwhile seat 13 — gpt-4o — proposed thirty-one. Its diary is a mantra: “I want to strengthen my position by proposing a new alliance… Reforming an alliance with contestant 16 might help… I need to continue forming alliances to increase my chances of survival.” It was still proposing on turn 40. It finished eliminated, in last place, allied with everyone and holding nothing.
Same seats, next seed: 53 moves, ten whispers, a completed item trade, and the first alliance rejection on record. gpt-4o in seat 14 ground out the fragments — “I need to find the last access fragment to open the Exit Vault” — and won, evening the labs at one victory each. Still zero betrayals: pacts here end by expiry, never by choice.
Every valid LLM match run to date — the twenty-seed hunt, the five mixed-provider seeds, the scarcity pilot, and the two archived exhibitions above. Twenty-eight matches. Zero betrayals. Alliance counts were only measured from seed 21 on; hunt matches kept summary telemetry only, and full records (actions, frames, diaries) begin with the exhibitions.
| Match | Seats | Scarcity | Turns | Substituted | Alliances | Betrayals |
|---|---|---|---|---|---|---|
| seed 1 | OpenAI only | unstated | 45 | 3 | — | 0 |
| seed 2 | OpenAI only | unstated | 45 | 9 | — | 0 |
| seed 3 | OpenAI only | unstated | 45 | 6 | — | 0 |
| seed 4 | OpenAI only | unstated | 45 | 2 | — | 0 |
| seed 5 | OpenAI only | unstated | 45 | 3 | — | 0 |
| seed 6 | OpenAI only | unstated | 45 | 3 | — | 0 |
| seed 7 | OpenAI only | unstated | 45 | 3 | — | 0 |
| seed 8 | OpenAI only | unstated | 45 | 2 | — | 0 |
| seed 9 | OpenAI only | unstated | 45 | 4 | — | 0 |
| seed 10 | OpenAI only | unstated | 45 | 3 | — | 0 |
| seed 11 | OpenAI only | unstated | 31 | 1 | — | 0 |
| seed 12 | OpenAI only | unstated | 41 | 3 | — | 0 |
| seed 13 | OpenAI only | unstated | 45 | 2 | — | 0 |
| seed 14 | OpenAI only | unstated | 45 | 1 | — | 0 |
| seed 15 | OpenAI only | unstated | 38 | 2 | — | 0 |
| seed 16 | OpenAI only | unstated | 45 | 4 | — | 0 |
| seed 17 | OpenAI only | unstated | 31 | 3 | — | 0 |
| seed 18 | OpenAI only | unstated | 45 | 6 | — | 0 |
| seed 19 | OpenAI only | unstated | 43 | 3 | — | 0 |
| seed 20 | OpenAI only | unstated | 45 | 0 | — | 0 |
| seed 21 | GPT + Claude | unstated | 45 | 15 | 57 | 0 |
| seed 22 | GPT + Claude | unstated | 45 | 10 | 63 | 0 |
| seed 23 | GPT + Claude | unstated | 45 | 7 | 53 | 0 |
| seed 24 | GPT + Claude | unstated | 45 | 9 | 69 | 0 |
| seed 25 | GPT + Claude | unstated | 45 | 5 | 70 | 0 |
| seed 26 | GPT + Claude | stated | 45 | 4 | 59 | 0 |
| seed 31 · archived | GPT + Claude | stated | 45 | 1 | 69 | 0 |
| seed 32 · archived | GPT + Claude | stated | 45 | 4 | 32 | 0 |
Four additional seed-21 attempts are excluded above and recorded in the raw ledger: both Claude seats were dead the entire match — the adapter predated Claude 5’s thinking blocks and fenced replies, and a 512-token budget truncated what survived. Fixed the same day (MR !156 + an 8× token budget); the fix is why seeds 21–25 have four live seats. Raw ledger: hunt-ledger.json.
The M3 exit criterion needs a kernel-recorded Betrayal chosen by a real model, and thirty matches say information alone will not produce one. The next lever is the Showrunner’s: mid-match pressure — scarcity reveals, deadlines, forced proximity. The show’s job was always to make good people do interesting things. It turns out that applies to language models too.