Index · pending cases r28 · case 2 · case 1 (c4)
Pending case 2: room 1a93804a, move 4 (Rb8). The reply rule fails, the "gave up" rule fails too, and the rule that would tell it.
Story d90a344c-4c53-4cb1-8f2e-6ca1f5f48245, room 1a93804a-a2bf-4f39-885a-49a5968d1427. You play white. Your opponent plays black. Class in pending-unclear-r28.md: positional-gives-material. In the r29 rule study this moment is in the remainder: no tested rule explains it.
1. The facts the generator has
Position before Rb8. Black to move. Black's queen on h3 and rook on g8 point at your king. Your knight on g2 is the only cover.
| Score before the move | -564 cp (white's side). Black is winning by about 5.6 pawns. |
|---|---|
| Best move for black | Rxg2+ (g8g2), a rook sacrifice |
| Move played | Rb8 (f8b8) |
| Score after Rb8 | -7 cp. The game is level. |
| Drop | 557 cp. One of the largest drops in the 120 stories. |
| Best reply for you | Qb2 (-24 cp, level). In the game you played Rxb8 (-118 cp). |
| Stored best line before Rb8 | Rxg2+ Rxg2 Rxf5 Qe2 Nf3+ Kf2 Qh4+ Rg3 Qh2+ Rg2 Ng1+ Ke1 Qh4+ Kd1 Nxe2 Kxe2 Rg5 (17 plies, already in the facts) |
2. What the generator does today: the reply rule
Two of your replies are within 100 cp of the best one. Both lines are walked for material from your side. Neither wins anything, so no told line.
| reply | score (white) | line walked (10 plies) | net for you | verdict |
|---|---|---|---|---|
| Qb2 | -24 | Qb2 Rxb7 Qxd4+ Kc7 Qxe5+ Kb6 Qd4+ c5 Rb2+ Ka7 | -1 | rejected: no material gain |
| Rxb8 | -118 | Rxb8 Rxb8 Qe2 Rb1+ Rf1 Rxf1+ Qxf1 Nf3+ Kf2 Nh2 | 0 | rejected: no material gain |
Qb2
| ply | move | check / capture | running sum (you) |
|---|---|---|---|
| 1 | Qb2 | - | 0 |
| 2 | Rxb7 | takes rook | -5 |
| 3 | Qxd4+ | check | -4 |
| 4 | Kc7 | - | -4 |
| 5 | Qxe5+ | check | -1 |
| 6 | Kb6 | - | -1 |
| 7 | Qd4+ | check | -1 |
| 8 | c5 | - | -1 |
| 9 | Rb2+ | check | -1 |
| 10 | Ka7 | - | -1 |
Rxb8
| ply | move | check / capture | running sum (you) |
|---|---|---|---|
| 1 | Rxb8 | takes rook | +5 |
| 2 | Rxb8 | takes rook | 0 |
| 3 | Qe2 | - | 0 |
| 4 | Rb1+ | check | 0 |
| 5 | Rf1 | - | 0 |
| 6 | Rxf1+ | check | -5 |
| 7 | Qxf1 | takes rook | 0 |
| 8 | Nf3+ | check | 0 |
| 9 | Kf2 | - | 0 |
| 10 | Nh2 | - | 0 |
Text shown today: They don't lose a piece right away, but if you find (Qb2), their winning position slips back to a level game. It threatens checkmate with (Qxd4#). In the game you handled it your own way with (Rxb8).
Steps: c2b2 → "Your queen moves (Qb2)."
The text is true: Qb2 levels the game and threatens Qxd4#. But it says nothing about why Rb8 was a mistake. Black was winning by 5.6 pawns; the text calls it "their winning position" and stops there.
3. The "gave up" rule (case 1, PR in progress) on this moment
The rule walks the stored best line before the mistake, from black's side, and needs a material gain of at least 1 that settles by ply 8 within a 10-ply walk.
| ply | move | check / capture | running sum (them) |
|---|---|---|---|
| 1 | Rxg2+ | check | +3 |
| 2 | Rxg2 | takes rook | -2 |
| 3 | Rxf5 | takes pawn | -1 |
| 4 | Qe2 | - | -1 |
| 5 | Nf3+ | check | -1 |
| 6 | Kf2 | - | -1 |
| 7 | Qh4+ | check | -1 |
| 8 | Rg3 | - | -1 |
| 9 | Qh2+ | check | -1 |
| 10 | Rg2 | - | -1 |
| 11 | Ng1+ | check | -1 |
| 12 | Ke1 | - | -1 |
| 13 | Qh4+ | check | -1 |
| 14 | Kd1 | - | -1 |
| 15 | Nxe2 | takes queen | +8 |
| 16 | Kxe2 | takes knight | +5 |
- Ply 1: the rook takes the knight, +3. Ply 2: your rook takes it back, −2. Ply 3: the rook takes a pawn, −1.
- From ply 3 to ply 14 the sum stays at −1. Black is a rook down for a knight and a pawn.
- Ply 15: the knight takes your queen, +8. Ply 16: your king takes the knight, +5. The line settles at ply 16 with net +5 for black.
- The 10-ply walk sees only −1. Rejected: the line gives material. Even the full line is rejected, because the material settles at ply 16, not by ply 8.
4. What fails
- Both rules measure material, and material lies here for 12 plies. Rxg2+ is a sacrifice. The payoff (your queen) comes only after a chase of checks. Any rule that wants the sum to settle fast cannot tell a sacrifice attack.
- The reply side has nothing to tell. After Rb8 the game is level. Qb2 wins nothing; it only stops the attack.
- Adding engine plies changes nothing. The stored line is already 17 plies. The problem is the rule, not the data.
5. The rule that would tell it: a forcing line may run long
In this line 8 of black's 8 moves are checks or captures. Your replies are forced: recapture, king moves, or a block. Such a line is easy to follow on the board, because there is no choice at each step. Proposed rule, with the current facts and no new engine data:
- Walk the whole stored line (18 plies at most) when at least 70% of the attacker's moves are checks or captures.
- Accept the line when the sum settles at least +1 anywhere inside it, or the line ends in mate.
- When the sum dips below 0 before the payoff, the headline says "a sacrifice".
Proposed scene (prototype text from the board and the line)
Their move (Rb8) was a mistake. Before it, they had (Rxg2+): a rook sacrifice. Your king gets chased by checks, and at the end they win your queen for a knight: net +5 for them. Let's see what they gave up.
- 1Their rook takes your knight (Rxg2+). Check. Net +3 for them.
- 2Your rook takes their rook (Rxg2). Net -2 for them.
- 3Their rook takes your pawn (Rxf5). Net -1 for them.
- 4Your queen moves (Qe2).
- 5Their knight moves (Nf3+). Check.
- 6Your king runs (Kf2).
- 7Their queen moves (Qh4+). Check.
- 8Your rook moves (Rg3).
- 9Their queen moves (Qh2+). Check.
- 10Your rook moves (Rg2).
- 11Their knight moves (Ng1+). Check.
- 12Your king runs (Ke1).
- 13Their queen moves (Qh4+). Check.
- 14Your king runs (Kd1).
- 15Their knight takes your queen (Nxe2). Net +8 for them.
- 16Your king takes their knight (Kxe2). Net +5 for them.
After (Rb8) that line is gone. Your reply (Qb2) makes the game level, and it threatens checkmate with (Qxd4#). In the game you played (Rxb8) instead.
6. Coverage and the rest
Scan of the 66 remainder moments (stored best line before the mistake, up to 18 plies, script ai-workspace/forcing-scan.ts):
| shape | moments | what to do |
|---|---|---|
| Forcing long line: gain settles inside the stored line, 70%+ of the attacker's moves are checks or captures | 13 | This rule. Examples: 1a93804a m4 (this page), 44509466 m2 (Qf6, drop 652), dae255d7 m22 (Qc6+), dfb4f795 m5 (Ne3, drop 508). |
| Mate inside the stored line, longer than 10 plies | 1 | Same rule (296f611c m32: mate in 15 plies, all checks). |
| Long quiet gain: payoff after ply 10 with few checks | 17 | Leave. A long quiet line is not easy to follow; the reader must trust every quiet move. |
| No material gain at all in the stored line | 35 | The true positional remainder. Example: 6d08e398 m8 (g5, drop 210): the missed line Nh5 Bg3 Nxg3 fxg3 ... trades pieces and ends level in material. Only an honest score sentence is possible ("Before this move the engine had them clearly ahead. After it the game is level. There is no single forcing line."). |
Code for the rule: libs/api/src/domain/zapp/game-story/line-narration.ts: walkLine returns the attacker's check/capture ratio; toldLineFromMoves raises its ply limit to 18 and accepts settle inside the line when the ratio is at least 0.7 (new clarity "forcing"); narrateToldLine adds the "a sacrifice" headline when the running sum goes below 0 before the payoff. pure.ts needs no change beyond the "gave up" fallback of case 1.
Data: ai-workspace/game-story-prod-review/regen/inputs-r28/d90a344c-4c53-4cb1-8f2e-6ca1f5f48245.json, rule study regen/analysis-r29/rules-out.json. Built 2026-08-27.