LABS RESEARCH · EXP-001

We gave two models the same 8-second job. One never finished a sentence.

Our word game gives an LLM eight seconds to invent a combination. The reasoning model assigned to the publication's drafting desk went 0 for 20. A fast chat model did the job in 2.3 seconds, every time.

FT.NEWS Labs · 2026-06-12

Abstract

The Daily Combinator (/play) resolves unknown word pairs with a live LLM call. The call runs under a hard 8-second budget because a player is standing there holding a tile. When the call wins, the player gets a new word with an emoji and a one-liner. When it loses, they get a consolation card that says StillCooking.

Production routed that call to the same model the publication uses for drafting articles: a large reasoning model. Players got StillCooking one hundred percent of the time, and the nightly cache-warming job burned two and a half minutes producing nothing. This experiment documents the failure, the swap, and what the numbers say about matching models to jobs instead of ranking them on vibes.

TL;DR

ModelRoleCompletions inside 8sMedian latencyWarm-run yield
minimax-m3Drafting desk (reasoning)0no completions to measure0 of 20
llama-3.3-70b-instructGame desk (chat)632,263 ms17 to 19 of 20
deepseek-v4-flashFallback chain cameo25,386 msn/a

Methods

The task: given two normalized words (say, telescope + burrito), return strict JSON with a combined result, one emoji, an explanation between 10 and 200 characters, a rarity, and a category. The prompt is the production game prompt, verbatim, reproduced in the appendix. Temperature 0.7, max 300 tokens, response_format json_object.

The budget: 8,000 ms wall clock, enforced by an AbortSignal in lib/game/ai.ts. A miss is not retried in the moment; the player sees the fallback and the pair stays eligible for the next attempt.

Two call sites exercise the task. Live combines fire when a player merges a pair no one has tried. The pre-generation job (game_pregen_runs) warms the twenty most likely next pairs in one nightly pass, sequentially, same prompt, same budget.

Scoring is binary per call: a validated JSON object cached into game_ai_results counts as a completion. A timeout, an empty message, or JSON that fails the zod schema counts as nothing, because that is what the player receives: nothing.

Results

The reasoning model never produced a single cacheable result. Twenty warm-up attempts consumed 2 minutes 36 seconds, almost exactly twenty stacked 8-second timeouts. A live player test confirmed it end to end: 8.3 seconds of waiting, then the fallback card.

After the swap, the same job on the chat model cached 63 results with a median of 2,263 ms and a p90 of 5,108 ms. The slowest call ever recorded was 6,810 ms, still inside the budget. Warm runs went 17, 18, and 19 for 20; the misses were occasional malformed JSON, not timeouts.

The fallback chain added a footnote: deepseek-v4-flash caught two calls at a median of 5,386 ms. Inside the budget, but spending two thirds of it.

WARM-RUN YIELD, COMBOS GENERATED PER 20 ATTEMPTEDWARM-RUN YIELD, COMBOS GENERATED PER 20 ATTEMPTED. 4 groups, 1 series. Values from 0 to 19.04.89.514.319Run 1 · minimaxRun 2 · llamaRun 3 · llamaRun 4 · llamacombos cached
game_pregen_runs, 2026-06-11 to 06-12. The first run is the reasoning model; the next three are the chat model on the identical pair list.
LATENCY OF SUCCESSFUL CALLS, MSLATENCY OF SUCCESSFUL CALLS, MS. 2 groups, 2 series. Values from 2K to 7K.02K4K5K7Kllama-3.3-70bdeepseek-v4-flashmilliseconds
game_ai_results.latency_ms. minimax-m3 does not appear because no call ever completed; its bar would be the right-hand wall of the chart.

Discussion

Nothing here says the reasoning model is bad. It says the job was wrong for it. A model that spends its token budget thinking is a fine choice for drafting a 900-word article overnight and a catastrophic choice for an 8-second party trick, and no leaderboard score communicates that difference.

The fix was architectural, not editorial: per-surface model knobs. The game pins GAME_OPENROUTER_MODEL, the curation scorer pins SCORING_OPENROUTER_MODEL, and the drafting desk keeps whatever the publication wants for prose. The same incident repeated three times in one week, in three disguises (game combines, the daily theme generator, pipeline scoring), and the same one-line fix closed each one.

The general claim we will keep testing: model selection is a per-surface product decision with a latency budget attached, and the budget is part of the benchmark. A follow-up experiment will run our coding tasks and game simulations across models under explicit budgets, in this same format.

Model breakdown

minimax-m3

The drafting desk, moonlighting

0 completions. Thinks past every deadline.

Completions inside 8s
0
Warm-run yield
0 of 20
Time spent producing it
2 min 36 s
Player experience
StillCooking, always
LLM response missing message.content

Every observable behaved the same way: the model accepted the job, reasoned its way through the budget, and had nothing in the content field when the clock ran out. The theme generator saw the purest form of it, a response object with the message present and the content empty, the token budget spent on thinking.

On its actual desk, drafting long-form with minutes of headroom, none of this applies. That is the point.

llama-3.3-70b-instruct

The game desk

63 completions, median 2.3 s, never missed the budget.

Completions inside 8s
63
Median / p90 latency
2,263 / 5,108 ms
Slowest call ever
6,810 ms
Warm-run yield
17 to 19 of 20
Lens Wrap. Focusing in on the big picture, one bite at a time.

The first model the game prompt was tuned on, and it shows. Strict JSON nearly every time, the misses were schema violations rather than timeouts, and the voice lands the register the prompt asks for: relatable, current, clever without trying too hard.

The quote above is real output, the first live combine after the swap: telescope + burrito.

deepseek-v4-flash

The fallback chain cameo

2 completions at the edge of the budget.

Completions inside 8s
2
Median latency
5,386 ms
Slowest call
7,666 ms
Margin left
334 ms

OpenRouter's failover routed two calls here during the incident window. Both finished, both spent most of the budget doing it. A serviceable understudy, not a desk assignment.

Data

RunDate (UTC)ModelRequestedGeneratedDuration
pregen 12026-06-11minimax-m32002 m 36 s
pregen 22026-06-11llama-3.3-70b20171 m 13 s
pregen 32026-06-11llama-3.3-70b2018~1 m
pregen 42026-06-11llama-3.3-70b2019~1 m
live test2026-06-11minimax-m3108.3 s, fallback served
live test2026-06-11llama-3.3-70b114.1 s, Lens Wrap

Source tables: game_pregen_runs, game_ai_results, plus the production runs ledger. Cached rows are inspectable in the admin moderation queue.

Appendix

Environment

Vercel serverless functions, OpenRouter routing, postgres on Neon. The 8,000 ms budget wraps the full HTTP round trip, not just generation. Fallback chain: primary model, then OPENROUTER_FALLBACK_MODELS in order.

Completion criteria

A call counts as complete when the response parses as JSON and passes the zod schema: result 2-120 chars, exactly one emoji, explanation 10-200 chars (no em dashes), rarity in {Common, Uncommon, Rare, Legendary}, category 1-100 chars. Anything else is a miss, including responses where message.content is empty.

The production prompt (verbatim contract)

Combine "{a}" + "{b}" into one new thing.
Audience: millennial women 27-42. Relatable, current,
clever-not-try-hard. No corporate buzzwords, nothing mean.
Return JSON: { "result", "emoji", "explanation",
"rarity": "Common|Uncommon|Rare|Legendary", "category" }
temperature 0.7 · max_tokens 300 · response_format json_object
budget 8000 ms (AbortSignal)