The opening: Black has two moves to find
The forced part of the game is a chain of captures four or five plies long, with three forks on the main line. Two are Black’s, and both decide the game. One is Red’s, and does not. A fourth, after a losing move by Black, holds most of the tree. Red’s first move is a cannon taking a horse; the two choices are mirror images, so call it 1. Cxb10. In the boards below, the arrows are every capture the side to move has.
| Fork | Capture | With best play | Endings below | Proven |
|---|---|---|---|---|
| Fork A | 1... Cxh1 | Draw | 82 | 62 |
| Fork A | 1... Rxb10 | Red wins | 1 | 1 |
| Fork B | 2. Rxh1 | Draw | 1 | 0 |
| Fork B | 2. Cxd10 | Draw | 81 | 62 |
| Fork C | 2... Cxf1 | Red wins | 80 | 62 |
| Fork C | 2... Kxd10 | Draw | 1 | 0 |
| Fork D | 3. Kxf1 | Red wins | 1 | 0 |
| Fork D | 3. Cxf10 | Black wins | 58 | 44 |
| Fork D | 3. Cxa10 | Draw | 21 | 18 |
One verdict on the main line rests on search alone. The engine found 2...Cxf1 losing at 100,000 nodes a move and again at a million, and the prover ran out of budget on it. If it does hold, Black has a second way to draw, and the game is still a draw.
Why the chariot recapture loses
A certificate is a tree: at every Red move it holds one move, and at every Black move it holds every legal reply. The one for 1...Rxb10 has 1,864 positions. Below is its main line. At Red’s first free move Black has 42 legal replies, and the certificate answers each of them.
A quiet move that leaves your opponent exactly one capture is a move your opponent has to make. Red’s back-rank pieces become a queue, and Black’s chariot, forced to take whatever is put in front of it, empties the queue for Red. Thirty plies later Red has nothing left and has won. So Black’s only move is 1...Cxh1.
After the chain: what each side plays for
Left, after 1. Cxb10 Cxh1 2. Rxh1 Rxb10, Red to move. Right, after 2. Cxd10 Kxd10 3. Rxh1, Black to move, the same material with the general on d10. The engine’s games from here, at three budgets, show what the middlegame is about.
You cannot lose a piece; you can only have it taken. So every move is an offer, and the ones that count are the offers the opponent cannot refuse: a quiet move that leaves them exactly one capture.
A loose chariot is a liability. Put pieces in its path and it must take every one, which is how the chariot recapture loses. So both sides open by offering cannons. In the game at two million nodes a move, 3. Cb3 screens Black’s cannon onto the b1 horse, three captures follow, and both chariots are loose. Fourteen plies of compelled captures follow, with material coming off in step.
Or a slow war of soldiers. At five million nodes nobody finds a forcing offer early, and soldiers walk into each other for a hundred plies, taken in pairs, with an elephant and a general thrown in on the way.
Then the palace makes it a draw
To win you must lose your general, both advisors and both elephants, and none of them can leave home. Each can only be taken by an enemy piece that comes to it, and both players are trying to get rid of exactly those pieces. Once neither side has a chariot, horse, cannon or soldier left, no capture is possible ever again, and the rules score that a draw.
The two-million-node game gets there at ply 35, Red feeding its last mobile pieces to Black’s chariot, and repeats to a draw at ply 44. The soldier war ends with a chariot and the palace pieces each, and that draw can be checked by hand. Black’s chariot sits on lines none of Red’s pieces can reach, so it can never be made to capture; either chariot can be thrown away at will; and with no capture on the board any move is legal, so whoever wants to wait shuffles an advisor until the progress clock ends the game.
To win you need the opponent to keep enough mobile force to eat your whole palace, and to be compelled to use it. They control that force: they can throw it into captures you cannot refuse, park it, or wait. In every engine game one of the three was there when wanted, and in random play a quarter of 3,000 games stall.
This is evidence for a draw, short of a proof. Search to five million nodes a move found no win from either surviving position. We have not shown that a way out exists from every position the chain can lead to, only that no search found a position without one. The title is that verdict and that geometry.
Could it be made a game?
The draw comes from one fact: five pieces a side can only be taken by pieces the opponent would rather throw away. A repair has to change that, change what you have to lose, or change what a stall is worth. We tried four, through the same referee, sweep, prover and self-play. None made a game.
Score every stall for the side with fewer pieces. This is FICS’s stalemate rule applied wherever the game stops, and it hands a frozen board to whoever is lighter. Random play goes from 26% undecided to 4% with no tilt (Red 47.9%). Engine play did not change at all: the engine does not know the rule, so the same games were simply scored differently, which says nothing about the game the rule would create. Testing it properly needs a Fairy-Stockfish patch so the engine plays for the count. It is the only repair that keeps the game recognisable and might work, and the stall key is already in the kernel if anyone wants to try.
Lose the general instead of everything. Codrus, the 1844 ancestor, puts the target in reach down a file, but a side that sheds its mobile pieces can still never be made to take the enemy general. It draws through the same two opening lines, faster: 28 endings, 20 of 25 losses proven, three self-play draws.
Keep the general royal. Losers, ICC’s version, keeps check and mate, and being mated or reduced to the bare general wins. It is decisive the wrong way: Black wins at one, two and five million nodes, and backing up its 16-ending chain gives Black too, with 7 of 13 losses proven. A check suspends the obligation to capture, and that tempo lands with the second player in every line we looked at.
Let the palace pieces out. That removes the fortress by removing the confinement, and most of what makes the pieces xiangqi’s goes with it. We did not measure it; it is a different board.
How we checked it
The referee is a xiangqi rule kernel with switches for the rules above. Its move generation matches Fairy-Stockfish’s on 209 positions, with zero disagreements. In every game the engine proposes and the kernel decides, applies and ends the game, so an engine quietly playing different rules aborts the run.
The player is Fairy-Stockfish, configured through a variants file. Its evaluation was never taught this objective, and it shows. Ten times the search beats one times the search only 10-4 with 6 draws here, against 20-0 on normal xiangqi. That is why the opening rests on proofs.
The prover takes a position and a claim, such as “Red wins from here”, and builds a tree with one winning move at each of the winner’s turns and every legal reply at each of the loser’s, down to positions the kernel says are over. If the tree closes, the claim is a fact about the rules, whatever any engine thinks. It is proof-number search with a 60-ply cutoff that counts as a loss for the side trying to win, so a proof can never lean on it. Every proof is saved as a certificate, and a separate checker replays certificates against the kernel and does nothing else.
The sweep: whoever moves first at the end of the chain wins
The kernel walked every branch of the opening chain, 605 positions and 166 endings between 4 and 18 plies in, 72 of them at ply 14, and in 130 of them at least one general is already gone. Mirror images aside, 83 are distinct. The engine played a game from each at 100,000 nodes a move. In 70 of the 83 the game was over within 14 to 36 more plies, and the winner was whoever had the first free move at the ending, 66 times out of 70. The other 13 stalled, a draw under the rules as written.
| Ending at ply | Moves first | Endings | Red wins | Black wins | Stalls |
|---|---|---|---|---|---|
| 4 | Red | 2 | 1 | 0 | 1 |
| 5 | Black | 1 | 0 | 0 | 1 |
| 6 to 12 | Alternating | 14 | 8 | 6 | 0 |
| 14 | Red | 36 | 36 | 0 | 0 |
| 15 | Black | 5 | 0 | 4 | 1 |
| 16 | Red | 15 | 8 | 1 | 6 |
| 17 | Black | 6 | 0 | 6 | 0 |
| 18 | Red | 4 | 0 | 0 | 4 |
So inside the chain, every choice between captures is a choice about who moves first when the chain ends. Rerun at a million nodes a move, eleven verdicts moved: six stalls became wins, two wins took longer, three stalls stayed stalls, and no win changed sides.
The sweep finds candidates and settles nothing on its own. Its wins held up: none changed sides at ten times the budget, and 63 of the 70 were then proven without the engine. Its stalls are weaker evidence, since six of the 13 became wins at a million. The two stalls that matter are the surviving endings, and they stayed stalls at a million and in every game from the array at up to five million nodes a move.
The proofs
From each of the 70 decisive endings, with a budget of a million positions, 63 proofs closed, 7 ran out of budget, and none was refuted. The median proof is 19 positions, a single line in which every defending reply is compelled; the largest is the 1,864 of the chariot recapture. The checker passes all 63. The fork table is those values backed up the chain from the 100,000-node sweep, and scoring it from the million-node sweep changes no value within eight plies of the array.
Every game, to step through
Every game this article rests on is in the viewer below: the engine against itself at one, two and five million nodes a move; a game from each of the 83 endings of the opening chain; the 20 ladder games, where a strong engine met a weak one from random openings; and the main line of each of the 63 proofs. It opens on the 2M game. Pick any other from the list.
What we are publishing instead of a play page
Everything above is in one repository: the rule kernel, the three Fairy-Stockfish stanzas, all 166 endings of the opening chain, one engine game from each ending at each budget, every proof certificate, and the games in a viewer that opens from the folder. npm run verify replays every certificate against the rules in a few seconds and reports 63, 63, 20 and 7 valid, and the README has the four commands that reproduce the sweep and the proofs with a Fairy-Stockfish binary.
If you can show a third surviving opening, a defence in any certificate, or a win for either side from the positions above, open an issue there. This page will say so.