← All posts

Experiments13 min read

By Benjamin from EloCoach · Updated

I cut the coach’s prompt in half. The first word still took 20 seconds.

Every game review starts with one large request to a language model. Most of that request is the coach’s instructions: how to read the engine data, how to mark up a board, what to remember about you. Over months of fixes it had grown to about 29,000 tokens, and the first words of a review took around 20 seconds to appear. The obvious move was to put the prompt on a diet. I did, and cut it by more than half without making the reviews worse. The wait before the first word barely moved. This post is about why, and about the dial that does move it.

What the coach reads

A review request has two parts. The instructions are the same for every player and every game: 88,000 characters, about 21,000 tokens, roughly 85 percent of the request. Then there is the game itself: the moves with the engine’s verdict on each one, the handful of key moments with the exact position before each, your opening history and anything the coach remembers about you. That part is 14,000 to 19,000 characters.

Reading the instructions end to end, I found the usual sediment. The same chip rules stated in three files. Field descriptions for data the model no longer receives. Rules for blocks that only appear in a few games, sent with every game. The game’s moves printed twice, once plain and once annotated. And, as it turned out, a few things that were simply wrong (more on those below).

How I tested it

  • Five reviewed games from the earlier baseline run on public games: three from Chess.com and two from Lichess, all blitz, with the player as White in two and Black in three, a win, a draw and three losses, from 30 to 73 moves. I am not naming the players here; they do not matter to the result.
  • The real prompt, exactly. I ran the backend on a copy of that data and captured the request it sends, instead of reconstructing it by hand.
  • Three rewrites, then one revision. Each rewrite is a full set of the coach’s instruction files plus changes to the game data. The table below says what each one changed.
  • The same model as production (Gemini through OpenRouter, normal reasoning), streamed, timing the first word and the last. 140 timed reviews, interleaved so that a slow minute on the provider’s side hits every option.
  • Two kinds of grading. A format checker built on the app’s own parsers (25 tests of its own) checks the things that break the screen: section markers, board chips, the memory block the coach writes for later. Then a blind judge, an AI model told to fact-check every claim against the game data with a chess library, compared each rewrite with the current prompt on the same game without knowing which was which.

The options side by side

Each row is one version of the prompt. Times are medians. Format clean counts replies that passed every check that matters to the screen. The judged column reads as three counts over ten blind pairs: the option preferred, the current prompt preferred, a tie.

Round 1: Gemini, normal reasoning

Current prompt

what runs today

Input
29.0k
First word
20.9 s
Full review
37.4 s
Format clean
3 of 20
Judged
ref.
Cost
4.0¢

A. Deduplicated

same structure, repeats and stale text removed

Input
19.7k
First word
19.7 s
Full review
36.3 s
Format clean
3 of 20
Judged
6 · 2 · 2
Cost
4.2¢

B. Restructured

rewritten as one plan, every rule stated once

Input
13.1k
First word
19.1 s
Full review
32.6 s
Format clean
18 of 20
Judged
2 · 4 · 4
Cost
3.9¢

C. Conditional

B, plus rules only for the data this game has

Input
10.9k
First word
21.7 s
Full review
37.6 s
Format clean
13 of 20
Judged
3 · 5 · 2
Cost
3.7¢

Round 2: Gemini

Current prompt

what runs today

Input
29.0k
First word
20.7 s
Full review
38.2 s
Format clean
2 of 15
Judged
ref.
Cost
3.6¢

B2. Restructured, fixed

B with its two regressions fixed

Input
13.2k
First word
16.8 s
Full review
30.7 s
Format clean
14 of 15
Judged
4 · 4 · 2
Cost
3.4¢

Current, low reasoning

today’s prompt, thinking switched off

Input
29.0k
First word
2.1 s
Full review
17.5 s
Format clean
1 of 15
Judged
2 · 5 · 3
Cost
2.6¢

B2, low reasoning

B2 with thinking switched off

Input
13.2k
First word
1.9 s
Full review
15.5 s
Format clean
14 of 15
Judged
3 · 5 · 2
Cost
1.8¢

Round 3: Claude Haiku 5.5, low reasoning

Current, low reasoning

today’s prompt

Input
39.0k
First word
66.2 s
Full review
77.0 s
Format clean
0 of 10
Judged
ref.
Cost
1.2¢

B2, low reasoning

the restructured prompt

