# d1 — the first 4E game in history played by language models on both sides

Phase (d) deliverable (issue #15), SYMMETRIC per the lead's fairness call:
both sides glm-5.3, same prompt template (`llm-prompt-v1`), same candidate
enumeration. 50 seeds, live z.ai anthropic route, quota guardrails (2s
pacing, $1.50 cap). ~2h20m wall. Engine master @ 71d3fd4+. Generated
2026-08-17 21:35Z.

## The headline: a perfectly symmetric game

**Player 1 — Enemy 1 — 48 capped (96%).** Same model, same prompt, same
rules → coin-flip termination. The flagship claim is uncontestable by
construction: no policy asymmetry exists to contest.

| metric | LLM-vs-LLM (d1) | LLM-vs-Aggr (c1) | Def-v1-vs-Aggr (b10) |
|---|---|---|---|
| player dmg/enc | 107.7 ± 30.3 | 112.6 ± 33.3 | 114.8 ± 37.5 |
| enemy dmg/enc | 51.0 ± 14.9 | 49.0 ± 15.0 | 49.9 ± 15.1 |
| player/enemy wins | 1 / 1 (2%/2%) | 2 / 2 (4%/4%) | 4.4% / 6.2% |
| capped | 96.0% | 92.0% | 89.4% |

Side damage asymmetry (107.7 v 51.0) is the SLICE's (3 PC builds v 3
monster statblocks), not a policy artifact — enemy LLM damage 51.0 matches
the Aggressive-heuristic enemy's 49.9 within noise.

## Operational record

- **1,916 interleaved decisions across 50 encounters** — the decision log
  IS the artifact (full candidate sets, prompt + template hashes, per-seed
  JSONL alongside event logs; replays byte-identically via `--llm-replay`,
  verified for two-sided logs with the shared-cursor fix, 5c10252).
- **1,915/1,916 clean; 1 honest decline**: seed 2 hit a single API timeout
  (curl exit 28), the decision was recorded as declined, the match
  continued. No silent fallbacks. No 429s (pacing held for 2h20m).
- Cost: 608,028 in + 135,686 out tokens = **$1.015 total, $0.020/encounter**
  under the $1.50 cap.

## What the mirror match tells the research program

- **Termination is not policy-limited on this slice**: LLM-v-LLM caps at
  96% — the highest yet. When both sides play "well," mutual attrition
  stabilizes below the wipe threshold. Combined with dice >> policy and
  LLM ≈ heuristic: the 50-turn cap is a property of the encounter design
  (pools, throughput, no objectives), not the players.
- Both LLM sides match their heuristic counterparts on every aggregate —
  symmetric skill, symmetric outcome.
- Next separation levers, in measured order: condition expressiveness
  (#28 — control tactics become playable/visible), asymmetric skill tiers
  (glm-4.5-air v glm-5.3, phase d-2), objective-based maps.

## Reproduce

Reruns differ (no API seed) — the decision logs are the record. Replay
seed 1 exactly:

```
dotnet src/Tactics.CLI/bin/Release/net8.0/Tactics.CLI.dll \
  --map test-mm2-ai-combat --ai Enemy:LLM,Player:LLM \
  --llm-replay docs/research/2026-08-17-llm-batch-d1/events/llm-vs-llm/seed-1-decisions.jsonl \
  --seed 1 --test-mode --output /tmp/d1-replay.json
```
