Here is an experiment worth running. Go to any chess site, pick the weakest bot it offers — the one labelled 400, or 250, or simply "Beginner" — and play it as someone who has just learned the rules.
A lot of people lose. Then they lose again. Then they conclude, reasonably enough, that they are hopeless at chess and go and do something else.
The uncomfortable part is that they were probably not playing a 400-rated opponent at all.
The floor
Stockfish is the strongest chess engine in the world and, by a very wide margin, the one most chess bots are built on. It exposes a strength dial through the UCI protocol called UCI_Elo: you enable UCI_LimitStrength, you pass a number, and the engine plays at roughly that level.
That dial has a minimum. In Stockfish 16, 17.1 and 18 the accepted range is 1320 to 3190. In the older Stockfish 10 and 11 it was 1350 to 2850.
So what happens if you ask for 400?
It does not error. It does not warn you. It does not refuse. The value is silently clamped up to the floor and the engine plays at 1320 — roughly a decent club player — while your interface cheerfully displays whatever number you asked for.
This is not a bug, and it is not hidden. It is documented behaviour, and from the engine's point of view it is the sensible thing to do: Stockfish's strength limiting works by degrading a very strong search, and below a certain point that approach stops producing anything resembling coherent chess. The floor is honest about where the technique runs out.
The dishonesty, when it happens, is one layer up — in software that passes a number below the floor and then reports it back to the user as though it took effect.
What 1320 actually feels like
It is worth being concrete about the gap, because "1320" does not sound like much if you do not have a feel for rating scales.
A 1320-rated player has a real opening repertoire, sees most one-move threats, punishes hanging pieces immediately, and will convert an extra rook without difficulty. They are stronger than the large majority of people who play chess casually. Someone who learned the rules a month ago is not close.
There is a second wrinkle that makes it worse. Stockfish's Elo limiting is calibrated at a time control of 120 seconds plus 1 second per move, anchored to the CCRL 40/4 rating list. Over a typical forty-move game that works out to about four seconds of thinking time per move. Give the engine more time than the calibration assumes and it plays above its label — a doubling of thinking time is worth somewhere in the region of 50 to 70 Elo.
So the beginner experience is often: a bot advertised at 400, actually limited to 1320, possibly thinking for longer than the calibration assumed. And then, because strength limiting works by injecting errors into a strong search, it will occasionally throw a piece away for no reason — which is exactly the thing that makes the whole experience so confusing. You lose, you see the bot blunder, you lose again anyway.
Why not just search less deeply?
There is an obvious-looking way around the floor: instead of asking for a low rating, tell the engine to search only one move ahead. No floor applies, and the engine gets genuinely weak.
We tried this. It works, in the narrow sense that it produces a beatable opponent, and it is badly lopsided in practice.
An engine searching to depth 1 calculates perfectly one ply deep and is then completely blind. It never sees the reply. So it grabs any free material on offer and hangs its own pieces constantly — but it never drifts, never makes a vague move, never puts a piece on a slightly wrong square. Real beginners do all of those things and do not hang a piece every single move. Depth-1 chess is weak in a way that no human is weak, and playing it teaches you very little.
The engine that can actually play badly
Stockfish is not the only engine in the world, and not all of them have this floor.
Texel, by Peter Österlund, accepts a UCI_Elo range of −625 to 2540. Not a typo, and not clamped — genuinely negative, all the way down. It also exposes a separate Strength setting from 0 to 1000, where zero is a completely random mover.
That range exists because Texel degrades differently. Rather than running a strong search and spoiling the output, it weakens the evaluation and the search together, so the result is an engine that plays consistently badly rather than one that plays well with seizures. It misses things. It leaves pieces loose. It does not suddenly produce a grandmaster move in the middle of a bad game.
On Chessy, that is what our beginner bot runs on. Aunt Judith is Texel with a requested rating of 250, and she really does not see what you are about to do.
An honest caveat about that number. 250 is a requested UCI_Elo, not a measured strength. Texel's internal scale is not anchored to CCRL, and we have not run calibration games against rated humans to verify where she actually lands. What we can say with confidence is that the request is not being silently clamped, which is exactly the thing that was going wrong before.
Why this matters more than it sounds like it should
Beginners are the largest group of chess players in the world and the worst served by chess software. Nearly every tool is built by and for people who are already good — engines, opening databases, analysis boards, puzzle rushes. All of it assumes you can already see a hanging knight.
The single most important thing for someone in their first month of chess is a winnable game. Not a fair game, not an instructive game — a game they can actually win, against an opponent who is genuinely worse than they are. That experience is what makes people come back the next day.
A hard floor at 1320 makes that experience impossible to deliver, and because the clamping is silent, the software delivering it does not know it is failing. It shows a "400" label, the engine plays at 1320, and the person on the other side of the screen concludes the problem is them.
It is not them. It is a range check.
Check it yourself
None of this requires taking our word for it. The range is declared in Stockfish's own source, in the UCI option definitions, and it is stated in the official Stockfish UCI documentation. If you have a copy of the engine, you can confirm the clamping in about a minute: enable UCI_LimitStrength, set UCI_Elo to 400, and ask the engine to echo the option back.
It will tell you 1320.
