Index · pending cases r28 · one case in full
Pending case: room 0b5acbb6, move 2 (c4). What happens, what fails, what the same facts can say.
Story 44d849b7-1b67-404d-9a55-1015f8a623ff, room 0b5acbb6-6def-48f1-9d2b-72e21ded2690. You play white. Your opponent plays black. Zapp move 2 is black's move at game move 35. Classification in pending-unclear-r28.md: positional-gives-material (110 of the 283 pending moments are in this class).
1. The facts the generator has
Position before c4. Black to move. Black has two rooks on g3 and h3 near your king.
| Score before the move | -441 cp (white's side). Black is winning by about 4.4 pawns. |
|---|---|
| Best move for black | Rxg2+ (g3g2) |
| Move played | c4 (c5c4) |
| Score after c4 | -155 cp. Black is still better, by about 1.5 pawns. |
| Drop | 286 cp. Above the 90 cp limit, so this is a mistake moment. |
| Your reply in the game | Rf2 (f1f2), score -194 cp. This is also the engine's best reply. |
| Stored best line before c4 | g3g2 e2g2 h3g3 a2a4 g3g2 g1g2 b5a4 f1e1 = Rxg2+ Qxg2 Rg3 a4 Rxg2+ Kxg2 bxa4 Re1 (8 plies, in the facts already) |
2. What the generator does today, step by step
- It sees the drop of 286 cp and opens a mistake moment for black's move c4.
- It reads the top replies for white from the next move's
cpScoresOfTopMoves. The best reply is Rf2 at -194 cp. Every reply within 100 cp of it is a candidate: three of ten. - For each candidate it walks the stored line (10 plies at most, played reply from
pvAfterPlayedMove, others from the candidate facts) and adds up captured material from your side. - A line is "tellable" only when it is a mate, or when you are ahead by at least 1 pawn and the material stops changing by ply 8.
- No candidate is tellable, so the punishment scene keeps the old text.
Candidate replies and the walk result
| reply | score (white) | in window (best − 100) | line source | line walked | net material for you | settles at ply | verdict |
|---|---|---|---|---|---|---|---|
| Rf2 | -194 | yes | pvAfterPlayedMove | Rf2 Re3 Qd2 Rd3 Qe1 Kg7 Rh2 Rdg3+ Kf1 c3 | 0 | 0 | rejected: no material gain |
| Qe6+ | -209 | yes | candidateFact | Qe6+ Kg7 Qf7+ Qxf7 gxf7 Kxf7 Rxg3 Rxg3+ Kf2 Rd3 | -1 | 8 | rejected: no material gain |
| Qe8+ | -234 | yes | candidateFact | Qe8+ Kg7 Qf7+ Qxf7 gxf7 Kxf7 Rxg3 Rxg3+ Kf2 Rh3 | -1 | 8 | rejected: no material gain |
| Rf4 | -312 | no | none | - | - | - | not tried, outside the window |
| a4 | -485 | no | none | - | - | - | not tried, outside the window |
| b3 | -504 | no | none | - | - | - | not tried, outside the window |
| a3 | -563 | no | none | - | - | - | not tried, outside the window |
| g7 | -571 | no | none | - | - | - | not tried, outside the window |
| b4 | -581 | no | none | - | - | - | not tried, outside the window |
| Rb1 | -590 | no | none | - | - | - | not tried, outside the window |
The three walks in detail (running sum from your side)
Rf2 (-194 cp)
| ply | move | takes | running sum (you) |
|---|---|---|---|
| 1 | Rf2 | - | 0 |
| 2 | Re3 | - | 0 |
| 3 | Qd2 | - | 0 |
| 4 | Rd3 | - | 0 |
| 5 | Qe1 | - | 0 |
| 6 | Kg7 | - | 0 |
| 7 | Rh2 | - | 0 |
| 8 | Rdg3+ | - | 0 |
| 9 | Kf1 | - | 0 |
| 10 | c3 | - | 0 |
Qe6+ (-209 cp)
| ply | move | takes | running sum (you) |
|---|---|---|---|
| 1 | Qe6+ | - | 0 |
| 2 | Kg7 | - | 0 |
| 3 | Qf7+ | - | 0 |
| 4 | Qxf7 | queen | -9 |
| 5 | gxf7 | queen | 0 |
| 6 | Kxf7 | pawn | -1 |
| 7 | Rxg3 | rook | +4 |
| 8 | Rxg3+ | rook | -1 |
| 9 | Kf2 | - | -1 |
| 10 | Rd3 | - | -1 |
Qe8+ (-234 cp)
| ply | move | takes | running sum (you) |
|---|---|---|---|
| 1 | Qe8+ | - | 0 |
| 2 | Kg7 | - | 0 |
| 3 | Qf7+ | - | 0 |
| 4 | Qxf7 | queen | -9 |
| 5 | gxf7 | queen | 0 |
| 6 | Kxf7 | pawn | -1 |
| 7 | Rxg3 | rook | +4 |
| 8 | Rxg3+ | rook | -1 |
| 9 | Kf2 | - | -1 |
| 10 | Rh3 | - | -1 |
Rf2 makes a long line with no capture in the first 10 plies: sum 0. Qe6+ and Qe8+ force a queen trade and then you are one pawn down: sum −1. None of them wins anything. That is correct chess: c4 does not hang a piece. Black is still better after every reply.
3. The text shown today
Scene opponent-mistake-1-move: Here your opponent moved their pawn (c4). It hands you a chance. Let's find it.
Scene opponent-mistake-1-punishment: They don't lose a piece right away, but after your reply (Rf2), part of their advantage slips away. And (Rf2) is exactly what you played. Well done.
Steps: f1f2 → "Your rook moves (Rf2)."
4. What fails
- The told-line rule looks in the wrong place. It only looks at your replies after c4. c4 does not lose material, so no reply can show a win. The mistake is not "black hangs something"; it is "black throws away a winning line".
- The old text is vague. "Part of their advantage slips away" names no move, no piece, no reason. The single step Rf2 shows nothing. The reader cannot see why c4 was bad.
- The story is asymmetric. When you make a positional mistake, the correct-move scene shows the line you missed. When your opponent makes one, nothing shows what they missed.
- No amount of extra plies fixes this. Deeper reply lines still show a game where black stays ahead. The honest content is the line black gave up, and that line is already in the facts (
bestMovePvLineof move 2).
5. A reasonable explanation from the same facts
Walk the stored best line before c4 with the same rule (material sum, settle by ply 8). It is tellable: black wins your queen and a pawn for a rook, net +5 for black, settled at ply 7. Class: slow material.
| ply | move | takes | running sum (them) |
|---|---|---|---|
| 1 | Rxg2+ | rook | +5 |
| 2 | Qxg2 | rook | 0 |
| 3 | Rg3 | - | 0 |
| 4 | a4 | - | 0 |
| 5 | Rxg2+ | queen | +9 |
| 6 | Kxg2 | rook | +4 |
| 7 | bxa4 | pawn | +5 |
Proposed scene (prototype text from the board and the line)
Their move (c4) was a mistake. Before it, they had (Rxg2+): it wins your queen and a pawn for a rook, net +5 for them. Let's see what they gave up.
- 1Their rook takes your rook (Rxg2+). Check. Net +5 for them.
- 2Your queen takes their rook (Qxg2). Net 0 for them.
- 3Their rook moves (Rg3).
- 4Your pawn moves (a4).
- 5Their rook takes your queen (Rxg2+). Check. Net +9 for them.
- 6Your king takes their rook (Kxg2). Net +4 for them.
- 7Their pawn takes your pawn (bxa4). Net +5 for them.
After (c4) that line is gone. Your reply (Rf2) keeps the game close. And (Rf2) is exactly what you played. Well done.
The scene starts from the position before c4 (black to move) and plays the missed line. The last two sentences are the old closing, kept.
6. What this needs in the code, and what it covers
libs/api/src/domain/zapp/game-story/pure.ts, thetoldLineblock in the mistake analysis: whenpickToldLinereturns null and the mover is the opponent, fall back totoldLineFromMoves({ fen: fenBefore, uciMoves: bestLineMoves })and mark the line asframing: "gaveUp".libs/api/src/domain/zapp/game-story/line-narration.ts,narrateToldLine: a "gave up" headline ("Before it, they had (X): it wins ...") and a closing that names the played reply instead of "They can't get it back.".replaceLastSceneWithToldLine: the punishment scene's steps start fromfenBefore, not from the position after the mistake, in this framing.- No new engine data: the line is the mover's stored
bestMovePvLine(8 plies today). - Coverage on the 283 pending moments, with the current facts: 53 opponent mistakes get this text. The 65 user mistakes of the same shape already show the missed line in their correct-move scene. Remaining after this: 66 moments where the missed line is also positional (no material in 8 plies, no mate) and about 99 moments where the punisher does win but only in deeper lines; those stay on the old text.
Data: ai-workspace/game-story-prod-review/regen/inputs-r28/44d849b7-1b67-404d-9a55-1015f8a623ff.json, script regen/scripts-r28/, dump ai-workspace/dump-case.ts. Built 2026-08-27.