The short version: My opponent arrived rated 526 points higher. The queens came off before either side had developed a bishop. Then my king went sightseeing, an h-pawn started believing in itself, and the game became much less settled than the material count wanted it to be.
| Game | ThreeSadPandas–luferseji |
| Event | Monthly Classical Arena |
| Date | September 4, 2026 |
| Time control | 20+10 Classical, rated |
| Opening | Caro-Kann Defense: Two Knights Attack |
| Ratings | ThreeSadPandas 1167; luferseji 1693 |
| Rating gap | 526 points |
| Engine | Stockfish 18, five million nodes per search |
| Series | The Engine Room — Every move gets cross-examined |
Arena pairings are not required to care about your comfort.
The Monthly Classical Arena handed me White against a 1693-rated opponent. I was 1167. The game was 20+10, so this was not a bullet-game ambush in which the stronger player could wave a clock at me until pieces fell over. There would be time to play chess. There would also be time to understand exactly how much trouble I was in.
This review uses the same local method as the other Engine Room analysis: Stockfish 18 examines three candidate moves before every move played, then performs a separate search on the resulting position. The complete report and exact PGN are preserved in the repository.
I am going to withhold the evaluation ledger until after the game.
That is partly for narrative decency. It is also because an evaluation number can tell you who should win while hiding the far more entertaining question: who currently looks as though they might?
Replay the resistance
The official Lichess board is oriented from White’s side.
The original remains available as rPcoJNTf on Lichess.
The complete game score
The clocks are included. Watch them rise. Neither player loses this game to time pressure; the ten-second increment leaves both of us richer in minutes than arena players have any right to be.
[Event "Monthly Classical Arena"]
[Site "https://lichess.org/rPcoJNTf"]
[Date "2026.09.04"]
[Round "-"]
[White "ThreeSadPandas"]
[Black "luferseji"]
[Result "0-1"]
[GameId "rPcoJNTf"]
[UTCDate "2026.09.04"]
[UTCTime "18:10:30"]
[WhiteElo "1167"]
[BlackElo "1693"]
[WhiteRatingDiff "-1"]
[BlackRatingDiff "+1"]
[Variant "Standard"]
[TimeControl "1200+10"]
[ECO "B10"]
[Opening "Caro-Kann Defense: Two Knights Attack"]
[Termination "Normal"]
1. e4 { [%clk 0:20:00] } 1... c6 { [%clk 0:20:00] }
2. Nf3 { [%clk 0:20:07] } 2... d5 { [%clk 0:20:09] }
3. Nc3 { [%clk 0:20:14] } 3... dxe4 { [%clk 0:20:17] }
4. Nxe4 { [%clk 0:20:20] } 4... Nf6 { [%clk 0:20:26] }
5. d3 { [%clk 0:20:12] } 5... Nxe4 { [%clk 0:20:32] }
6. dxe4 { [%clk 0:20:17] } 6... Qxd1+ { [%clk 0:20:40] }
7. Kxd1 { [%clk 0:20:23] } 7... Bg4 { [%clk 0:20:49] }
8. h3 { [%clk 0:20:27] } 8... Bxf3+ { [%clk 0:20:57] }
9. gxf3 { [%clk 0:20:35] } 9... e6 { [%clk 0:21:07] }
10. Bf4 { [%clk 0:20:41] } 10... Nd7 { [%clk 0:21:14] }
11. c4 { [%clk 0:20:46] } 11... Bc5 { [%clk 0:21:16] }
12. Rh2 { [%clk 0:20:48] } 12... e5 { [%clk 0:21:09] }
13. Be3 { [%clk 0:20:52] } 13... O-O-O { [%clk 0:20:50] }
14. Ke2 { [%clk 0:20:47] } 14... Be7 { [%clk 0:20:45] }
15. Rd1 { [%clk 0:20:46] } 15... Kb8 { [%clk 0:20:43] }
16. a3 { [%clk 0:20:51] } 16... h6 { [%clk 0:20:45] }
17. b4 { [%clk 0:20:58] } 17... g6 { [%clk 0:20:47] }
18. c5 { [%clk 0:20:49] } 18... f5 { [%clk 0:20:49] }
19. h4 { [%clk 0:20:46] } 19... f4 { [%clk 0:20:58] }
20. Bd2 { [%clk 0:20:47] } 20... Bf6 { [%clk 0:20:27] }
21. Ke1 { [%clk 0:20:41] } 21... Nf8 { [%clk 0:20:26] }
22. Bc4 { [%clk 0:19:59] } 22... Rd4 { [%clk 0:20:18] }
23. Bf7 { [%clk 0:19:39] } 23... Rd3 { [%clk 0:20:04] }
24. h5 { [%clk 0:18:53] } 24... g5 { [%clk 0:20:03] }
25. Bc1 { [%clk 0:18:21] } 25... Rxd1+ { [%clk 0:20:01] }
26. Kxd1 { [%clk 0:18:27] } 26... Rh7 { [%clk 0:20:10] }
27. Be8 { [%clk 0:17:32] } 27... Ne6 { [%clk 0:19:57] }
28. Rh1 { [%clk 0:17:31] } 28... Nd4 { [%clk 0:20:03] }
29. Rh3 { [%clk 0:17:13] } 29... Re7 { [%clk 0:20:10] }
30. Bg6 { [%clk 0:17:07] } 30... Rd7 { [%clk 0:20:16] }
31. Ke1 { [%clk 0:17:09] } 31... Nc2+ { [%clk 0:20:05] }
32. Kf1 { [%clk 0:17:14] } 32... Rd1+ { [%clk 0:20:08] }
33. Kg2 { [%clk 0:17:21] } 33... Rxc1 { [%clk 0:20:16] }
34. a4 { [%clk 0:17:12] } 34... Nxb4 { [%clk 0:20:24] }
35. a5 { [%clk 0:17:16] } 35... Rxc5 { [%clk 0:20:28] }
36. Bf5 { [%clk 0:17:04] } 36... Rxa5 { [%clk 0:20:32] }
37. Rh1 { [%clk 0:17:12] } 37... Nc2 { [%clk 0:20:23] }
38. Rd1 { [%clk 0:17:07] } 38... Nd4 { [%clk 0:20:32] }
39. Bd7 { [%clk 0:16:59] } 39... Kc7 { [%clk 0:20:31] }
40. Be8 { [%clk 0:16:56] } 40... Ra3 { [%clk 0:20:36] }
41. Kh3 { [%clk 0:16:27] } 41... Rxf3+ { [%clk 0:20:43] }
42. Kg4 { [%clk 0:16:34] } 42... Rxf2 { [%clk 0:20:45] }
43. Rxd4 { [%clk 0:16:17] } 43... exd4 { [%clk 0:20:51] }
44. Kf5 { [%clk 0:16:22] } 44... Bg7 { [%clk 0:20:51] }
45. Kg6 { [%clk 0:16:26] } 45... Bf8 { [%clk 0:20:44] }
46. Kf7 { [%clk 0:16:11] } 46... Bd6 { [%clk 0:20:29] }
47. Kg7 { [%clk 0:16:09] } 47... d3 { [%clk 0:20:35] }
48. Kxh6 { [%clk 0:15:56] } 48... Rg2 { [%clk 0:20:43] }
49. Bf7 { [%clk 0:15:53] } 49... d2 { [%clk 0:20:50] }
50. Bb3 { [%clk 0:16:00] } 50... Rg1 { [%clk 0:20:55] }
51. Kg6 { [%clk 0:15:15] } 51... d1=Q { [%clk 0:21:02] }
52. Bxd1 { [%clk 0:15:22] } 52... Rxd1 { [%clk 0:21:10] }
53. Kxg5 { [%clk 0:15:29] } 53... f3 { [%clk 0:21:15] }
54. h6 { [%clk 0:15:25] } 54... Be5 { [%clk 0:21:23] }
55. Kf5 { [%clk 0:15:28] } 55... Bd4 { [%clk 0:21:07] }
56. h7 { [%clk 0:15:33] } 56... Rh1 { [%clk 0:21:15] }
57. Kg6 { [%clk 0:15:34] } 57... f2 { [%clk 0:21:22] }
58. Kf7 { [%clk 0:15:27] } 58... f1=Q+ { [%clk 0:21:29] }
59. Kg8 { [%clk 0:15:27] } 59... Qf6 { [%clk 0:21:26] }
60. e5 { [%clk 0:15:09] } 60... Bxe5 { [%clk 0:21:32] }
61. h8=Q { [%clk 0:14:54] } 61... Rxh8# { [%clk 0:21:30] } 0-1Phase one: trade the queens, walk the king
1.e4 c6 2.Nf3 d5 3.Nc3 dxe4 4.Nxe4
The Caro-Kann begins normally. I choose the Two Knights Attack, Black releases the central tension, and my knight recaptures on e4.
Stockfish considers all of this ordinary. Its evaluation stays between +0.24 and +0.36 for White. The rating gap has not appeared on the board. Ratings do not get a piece.
4…Nf6 5.d3 Nxe4 6.dxe4 Qxd1+ 7.Kxd1
I play 5.d3, offering an exchange of the knight on e4. Stockfish slightly prefers 5.Qe2, which keeps more pieces on the board and asks Black to decide how to handle the knight. The game continuation is still sound.
Black exchanges on e4 and then trades queens. I recapture with the king.
This looks inconvenient because White has permanently lost the right to castle. In a queenless position, however, the king on d1 is not automatically a crisis. It can walk toward safety, and the rook on h1 may even find work along the newly opened g-file after the next sequence.
After 7.Kxd1, Stockfish says +0.12. We have reached the rare opening position in which White’s king has moved and the engine remains bored.
7…Bg4 8.h3 Bxf3+ 9.gxf3
Black pins the knight, I ask the bishop a question, and Black chooses to exchange. The g-pawn recaptures because the king cannot.
White’s kingside pawns are doubled, but the structure has compensating details:
- the f3-pawn supports e4;
- the g-file is half-open for the rook;
- Black has surrendered the bishop pair; and
- with queens gone, the exposed-looking king is much harder to attack directly.
Stockfish still calls the position equal. The doubled pawns are ugly. They are not guilty.
Phase two: one slow concession
9…e6 10.Bf4 Nd7 11.c4?
My first substantial mistake is not tactical. 11.c4? tries to hold central space and discourage …e5, but it makes the d4-square available and restricts my own light-squared bishop.
Stockfish prefers immediate development with 11.Bc4:
11.Bc4 Bc5 12.Ke2 f5 13.Rd1
The game move shifts the evaluation from roughly equal to −0.83. No pawn falls. Black simply gets the easier plan.
This is a useful kind of engine criticism because there is no combination to memorize. When the king has already moved and the rooks need coordination, another pawn move should have to explain why development can wait.
11…Bc5 12.Rh2 e5 13.Be3 O-O-O 14.Ke2
The rook lift to h2 looks eccentric and is not Stockfish’s first choice, but it has a job: the rook can slide to g2 behind the open file. Black grabs space with …e5, and I retreat the bishop before walking the king to e2.
Black castles long. Now both kings have reached the queenside by completely different legal procedures.
The engine prefers 14.h4 and gives Black a modest edge after 14.Ke2, but White is organized enough to play. The king is not being hunted. The bishops have squares. The h-rook has a route.
14…Be7 15.Rd1 Kb8 16.a3 h6 17.b4 g6 18.c5
I build a queenside chain with c4–b4–c5. Black makes luft, prepares kingside space, and waits.
This is the point where the game starts looking bleak in a quiet, adult way. Black has a safe king, a compact structure, and pieces that can use the center. White’s king has spent the opening commuting between d1 and e2. The rook on h2 is still waiting for its promised career.
But the structure also gives White something concrete. The queenside pawns cramp Black, the bishop pair survives, and f4 is available as a break.
Then Black breaks first.
The position turns: 18…f5?
Black plays 18…f5?, attacking the e4-pawn and beginning kingside expansion.
The move looks powerful. Stockfish says it is the first serious Black error of the game. Instead of maintaining equality with 18…b6, Black gives White an advantage of about +0.85.
The best response is 19.Rg2!, finally completing the rook’s long route:
19.Rg2 g5 20.h4 fxe4 21.fxe4 Rhg8 22.Ke1
I play 19.h4 instead. It is less precise, but it keeps a small White edge and asks Black whether the kingside pawns are really ready to move again.
Black answers yes.
19…f4?
The pawn advances to f4 and attacks my bishop on e3.
This is the moment when appearances and evaluation separate completely. The bishop must move. Black has a protected pawn deep in White’s position. The g-pawn can advance. A stronger opponent appears to be rolling downhill.
Stockfish evaluates the position at +2.39 for White.
The f-pawn has overextended. Black has closed the kingside before completing development, and White’s bishops can use the weakened dark squares. The engine prefers 20.Bc1, but my 20.Bd2 preserves the advantage at +2.45 and registers no meaningful loss in the resulting-position search.
Black replies 20…Bf6?, and the engine rises to +3.03.
This is not a drill. White is better. Against a player rated 526 points higher, after the awkward king walk and the rook on h2, I have reached the kind of position where a clean continuation can take control of the game.
The comeback is real.
Please enjoy it responsibly.
The move that lets the air out: 21.Ke1?
I retreat the king to e1.
The move feels prudent. The king steps away from possible checks and gets closer to the back rank. Unfortunately, it ignores the opportunity created by Black’s last move.
Stockfish wants 21.Bc3!:
21.Bc3 Rhe8 22.Rd6 Be7 23.Rxg6 Bxc5 24.bxc5
The bishop challenges Black’s dark-squared bishop, the rook becomes active on d6, and White starts collecting the kingside pawns. That continuation keeps an advantage around +3.0.
After 21.Ke1?, the evaluation falls to +0.53. I did not blunder material. I blundered the moment.
That can be harder to feel over the board. A hanging rook announces itself. A temporary window for activity closes silently.
Still: +0.53 is not a disaster. White remains slightly better. The position is complicated. The comeback has not been canceled; it has merely been placed on administrative leave.
21…Nf8 22.Bc4 Rd4
Black consolidates the knight and activates the rook on d4. I find 22.Bc4, Stockfish’s first choice, and Black finds 22…Rd4, also Stockfish’s first choice.
The rook is impressive but not yet decisive. White can play 23.Bb3, challenge it with a rook, and keep a small edge.
23.Bf7? Rd3?
I send the bishop to f7 instead. The move gives Black a slight advantage; 23…Rh7 would exploit the bishop’s placement and keep it.
Black chooses 23…Rd3?, invading with the rook but returning the edge to White. After 24.h5 g5 25.Bc1, Stockfish calls the position essentially equal.
This short phase deserves a clean accounting:
- White had about +3.03 after Black’s 20th move.
- White’s 21.Ke1? reduced that to +0.53.
- White’s 23.Bf7? gave Black approximately −0.49.
- Black’s 23…Rd3? returned White to +0.36.
- after 25.Bc1, the engine says 0.00.
Against the 1693, after twenty-five moves, the game is level.
There is no need to discuss anything that happens later. We have established the moral victory and may all leave in excellent spirits.
The equal position lasts exactly two moves
25…Rxd1+ 26.Kxd1 Rh7 27.Be8?
Black exchanges the active rook for mine. I recapture with the king, and Stockfish still says 0.00.
The correct plan is patient bishop placement: Ba2, Bb3, or Bc4. Those moves preserve the bishops, keep an eye on the queenside, and allow the rook to contest the h-file.
I play 27.Be8?.
The bishop steps onto a square where …Re7 can attack it while Black prepares to exchange the other bishop with …Nxg6. Stockfish drops the position to −1.29.
Black chooses 27…Ne6, which is less exact and cuts the advantage roughly in half. I play 28.Rh1, Black centralizes with 28…Nd4?, and suddenly the engine gives White a narrow route back toward equality.
The required move is 29.Bb2!:
29.Bb2 Nxf3 30.Ke2 g4 31.Rd1 Rg7 32.Bg6
White develops the bishop that has been waiting on c1 since move one, keeps the rook active, and limits the damage. The evaluation is only about −0.56. Difficult, yes. Lost, no.
The comeback is once again peeking through the kitchen door.
29.Rh3?
I lift the rook to h3.
It looks active. It protects f3, supports the h-pawn, and appears ready to slide across the third rank. It also leaves the bishop on c1 undeveloped and gives Black a forcing tempo against the bishop on e8.
Black plays 29…Re7!. The evaluation falls to −2.89.
The rook lift is the game’s largest ordinary evaluation loss for White: about 2.25 pawns compared with 29.Bb2. The move tries to improve the piece that was already active while ignoring the piece that had never entered the game.
That is the strategic lesson in one sentence: before making your good piece more ambitious, ask whether your bad piece has clocked in.
The rook enters and the bishop disappears
30.Bg6 Rd7 31.Ke1?
I save the attacked bishop. Black doubles down on the d-file, and I move the king back to e1.
Stockfish prefers 31.Rh1, keeping the king near the queenside and denying Black some checking geometry. 31.Ke1? deepens Black’s advantage to −4.53.
31…Nc2+ 32.Kf1 Rd1+ 33.Kg2?
Black checks with the knight, invades with the rook, and asks the king one last directional question.
The best answer is 33.Ke2!. After 33…Rxc1 34.Kd2 Ra1 35.Kxc2, White can eventually take the knight on c2. Black remains clearly better, but the exchange has a limit.
I choose 33.Kg2? instead.
Black plays 33…Rxc1, taking the bishop that never moved.
The evaluation reaches −6.95. My dark-squared bishop began on c1, watched sixty-five half-moves go past, and was then removed by a rook as though the opening setup were being cleared after an event.
Now it is bleak.
Which means it is finally time to fight.
Refusing to become a diagram
34.a4 Nxb4 35.a5 Rxc5 36.Bf5 Rxa5
Black methodically collects the queenside. The a-pawn advances to a5 and briefly looks like counterplay; Black takes the b-pawn, then the c-pawn, then the a-pawn.
The engine evaluation passes −8.0. The objective comeback is over.
But “lost” is an engine category, not a move. Black still has to finish. White still has one rook, one bishop, a king that is no longer afraid of daylight, and the doubled h-pawn that came from 9.gxf3.
37.Rh1 Nc2 38.Rd1 Nd4 39.Bd7 Kc7 40.Be8 Ra3
The pieces reorganize. Black’s knight occupies d4. Black’s rook attacks from the side. My bishop keeps moving between d7 and e8, doing the chess equivalent of refusing to sign for a package.
There is no tactical rescue here. There is, however, a plan: activate the king, remove kingside pawns, and make the h-pawn somebody else’s problem.
41.Kh3 Rxf3+ 42.Kg4 Rxf2 43.Rxd4
The king marches into the checks. Black takes both f-pawns. I answer with 43.Rxd4, giving the rook for Black’s knight.
Stockfish prefers 43.Rd3, but only by about half a pawn in a position already evaluated beyond −10. The exchange is not objectively saving. Practically, it removes the centralized knight and simplifies the board into a race that has one extremely visible idea.
After 43…exd4, Black has a rook, bishop, and dangerous connected passers against my bishop and kingside pawns.
That sounds conclusive.
My king is on f5.
The h-pawn is still alive.
Do not touch that evaluation ledger yet.
The king starts making it look possible
44.Kf5 Bg7?! 45.Kg6 Bf8 46.Kf7 Bd6 47.Kg7
Black should play 44…Bd8, placing the bishop where it can control the promotion route and coordinate with the pawns. 44…Bg7?! gives back nearly two pawns of evaluation, although Black remains completely winning.
The human board looks more encouraging than that sentence.
My king reaches g6, then f7, then g7. The h5-pawn waits behind it. Black’s bishop retreats. Black’s rook is tied to promotion geometry. The king has walked from d1 to e2, back to e1, through f1 and g2, then up the board until it is standing one file from the corner.
The comeback has changed forms. It is no longer “can White restore equality?” It is “can White make one threat serious enough that Black stops being comfortable?”
The answer is yes.
Please do not ask the follow-up question yet.
47…d3 48.Kxh6
Black pushes the d-pawn. I capture on h6, clearing the h-pawn’s path.
This move is the point where Stockfish first announces a forced mate. It prefers 48.Kf6, which prolongs the game without changing the result. 48.Kxh6? allows mate in ten under this search.
But look at the board without the number. White has a king on h6, a pawn on h5, a bishop available to stop the d-pawn, and another pawn on e4. Black’s king is far away. The finish still has to be calculated.
48…Rg2 49.Bf7 d2 50.Bb3 Rg1 51.Kg6
The bishop drops back just in time. Black’s d-pawn reaches d2. The rook supports it from g1. My king returns to g6 so the h-pawn can run.
Both sides are one move from doing something irreversible.
51…d1=Q 52.Bxd1 Rxd1
Black queens first.
For less than one move, the board contains a new black queen. My bishop immediately captures it. Black’s rook captures the bishop.
The d-pawn has done its job: it removed White’s last minor piece and pulled Black’s rook to d1. Now the material is rook and bishop against two pawns.
But the rook has left the h-file.
That seems important.
The pawn race
53.Kxg5 f3 54.h6 Be5 55.Kf5 Bd4 56.h7
I remove the g-pawn and push the h-pawn. It reaches h7.
One square remains.
Black’s f-pawn is also running, but it is only on f3. My king is active. The black rook is on d1. The bishop has to watch promotion. The e-pawn can still distract it.
This is starting to look—if you stand at the correct distance from Stockfish—like a comeback.
Black plays 56…Rh1.
The rook crosses from d1 to h1 and takes control of the promotion file from behind. This is the quiet move that tells the truth about the position. The pawn can reach h8. The rook can reach h8 too.
57.Kg6 f2 58.Kf7 f1=Q+
Black queens again, this time with check.
The first promoted queen was a decoy that disappeared immediately. The second arrives with tempo and stays.
59.Kg8 Qf6 60.e5 Bxe5
Black could mate at once with 59…Rg1#. Instead, 59…Qf6 keeps the forced mate. I push 60.e5, Stockfish’s best move, and Black’s bishop captures it.
White now has one legal idea left.
It is not enough.
It is still correct.
61.h8=Q
I promote the pawn.
For one half-move, ThreeSadPandas has a queen again.
Not a rook to change the geometry. Not a bishop as a symbolic objection. A queen. Full value. Full ceremony. A panda with self-respect does not carry a pawn across the entire board merely to become modest at the end.
61…Rxh8#
Black’s rook travels from h1 to h8, captures the newborn queen, and delivers checkmate.
The pawn promoted because promotion was the best move. The queen died because every promotion lost. The rook had been waiting on the same file for five moves.
The comeback was not real.
The fight was.
Now we may look at the engine ledger
Every score below is from White’s perspective. Positive favors White. Negative favors Black. Mate scores replace decimal evaluations once Stockfish sees a forced finish.
| Moment | Evaluation | What changed |
|---|---|---|
| 7.Kxd1 | +0.12 | Queen trade leaves a balanced ending-like middlegame |
| 11.c4? | −0.83 | White gives Black the easier central plan |
| 13…O-O-O?! | −0.42 | Black returns part of the edge |
| 15…Kb8?! | +0.06 | Position returns to equality |
| 18…f5? | +0.85 | Black overextends on the kingside |
| 19…f4? | +2.39 | White receives a real advantage |
| 20…Bf6? | +3.03 | High point of White’s game |
| 21.Ke1? | +0.53 | White misses 21.Bc3! and most of the advantage disappears |
| 23.Bf7? | −0.49 | Black takes a small edge |
| 23…Rd3? | +0.36 | Black returns it |
| 25…Rxd1+ | 0.00 | Exact equality after the rook exchange |
| 27.Be8? | −1.29 | White’s bishop placement creates tactical trouble |
| 28…Nd4? | −0.50 | 29.Bb2 would keep the game close |
| 29.Rh3? | −2.81 | White misses the last resilient setup |
| 31.Ke1? | −4.53 | Checks on the d-file become forcing |
| 33…Rxc1 | −6.95 | Black wins the undeveloped bishop |
| 36…Rxa5 | −8.18 | White’s queenside counterplay disappears |
| 43…exd4 | −11.01 | The rook-for-knight liquidation leaves a lost race |
| 44…Bg7?! | −9.87 | Black gives the king and h-pawn more room |
| 47…d3?! | −13.55 | Inaccurate, but still completely winning |
| 48.Kxh6? | Mate in 10 | The king takes a pawn and enters a forced mating net |
| 51…d1=Q | Mate in 9 | First black promotion |
| 58…f1=Q+ | Mate in 2 | Second black promotion |
| 61.h8=Q | Mate in 1 | White promotes with honor |
| 61…Rxh8# | Checkmate | The rook collects the queen and the king |
The ledger reveals three different games.
First, an equal queenless middlegame. Second, a real White advantage created by Black’s premature kingside expansion. Third, a technical loss that White makes visually dangerous by activating the king and advancing the h-pawn.
The misleading part was the hope after move forty-three. Stockfish never believed in it. The useful part was playing as though practical chances still mattered.
What I did well
I accepted the queenless position
After 6…Qxd1+, I did not treat the loss of castling rights as an emergency. The king found workable squares, the doubled pawns supported the center, and the position remained balanced.
I built space against a much stronger opponent
The queenside chain was not perfect, but b4 and c5 restricted Black and helped provoke …f5 and …f4. Those pawn moves gave White the game’s largest advantage.
I found 20.Bd2
When the bishop was attacked, I preserved it with a Stockfish-approved retreat. After Black’s reply, White reached +3.03.
I kept creating practical problems
Once objectively lost, I activated the king, removed the centralized knight with Rxd4, captured kingside pawns, and advanced the h-pawn to the final rank. None of it saved the game against accurate play. All of it required accurate play.
I promoted
Standards remain standards.
What I need to fix
Develop the worst piece
The bishop on c1 is the central failure of the game. 11.c4? restricted it. 29.Rh3? ignored the chance to develop it with Bb2. 33…Rxc1 finally removed it without the bishop having made a move.
Training question: before improving an active rook, which piece still has no useful square or job?
Recognize when activity is temporary
After 20…Bf6?, 21.Bc3! used the moment to invade with Rd6 and attack g6. 21.Ke1? made a generally sensible king move while the tactical window closed.
Training question: what became possible specifically because of the opponent’s last move?
Answer checks with the resulting position in mind
The sequence 31…Nc2+ 32.Kf1 Rd1+ 33.Kg2? let the rook take c1 while the king could no longer approach the knight. 33.Ke2! would have kept a route toward c2 and limited the material loss.
Training question: after the check ends, where do the checking piece and my king stand, and what can each capture next?
Use the clock on structural and tactical decisions
White finished with 14:54. Black finished with 21:30. The arena format rewards finishing games, but this was 20+10 Classical and neither player faced time pressure.
The positions after 20…Bf6, 28…Nd4, and 32…Rd1+ deserved longer calculation. The increment was not merely decorative; it was permission to stop and inspect the whole board.
Reproducible engine record
The run used:
- Stockfish 18;
python-chess1.11.2;- 4 threads;
- 512 MB hash;
- 5,000,000 nodes for each search;
- MultiPV 3 before every played move;
- a separate 5,000,000-node search after every played move; and
- principal variations limited to 12 plies in the saved report.
Scores are normalized to White’s perspective. Multi-threaded searches may differ by a few centipawns between runs. Those tiny changes are noise; the swings discussed here are not.
The same repository-owned harness used for the earlier Engine Room work produced this report:
#!/usr/bin/env python3
"""Produce a reproducible, move-by-move Stockfish report for a PGN game."""
import argparse
import json
import shutil
from pathlib import Path
import chess
import chess.engine
import chess.pgn
def score_for_white(info):
return info["score"].pov(chess.WHITE).score(mate_score=100000)
def display_score(info):
score = info["score"].pov(chess.WHITE)
if score.is_mate():
mate = score.mate()
return f"M{mate}" if mate is not None and mate >= 0 else f"-M{abs(mate or 0)}"
value = score.score()
return f"{(value or 0) / 100:+.2f}"
def pv_to_san(board, pv, length=12):
variation = board.copy()
moves = []
for move in pv[:length]:
if move not in variation.legal_moves:
break
moves.append(variation.san(move))
variation.push(move)
return " ".join(moves)
def main():
parser = argparse.ArgumentParser()
parser.add_argument("pgn", type=Path)
parser.add_argument("output", type=Path)
parser.add_argument("--engine", default=shutil.which("stockfish") or "stockfish")
parser.add_argument("--nodes", type=int, default=500000)
parser.add_argument("--multipv", type=int, default=3)
parser.add_argument("--threads", type=int, default=4)
parser.add_argument("--hash", type=int, default=512)
args = parser.parse_args()
with args.pgn.open() as source:
game = chess.pgn.read_game(source)
if game is None:
raise SystemExit("No PGN game found")
engine = chess.engine.SimpleEngine.popen_uci(args.engine)
engine.configure({"Threads": args.threads, "Hash": args.hash})
report = {
"game": dict(game.headers),
"method": {
"engine": engine.id,
"python_chess": chess.__version__,
"nodes_per_search": args.nodes,
"multipv": args.multipv,
"threads": args.threads,
"hash_mb": args.hash,
"score_perspective": "White; positive favors White",
"mate_score_centipawns": 100000,
"pv_length_plies": 12,
},
"positions": [],
}
try:
board = game.board()
for ply, move in enumerate(game.mainline_moves(), start=1):
mover = board.turn
move_number = board.fullmove_number
played_san = board.san(move)
candidates = engine.analyse(
board,
chess.engine.Limit(nodes=args.nodes),
multipv=args.multipv,
)
candidate_rows = []
for rank, info in enumerate(candidates, start=1):
candidate_rows.append(
{
"rank": rank,
"move": board.san(info["pv"][0]),
"score": display_score(info),
"score_cp_white": score_for_white(info),
"depth": info.get("depth"),
"seldepth": info.get("seldepth"),
"nodes": info.get("nodes"),
"pv": pv_to_san(board, info["pv"]),
}
)
best_cp = candidate_rows[0]["score_cp_white"]
best_move = candidates[0]["pv"][0]
board.push(move)
after = engine.analyse(board, chess.engine.Limit(nodes=args.nodes))
after_cp = score_for_white(after)
loss = best_cp - after_cp if mover == chess.WHITE else after_cp - best_cp
report["positions"].append(
{
"ply": ply,
"move_number": move_number,
"side": "White" if mover == chess.WHITE else "Black",
"played": played_san,
"best_move": candidate_rows[0]["move"],
"is_best": move == best_move,
"centipawn_loss": max(0, loss),
"evaluation_after": display_score(after),
"evaluation_after_cp_white": after_cp,
"after_depth": after.get("depth"),
"after_seldepth": after.get("seldepth"),
"after_nodes": after.get("nodes"),
"best_reply_line_after": pv_to_san(board, after.get("pv", [])),
"candidates_before": candidate_rows,
}
)
finally:
engine.quit()
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(json.dumps(report, indent=2) + "\n")
if __name__ == "__main__":
main()
The preserved source files are:
analysis/stockfish/rPcoJNTf.pgn— the exact Lichess PGN with clocks;analysis/stockfish/rPcoJNTf-stockfish18.json— the complete five-million-node report; andscripts/analyze_game.py— the reusable analysis harness.
The PGN and report remain internal source evidence rather than public downloads. The script is displayed through the repository-restricted shortcode. Stockfish is free, open-source software; this site invokes a local installation and does not redistribute the engine binary. The evergreen explanation is in What Stockfish Is and How I Use It.
The honest verdict
I did not nearly save the final position. Stockfish is unambiguous about that.
What I nearly did was convert an equal opening into a serious advantage against a player rated 526 points higher. After 20…Bf6?, White was about +3.03. I gave most of it away with a passive king move, returned to exact equality, then lost the thread through undeveloped pieces and forced checks.
That is the painful lesson.
The encouraging lesson is that the rating gap never made the decisions for me. Black made mistakes. I created pressure. I reached a winning evaluation. Even after the game became objectively lost, I forced the board to contain two black promotions, one captured queen, a king on the seventh rank, and a white pawn one step from glory.
Then the pawn took the step.
The queen lived for exactly zero replies.
But she lived.