How Koga decides

Definition Promoting to less than a queen — on purpose
  • When a pawn reaches the last rank it normally becomes a queen, the strongest piece. Choosing a rook, bishop, or knight instead is an under-promotion.
  • Koga only calls this a tactic when the lesser piece is genuinely better than a queen would have been — not merely a cosmetic choice in a position that is already winning every which way.
Cosmetic filter Why most minor promotions are NOT flagged
  • In a crushing position any promotion wins, so a lesser piece is often picked for no real reason. Those are reported as a plain promotion, not an under-promotion.
  • When an engine score is available, Koga compares the played piece against a queen on the very same square. The under-promotion is accepted only if the lesser piece scores clearly better (by a comfortable margin); otherwise it is treated as cosmetic.
Concrete reasons When a lesser piece truly beats a queen
  • Knight for mate or check — promoting to a knight delivers checkmate (or a decisive check) that a queen on the same square cannot.
  • Avoiding stalemate — a queen would leave the opponent with no legal move, throwing away the win; a rook or bishop keeps the position alive and winning.
  • Avoiding a queen blunder — promoting to a queen would walk into a forced mate against us, so a lesser piece is the only winning choice.
When we look Where the promotion is read
  • Koga reads the promotion piece straight from the move played, and also scans the player's moves deeper in the engine's main line.
  • A rook or bishop promotion that appears later inside the line goes through the same stalemate and mate probes as the immediate move (the immediate move can also be scored by an engine; a later one cannot): it is an under-promotion only when a queen would stalemate, walk into a stalemate trap or lose to a forced mate. Engines write =R in won endings where =Q wins the same, and that is a plain promotion. A knight deeper in the line is still taken at face value: a later e8=N+ fork is never cosmetic.

Test positions (the examples that guard against regressions)

Knight promotion that mates (queen would only stalemate)

A constructed endgame. Black plays g1=N#, delivering checkmate. Promoting to a queen instead would leave White with no legal move — stalemate and a thrown-away win. The mating knight is the genuine under-promotion; Koga scores the finished positions directly, no engine needed.

✓ detectedKnight · matetest_terminal_promotion_comparison_does_not_need_engine_response
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . k
. . . . . . . .
. . . . . . . K
. . . . . q . .
. . . . . . n .
Piece that moves
King
Attacking piece

Real game: knight promotion that mates, alongside the mate label

Lichess QAnl6. The knight promotion g8=N# delivers checkmate that a queen on g8 cannot, so it is a genuine under-promotion. Because the promotion is *how* mate is delivered, Koga keeps under-promotion as a co-headline alongside checkmate rather than hiding it behind the mate.

✓ detectedKnight · mate♟ Lichess QAnl6test_knight_promotion_mate_emits_underpromotion_as_motif
. . . . . . N .
p . p . R . . .
. . . p . k . .
. p . . . P . .
. . . . . . K .
. . . . . . . .
P . . . . . . .
. . r . . . . .
Piece that moves
King
Attacking piece

Saavedra: rook promotion to dodge stalemate

The Saavedra study. White plays c8=R rather than c8=Q. After c8=Q Black answers Rc4+, and capturing the rook with Qxc4 stalemates Black — a draw. The rook keeps the win, so it is a real under-promotion.

✓ detectedRook · stalemate avoidancetest_saavedra_stalemate_avoidance_kept_as_underpromotion
. . R . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . r . . . .
. . . . . . . .
. . K . . . . .
k . . . . . . .
Piece that moves
King
Targeted / won piece

Rook promotion because a queen stalemates at once

A real endgame position. Promoting to a queen on d8 would immediately stalemate the black king — an instant draw. The rook leaves Black a legal move while keeping the position winning, so d8=R is a true under-promotion.

✓ detectedRook · stalemate avoidancetest_queen_promotion_immediate_stalemate_kept_as_underpromotion
. . . R . . . .
. . . . . k . .
. R . . . . . .
. . . . B . p .
. . . . . p B .
. . . . . P . .
. . . . . . K P
. . . . . . . .
Piece that moves
King

Knight promotion because a queen loses by force

