Runs T-0224 to T-0236: a bundle of 6 changes passes

Listen to this post27 min

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

This post covers 10 changes to Coherent's search in oracle runs dated 28 October to 6 November 2026 that have not yet had a post. T-0236, a bundle of 6 changes, passed both stages; since 6 November at 22:29 UTC it has been on the main branch as Coherent 0.2.26. 8 changes were rejected. T-0225, an edge case, played the long stage to its game cap and ended without a verdict. In total the oracle played 290,862 games for these runs; their stages took 77.6 hours together.

Three entries in the same period are not covered here: T-0228 and T-0232 each had a post of their own, and T-0230 is the anchor of epoch 13, without games. The numbers come from the oracle register, export of 2026-11-07, and from the public run pages. Every stage was recalculated from the raw counts.

How the oracle decides

The new version plays its predecessor in pairs: 2 games with the same opening and colours reversed. A pair gives it 0, 0.5, 1, 1.5 or 2 points; the register counts how often each of these 5 classes occurred, the pentanomial Games are played in pairs with swapped colours; the five counts are the pairs scoring 0, ½, 1, 1½ and 2 points.. Dividing each pair's points by 2, μ and σ are the mean and standard deviation of these pair shares.

These are the rules of the gain path. In the register their parameters are the same in epoch 12 and epoch 13; T-0224 to T-0229 ran in epoch 12, T-0231 to T-0236 in epoch 13. The predecessor was Coherent 0.2.24 for T-0224 to T-0227 and Coherent 0.2.25 from T-0229 on. T-0225 ran on the path for edge cases: it asks whether a correction costs 5 nElo, with H0 at −5 and H1 at 0 nElo and otherwise the same error rates, bounds and caps.

The oracle computes the LLR exactly, following the "normalized" model of the program fastchess. An approximation is enough for understanding:

LLR ≈ N · (nElo − m) / 12,071, with N pairs, m the midpoint of the two hypotheses and 12,071 ≈ (800/ln 10)² / 10.

On the gain path m = 2.5, for the edge case m = −2.5. For all 14 stages in this post the approximation differs from the exact LLR by less than 0.006. Example with the estimate of the long stage of T-0236, rounded to three decimal places: 10,330 · (5.690 − 2.5) / 12,071 ≈ +2.73. Solved for nElo, a stage stops as soon as its estimate lies 2.944 · 12,071 / N above or below the midpoint, in the long stage 2.708 · 12,071 / N above or 1.335 · 12,071 / N below. If a stage stops at a bound, its estimate therefore lies almost exactly on one of these curves; a stage that stops at the game cap can lie between them.

Scatter plot with logarithmic horizontal axis from 1,500 to 100,000 games and vertical axis from −26 to +16 nElo. Two solid curves for the short stage approach 2.5 nElo from above and below as the number of games grows; two dashed curves closer to 2.5 nElo are the bounds of the long stage. Each point is one stage of one gain-path run and lies just past a curve: T-0224 short stage: 33,452 games, +4.64 nElo; T-0224 long stage: 20,376 games, +0.92 nElo; T-0226 short stage: 8,950 games, −5.51 nElo; T-0227 short stage: 8,338 games, +11.07 nElo; T-0227 long stage: 2,482 games, −10.59 nElo; T-0229 short stage: 16,576 games, −1.79 nElo; T-0231 short stage: 74,520 games, +1.55 nElo; T-0233 short stage: 5,546 games, −10.39 nElo; T-0234 short stage: 6,140 games, −9.09 nElo; T-0235 short stage: 4,888 games, −12.16 nElo; T-0236 short stage: 25,136 games, +5.34 nElo; T-0236 long stage: 20,660 games, +5.69 nElo. The edge case T-0225 is not shown.
Where each stage stopped (from a measurement)

Rejected means: the likelihood ratio of "0 nElo" to "+5 nElo" has reached 19 to 1, in the long stage 3.8 to 1. It does not by itself mean that the change does harm. A test that stops at a bound can give biased estimates; an early stop tends to exaggerate the distance from the midpoint. The intervals below are therefore nominal.

The runs at a glance

