Handicapped Engines: Why Stockfish Skill Level 5 Feels Alien

In short Skill Level weakens Stockfish by injecting random move selection, producing an opponent that plays grandmaster moves punctuated by moves no human would consider — which is why it teaches bad expectations.

Route ahead 6 sections
  1. What Skill Level actually does
  2. What a human 1400 does instead 1 min
  3. A worked example 2 min
  4. Why this teaches bad expectations 3 min
  5. What to do instead 3 min
  6. Reading the engine instead of fighting it 4 min

You have probably done it. You opened a Stockfish interface, dragged the Skill Level slider down to 5 because 20 felt like playing a wall, and sat down for a game. Then something odd happened. For ten moves the engine played like a strong master. On move eleven it hung a rook to a one-move tactic. On move twelve it found a quiet prophylactic idea you’d never have spotted.

That whiplash is the subject of this post. The stockfish skill level settings are widely used and widely misunderstood, and the way they weaken the engine produces an opponent that teaches the wrong lessons.

What Skill Level actually does

Stockfish exposes a UCI option called Skill Level, an integer from 0 to 20. At 20 the engine plays at full strength. Below 20, it does not become a “worse thinker”. It searches almost as it normally would, then picks a move from its own candidate list with deliberate noise.

Roughly, the mechanism in Stockfish’s source (Skill struct in search.cpp) works like this:

  1. The engine runs a multi-PV search with at least 4 lines.
  2. It computes a weakness value from the level: weakness = 120 - 2 * level. At level 5 that is 110. At level 20 it is 80, but at 20 the skill logic is switched off entirely.
  3. Each candidate gets its score plus a random push, scaled by that weakness value and by the gap between the best and worst candidate among those lines.
  4. The highest total wins, and that move is played.

Search depth is also capped at low levels (roughly 1 + level), but the main character of the weakness comes from step 3. The dice decide the move.

Notice what that means. The engine always knows the strong moves. It then sometimes rolls its way past them. A bad move at Skill Level 5 is not a mistake of understanding, it is a sampling accident.

What a human 1400 does instead

Compare that with how a club player errs. Humans blunder for reasons: a pinned piece not noticed, a long diagonal ignored, a threat missed because attention was on the kingside. The errors cluster around tactics that are hard to see and positions that are hard to evaluate.

Stockfish at Skill 5 errs at random among its top few candidates. If a position has a quiet developing move, a good capture, and a move that drops a knight, the dropped knight can be chosen at any time, regardless of how obvious the capture was.

Here is the shape of a typical game against it, with approximate Lichess-style ratings people report for the levels (these vary by time control and hardware, so treat them as ballpark):

Skill LevelRough strength (reported)What it feels like
0~1300Random-looking giveaways every few moves
3~1500Strong structure, then a free piece
5~1700Master positional play, then a one-move blunder
10~2200Fewer gifts, still occasional oddities
20~3500No gifts

A “1700” Skill 5 is not a 1700 player. Its average error rate matches one. Its error distribution does not.

A worked example

Take a standard Italian Game position after 1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.c3 Nf6 5.d3 d6 6.O-O O-O. Ask full Stockfish for its multi-PV view:

setoption name MultiPV value 4
position startpos moves e2e4 e7e5 g1f3 b8c6 f1c4 f8c5 c2c3 g8f6 d2d3 d7d6 e1g1 e8g8
go depth 22
info depth 22 multipv 1 score cp 22 pv b2b4 ...
info depth 22 multipv 2 score cp 18 pv h2h3 ...
info depth 22 multipv 3 score cp 15 pv b1d2 ...
info depth 22 multipv 4 score cp 10 pv c1g5 ...

(Numbers are representative of what you’ll see, not a recording of one exact run.) The top four moves sit within about 12 centipawns. Choose any and White is fine.

Now picture a middlegame where the top moves are +0.6, +0.4, +0.2 and −3.1. The fourth is a blunder worth three pawns. The Skill logic chooses by adding noise to scores in that list, so a noisy engine can reach that last line. A human 1700 would almost never look at it, because it is visibly bad. Stockfish at Skill 5 will play it perhaps once every dozen moves in sharp positions, and then go back to playing like a titled player.

When you beat that engine you learn that you can punish a random gift. You learn nothing about converting a slight edge against someone who defends sensibly and cracks under pressure.

Why this teaches bad expectations

Three habits get trained, and none of them help.

You start expecting a free piece. Against a real opponent, the blunder is rarer and more disguised. Waiting for the gift makes you drift in quiet positions.

You mistrust good moves. When Skill 5 plays a deep positional idea and then collapses, you learn to treat strong play as luck. At the board you’ll dismiss a real plan as a bluff.

You can’t extract patterns. A human opponent at 1500 repeats the same type of error: undeveloped queenside, loose back rank, weak calculation of captures. You can train against that. Random noise has no pattern to train against.

What to do instead

If you want an engine as a sparring partner, you have better options than the slider.

  • Limit strength through Elo. Set UCI_LimitStrength to true and UCI_Elo to something like 1600. Stockfish uses the same skill machinery under the hood, mapped to a rating, so the move-noise issue remains. It is a cleaner knob than Skill Level, not a different mechanism.
  • Use Maia. The Maia models (trained on millions of Lichess games, with versions around 1100, 1500 and 1900) predict the move a human of that rating plays, with roughly 50% accuracy. They make human-shaped mistakes. You can run them through lc0 or play the Lichess bots maia1, maia5 and maia9.
  • Use Stockfish for analysis, not for opposition. Let it judge your own games. Run it at depth 20 or more with MultiPV 3 and read the gap between line 1 and line 2.

I go into the practical setup of human-like opponents in Sparring Against Human-Like Bots At Your Rating, including which bots match which rating bands.

Reading the engine instead of fighting it

Here is a small routine that makes the engine useful at 1000-1900.

  1. Play a game against a human or Maia bot. Save the PGN.
  2. Load it into Stockfish (the Lichess analysis board, or the Arena GUI with a local build).
  3. Flag every move where the evaluation drops 100 centipawns or more. At club level you’ll typically find 3 to 6 in a 40-move game.
  4. For each, ask the engine for its best move and look at the first three plies of the line. Write down the type of mistake: hung piece, missed fork, wrong pawn break.
  5. After ten games, count the types. The most common one is your training plan.

That last step is the point. A pattern in your own errors is worth far more than a hundred wins against a dice-rolling grandmaster.

Skill Level 5 is a fine toy for an afternoon. As a training partner it manufactures an opponent that does not exist anywhere else, and you will spend your board time waiting for a gift that a real 1700 will never hand you.