Bishop and knight

Listen to this post7 min

Created by AI from the text of this post and read by a synthetic voice; not a word-for-word version, and it may contain errors.

A king with a bishop and a knight wins against a lone king in almost every position. The win can be forced, but it is not easy to find: the defending king has to be driven into a corner of the bishop's colour. A program that does not know this can chase the king around the board until a repetition or the fifty-move rule ends the game as a draw.

On 2026-09-29 the question came up whether Coherent can do it.

A first probe

A quick test that day let the engine play against itself from eight random positions with king, bishop and knight against king, at a tenth of a second per move. It delivered mate twice. Four games ended by threefold repetition and two by the fifty-move rule. Four of the six failed positions were played again with a full second per move: two more mates and two more repetitions, one after twenty half-moves and one after thirty-six. More time helped only in part, which pointed to missing knowledge rather than missing depth.

A battery instead of a probe

Eight games are a hint, not a measurement. The same day a small tool was written that tests endgames class by class. It was reviewed twice before its first report; four small changes made after the second review were not reviewed again.

Results for version 0.1.120:

ClassResult
bishop and knight against kingseven of twenty won positions converted; the other thirteen ended by the fifty-move rule
rook, queen, two bishops against kingtwenty of twenty converted in each class
king and pawn against kingall fifteen wins converted, all five draws held
rook and pawn against rooksix of seven wins converted, all thirteen draws held
queen against rooknineteen of twenty converted
queen and pawn against queenall nine wins converted, all eleven draws held
rook against bishop, rook against knight (drawn positions)nineteen and twenty of twenty draws held

The eleventh class, rook and two pawns against rook and pawn, has more pieces than the tables cover. It has no starting value and is not scored.

One class stands apart: bishop and knight. The same battery at a tenth of a second and at one second per move has not run yet: the tool only starts timed runs on a mostly idle machine, and the machine was busy.

What had been tried before

Tablebases, read by a decoder written from a description

The decision on 2026-09-29 was to use endgame tablebases after all, read by a decoder of the project's own, written under clean-room rules:

The first version disagreed with the reference in more than seventy thousand positions, all of one kind. It concerned captures in lost positions, a case the description covered only in part. The implementer inferred the missing rule from the reference's behaviour, not from anyone's code. The description was amended afterwards; the amendment corrects part of the inferred rule and has not gone into the decoder yet.

With the inferred rule in place, a second session checked the decoder again:

At the time of writing, the full comparison of the five-piece tables that label positions as won, drawn or lost is still running. The full comparison of the five-piece tables that give the distance to the next capture or pawn move has not started yet.

In measured games the opponents will get the same tables, so that a test compares engines and not access to tables. That changes the measuring conditions and starts a new measuring epoch, which was approved on 2026-09-29. The tables are used in measured games only after the decoder has been accepted, and full comparisons of the five-piece tables are among the conditions for that.

What this does not say yet

This entry does not say whether the tables make Coherent play endgames better. That has not been measured. The battery will run again once the decoder is part of the engine, and that result, not this entry, will say whether it worked.