Input
17.6k
First word
53.9 s
Full review
62.0 s
Format clean
0 of 10
Judged
3 · 2 · 5
Cost
0.8¢
The current prompt is the shaded row in each round. Each round reran it next to the options it is compared with, so compare within a round. Round 3 is a different model; see below.
  • A, deduplicated removed a third of the input, kept the structure, and was the judges’ favourite (6 to 2). It did not fix a single format problem.
  • B, restructured rewrote the instructions as one plan: who the coach is, what each data block means, the reply in order, the markup. It more than halved the input and went from 3 to 18 clean replies out of 20. It also had two regressions: it wrote move sequences in prose instead of on a board, and covered the key moments a little less often.
  • C, conditional sent rules only for the data a game actually has. It was the smallest, and it was worse than B on both format and coverage.
  • B2 is B with those two regressions fixed. Over ten blind pairs the judges split 4 to 4 with 2 ties, and it kept the format gain (14 of 15 against 2).

Where the wait goes

To see why the times hardly move, split each review into three parts: the model reading the request, the model reasoning before it writes anything, and the writing itself.

reading the promptreasoningwriting the review010203040seconds, medianCurrent promptCurrent prompt: reading the prompt 4.1 sCurrent prompt: reasoning 16.8 sCurrent prompt: writing 16.5 s37.4 sA. DeduplicatedA. Deduplicated: reading the prompt 3.8 sA. Deduplicated: reasoning 15.9 sA. Deduplicated: writing 16.6 s36.3 sB. RestructuredB. Restructured: reading the prompt 3.3 sB. Restructured: reasoning 15.8 sB. Restructured: writing 13.5 s32.6 sC. ConditionalC. Conditional: reading the prompt 4.1 sC. Conditional: reasoning 17.6 sC. Conditional: writing 15.9 s37.6 sB2. Restructured, fixedB2. Restructured, fixed: reading the prompt 3.3 sB2. Restructured, fixed: reasoning 13.5 sB2. Restructured, fixed: writing 13.9 s30.7 sCurrent, low reasoningCurrent, low reasoning: reading the prompt 2.1 sCurrent, low reasoning: writing 15.4 s17.5 sB2, low reasoningB2, low reasoning: reading the prompt 1.9 sB2, low reasoning: writing 13.6 s15.5 s
Medians per option. Hover a segment for its seconds. The first word arrives where the gold segment ends.

With normal reasoning, the first byte arrives after 3 to 4 seconds whatever the request’s size. The instructions are identical on every review, so the provider usually has them cached, and cutting 16,000 tokens saves well under a second. The gold segment is where the time goes: the model thinks for about 2,000 tokens before writing a word, and a shorter prompt did not make it think less.