A real position where promoting to a queen on c8 walks into a forced mate against White (…Qxd6+ Kxd6 and Black's heavy pieces finish). The played c8=N+ sidesteps that line and keeps White winning, making the knight a genuine under-promotion.

✓ detectedKnight · avoids losing linetest_queen_promotion_loses_to_forced_mate_kept_as_underpromotion
. . N . . . . R
. . . K . k . .
. . . P . . . .
. . . . . . . .
. . . . . P . .
. . . . . . . .
. . . q . . . .
. . . r . . . .
Piece that moves
King
Attacking piece

Cosmetic rook promotion (NOT flagged)

A constructed, already-won position. The pawn promotes on e8 to a rook, but a queen would win just as easily — there is no concrete reason for the lesser piece. Koga reports a plain promotion, not an under-promotion.

✗ not detectedRook · cosmetictest_cosmetic_rook_promotion_treated_as_promotion
. . . . R . . .
. . . . . . . k
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . K . . .
Piece that moves
King

Cosmetic knight promotion (NOT flagged)

A constructed, already-won position. The pawn promotes on e8 to a knight that gives no check and serves no concrete purpose a queen would not serve better. It is reported as a plain promotion, not an under-promotion.

✗ not detectedKnight · cosmetictest_cosmetic_knight_promotion_no_check_treated_as_promotion
. . . . N . k .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . K . . .
Piece that moves
King

Cosmetic mating promotion (NOT flagged)

Lichess n5QUx. Black plays …b1=R#, but …b1=Q# mates just as well, so the minor piece is not required. The cosmetic rule applies even when the promotion delivers mate: Koga reports a plain promotion, not an under-promotion. Only a mating minor promotion the queen cannot replicate (e.g. QAnl6 g8=N#) is a genuine under-promotion.

✗ not detectedRook · cosmetic mate♟ Lichess n5QUxtest_cosmetic_mating_rook_promotion_is_promotion_not_underpromotion
. . . . . . . .
. . . Q . p p .
P . . . p . k .
. . . p . . . p
. . . b . . . .
. . . . . . . .
. . . . . R P P
. r . . . . K .
Piece that moves
King

Cosmetic rook promotion deeper in the line (NOT flagged)

Lichess UHf4SDkl, 43…f6 (a ChessMood coach's game, reported 22 Sep 2026: "+11 both moves"). The best move is f6, not a promotion; the engine line continues 44.Bf4 a1=R, where a1=Q wins the same and no stalemate or mate trick exists. Koga reports a plain promotion for the line, not an under-promotion.

✗ not detectedRook · cosmetic, deeper in the line♟ Lichess UHf4SDkltest_deep_pv_rook_promotion_in_won_position_is_a_plain_promotion
. . . . . . . .
. . . . . . p .
R . p . . p k p
. . . . B . . .
. . . . . . . .
. . . . . K P .
p . r . . P . .
. . . r . . . .
Piece that moves

Cosmetic mating promotion in the line (NOT flagged)

Lichess 0rESt. The forced line ends 1…Qxc2+ 2.Ka2 b1=R#, but …b1=Q# mates equally, so the rook is not required. The cosmetic rule applies even when the mating promotion sits deeper in the line, not just on the move being judged: Koga reports a plain promotion. Only a mating minor promotion the queen cannot replicate (e.g. QAnl6 g8=N#) is a genuine under-promotion. The board is shown right after 1…Qxc2+: the king on b1 must go to a2, and the b2-pawn then promotes on b1 with mate.

✗ not detectedRook · cosmetic mate (in line)♟ Lichess 0rESttest_cosmetic_mating_rook_promotion_deep_in_pv_is_promotion
. . r . k b . r
. . . . . p p p
p B . . . . . .
. . . Q . . P P
. . . . . P . .
P . . . . . . .
. p q . . . . .
. K . R . . . R
Piece that moves
King

Golden puzzles — every real Lichess puzzle Koga is tested against for this tactic (10)

Lichess 88YNz

Lichess 88YNz (rating 908). Solution: e8=N+ Kf8 Nxf6. Koga intentionally does not flag Under Promotion here — this minor-promotion fork needs engine evidence; the broad rule caused false positives.

✗ not detectedKnown boundary♟ Lichess 88YNz
. . . . . . . .
. . . . P p k .
. . . . . q p .
. . . . . . . p
p . . Q . . . .
P . . . . P . .
. . . . . P K .
. . q . . . . .

Lichess 6AByk

Lichess 6AByk (rating 1950). Solution: Qxb6 Qxb6 c8=N+ Kd7 Nxb6+.

✓ detectedrating 1950♟ Lichess 6AByk
. Q . . . . . .
. . P . k . . .
. n q p . . . p
. . . . p p . .
. . . . . . . .
. . . . . . P K
. P . . . P . P
. . . . . . . .

Lichess 0D1rh

Lichess 0D1rh (rating 818). Solution: g1=N+ Kf2 Nxf3. Koga intentionally does not flag Under Promotion here — this minor-promotion fork needs engine evidence; the broad rule caused false positives.

✗ not detectedKnown boundary♟ Lichess 0D1rh
. . . . . . . .
. . . . . . . .
. . . . . . q .
. . . . . . . .
. . . . . . . .
. . . . N Q . .
. . . . K . p k
. . . . . . . .

Lichess 6VZpZ

Lichess 6VZpZ (rating 1645). Solution: b8=N+ Kb6 Rxf1.

✓ detectedrating 1645♟ Lichess 6VZpZ
. . . . . . . .
. P . . . R . .
. . k . p . . r
. . . p . . . .
. . . P . . . .
. . . . . . . p
P . . . . . . K
. . . . . q . .

Lichess 0Fh2r

Lichess 0Fh2r (rating 1095). Solution: f2 Nd5 f1=N+.

✓ detectedrating 1095♟ Lichess 0Fh2r
. . . . . . . .
. . . . . . . .
. . . . . . . p
. . . . . k p P
. . . . . . . .
. . N p . p . .
. . . K . . . .
. . . . . . . .

Lichess 8NGrX

Lichess 8NGrX (rating 1075). Solution: dxe1=N+ Kh1 Rf1#.

✓ detectedrating 1075♟ Lichess 8NGrX
. . . Q . . . .
. . . . . . k .
. . . . . . . .
. P . . . . . p
P . Q . . p p .
. . . . . r . .
. . . p p . K P
. . . . R . . .

Lichess 9bjTk

Lichess 9bjTk (rating 2155). Solution: d1=N+ Kf4 Qf5#. Koga intentionally does not flag Under Promotion here — this minor-promotion mate case needs engine evidence; the broad rule caused false positives.

✗ not detectedKnown boundary♟ Lichess 9bjTk
. . . . k . . .
p . Q . . p . .
. . . . p . . .
. . . . P . . .
. . . P . . . p
P . P . K P . .
. P q p R . . .
. . . . . . . .

Lichess 65kp7

Lichess 65kp7 (rating 1339). Solution: b8=N+ Ke6 Nxc6.

✓ detectedrating 1339♟ Lichess 65kp7
. . . . . . . .
K P . k . . . .
. . q B . . . .
P . n . P . p .
. . . . . . P .
. . . . . . . .
. . . . . . . .
. . . . . . . .

Lichess 9wOXd

Lichess 9wOXd (rating 2039). Solution: d6+ Kd8 e7+ Kd7 exf8=N+ Kd8 Bxc4.

✓ detectedrating 2039♟ Lichess 9wOXd
. . . . . r . .
. . . . k B p .
. . . . P . P r
. . p P K . . .
. . q . . . . p
. . . . . . . .
. . . . . P P .
. . . . . . . .

Lichess 10q1p

Lichess 10q1p (rating 2057). Solution: fxg7+ Kg8 Qxh7+ Kxh7 gxf8=N+ Kg8 Nxe6.

✓ detectedrating 2057♟ Lichess 10q1p
. . . . . r . k
p p . . n . p p
. . p . q P . .
. . . p . . . .
. . . . . . . .
. . B Q . . P .
P P . . . . . P
. . . . . . . K