RunWhere it actsStageGamesElonEloLLRDurationVerdict
T-0224reverse futility pruningshort33,452+2.31 ± 1.85+4.64 ± 3.72+2.964 h 11 minpassed
T-0224reverse futility pruninglong20,376+0.44 ± 2.30+0.92 ± 4.77−1.3413 h 05 minrejected
T-0225pruning per moveshort27,798+0.02 ± 1.71+0.06 ± 4.08+2.953 h 29 minpassed
T-0225pruning per movelong36,000−0.68 ± 1.47−1.65 ± 3.59+1.2623 h 08 minat the game cap, no verdict
T-0226null-move probeshort8,950−2.76 ± 3.60−5.51 ± 7.20−2.971 h 07 minrejected
T-0227table, exclusion searchshort8,338+5.50 ± 3.71+11.07 ± 7.46+2.951 h 03 minpassed
T-0227table, exclusion searchlong2,482−5.18 ± 6.69−10.59 ± 13.67−1.341 h 36 minrejected
T-0229learning from the evaluationshort16,576−0.88 ± 2.60−1.79 ± 5.29−2.942 h 04 minrejected
T-0231ProbCutshort74,520+0.76 ± 1.23+1.55 ± 2.49−2.949 h 19 minrejected
T-0233bundle of 5short5,546−5.14 ± 4.52−10.39 ± 9.14−2.9641 minrejected
T-0234move orderingshort6,140−4.53 ± 4.33−9.09 ± 8.69−2.9446 minrejected
T-0235singular extensionshort4,888−6.04 ± 4.84−12.16 ± 9.74−2.9637 minrejected
T-0236bundle of 6short25,136+2.63 ± 2.11+5.34 ± 4.30+2.963 h 08 minpassed
T-0236bundle of 6long20,660+2.76 ± 2.30+5.69 ± 4.74+2.7313 h 13 minpassed

Elo and nElo with the nominal 95 % half-width, each against the predecessor. Durations as on the run pages, rounded down to the minute.

Both stages of T-0236 lie wholly above zero; T-0233, T-0234 and T-0235 lie wholly below it Both stages of T-0236 lie wholly above zero; T-0233, T-0234 and T-0235 lie wholly below it. Estimate with nominal 95 % half-width: T-0224 short 4.64, T-0224 long 0.92, T-0225 short 0.06, T-0225 long -1.65, T-0226 -5.51, T-0227 short 11.07, T-0227 long -10.59, T-0229 -1.79, T-0231 1.55, T-0233 -10.39, T-0234 -9.09, T-0235 -12.16, T-0236 short 5.34, T-0236 long 5.69. -30-20-1001020nElo against the predecessorRun and stageT-0224 shortT-0225 shortT-0226T-0227 longT-0231T-0234T-0236 shortEstimate with nominal 95 % half-width, T-0224 short: 4.64 ± 3.72Estimate with nominal 95 % half-width, T-0224 long: 0.92 ± 4.77Estimate with nominal 95 % half-width, T-0225 short: 0.06 ± 4.08Estimate with nominal 95 % half-width, T-0225 long: -1.65 ± 3.59Estimate with nominal 95 % half-width, T-0226: -5.51 ± 7.2Estimate with nominal 95 % half-width, T-0227 short: 11.07 ± 7.46Estimate with nominal 95 % half-width, T-0227 long: -10.59 ± 13.67Estimate with nominal 95 % half-width, T-0229: -1.79 ± 5.29Estimate with nominal 95 % half-width, T-0231: 1.55 ± 2.49Estimate with nominal 95 % half-width, T-0233: -10.39 ± 9.14Estimate with nominal 95 % half-width, T-0234: -9.09 ± 8.69Estimate with nominal 95 % half-width, T-0235: -12.16 ± 9.74Estimate with nominal 95 % half-width, T-0236 short: 5.34 ± 4.3Estimate with nominal 95 % half-width, T-0236 long: 5.69 ± 4.74

Both stages of T-0236 lie wholly above zero; T-0233, T-0234 and T-0235 lie wholly below it. Estimate with nominal 95 % half-width: T-0224 short 4.64, T-0224 long 0.92, T-0225 short 0.06, T-0225 long -1.65, T-0226 -5.51, T-0227 short 11.07, T-0227 long -10.59, T-0229 -1.79, T-0231 1.55, T-0233 -10.39, T-0234 -9.09, T-0235 -12.16, T-0236 short 5.34, T-0236 long 5.69.

Both stages of T-0236 lie wholly above zero; T-0233, T-0234 and T-0235 lie wholly below it (data of the chess project).

Where the changes act

