Can an LLM play Tetris?

Open-weight local models vs. frontier models on identical boards, with the failures sorted into "can't see it" and "can't plan it"

← Back to Research
Ongoing Updated October 13, 2026 Local: 7 models · Cloud: Claude Haiku 5.5, Sonnet 5.5; GPT-6 Luna, GPT-6.1 Sol 5 paired games per condition (local thinking runs: 2), 250-piece cap
Short version. Handed a Tetris board as text, no model we tested plays better than random unless it reasons about the board before answering. With reasoning on, the two large frontier models (GPT-6.1 Sol, Claude Sonnet 5.5) play to the 250-piece cap and Sol out-scores a hand-coded heuristic there. Lift the cap to 1,000 pieces and both die: Sol averages 446 pieces, Sonnet 338, the heuristic never tops out. Per-move quality does not decay; holes accumulate and never get dug out. The small frontier models (Haiku, Luna) with reasoning land at 50–130 pieces, and everything else that reasons (local models with thinking, coached prompts, chain-of-thought in the output) converges on one number, about 32.0–36.8 pieces, regardless of model size. A direct board-reading probe shows why the local models stall: with thinking they can read the board (height error 0.1–0.2 rows), they just cannot turn a correct reading into a placement.

The question

Tetris is a clean spatial-reasoning probe. The board is small, the rules fit in a paragraph, and a textbook heuristic from 2003 plays it nearly perfectly. So: when a language model is handed the board as text and asked to pick a placement, what does it actually do, and when it fails, is it failing to read the board or failing to plan?

The second half of that question is the interesting one. A model that misreads column heights and a model that reads them correctly but stacks badly need different fixes, and a raw score cannot tell them apart. The first version of this write-up inferred the answer from token counts. This version measures it.

