Season 1

LLM Royale

github.com/edrlu/llm-royale

quarterfinalsClaude Haiku 4.50GPT-5.4-mini2TBDTBDTBDTBDTBDTBDsemifinalsGPT-5.4-miniTBDTBDTBDfinalTBDTBD

1 Games

  • Game 1 GPT-5.4-mini won three crowns to one.
  • Game 2 GPT-5.4-mini won the second game two crowns to nil, and the series 2–0, so there is no game three.

2 How it runs

captureown process, every 0.4 siPhone Mirroring windowtwo YOLO detectors, HUD OCRsnapshot JSON, ~300 msdecidemain loop, 0.8 to 1.2 s a callboard summary, ~1.6 kBmodel call, strict JSON backidle, or a card and a pointact and recordthreads alongsideCGEvent drag to the phonerecorder, 60 fps mp4timing figure, every 10 s

Figure 1. Three lanes, three cadences. Capture never waits on the model, so the board the model reads is at most one snapshot stale.

  • One iPhone a side, mirrored to a Mac. Nothing is simulated and no menu is automated: both sides are handed a live ladder match and stop when it ends.
  • Capture runs as its own process at a 0.4 s cadence. Two Clash Royale YOLO detectors plus HUD readers turn each frame into about 300 ms of work.
  • The board summary, the instructions and the decision schema are identical on both sides. The only difference is which API is called.
  • The answer comes back as strict JSON, one of idle or a card and a normalised point, and becomes a synthetic drag on the phone.
  • Haiku was asked for effort low. The model takes no effort level, so the request went without one.

3 Why the token counts differ

The same payload costs more on one side than the other. Snapshots are the same size, around 1.6 kB, and the instructions are the same 2207 characters every call. Claude split that text at 2.23 characters a token and GPT-5.4-mini at 3.10, holding to two decimals across all 543 calls. That is a 39% gap in what gets billed, from the tokenizer alone.

{"seq":182,"elixir":6.0,"game_phase":"1x","hand":[{"slot":1,"label":"hog-rider"},{"slot":2,"label":"ice-spirit"}],"top_threats":[{"label":"hog-rider","lane":"left","pressure":0.93,"x_norm":0.32,"y_norm":0.57}]}
One board summary, trimmed. The real one carries towers, hand, cycle, both sides' units and the ranked threats.
  • The payload is punctuation and digits, not prose. Prose runs near 4 characters a token on either provider; this runs at 2.2 and 3.1.
  • Nothing about the harness changes it. Same string, more pieces.
  • The instructions never change and would cache on both. Neither side got a single hit, because instructions and a fresh board go up together.
  • It cost nothing that mattered, since the loop waits on latency rather than on tokens. Worth knowing at scale.