010203040506002,0004,0006,0008,000reasoning tokens before the first wordseconds to the first wordCurrent prompt: 2069 reasoning tokens, first words after 21 sCurrent prompt: 1709 reasoning tokens, first words after 20.5 sCurrent prompt: 4329 reasoning tokens, first words after 38 sCurrent prompt: 2599 reasoning tokens, first words after 22.7 sCurrent prompt: 1500 reasoning tokens, first words after 15.1 sCurrent prompt: 1606 reasoning tokens, first words after 15 sCurrent prompt: 4647 reasoning tokens, first words after 39.9 sCurrent prompt: 2257 reasoning tokens, first words after 19.8 sCurrent prompt: 2378 reasoning tokens, first words after 21.2 sCurrent prompt: 3449 reasoning tokens, first words after 29.8 sCurrent prompt: 1925 reasoning tokens, first words after 16.7 sCurrent prompt: 2242 reasoning tokens, first words after 18 sCurrent prompt: 1313 reasoning tokens, first words after 12.5 sCurrent prompt: 764 reasoning tokens, first words after 17.7 sCurrent prompt: 1914 reasoning tokens, first words after 17 sCurrent prompt: 3933 reasoning tokens, first words after 48.9 sCurrent prompt: 3269 reasoning tokens, first words after 28.8 sCurrent prompt: 3428 reasoning tokens, first words after 33.1 sCurrent prompt: 2058 reasoning tokens, first words after 20.7 sCurrent prompt: 1209 reasoning tokens, first words after 21.2 sShorter prompt: 1762 reasoning tokens, first words after 17.2 sShorter prompt: 5489 reasoning tokens, first words after 45.8 sShorter prompt: 2268 reasoning tokens, first words after 19.5 sShorter prompt: 2058 reasoning tokens, first words after 17.5 sShorter prompt: 2887 reasoning tokens, first words after 24.2 sShorter prompt: 3154 reasoning tokens, first words after 45.5 sShorter prompt: 2881 reasoning tokens, first words after 26.5 sShorter prompt: 2382 reasoning tokens, first words after 18.4 sShorter prompt: 2218 reasoning tokens, first words after 20.6 sShorter prompt: 2924 reasoning tokens, first words after 28.9 sShorter prompt: 1730 reasoning tokens, first words after 15.4 sShorter prompt: 3009 reasoning tokens, first words after 19.9 sShorter prompt: 2035 reasoning tokens, first words after 17.8 sShorter prompt: 2187 reasoning tokens, first words after 18.2 sShorter prompt: 1084 reasoning tokens, first words after 11.6 sShorter prompt: 1542 reasoning tokens, first words after 13.8 sShorter prompt: 2335 reasoning tokens, first words after 21.2 sShorter prompt: 2858 reasoning tokens, first words after 24.3 sShorter prompt: 2741 reasoning tokens, first words after 18.5 sShorter prompt: 2809 reasoning tokens, first words after 19.8 sShorter prompt: 5714 reasoning tokens, first words after 43 sShorter prompt: 2856 reasoning tokens, first words after 22.4 sShorter prompt: 2460 reasoning tokens, first words after 19.4 sShorter prompt: 2917 reasoning tokens, first words after 19.8 sShorter prompt: 1839 reasoning tokens, first words after 15.8 sShorter prompt: 2608 reasoning tokens, first words after 39.5 sShorter prompt: 2872 reasoning tokens, first words after 23.2 sShorter prompt: 2165 reasoning tokens, first words after 15.4 sShorter prompt: 1454 reasoning tokens, first words after 18.8 sShorter prompt: 4736 reasoning tokens, first words after 36.4 sShorter prompt: 1048 reasoning tokens, first words after 9.7 sShorter prompt: 1363 reasoning tokens, first words after 12.6 sShorter prompt: 1013 reasoning tokens, first words after 9.2 sShorter prompt: 3631 reasoning tokens, first words after 30.6 sShorter prompt: 1398 reasoning tokens, first words after 10.2 sShorter prompt: 675 reasoning tokens, first words after 5.6 sShorter prompt: 7029 reasoning tokens, first words after 58.4 sShorter prompt: 745 reasoning tokens, first words after 7 sShorter prompt: 2444 reasoning tokens, first words after 16.5 sShorter prompt: 3294 reasoning tokens, first words after 24.3 sShorter prompt: 6308 reasoning tokens, first words after 47.3 sShorter prompt: 3810 reasoning tokens, first words after 27.1 sShorter prompt: 2665 reasoning tokens, first words after 20.9 sShorter prompt: 8604 reasoning tokens, first words after 55.1 sShorter prompt: 2468 reasoning tokens, first words after 20.5 sShorter prompt: 3768 reasoning tokens, first words after 34.4 sShorter prompt: 2061 reasoning tokens, first words after 19.2 sShorter prompt: 3446 reasoning tokens, first words after 25.3 sShorter prompt: 1678 reasoning tokens, first words after 22.5 sShorter prompt: 3991 reasoning tokens, first words after 39 sShorter prompt: 1386 reasoning tokens, first words after 29.1 sShorter prompt: 1993 reasoning tokens, first words after 14.2 sShorter prompt: 1553 reasoning tokens, first words after 12.8 sShorter prompt: 1555 reasoning tokens, first words after 16.5 sShorter prompt: 1513 reasoning tokens, first words after 18 sShorter prompt: 2611 reasoning tokens, first words after 20.9 sShorter prompt: 3026 reasoning tokens, first words after 25.4 sShorter prompt: 2667 reasoning tokens, first words after 26.8 sShorter prompt: 1383 reasoning tokens, first words after 19.7 sShorter prompt: 1602 reasoning tokens, first words after 13.6 sCurrent prompt: 1742 reasoning tokens, first words after 21.4 sCurrent prompt: 2703 reasoning tokens, first words after 24.5 sCurrent prompt: 1384 reasoning tokens, first words after 14.5 sCurrent prompt: 2020 reasoning tokens, first words after 22.3 sCurrent prompt: 1922 reasoning tokens, first words after 18.4 sCurrent prompt: 2328 reasoning tokens, first words after 20.7 sCurrent prompt: 2341 reasoning tokens, first words after 21.6 sCurrent prompt: 3976 reasoning tokens, first words after 35.5 sCurrent prompt: 1948 reasoning tokens, first words after 26.2 sCurrent prompt: 1053 reasoning tokens, first words after 9.8 sCurrent prompt: 873 reasoning tokens, first words after 8.5 sCurrent prompt: 1628 reasoning tokens, first words after 16 sCurrent prompt: 2150 reasoning tokens, first words after 18.6 sCurrent prompt: 3746 reasoning tokens, first words after 30.9 sCurrent prompt: 608 reasoning tokens, first words after 6.7 sShorter prompt: 2254 reasoning tokens, first words after 16.3 sShorter prompt: 1984 reasoning tokens, first words after 15.8 sShorter prompt: 3817 reasoning tokens, first words after 32 sShorter prompt: 3002 reasoning tokens, first words after 27.4 sShorter prompt: 2696 reasoning tokens, first words after 25.7 sShorter prompt: 2174 reasoning tokens, first words after 16.8 sShorter prompt: 821 reasoning tokens, first words after 7.9 sShorter prompt: 2370 reasoning tokens, first words after 16.1 sShorter prompt: 2277 reasoning tokens, first words after 19.9 sShorter prompt: 2842 reasoning tokens, first words after 25.2 sShorter prompt: 2147 reasoning tokens, first words after 15.7 sShorter prompt: 2288 reasoning tokens, first words after 17.4 sShorter prompt: 3708 reasoning tokens, first words after 27.5 sShorter prompt: 1266 reasoning tokens, first words after 9.7 sShorter prompt: 798 reasoning tokens, first words after 6.7 scurrent promptshorter prompts
One dot per review, 110 reviews at normal reasoning. The line is about 5 seconds plus 7 seconds per thousand reasoning tokens, and it does not care which prompt was used.

