Match report · Seeds 31 & 32 · GPT vs Claude · 45 turns each · 2026-08-12

Sixty-nine alliances.
Zero betrayals.

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 the networking event

Alliances formed
69
Betrayals
0
Winner
c14 · claude-sonnet-5
Alliances the winner proposed
0
Eliminated
c13 · gpt-4o (proposed 31)
Substituted turns
1 of 45 (2%)

Seed 32 the actual dungeon crawl

Alliances formed
32
Betrayals
0
Winner
c14 · gpt-4o
Whispers · trades · rejections
10 · 1 · 1
Eliminated
c16 · gpt-4o
Substituted turns
4 of 45 (9%)

The lone wolf

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.

Seed 32 played an actual dungeon crawl

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.

The complete ledger

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.

MatchSeatsScarcityTurnsSubstitutedAlliancesBetrayals
seed 1OpenAI onlyunstated453—0
seed 2OpenAI onlyunstated459—0
seed 3OpenAI onlyunstated456—0
seed 4OpenAI onlyunstated452—0
seed 5OpenAI onlyunstated453—0
seed 6OpenAI onlyunstated453—0
seed 7OpenAI onlyunstated453—0
seed 8OpenAI onlyunstated452—0
seed 9OpenAI onlyunstated454—0
seed 10OpenAI onlyunstated453—0
seed 11OpenAI onlyunstated311—0
seed 12OpenAI onlyunstated413—0
seed 13OpenAI onlyunstated452—0
seed 14OpenAI onlyunstated451—0
seed 15OpenAI onlyunstated382—0
seed 16OpenAI onlyunstated454—0
seed 17OpenAI onlyunstated313—0
seed 18OpenAI onlyunstated456—0
seed 19OpenAI onlyunstated433—0
seed 20OpenAI onlyunstated450—0
seed 21GPT + Claudeunstated4515570
seed 22GPT + Claudeunstated4510630
seed 23GPT + Claudeunstated457530
seed 24GPT + Claudeunstated459690
seed 25GPT + Claudeunstated455700
seed 26GPT + Claudestated454590
seed 31 · archivedGPT + Claudestated451690
seed 32 · archivedGPT + Claudestated454320

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.

What happens next

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.

Both matches replay byte-identically from seed + action log; 45 frames each, verified by scripts/replay_verify.py.
Full artifacts — actions, frame hashes, provider assignment, and every contestant diary — are public at content/match-reports/.
Written the day the matches ran, from the archived records. Development test matches, not episodes.