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.
- Temperature. The Claude 5.5 models reject the
temperatureparameter 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
mediumeffort Haiku thinks (~1,100 tokens/move); Sonnet thinks zero tokens on this prompt. Sonnet's thinking row is therefore athigheffort (~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 acceptsnoneand has both. Neither acceptstemperature. 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.
Full table
| Model | Games | Pieces survived | min–max | Lines / game | Regret | Agrees w/ heuristic | Moves that make holes | Fallback moves | Latency / move |
|---|---|---|---|---|---|---|---|---|---|
| Dellacherie heuristic reference AI (ceiling) | 5 | 250.0 | 250–250 | 97.8 | 0 | 100% | 2% | 0% | — |
| Random legal move floor | 5 | 19.6 | 16–23 | 0.0 | 114 | 5% | 78% | 0% | — |
| GPT-6.1 Sol cloud · reasoning on (medium; cannot be turned off) | 5 | 250.0 | 250–250 | 90.8 | 6 | 62% | 10% | 0% | 17.0 s |
| Claude Sonnet 5.5 cloud · thinking on (high) | 5 | 206.8 | 79–250 | 72.0 | 13 | 56% | 11% | 0% | 7.9 s |
| Claude Haiku 5.5 cloud · thinking on (medium) | 5 | 128.8 | 67–208 | 34.8 | 12 | 51% | 16% | 0% | 7.8 s |
| GPT-6 Luna cloud · reasoning on (medium) | 5 | 48.6 | 36–59 | 5.2 | 24 | 34% | 42% | 0% | 22.0 s |
| Claude Sonnet 5.5 cloud · thinking off, reasons in output anyway | 5 | 91.6 | 76–113 | 21.4 | 14 | 55% | 22% | 0% | 11.2 s |
| Claude Sonnet 5.5 cloud · thinking off, JSON only | 5 | 33.8 | 15–46 | 2.2 | 37 | 30% | 51% | 0% | 4.2 s |
| Claude Haiku 5.5 cloud · thinking off, reasoning in output | 5 | 36.8 | 29–43 | 2.0 | 44 | 25% | 55% | 0% | 6.1 s |
| Claude Haiku 5.5 cloud · thinking off | 5 | 25.6 | 24–28 | 0.4 | 49 | 16% | 68% | 0% | 2.3 s |
| GPT-6 Luna cloud · reasoning off | 5 | 16.6 | 13–19 | 0.0 | 121 | 5% | 77% | 0% | 1.8 s |
| gpt-oss 120B local · thinking on (unbounded) | 2 | 34.5 | 34–35 | 1.0 | 42 | 25% | 48% | 0% | 69.8 s |
| gpt-oss 120B local | 5 | 26.6 | 21–35 | 0.8 | 67 | 16% | 56% | 43% | 206.6 s |
| Gemma 4 31B local · thinking on (8k budget) | 2 | 35.5 | 35–36 | 2.5 | 57 | 25% | 48% | 44% | 485.1 s |
| Gemma 4 31B local · coached prompt | 5 | 32.0 | 26–37 | 0.6 | 41 | 22% | 61% | 0% | 59.2 s |
| Gemma 4 31B local | 5 | 9.0 | 8–12 | 0.0 | 88 | 4% | 62% | 0% | 3.4 s |
| Qwen 3.8 27B local · thinking on (unbounded) | 2 | 32.5 | 27–38 | 1.0 | 33 | 25% | 42% | 0% | 295.6 s |
| Qwen 3.8 27B local · coached prompt | 1 | 21.0 | — | 0.0 | 65 | 5% | 68% | 55% | 447.5 s |
| Qwen 3.8 27B local | 5 | 13.4 | 8–17 | 0.0 | 98 | 1% | 69% | 0% | 3.3 s |
| Qwen 3.5 122B local | 5 | 10.2 | 9–11 | 0.0 | 77 | 2% | 57% | 0% | 27.3 s |
| Granite 4.2 30B local | 5 | 11.0 | 10–12 | 0.0 | 121 | 2% | 67% | 0% | 9.6 s |
| Nemotron 3 Super local | 5 | 10.4 | 8–13 | 0.0 | 81 | 0% | 60% | 0% | 87.1 s |
| Muse Glimmer 30B local | 5 | 20.0 | 15–23 | 0.0 | 89 | 9% | 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.
| Model | Height error (rows) | Boards read perfectly | Columns wrong / board | Pieces survived in play |
|---|---|---|---|---|
| GPT-6.1 Sol cloud · reasoning on (medium; cannot be turned off) | 0.00 | 100% | 0.0 | 250.0 |
| gpt-oss 120B local | 0.02 | 92% | 0.1 | 26.6 |
| GPT-6 Luna cloud · reasoning on (medium) | 0.06 | 77% | 0.3 | 48.6 |
| Muse Glimmer 30B local | 0.07 | 70% | 0.5 | 20.0 |
| Claude Sonnet 5.5 cloud · thinking on (high) | 0.07 | 78% | 0.4 | 206.8 |
| Claude Sonnet 5.5 cloud · thinking off, reasons in output anyway | 0.12 | 65% | 0.6 | 91.6 |
| Gemma 4 31B local · thinking on (8k budget) | 0.14 | 62% | 1.0 | 35.5 |
| Claude Haiku 5.5 cloud · thinking on (medium) | 0.14 | 53% | 0.9 | 128.8 |
| Qwen 3.8 27B local · thinking on (unbounded) | 0.22 | 48% | 1.3 | 32.5 |
| GPT-6 Luna cloud · reasoning off | 0.56 | 18% | 3.0 | 16.6 |
| Claude Haiku 5.5 cloud · thinking off | 0.77 | 25% | 3.4 | 25.6 |
| Gemma 4 31B local | 1.07 | 8% | 4.9 | 9.0 |
| Qwen 3.8 27B local | 1.23 | 3% | 5.7 | 13.4 |
| Qwen 3.5 122B local | 2.10 | 5% | 6.7 | 10.2 |
| Nemotron 3 Super local | 2.91 | 0% | 8.2 | 10.4 |
| Granite 4.2 30B local | 4.67 | 0% | 8.9 | 11.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
| Model | Cash a ready Tetris | Find the one 2-line fit | Survive a 12-high cliff | Dig out of garbage | 12 pieces, zero holes |
|---|---|---|---|---|---|
| Dellacherie heuristic reference AI (ceiling) | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 |
| Random legal move floor | 0.00 | 0.00 | 1.00 | 0.00 | 0.00 |
| GPT-6.1 Sol cloud · reasoning on (medium; cannot be turned off) | 1.00 | 1.00 | 1.00 | 0.83 | 0.89 |
| Claude Sonnet 5.5 cloud · thinking on (high) | 1.00 | 1.00 | 1.00 | 1.00 | 0.78 |
| Claude Haiku 5.5 cloud · thinking on (medium) | 1.00 | 1.00 | 1.00 | 0.94 | 0.44 |
| GPT-6 Luna cloud · reasoning on (medium) | 1.00 | 1.00 | 1.00 | 0.61 | 0.28 |
| Claude Sonnet 5.5 cloud · thinking off, reasons in output anyway | 1.00 | 1.00 | 1.00 | 0.78 | 0.67 |
| Claude Sonnet 5.5 cloud · thinking off, JSON only | 1.00 | 1.00 | 1.00 | 0.17 | 0.00 |
| Claude Haiku 5.5 cloud · thinking off, reasoning in output | 1.00 | 0.33 | 1.00 | 0.22 | 0.00 |
| Claude Haiku 5.5 cloud · thinking off | 1.00 | 1.00 | 1.00 | 0.00 | 0.00 |
| GPT-6 Luna cloud · reasoning off | 0.00 | 1.00 | 1.00 | 0.00 | 0.00 |
| gpt-oss 120B local · thinking on (unbounded) | 1.00 | 1.00 | 1.00 | 0.33 | 0.28 |
| gpt-oss 120B local | 1.00 | 1.00 | 1.00 | 0.17 | 0.00 |
| Gemma 4 31B local · coached prompt | 0.00 | 1.00 | 1.00 | 0.17 | 0.00 |
| Gemma 4 31B local | 1.00 | 1.00 | 1.00 | 0.00 | 0.00 |
| Qwen 3.8 27B local · thinking on (unbounded) | 0.00 | 1.00 | 1.00 | 0.33 | 0.11 |
| Qwen 3.8 27B local | 0.00 | 1.00 | 1.00 | 0.00 | 0.00 |
| Qwen 3.5 122B local | 1.00 | 1.00 | 1.00 | 0.00 | 0.00 |
| Granite 4.2 30B local | 0.00 | 1.00 | 1.00 | 0.00 | 0.00 |
| Nemotron 3 Super local | 0.00 | 1.00 | 0.50 | 0.00 | 0.00 |
| Muse Glimmer 30B local | 1.00 | 1.00 | 0.70 | 0.17 | 0.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:
| Model | Pieces (avg of 3) | per seed | Lines / game | Score | Regret | Holes on board (avg) |
|---|---|---|---|---|---|---|
| Dellacherie heuristic | 1000.0 | 1000/1000/1000 | 398.0 | 356,053 | 0 | 0.3 |
| GPT-6.1 Sol · reasoning medium | 445.7 | 691/481/165 | 161.0 | 97,347 | 8 | 7.0 |
| Claude Sonnet 5.5 · thinking high | 337.7 | 307/479/227 | 118.3 | 45,947 | 7 | 8.1 |
| Random legal move | 20.0 | 23/16/21 | 0.0 | 0 | 118 | 30.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:
| Model | Pieces @0.2 | Pieces @1.0 | Lines @0.2 | Lines @1.0 | Agree @0.2 | Agree @1.0 |
|---|---|---|---|---|---|---|
| gpt-oss 120B | 26.6 | 30.2 | 0.8 | 2.0 | 16% | 27% |
| Muse Glimmer 30B | 20.0 | 20.6 | 0.0 | 0.2 | 9% | 7% |
| Qwen 3.8 27B | 13.4 | 16.0 | 0.0 | 0.0 | 1% | 3% |
| Nemotron 3 Super | 10.4 | 12.4 | 0.0 | 0.0 | 0% | 3% |
| Qwen 3.5 122B | 10.2 | 11.0 | 0.0 | 0.0 | 2% | 2% |
| Granite 4.2 30B | 11.0 | 10.6 | 0.0 | 0.0 | 2% | 0% |
| Gemma 4 31B | 9.0 | 8.8 | 0.0 | 0.0 | 4% | 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_toolsthinking 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
temperatureparameter, 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.