Across those reviews, time to the first word tracks the reasoning length with a correlation of 0.90. It is the same lesson as the baseline post, one step earlier: there, the whole review followed how much the coach wrote; here, the first word follows how much it thought.

The dial that does move it

So I turned the reasoning down. On this model, the low setting switches it off entirely, and the first words arrived after about 2 seconds instead of 20. The whole review took 15 to 18 seconds instead of 31 to 38.

It is not free. Blind, the judges preferred the normal-reasoning reviews: 5 to 2 for today’s prompt and 5 to 3 for B2. The low-reasoning reviews still found the decisive moment, but they explained it less well: the judges’ insight score fell from 3.1 to 2.7 for today’s prompt and from 3.8 to 3.1 for B2. Somewhere between off and normal there is probably a reasoning budget that buys most of the speed for little of the quality. I have not measured it yet.

A second model

To check this was not a Gemini quirk, I reran B2 against the current prompt on a fast, cheap model from another lab: Claude Haiku 5.5, five games, two reviews each.

  • Prompt size matters more here. Nothing was cached on this route, so the full request is read every time. Both at low reasoning, B2 was faster to the first word (53.9 s against 66.2 s) and about 30 percent cheaper.
  • Reasoning still dominates. In a first try at the setting production uses, this model thought for 17,000 to 24,000 tokens and took one and a half to two minutes to start writing. Even at low it reasoned for 10,000 to 12,000 tokens. The right setting is per model; one setting for all of them would be a mistake.
  • Quality held. The judges split 3 to 2 with 5 ties, with equal accuracy scores. Neither prompt produced fully clean markup on this model, which suggests the format rules lean on Gemini habits.

What the diet did buy

Not speed, but three useful things. The restructured prompt follows the screen’s format far more reliably. It costs a little less per review. And reading every line found real mistakes, which no amount of reasoning time would have fixed:

  • The instructions said a key moment’s win probability was White’s. It is the player’s own. For every review of a game played as Black, the coach was told the opposite.
  • The instructions told the coach to leave out an opening board’s subtitle when it repeated the name. The app rejects an opening board without one, so the prompt was asking for boards that never render.
  • The game table’s move count is in half-moves. The judges found reviews saying “a 146-move game” about a game of 73 moves, under every prompt.
  • The examples showed board chips inside code blocks, and the model copied the wrapping.

What this does not tell you

  • Five games. Enough to see a large effect and a null one, not enough to rank options that are close. Ten blind pairs per option is a signal, not a verdict.
  • Strong players. All five are rated well above 2,600, Maia’s ceiling. Some of the data savings, like dropping a peer figure that repeats when two rating tiers agree, will be smaller for a 1200 player.
  • No coaching memory. None of these players had a profile yet, so the parts of the prompt about remembering you were not exercised.
  • An AI judge. Its fact-checks were concrete and checked with a chess library, but it is still one model grading another.

Update: a stricter test