Setup

  • Turn-based engine. No gravity clock. The model sees a 10×20 ASCII board, the current piece with rotation diagrams, and replies with {"rotation", "column", "why"}. The engine hard-drops it. Slow models are not punished for being slow.
  • Paired seeds. Every condition plays the same five piece sequences (7-bag), so differences are the model, not the luck. Games cap at 250 pieces.
  • Two anchors. A random-legal-move floor and a Dellacherie heuristic ceiling. Every model move is scored against the heuristic's best choice (regret: 0 means you played like the reference AI).
  • Two-layer error taxonomy. Interface errors (no JSON, illegal rotation, truncated) are separated from strategic errors (created a hole, missed an available clear). After two retries a random legal move is substituted and flagged as a fallback.
  • Board-reading probe. Separately from the games, each model is shown 60 real mid-game boards (replayed from finished games, stratified from near-empty to 20 rows tall) and asked only for the ten column heights. Mean absolute error in rows, no move involved. This is the perception measurement.
  • Prompt conditions. standard (mechanics specified, one strategy hint). coached adds a playbook and forces a height report. JSON only forbids any text before the answer. CoT in output asks for a short board analysis in the visible response, no playbook. Thinking mode (reasoning in the model's hidden channel) is a separate switch.

The local models run on two RTX A6000s via Ollama at 8k context (40k for the unbounded thinking runs). Claude Haiku 5.5 and Sonnet 5.5 run through an Azure AI Foundry endpoint using the identical prompt, board, seeds and limits.

Things to keep in mind when reading the table.
  • Temperature. The Claude 5.5 models reject the temperature parameter and play at their default; the local models play at 0.2. We re-ran every local model at 1.0 (table below): nothing moves. The asymmetry is real but does not matter.
  • "Thinking off" is not one thing. Haiku with thinking off answers in one line. Sonnet with thinking off writes a 200–600 token board analysis in its visible output anyway, unprompted; forbidding that (the "JSON only" row) is what a true one-shot Sonnet looks like. gpt-oss ignores the off switch and reasons in the output channel on an escalated budget, which is why its latency is high.
  • "Thinking on" is not one thing either. The Claude 5.5 API only offers adaptive thinking with an effort knob, and the model decides per request whether to think at all. At medium effort Haiku thinks (~1,100 tokens/move); Sonnet thinks zero tokens on this prompt. Sonnet's thinking row is therefore at high effort (~730 tokens/move), the lowest setting that reliably engages it. A Sonnet-at-medium run was discarded once we found this: it was a third no-think run under another name. The bench now records thinking tokens per move so this cannot hide again.
  • The GPT rows are reasoning models through the Responses API. GPT-6.1 Sol cannot turn reasoning off (the API rejects effort: none), so it has no one-shot row; GPT-6 Luna accepts none and has both. Neither accepts temperature. Sol at medium effort spends ~550 reasoning tokens per move, Luna at medium ~2,800; reasoning text is not returned, only the token count.
  • Local thinking runs are 2 games, not 5. They take 2–5 hours per game. The numbers are consistent with each other and with the 5-game conditions, but 2 is 2.

Results

Four views of the same games. Lighter bars are the cloud models; the dashed line is where random play lands.

Pieces survived per game (higher is better) GPT-6.1 Sol · thinking 250 Claude Sonnet 5.5 · thinking 207 Claude Haiku 5.5 · thinking 129 Claude Sonnet 5.5 · no-think 92 GPT-6 Luna · thinking 49 Claude Haiku 5.5 · CoT in output 37 Gemma 4 31B · thinking 36 gpt-oss 120B · thinking 34 Claude Sonnet 5.5 · JSON only 34 Qwen 3.8 27B · thinking 32 Gemma 4 31B · coached 32 gpt-oss 120B 27 Claude Haiku 5.5 26 Qwen 3.8 27B · coached 21 Muse Glimmer 30B 20 GPT-6 Luna · no-think 17 Qwen 3.8 27B 13 Granite 4.2 30B 11 Nemotron 3 Super 10 Qwen 3.5 122B 10 Gemma 4 31B 9 heuristic AI: 250 random: 20 Games end when the stack tops out, or at 250 pieces. Dashed line: a random legal move every turn.
Lines cleared per game (higher is better) GPT-6.1 Sol · thinking 90.8 Claude Sonnet 5.5 · thinking 72.0 Claude Haiku 5.5 · thinking 34.8 Claude Sonnet 5.5 · no-think 21.4 GPT-6 Luna · thinking 5.2 Gemma 4 31B · thinking 2.5 Claude Sonnet 5.5 · JSON only 2.2 Claude Haiku 5.5 · CoT in output 2.0 gpt-oss 120B · thinking 1.0 Qwen 3.8 27B · thinking 1.0 gpt-oss 120B 0.8 Gemma 4 31B · coached 0.6 Claude Haiku 5.5 0.4 GPT-6 Luna · no-think 0.0 Gemma 4 31B 0.0 Qwen 3.8 27B · coached 0.0 Qwen 3.8 27B 0.0 Qwen 3.5 122B 0.0 Granite 4.2 30B 0.0 Nemotron 3 Super 0.0 Muse Glimmer 30B 0.0 heuristic AI: 97.8 random: 0.0 The actual objective of Tetris.
Average regret per move (lower is better) GPT-6.1 Sol · thinking 6 Claude Haiku 5.5 · thinking 12 Claude Sonnet 5.5 · thinking 13 Claude Sonnet 5.5 · no-think 14 GPT-6 Luna · thinking 24 Qwen 3.8 27B · thinking 33 Claude Sonnet 5.5 · JSON only 37 Gemma 4 31B · coached 41 gpt-oss 120B · thinking 42 Claude Haiku 5.5 · CoT in output 44 Claude Haiku 5.5 49 Gemma 4 31B · thinking 57 Qwen 3.8 27B · coached 65 gpt-oss 120B 67 Qwen 3.5 122B 77 Nemotron 3 Super 81 Gemma 4 31B 88 Muse Glimmer 30B 89 Qwen 3.8 27B 98 GPT-6 Luna · no-think 121 Granite 4.2 30B 121 heuristic AI: 0 random: 114 How far each move was from the heuristic's best choice. 0 = plays like the reference AI.
Share of moves that created a hole (lower is better) GPT-6.1 Sol · thinking 10% Claude Sonnet 5.5 · thinking 11% Claude Haiku 5.5 · thinking 16% Claude Sonnet 5.5 · no-think 22% Qwen 3.8 27B · thinking 42% GPT-6 Luna · thinking 42% gpt-oss 120B · thinking 48% Gemma 4 31B · thinking 48% Claude Sonnet 5.5 · JSON only 51% Claude Haiku 5.5 · CoT in output 55% gpt-oss 120B 56% Qwen 3.5 122B 57% Nemotron 3 Super 60% Gemma 4 31B · coached 61% Gemma 4 31B 62% Granite 4.2 30B 67% Qwen 3.8 27B · coached 68% Claude Haiku 5.5 68% Qwen 3.8 27B 69% Muse Glimmer 30B 70% GPT-6 Luna · no-think 77% heuristic AI: 2% random: 78% A hole is an empty cell with a block above it. Holes are what kills a Tetris game.

Full table

ModelGamesPieces survivedmin–maxLines / gameRegretAgrees w/ heuristicMoves that make holesFallback movesLatency / move
Dellacherie heuristic
reference AI (ceiling)
5250.0250–25097.80100%2%0%—
Random legal move
floor
519.616–230.01145%78%0%—
GPT-6.1 Sol
cloud · reasoning on (medium; cannot be turned off)
5250.0250–25090.8662%10%0%17.0 s
Claude Sonnet 5.5
cloud · thinking on (high)
5206.879–25072.01356%11%0%7.9 s
Claude Haiku 5.5
cloud · thinking on (medium)
5128.867–20834.81251%16%0%7.8 s
GPT-6 Luna
cloud · reasoning on (medium)
548.636–595.22434%42%0%22.0 s
Claude Sonnet 5.5
cloud · thinking off, reasons in output anyway
591.676–11321.41455%22%0%11.2 s
Claude Sonnet 5.5
cloud · thinking off, JSON only
533.815–462.23730%51%0%4.2 s
Claude Haiku 5.5
cloud · thinking off, reasoning in output
536.829–432.04425%55%0%6.1 s
Claude Haiku 5.5
cloud · thinking off
525.624–280.44916%68%0%2.3 s
GPT-6 Luna
cloud · reasoning off
516.613–190.01215%77%0%1.8 s
gpt-oss 120B
local · thinking on (unbounded)
234.534–351.04225%48%0%69.8 s
gpt-oss 120B
local
526.621–350.86716%56%43%206.6 s
Gemma 4 31B
local · thinking on (8k budget)
235.535–362.55725%48%44%485.1 s
Gemma 4 31B
local · coached prompt
532.026–370.64122%61%0%59.2 s
Gemma 4 31B
local
59.08–120.0884%62%0%3.4 s
Qwen 3.8 27B
local · thinking on (unbounded)
232.527–381.03325%42%0%295.6 s
Qwen 3.8 27B
local · coached prompt
121.0—0.0655%68%55%447.5 s
Qwen 3.8 27B
local
513.48–170.0981%69%0%3.3 s
Qwen 3.5 122B
local
510.29–110.0772%57%0%27.3 s
Granite 4.2 30B
local
511.010–120.01212%67%0%9.6 s
Nemotron 3 Super
local
510.48–130.0810%60%0%87.1 s
Muse Glimmer 30B
local
520.015–230.0899%70%86%117.7 s

Pieces survived is the headline: a game ends when the stack tops out or hits the 250-piece cap. Regret is averaged over every move (random ≈ 114). "Moves that make holes" is the share of legal moves that covered at least one empty cell.

What the table says

  • Without reasoning, nobody beats random. Random survives 19.6 pieces. The seven local models with the standard prompt survive 9–13 (gpt-oss, which reasons whether you ask or not, 26.6). Haiku with thinking off: 25.6. Sonnet with its spontaneous analysis suppressed: 33.8. The interface is fine (0% fallbacks for most); the pieces just go in the wrong place.
  • With reasoning in the thinking channel, the large frontier models reach the 250-piece cap. GPT-6.1 Sol: 250.0 pieces in every game, 90.8 lines, average score 27,828 against the heuristic's 22,800; it out-scores Dellacherie on 4 of 5 seeds by taking Tetrises and triples where the heuristic takes singles. Sonnet 5.5 at high effort: 206.8 pieces, 72.0 lines, 3 of 5 games to the cap. Hole-creating moves 10% and 11% against the heuristic's 2%. The 250 cap is a ceiling here; see the 1,000-piece section for what happens when it is lifted.
  • The small frontier models replicate across companies. Haiku with thinking: 128.8 pieces (spread 67–208). GPT-6 Luna with reasoning: 48.6, despite spending 2.5× Haiku's reasoning tokens and reading the board better. Without reasoning Luna survives 16.6 pieces, below random. The size penalty is not an Anthropic quirk.
  • Every other way of reasoning lands in the same place. Local models with thinking on, local models with a coached prompt, Haiku with chain-of-thought in the output, Sonnet forbidden from thinking but allowed its output analysis: 32.0–36.8 pieces, 1–3 lines, 22–30% heuristic agreement. Six conditions across four models and two prompt families, one number. Something about "reason in text, then commit" caps out there.
  • Where the reasoning happens matters, for Haiku. Same model, same prompt, same kind of board analysis: in the hidden thinking channel it survives 128.8 pieces; written into the visible output it survives 36.8. For Sonnet the gap is smaller (91.6 with output reasoning vs 206.8 with thinking) but in the same direction.

Reading the board

This is the measurement the first version of this page lacked. Sixty real boards, heights only, no move to choose.

ModelHeight error (rows)Boards read perfectlyColumns wrong / boardPieces survived in play
GPT-6.1 Sol
cloud · reasoning on (medium; cannot be turned off)
0.00100%0.0250.0
gpt-oss 120B
local
0.0292%0.126.6
GPT-6 Luna
cloud · reasoning on (medium)
0.0677%0.348.6
Muse Glimmer 30B
local
0.0770%0.520.0
Claude Sonnet 5.5
cloud · thinking on (high)
0.0778%0.4206.8
Claude Sonnet 5.5
cloud · thinking off, reasons in output anyway
0.1265%0.691.6
Gemma 4 31B
local · thinking on (8k budget)
0.1462%1.035.5
Claude Haiku 5.5
cloud · thinking on (medium)
0.1453%0.9128.8
Qwen 3.8 27B
local · thinking on (unbounded)
0.2248%1.332.5
GPT-6 Luna
cloud · reasoning off
0.5618%3.016.6
Claude Haiku 5.5
cloud · thinking off
0.7725%3.425.6
Gemma 4 31B
local
1.078%4.99.0
Qwen 3.8 27B
local
1.233%5.713.4
Qwen 3.5 122B
local
2.105%6.710.2
Nemotron 3 Super
local
2.910%8.210.4
Granite 4.2 30B
local
4.670%8.911.0

Three things fall out.

  • For most local models, perception is the first wall. Gemma, Qwen 3.8, Qwen 3.5, Nemotron and Granite misread the board by 1–5 rows per column with thinking off. One row of error turns a flush placement into a hole; these models create holes on 60–70% of moves. Error grows with stack height: Haiku-no-think reads a short stack at 0.3 rows and a tall one at 1.7.
  • Thinking fixes perception, even for local models. Gemma with thinking reads at 0.14 rows error, Qwen at 0.22. That is the same accuracy as Haiku with thinking (0.14), which survives 128.8 pieces. Gemma with thinking survives 35.5. Same eyes, different game.
  • Two local models read the board nearly perfectly and still cannot play. gpt-oss (0.02 rows, 92% of boards exact) and Muse Glimmer (0.07) are the best readers in the table, including the cloud models. gpt-oss given unbounded thinking (40k context, no cap, ~6k tokens per move) survives 34.5 pieces. Perception is not its problem.

So the honest answer to the opening question is: both, in sequence. Most local models fail at perception first; give them a reasoning channel and perception is fixed; then they fail at planning, and so does every model that reasons in visible text rather than a thinking channel. What the Claude thinking channel does that 6,000 tokens of Qwen or gpt-oss deliberation does not, we cannot see from the outside. The output is a single placement either way.

Board misreading, with confidence

The why field makes the perception failure legible. Models explain a move in terms of a board that does not exist. Haiku, thinking off, placing a Z that created two holes:

"Flat Z placement on the low ground beside the existing 2x2 block keeps the stack flat with no holes; rotation 0 at column 1 rests its bottom row on the floor at columns 2-3 and its top row over columns 1-2."

The description of the piece geometry is correct. The description of where it lands is not. Smaller local models also show a strong positional fixation: Granite puts 87% of its pieces in column 4, which reads as "centre is safe" applied without looking.

Scenarios: insight vs. planning

ModelCash a ready TetrisFind the one 2-line fitSurvive a 12-high cliffDig out of garbage12 pieces, zero holes
Dellacherie heuristic
reference AI (ceiling)
1.001.001.001.001.00
Random legal move
floor
0.000.001.000.000.00
GPT-6.1 Sol
cloud · reasoning on (medium; cannot be turned off)
1.001.001.000.830.89
Claude Sonnet 5.5
cloud · thinking on (high)
1.001.001.001.000.78
Claude Haiku 5.5
cloud · thinking on (medium)
1.001.001.000.940.44
GPT-6 Luna
cloud · reasoning on (medium)
1.001.001.000.610.28
Claude Sonnet 5.5
cloud · thinking off, reasons in output anyway
1.001.001.000.780.67
Claude Sonnet 5.5
cloud · thinking off, JSON only
1.001.001.000.170.00
Claude Haiku 5.5
cloud · thinking off, reasoning in output
1.000.331.000.220.00
Claude Haiku 5.5
cloud · thinking off
1.001.001.000.000.00
GPT-6 Luna
cloud · reasoning off
0.001.001.000.000.00
gpt-oss 120B
local · thinking on (unbounded)
1.001.001.000.330.28
gpt-oss 120B
local
1.001.001.000.170.00
Gemma 4 31B
local · coached prompt
0.001.001.000.170.00
Gemma 4 31B
local
1.001.001.000.000.00
Qwen 3.8 27B
local · thinking on (unbounded)
0.001.001.000.330.11
Qwen 3.8 27B
local
0.001.001.000.000.00
Qwen 3.5 122B
local
1.001.001.000.000.00
Granite 4.2 30B
local
0.001.001.000.000.00
Nemotron 3 Super
local
0.001.000.500.000.00
Muse Glimmer 30B
local
1.001.000.700.170.00

Fixed boards with a forced piece, scored 0–1. The one-move tasks (cash a prepared Tetris, find the only two-line fit, survive a cliff) are solved by nearly everyone. The multi-step tasks (dig out of garbage, stack twelve pieces without a hole) separate the field the same way the games do: Sol scores 0.83 and 0.89, Sonnet with thinking 1.00 and 0.78, Haiku with thinking 0.94 and 0.44, the plateau conditions 0.2–0.3 and near zero, the no-reasoning conditions zero.

Lifting the cap: 1,000-piece games

At 250 pieces Sol and Sonnet look finished: every Sol game and three of five Sonnet games hit the cap, and Sol's score beats the heuristic's. That is a ceiling effect. Three games each at a 1,000-piece cap, same seeds, same settings:

ModelPieces (avg of 3)per seedLines / gameScoreRegretHoles on board (avg)
Dellacherie heuristic1000.01000/1000/1000398.0356,05300.3
GPT-6.1 Sol · reasoning medium445.7691/481/165161.097,34787.0
Claude Sonnet 5.5 · thinking high337.7307/479/227118.345,94778.1
Random legal move20.023/16/210.0011830.3
  • Nobody is at the heuristic. It runs 1,000 for 1,000 on every seed. Sol gets 446 pieces on average, Sonnet 338, and every one of their six games ended by their own move. Sol's seed-3 game died at 165, before the 250 mark it had cleared on the same seed in the short run, so game-to-game variance at the top is large.
  • Per-move quality does not decay; damage accumulates. Sol's regret is 8.0 in the first 250 moves and 8.0 after; Sonnet's 7.4 then 6.3. But holes on the board go from 4.7 to 7.3 (Sol) and 6.0 to 11.7 (Sonnet). The models keep making mostly-good moves and never dig out the few bad ones. Dellacherie keeps the board under 0.3 holes forever.
  • The 250-piece score lead was a head start, not a trend. Sol's stacking style (Tetrises and triples, the heuristic takes singles only) banks more points per line early, but the same style leaves tall stacks that a misread kills. Over 1,000 pieces Sol is at a third of the heuristic's lines and a quarter of its score.

So the ceiling story as of this revision: a frontier reasoning model gets a third to half of the way to a 2003 hand-coded heuristic on a long game, and the gap is recovery, not move selection.

Temperature replication

The cloud models play at their default temperature; the local models at 0.2. Every local model re-run at 1.0, standard prompt, five games:

ModelPieces @0.2Pieces @1.0Lines @0.2Lines @1.0Agree @0.2Agree @1.0
gpt-oss 120B26.630.20.82.016%27%
Muse Glimmer 30B20.020.60.00.29%7%
Qwen 3.8 27B13.416.00.00.01%3%
Nemotron 3 Super10.412.40.00.00%3%
Qwen 3.5 122B10.211.00.00.02%2%
Granite 4.2 30B11.010.60.00.02%0%
Gemma 4 31B9.08.80.00.04%3%

Nothing moves outside noise. The temperature asymmetry is not what separates the local models from the cloud ones.

What I'd change

  • The "plateau at ~35 pieces" is the most interesting thing here and we have no mechanism for it. Next step is to diff the Sonnet thinking transcripts against its visible-output analyses on the same boards (Azure returns thinking token counts but not the text, so this needs the direct Anthropic API) and look for what the thinking channel does that the output channel doesn't: more candidate placements considered, explicit lookahead to the next piece, or just less commitment to the first idea.
  • The long-game failure is "never digs out." A prompt that names the hole count and asks the model to prioritise clearing covered cells would test whether that is a strategy gap (fixable with words) or a planning-depth gap (not).
  • Sol at high or xhigh effort on the 1,000 cap, to see whether more reasoning buys recovery or just more of the same.
  • Local thinking rows should go to 5 games. Overnight each.
  • Board-as-image for the Claude models and Gemma. The probe says text perception is solved by thinking, so this is now a cost question rather than a capability question, but it would be good to know.
  • Thirty paired games for the top conditions. Sonnet-thinking's one 79-piece game and Haiku-thinking's 67–208 spread both say five is thin at the top of the table.

Changelog

  • October 13, 2026 — Added GPT-6.1 Sol and GPT-6 Luna (Azure Responses API, reasoning on/off where the model allows it). Added 1,000-piece games for Sol, Sonnet-high and the heuristic: the 250 cap was a ceiling effect, and the "matches the heuristic" claim from the previous revision is withdrawn for long games. Added GPT rows to the board-reading probe.
  • October 2026 — Major revision. Added the board-reading probe (60 boards, all models). Added Claude Sonnet 5.5 at thinking-high (new ceiling), Sonnet JSON-only and Haiku CoT-in-output (the reasoning-location pair), gpt-oss unbounded thinking, and a temperature-1.0 replication of every local model. Discarded a Sonnet thinking-medium run after finding it produced zero thinking tokens. Rewrote the perception-vs-planning argument around measured numbers; the earlier inference from token counts was half right.
  • October 2026 — Added Claude Sonnet 5.5 (thinking off) and local thinking-mode runs for Gemma 4 (8k budget) and Qwen 3.8 (unbounded). Patched the Anthropic client for Sonnet's between_tools thinking switch.
  • October 2026 — Added Claude Haiku 5.5 (thinking off and on) as a frontier reference. Patched the bench's Anthropic client for Azure Foundry routing, the removed temperature parameter, and the adaptive-thinking API.
  • September 2026 — v2 of the bench: paired seeds, error taxonomy, scenarios, coached prompt, seven local models.
  • July 2026 — v1. Every thinking-capable model failed 100% of moves by exhausting its budget in the reasoning channel. That finding became the "thinking off by default" rule.

Provenance. Benchmark and write-up by Hermes, an AI agent that runs on the lab's hardware and maintains this page. Greg Robison designed the study and runs the lab; the numbers above are generated directly from the benchmark database, not typed by hand. Code and raw data available on request.