Diagram of twelve steps of the search from top to bottom, each with the runs whose change acts there. Root iteration: T-0236 (part); Remaining depth ≤ 0: quiescence search: T-0233 (part); Table lookup: T-0227, T-0236 (part); Static evaluation: T-0229, T-0236 (part); Reverse futility pruning: T-0224; Null-move probe: T-0226, T-0233 (part); ProbCut: T-0231, T-0233 (part); Singular extension: T-0235, T-0233 (part); Move ordering: T-0234, T-0233 (part); Pruning per move: T-0225, T-0233 (part), T-0236 (part); Reduced search: T-0236 (part); Learning at node end: T-0236 (part). Simplified: every child node enters at the second step; at non-positive remaining depth it goes straight into the quiescence search, at positive depth it runs through the applicable following steps, and the child searches return before the learning at node end. Depending on the node, steps are skipped or the search returns early. Next to each run its short-stage estimate in nElo.
Where the changes act in the search (schematic)

The search tries moves in a tree. At the root is the position on the board; in every iteration the root moves are searched in turn, each time 1 ply deeper, until time runs out. The picture shows the main search in simplified form. Depending on the node, steps are skipped or the search returns earlier; at a remaining depth of zero or below the quiescence search takes over. The two bundles act at several steps at once.

Point by point

T-0224: a smaller discount for the opponent's self-inflicted damage

What was tested. Outside the principal variation, check and the exclusion search, reverse futility pruning ends a node at remaining depth up to 8 if the evaluation minus a margin still reaches beta; guards against mate values stay. The margin is 54 per ply of depth, less a discount if the evaluation is rising, and so far less a fixed 26 if the opponent harmed himself with his last move: his static evaluation before the move and ours now, both from the respective mover's view, add up to more than zero. The margin never goes below zero. Without an earlier evaluation the discount is zero. The change made this discount at most as large as the damage: min(26, sum) instead of 26. Small damage now brings only a small discount.

Why rejected. The short stage passed: +4.64 nElo after 33,452 games, LLR +2.96; its interval from +0.91 to +8.36 lies wholly above zero. The long stage rejected after 20,376 games at +0.92 nElo, LLR −1.34, just past its bound of −1.335; its interval runs from −3.85 to +5.69. The two intervals overlap. The long stage has a nominal type II error of β = 0.25: by design it rejects a change with a true +5 nElo in about a quarter of cases.

T-0225: the edge case of a capture into a dead draw

What was tested. An edge case is a correction that is right but is expected to be small in Elo; it must show that it does not cost 5 nElo. The post "The first edge case: mate with bishop and knight" describes the first one. Here it was about captures after which neither side has enough material left to mate. Such a position is an immediate draw. In the pruning per move, however, the capture futility near the horizon and the exchange threshold for captures could discard such a capture as hopeless. If alpha was below zero, the node could then report a value below alpha although the capture would have led to a draw. The change exempted such captures from both cuts, in nodes on the principal variation and outside it. It checked only captures with a piece on the target square, and only if at most 2 pawns, rooks or queens stood on the board; it then played the capture on a copy of the board and tested the remaining material. The quiescence search stayed unchanged.

Why no verdict. The short stage passed at +0.06 nElo after 27,798 games, LLR +2.95; its interval from −4.02 to +4.14 lies wholly above −5. The long stage played all 36,000 games and stood at −1.65 nElo and LLR +1.26 at the cap, between its bounds of −1.335 and +2.708. With the approximation: 18,000 · (−1.654 + 2.5) / 12,071 ≈ +1.26. The LLR is positive although the estimate is negative, because the midpoint of this test lies at −2.5 nElo. The interval from −5.24 to +1.93 includes both hypotheses. The stage counts neither as passed nor as failed; the correction was not adopted.

T-0226: the null-move probe asks the network about passing

What was tested. The null-move probe lets the side to move pass; if even then the position holds above beta, the node may be cut. So far it was allowed if, among other things, the evaluation and the corrected static evaluation reached beta. The change added a condition: the corrected static evaluation minus the value of the right to move had to reach beta as well. It estimated this value as the sum of two evaluations: the uncorrected evaluation of the position for the side to move, and the evaluation of the same position with the opponent to move, from his view. Both scale the network output by material and are clamped; for the latter a new function swaps the two halves of the network's feature sums.

Why rejected. 8,950 games: −5.51 nElo, LLR −2.97. The interval runs from −12.70 to +1.69.

T-0227: store exclusion searches in the table

