Concepts
Rules and the anti-chase laws
The board is ten by ten with two lakes, so 92 squares can hold a piece. Red sets up on the first four ranks, Blue on the last four, and Red moves first. A move shifts one piece one square orthogonally; a Scout may move any number of empty squares in a straight line. Moving onto an opponent's square is an attack: both types are revealed, the higher rank wins, equal ranks both die, the Spy beats the Marshal only when attacking, and only a Miner survives a Bomb. Capturing the Flag wins.
Two further rules matter for engines because they are the only things that stop a stronger piece from chasing a weaker one forever, and because they need history. The paper's simulator tracks the last four positions of the last-acting piece for the first and keeps a board history for the second.
The two-square rule
A piece may not cross the same square boundary on more than three consecutive turns of its owner. Moving from e4 to e5, back to e4, and to e5 again is allowed; the fourth crossing back to e4 is not, whatever the opponent did in between. The ISF text says the same thing as "not more than 3 times non-stop between the same two squares", and adds that a Scout is considered to occupy every square it passes over, which is why the engine reasons about boundaries rather than squares: a Scout that went e2 to e6, e6 to e3 and e3 to e5 has crossed the boundary between e4 and e5 three times and may not cross it again on its next turn, whether it moves one square or five.
Attacks count as moves. The engine keeps each player's last three moves and a counter of how many were made consecutively by the same piece, which is enough to decide the rule in a few comparisons.
The continuous-chase rule
Human rules call this the more-squares rule and describe it informally. The engine uses the paper's definitions. A threat is a move that ends adjacent to an opponent's movable piece without attacking. An evade moves the threatened piece to a square not adjacent to the threatening piece. A chase is an unbroken alternation of threats and evades. While a chase is running, the chasing player may not make a threat that recreates a position that already occurred after a threat of this chase, unless the threatening piece is simply returning to the square it left on its previous turn. That exception hands the two-move oscillation to the two-square rule, which bounds it at three crossings.
Positions are compared by a Zobrist key of piece placement. The engine remembers the last 32 after-threat positions of the current chase, which covers a full lap around a lake with room to spare; a chase longer than that keeps its most recent 32 positions, a limit that has never been reached in testing and that the record of any run will show if it is.
Draws and losses without a battle
A player with no legal move on their turn loses; if the opponent would
also have no legal move, the game is drawn. After
Every rule is covered by a test in crates/engine/tests, including the
full lap around the lake above and the interaction between the chase
exception and the two-square limit. The next page is about
how the engine makes all of this fast.