The second round was written down before any run: the arms, the games, the measures and what would count as a pass. A variant had to be at least as good on every quality measure, not on average, and a faster prompt only counted as a win at equal quality.

  • Every chess claim checked by code. A small model lists each factual claim in a review (a piece on a square, a pin, a defender, a capture, the material count) and chess.js rules it right or wrong against the actual position. I checked 60 of those rulings by hand: every claim ruled right was right, and about 7 in 10 claims ruled wrong were real coach errors, the rest misreadings by the extractor.
  • A judge with a measured noise floor. The blind judge scores story, depth, learning value and grounding, and counts statements about what the player thought or felt that nothing supports. Judging the same prompt against itself moved its scores by 0.2 to 0.3 on a five-point scale. Any real difference has to clear that.
  • One change at a time. Bug fixes, removing repeats, reordering sections and trimming the game data were each tried alone, then the best combination went up against today's prompt on 15 games it had never seen: 12 public games from players rated 550 to 3,160, and 3 reviews from our own closed beta, rebuilt on a local copy and never quoted here.

The trimmed prompt came out inconclusive. Chess errors were 6.5 against 7.2 per 100 claims, too close to call. The judge preferred today's prompt in 6 games, the trimmed one in 3, with 6 ties, and the first word was not reliably faster. Nothing was shown to be worse, but nothing was shown to be equal either, and equal was the bar.

Update: where the coach actually goes wrong

The claim checker made the real problem visible. The coach is reliable about what it reads from the engine data, and unreliable about what it works out on the board for itself.

Wrong claims by kind: claims read from the engine data against claims the coach works out itself.
Kind of claimWrong
Which move was played (2,137 claims)0%
The engine's best move2%
Which piece is on which square6%
A piece is undefended23%
Bishop colour25%
A piece is hanging33%
A pin44%
What defends what45%
Share of each kind of claim ruled wrong at the position the review names, across 85 reviews. Roughly 3 in 10 of these are extraction errors, the same for every kind.

This held even with the board in front of it. Since the board vision change, every key moment lists each piece by its square, and that works: on a board the coach was shown, only 3% of its piece locations were wrong, against 14% elsewhere. But its claims about pins, defenders and loose pieces were wrong 27% of the time on those same boards, no better than without them. Knowing the bishop is on a5 and the knight on c3 did not stop it calling the knight pinned with a pawn in between. It had the coordinates and still got the geometry wrong.

Update: what we shipped instead

  • Board facts. Under each key moment, code now lists the exact relationships before and after the player's move: the material count, pieces attacked with no defender, pieces attacked by a cheaper piece, real pins, and what attacks and defends the piece that moved. The coach is told these lines are its only source for those claims. It is the same idea as board vision, one level up: the coach reports relationships instead of computing them.
  • Four things the coach was being told wrong. The "human read" under each moment was inverted for every player who had Black: a player who was losing after the move could be told they were still holding. A key moment's win probability was described as White's when it is the player's own. An opening board with no subtitle was dropped, which shifted every later board in the review one slot. And the game table counted half-moves as moves.

Update: did it move the needle?

On 19 October I ran today's prompt and the new one side by side on the same 15 test games, same model, same judge, same checker.

Today's prompt against the prompt with board facts and the four corrections.
MeasureToday's promptWith board facts
Relationship claims wrong23.7%18.9%
"X defends Y" wrong4 of 91 of 14
"Undefended" wrong9 of 344 of 40
Errors written into memory20
Judge preferred48 (2 ties)
Review length100%102%
First word, median26.4 s21.3 s
15 games, one review each per prompt. The judge counts are over 14 pairs judged in both orders (one pair could not be judged).

Every quality measure moved the right way. The judge preferred the new reviews two to one, and scored all four dimensions slightly higher. Fewer relationship claims were wrong, and none of the errors reached the coach's memory of the player. Honestly, though, none of it is statistically certain at 15 games: each difference sits inside its margin of error, and the first-word gain is within normal variation. One measure went the wrong way: bishop colour errors rose from 2 of 18 to 6 of 19, because the facts do not name square colours yet.

Here is what the difference looks like, from a seven-move game by a 550-rated player who missed a queen and bishop aiming at f7. Today's prompt wrote, two sentences apart:

The f7 pawn was defended solely by your king on e8. [...] it left f7 completely unprotected against two attackers. [...] White wasted no time, capturing the undefended pawn with 4.Qxf7+.

With board facts, the same moment read:

The light-squared bishop on c4 and the queen on f3 were both aiming directly at your f7-pawn, which was defended solely by your king on e8. [...] The queen on f7 was defended by the light-squared bishop on c4, meaning your king could not capture it.

Both statements in the second version check out. It still made a mistake elsewhere in the same review, saying a knight on f6 would attack the queen on f3, which it would not. Board facts cover the key moments, not every sentence.