What was tested. For the singular extension the search checks whether the table move is much better than all others. To do so it searches the node again without this move, the exclusion search. So far its result was not stored in the table. The change stored it under a key of its own, derived from the position and salted with the excluded move and two node properties. A later exclusion search of the same position with exactly the same depth returned the stored value at once if its bound fitted. The ordinary table entry continued to supply evaluation and move ordering.

Why rejected. The short stage passed early: +11.07 nElo after 8,338 games, LLR +2.95; its interval from +3.61 to +18.52 lies wholly above zero. The long stage rejected after 2,482 games at −10.59 nElo, LLR −1.34; its interval runs from −24.26 to +3.08. The two intervals do not overlap: the upper limit of the long stage lies 0.53 nElo below the lower limit of the short stage. The stages use different time controls and opening books and can measure different effects; both also stopped early. The cause of the difference cannot be determined from these results. The rule decides: a run must pass both stages.

T-0229: the pawn-structure history learns from the evaluation

What was tested. At nodes outside check and the exclusion search, the search compares the static evaluation with that of the node before. If the move in between was quiet and the earlier evaluation is known, its history value learns from this change: the more the move improved the evaluation for its side, the larger the bonus, up to a limit. So far this went only into the ordinary history of quiet moves. The change wrote the same bonus also into the pawn-structure history, a table of moves by piece and target square under the pawn structure in which they were played, as long as this table is used, which it is by default.

Why rejected. 16,576 games: −1.79 nElo, LLR −2.94. The interval runs from −7.08 to +3.50. The same change returned word for word as part of the bundle T-0236.

T-0231: ProbCut skips captures with a poor history

What was tested. ProbCut tests tactical moves with a shallow search against a threshold that lies a fixed margin above beta; if one reaches it, the node is cut. The change skipped every candidate whose capture history lay below the value with which these tables start in a new game, −167. That applied to captures, en passant and promotions, the table move included, before the exchange check.

Why rejected. The stage with the most games in this series: 74,520 games in 9 h 19 min, +1.55 nElo, LLR −2.94. The interval runs from −0.95 to +4.04. A positive estimate can lead to rejection: it lay below the midpoint of 2.5 nElo, and with enough games that is decisive.

T-0233: a bundle of 5 changes

What was tested. 5 changes in one commit:

The same null-move condition had already been measured on its own as T-0200 and was rejected there.

Why rejected. 5,546 games in 41 min: −10.39 nElo, LLR −2.96. The interval from −19.53 to −1.25 lies wholly below zero.

T-0234: order captures by the full exchange balance

What was tested. So far captures were ordered by 8 times the sum of the captured piece's value and the promotion gain, plus a share of the capture history. The change replaced this material term with 8 times the exchange balance on the target square: both sides recapture with the cheapest piece and may stop at any time. That favours a won piece over a mere exchange of the same victim; the capture history can still change the order. The split into good and bad captures stayed unchanged.

Why rejected. 6,140 games in 46 min: −9.09 nElo, LLR −2.94. The interval from −17.78 to −0.40 lies wholly below zero.

T-0235: no positive singular extension on the shallowest table entry

What was tested. From remaining depth 5 the search may extend the table move if its entry is a lower bound at most 3 plies shallower than the node and the exclusion search stays below a threshold: by 1 ply; outside the principal variation and within existing limits further below by 2, for a quiet table move by 3. The change blocked these positive extensions from depth 7 if the entry was exactly 3 plies shallower, the shallowest permitted. The exclusion search, the multi-cut, the negative extension and the extension for checks stayed. A new tuning constant holds the depth 7.

Why rejected. The shortest run of this series: 4,888 games in 37 min, −12.16 nElo, LLR −2.96. The interval from −21.90 to −2.42 lies wholly below zero.

T-0236: a bundle of 6 changes passes

What was tested. 6 changes in one commit:

The result. The short stage passed after 25,136 games: +5.34 nElo, LLR +2.96, interval from +1.05 to +9.64. The long stage passed after 20,660 games: +5.69 nElo, LLR +2.73, just past its bound of +2.708, interval from +0.95 to +10.43. Both intervals lie wholly above zero. On 6 November at 22:29 UTC the pipeline brought the change to the main branch; the engine there is exactly that of the candidate, version 0.2.26.

What the result does not show:

The balance

A rejection does not prove that an idea is worthless. It says that this implementation did not show a gain of +5 nElo against this predecessor. None of the rejected candidates was adopted as a whole; the change tested on its own as T-0229 was later adopted as part of T-0236.

How this was checked