Extreme — The Strongest Quoridor Bot
Nemesis is the extreme tier: the strongest opponent on the roster, sitting one rung above Master, with the largest search budget of any bot here. Its ratings and the rest of the ladder are on the bots page. It is the right opponent if you already beat the tier below more often than not and you want a game where careless moves are simply punished — but it also has one blind spot that has been measured at two very different search budgets, and the larger budget did not close it. This page is mostly about that.
What "the largest budget" actually buys
Nemesis has the highest playout ceiling on the ladder, and it is not a close
thing: 60,000 playouts a move against Master's 20,000 — a factor of three
(src/lib/quoridor/engine/mcts/engine-v3.ts:106-111). Hold on to that number;
the rest of this page turns on it.
That ceiling is also rarely what stops the search. It is a clip laid over the
top of whatever the search had already decided to spend — in the source's own
words it "only clips the TOP"
(src/lib/quoridor/engine/mcts/engine-v3.ts:294-297) — and how much of it a
given position is granted is decided position by position
(how complexity sets the budget). On a benchmark position this
tier judged worth pushing on, it spent 49,524 playouts a move where Master
spent its flat 20,000
(tournament-results/2026-07-10-stage4-gates/g-speed-bench-simcap-fix.log:17-29),
so the gap you actually meet is nearer two and a half times than three — and in
a quiet position, smaller again. In a timed game a second bound sits underneath
all of it: a bot here may never spend more than a slice of its
remaining clock on a single move, and it holds a reserve back so it can always
answer and never flag (src/lib/quoridor/engine/time.ts:33-39, applied at
src/lib/quoridor/bot.worker.ts:404-405). That bound is generous next to
anything this tier would normally spend, so it bites only when the clock itself
is short — bullet, or the scramble at the end of a longer game — and it does
not apply to untimed games at all (src/pages/Game.tsx:1319-1322).
So "extreme" is a range rather than one fixed strength, and the rest of this page describes the top of that range: a position the tier judges worth pushing on, in a game whose clock is not squeezing it. Nemesis in bullet is a genuinely smaller opponent than Nemesis in a long game, and if you want to say you beat the strongest thing here, beat the long-game one.
What it does not get wrong
Do not plan to out-race it. Racing is the part of Quoridor that is closest to arithmetic, and it is the part this engine is best at (how it scores a move); and once its own walls are gone it stops searching altogether and simply walks (advanced covers that shortcut). A one- or two-square lead you were counting on is not a plan against this tier.
Nor will it fall for a cage that announces itself. The engine work here keeps
a scripted cage-builder — a deterministic opponent that scores every legal
wall by the two-wall seal that begins with it and commits the best one the
moment that score clears a fixed bar, whatever else the position is doing
(src/lib/quoridor/trap/trapper-bot.ts:126-146,111-113). Played from the
opening against the extreme tier, that script lost all twenty games, in both
seats, all but one of them inside thirty plies
(tournament-results/2026-07-10-stage4-gates/g-str-vstrapper-extreme.log:3-26).
When the top rung of the ladder was
re-measured, the extreme tier beat the tier below it in every game on both
seeds
(tournament-results/2026-07-10-stage4-gates/g-tiers-v3-mst-ext-seed1-simcap-fix.log:5,
…-seed2-simcap-fix.log:5).
The blind spot, and how it was found
Two recorded games are kept in the repository as fixtures: a human playing the
P1 seat beat the top bots twice, and both games were saved move for move
(src/lib/quoridor/trap/real-games.ts:91-114). They were not saved as
trophies. Every position in them where the bot was on move and two further
walls could already have added eight squares or more to its path was extracted
into a regression suite — nine positions in all — each one labelled with the
move the bot actually played on the way to losing
(src/lib/quoridor/trap/trap-suite.ts:1-11,42-72).
The suite scores a candidate move by asking what the position looks like
after it: how much two further walls could still add to the bot's path
(src/lib/quoridor/trap/acceptance.ts:175-178). A move that leaves the bot
eight or more squares from a two-wall seal counts as a miss
(SUITE_THRESHOLD_2WALL, src/lib/quoridor/trap/trap-suite.ts:19). Run at
the extreme tier's own budget across five seeds, the engine missed on 26 of
the 45 searches
(tournament-results/2026-07-10-stage4-gates/g-trap-arm-b-postfix.log:50).
The detail worth sitting with is what it did play. In the decisive position
from the first recorded game, the bot in the original loss stepped sideways
along its own shortest route and dived into the pocket, and lost
(src/lib/quoridor/trap/trap-suite.ts:74-82). The current engine does not
repeat that step — at every seed, in both test arms, it chose a wall instead
(tournament-results/2026-07-10-stage4-gates/README.md:144-168). And the
position it left behind was still eight to twelve squares from a two-wall
seal. It avoided the recorded blunder and remained just as trapped. The search
is not blind to the move that loses on the spot; it is blind to the shape
that makes every move lose slowly.
Why a bigger budget has not fixed it
The same suite was run twice on the same nine positions and the same five
seeds: once at a flat 20,000 playouts a search — Master's entire ceiling, spent
on every position alike — and once at the extreme tier's own pacing, which on
the benchmark above runs about two and a half times that
(tournament-results/2026-07-10-stage4-gates/README.md:100-101). Two and a half
times the thinking. The scores came out level: 25 misses
and 26 misses out of 45, within a single case of each other. That one case was
traced to a position where the tier's pacing gave the search fewer effective
playouts than the flat arm, not more — the difference ran the wrong way for
the budget story entirely
(tournament-results/2026-07-10-stage4-gates/README.md:102-128). Sweeping the
search's exploration constant across six values left that same case unmoved.
Budget buys precision inside a model of the game. It does not buy a new model. The samples this search draws are shaped like races (how the engine scores a move), and a pocket is therefore something it either meets statistically or does not meet at all (traps and cages works through why). Sampling more from a distribution that under-represents an event does not make the event more visible; it only makes your estimate of an already-wrong number more precise. That is a structural limit, and it is why the extreme tier is enormously harder than the tier below it at everything except this one thing, where the two came out level — a single case worse, in fact, at the larger budget.
It is worth carrying that idea out of the software and into your own play. Thinking longer only helps where your reading is already pointed at the right question. If you are counting the race very carefully and the position is about terrain, more calculation makes you more confidently wrong.
A plan for beating Nemesis
Let it commit first. The scripted trapper above starts walling the moment
any wall clears its bar, without waiting for its target to choose a side, and
it has never taken a game off this tier. That is not a proof of cause, but the
recorded human win did the opposite. Play the opening straight, let the bot
settle onto a file, and only then look for terrain. In that win, the
human's first three walls all went into the same groove across the board,
well before any of them touched the bot's flank
(src/lib/quoridor/trap/real-games.ts:95-96).
Build so that each wall reads as ordinary. The suite's misses are
positions the bot walked into while the pocket was still incomplete. In the
recorded game the bot stepped sideways along its own shortest route onto f4 —
the move the fixture is built around, and a real gain of one square on its
distance to goal — and then spent its next four turns backing out of it: f5, f6,
e6, e7, not one of them a step toward its own goal
(src/lib/quoridor/trap/real-games.ts:96-97; the seat's goal direction is
documented at real-games.ts:13-14). It had eight walls in hand while that
was happening, and the next three it spent went down on the opposite side of
the board from the pocket (src/lib/quoridor/trap/real-games.ts:97-99). The
recognition came, and it came several tempi late.
Price the door, not the walls. How much a pocket costs depends on where its remaining opening sits relative to the pawn's line of travel; traps and cages works out the two counts and tempo and the race supplies the distance model they use. The suite's own gate is a usable rule of thumb in your own games: if two more walls could add eight squares or more, the position is already a pocket whatever it looks like.
Do not expect it to panic. It plays the move its search kept returning to, right up until the sampling turns against it, and inside a forming pocket that is frequently one more step along its own shortest route. You will not get a warning move.
Do not start a cage you cannot finish. Everything above is only worth attempting when you are behind by more than a single wall can repair; a half-built cage hands over walls and tempi for nothing, and this tier is the one opponent here that will certainly convert them (what a cage costs to build).
Who this tier is for
Play Nemesis when you want the strongest game available here and you have a time control generous enough for it to matter — and when you are willing to lose most of them for a while. Drop back to Master if you are losing every game rather than most of them; the difference in difficulty is real and the games stay instructive. If you want to know why a game went the way it did rather than just that it did, the analysis and coaching tools are on Pricing, and the Glossary covers any term here that was unfamiliar.
The honest summary is that this bot is very hard to beat by playing well and somewhat easier to beat by playing differently. The regression suite exists because a human did exactly that, twice, and the games were good enough to keep.