Runs T-0203 to T-0214: 11 changes, none adopted

Listen to this post24 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.

On 24 and 25 October 2026 the oracle wrote runs T-0203 to T-0214 into its register. T-0205 was interrupted; its change went into the oracle again as T-0206. The other 11 runs each tested one change to the engine's search against the same predecessor, Coherent 0.2.24, and none was adopted: 10 failed the short stage, and T-0213 passed it and failed the long stage. In total the oracle played 292,132 games for them; the short stages alone took 36.6 hours.

This post was written at the operator's request. It explains, point by point, what each change did and why the oracle rejected it. The numbers come from the oracle register, export of 2026-10-25. Every stage was recalculated from the raw counts, and 2 independent reviewers recalculated the mathematics as well.

How the oracle decides

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

The oracle computes the LLR exactly, following the “normalized” model of the fastchess program. For understanding, an approximation is enough; computed with the unrounded nElo, it differs from the register by less than 0.01 for all 12 stages in this post:

LLR ≈ N · (nElo − 2.5) / 12,071, with N pairs and 12,071 ≈ (800/ln 10)² / 10.

2.5 nElo is the midpoint between H0 and H1. A simple rule follows: the short stage rejects as soon as the estimate lies 71,086 / games below 2.5 nElo. After 10,000 games that means below −4.61 nElo, after 50,000 games below +1.08 nElo. The closer the estimate is to the midpoint, the longer the run takes.

Scatter plot with logarithmic horizontal axis from 2,000 to 100,000 games and vertical axis from −24 to +10 nElo. Two curves for the short stage approach 2.5 nElo from above and below as the number of games grows; a third, dashed curve between the lower one and 2.5 nElo is the rejection bound of the long stage. Each point is one stage of one run and lies just past a curve: T-0212 short stage: 3,008 games, −21.29 nElo; T-0214 short stage: 3,984 games, −15.41 nElo; T-0213 long stage: 3,064 games, −8.20 nElo; T-0211 short stage: 8,930 games, −5.54 nElo; T-0206 short stage: 9,440 games, −5.05 nElo; T-0207 short stage: 11,130 games, −3.92 nElo; T-0209 short stage: 20,120 games, −1.05 nElo; T-0203 short stage: 26,224 games, −0.21 nElo; T-0208 short stage: 27,502 games, −0.10 nElo; T-0210 short stage: 57,582 games, +1.26 nElo; T-0204 short stage: 73,526 games, +1.53 nElo; T-0213 short stage: 47,622 games, +4.01 nElo.
Where each stage stopped (from a measurement)

The figure shows each completed stage where it stopped: just past the bound. 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 mean that the change does harm. A test that stops at a bound gives biased estimates; an early stop exaggerates the distance from the midpoint. The intervals below are therefore nominal.

The runs at a glance

RunWhere it actsGamesElonEloLLRHoursVerdict
T-0203late move reductions26,224−0.11 ± 2.08−0.21 ± 4.21−2.953.3rejected
T-0204table cutoff73,526+0.75 ± 1.24+1.53 ± 2.51−2.979.2rejected
T-0205late move reductions–––––interrupted
T-0206late move reductions9,440−2.54 ± 3.52−5.05 ± 7.01−2.951.2rejected
T-0207learning at node end11,130−1.94 ± 3.18−3.92 ± 6.45−2.961.4rejected
T-0208learning at node end27,502−0.05 ± 2.03−0.10 ± 4.11−2.963.5rejected
T-0209pruning per move20,120−0.52 ± 2.37−1.05 ± 4.80−2.962.5rejected
T-0210learning at node end57,582+0.62 ± 1.40+1.26 ± 2.84−2.967.5rejected
T-0211null-move probe8,930−2.72 ± 3.54−5.54 ± 7.21−2.971.1rejected
T-0212move ordering3,008−10.51 ± 6.14−21.29 ± 12.42−2.960.4rejected
T-0213root iteration, short stage47,622+1.66 ± 1.30+4.01 ± 3.12+2.976.0passed
T-0213root iteration, long stage3,064−3.29 ± 4.93−8.20 ± 12.30−1.36–rejected
T-0214iterative deepening3,984−7.59 ± 5.31−15.41 ± 10.79−2.950.5rejected

Elo and nElo with the nominal 95 % half-width, each against Coherent 0.2.24. Hours: measuring time of the short stage.

No interval reaches +5 nElo, except the short stage of T-0213; two lie wholly below zero No interval reaches +5 nElo, except the short stage of T-0213; two lie wholly below zero. Estimate with nominal 95 % half-width: T-0203 -0.21, T-0204 1.53, T-0206 -5.05, T-0207 -3.92, T-0208 -0.1, T-0209 -1.05, T-0210 1.26, T-0211 -5.54, T-0212 -21.29, T-0213 short 4.01, T-0213 long -8.2, T-0214 -15.41. -40-30-20-10010nElo against Coherent 0.2.24Run and stageT-0203T-0204T-0206T-0207T-0208T-0209T-0210T-0211T-0212T-0213 shortT-0213 longT-0214Estimate with nominal 95 % half-width, T-0203: -0.21 ± 4.21Estimate with nominal 95 % half-width, T-0204: 1.53 ± 2.51Estimate with nominal 95 % half-width, T-0206: -5.05 ± 7.01Estimate with nominal 95 % half-width, T-0207: -3.92 ± 6.45Estimate with nominal 95 % half-width, T-0208: -0.1 ± 4.11Estimate with nominal 95 % half-width, T-0209: -1.05 ± 4.8Estimate with nominal 95 % half-width, T-0210: 1.26 ± 2.84Estimate with nominal 95 % half-width, T-0211: -5.54 ± 7.21Estimate with nominal 95 % half-width, T-0212: -21.29 ± 12.42Estimate with nominal 95 % half-width, T-0213 short: 4.01 ± 3.12Estimate with nominal 95 % half-width, T-0213 long: -8.2 ± 12.3Estimate with nominal 95 % half-width, T-0214: -15.41 ± 10.79

No interval reaches +5 nElo, except the short stage of T-0213; two lie wholly below zero. Estimate with nominal 95 % half-width: T-0203 -0.21, T-0204 1.53, T-0206 -5.05, T-0207 -3.92, T-0208 -0.1, T-0209 -1.05, T-0210 1.26, T-0211 -5.54, T-0212 -21.29, T-0213 short 4.01, T-0213 long -8.2, T-0214 -15.41.

No interval reaches +5 nElo, except the short stage of T-0213; two lie wholly below zero (data of the chess project).

Where the changes act

Diagram of eight steps of the search from top to bottom, each with the runs whose change acts there. Iterative deepening: T-0214; Root iteration: T-0213; Table lookup: T-0204; Null-move probe: T-0211; Move ordering: T-0212; Pruning per move: T-0209; Late move reductions: T-0203, T-0206; Learning at node end: T-0207, T-0208, T-0210. From the table lookup on, every child node runs through the same steps again. Next to each run its short-stage estimate in nElo.
Where the changes act in the search (schematic)

The search tries out moves in a tree. At the root is the position on the board. Iterative deepening searches it first 1 ply deep, then 2, then 3, until time runs out. In every node of the tree the same steps run: look up the table, probe a null move, order the moves, prune or reduce per move, learn at the end. The 11 changes are spread over all of these steps.

Point by point

T-0203: reduce shuttle moves more

What was tested. Late move reductions search moves that come late in the order at a shallower depth first. The change reduced a move by one more ply if it puts the piece that the same side moved 2 plies earlier back on that move's origin square, quietly and without check. The history that the search otherwise uses to judge moves knows only the piece and destination square of the earlier move, so it cannot tell this shuttling from a manoeuvre to the same square. The size of 1 ply was the author's choice, not tuned.

Why it was rejected. After 26,224 games the estimate was −0.21 nElo, 2.7 nElo below the midpoint and right at the bound for that number of games; the LLR fell to −2.95. The interval runs from −4.42 to +3.99: no gain and no loss shown, +5 ruled out.

T-0204: double-check the table cutoff at the stored move

What was tested. If the search finds a deep enough table entry with a score of at least beta, it ends the node at once. The change first checked the child's entry after the stored move. If the child had a lower-bound or exact entry at least as deep as the current search depth minus 1, and it said that the move stays below beta from the parent's point of view, the cutoff was skipped and the node was searched normally. This applied outside the principal variation and the exclusion search, an auxiliary search that excludes one move, for non-mate scores and a legal stored move. The author had named the risk: the check costs work, and another move can still reach beta.

Why it was rejected. The longest run: 73,526 games in 9.2 hours. The estimate of +1.53 nElo was positive but below the midpoint, and after that many games the bound lay there: LLR −2.97. The interval from −0.99 to +4.04 does not rule out a small gain, but it does rule out +5. The short stage is not built for small gains: a change with a true +1.5 nElo would pass it, in the Brownian approximation without a game limit, only about 24 % of the time.

T-0205: interrupted

On 24 October the oracle's machine was switched off and on again during this run. The register lists T-0205 as interrupted, with no stage results and no verdict. The same change was then measured as T-0206.

T-0206: late move reductions at principal-variation nodes from the second move

What was tested. The principal variation is the line of moves the search currently considers best. At its nodes, the first and also the second legal move used to be exempt from late move reductions; at all other nodes only the first. The change removed the exemption for the second move; the reduction itself was computed as before. 1 condition changed in the code.

Why it was rejected. The estimate was well below zero, so 9,440 games in 1.2 hours were enough: −5.05 nElo, LLR −2.95. The interval runs from −12.06 to +1.96.

T-0207: no ordering lessons from draw results

What was tested. At the end of a node the search learns from the best move, among other things history values, that is bonuses for it and maluses for the moves searched before it, plus killer moves and the countermove. These values later order the moves in other positions. The change skipped this learning, and also the learning for the preceding move, when the node's result was exactly a draw. The author's idea: draw results that depend on the path to the position should influence move ordering elsewhere less. As a risk the author named that useful defensive moves would then learn nothing either.

Why it was rejected. 11,130 games: −3.92 nElo, LLR −2.96. The interval runs from −10.38 to +2.53.

T-0208: history bonus weighted by how often a rank is reached

What was tested. Outside the principal variation, the history bonus for a best move used to grow with the number of legal moves the node had reached so far, up to 8, including moves pruned without search; at principal-variation nodes there was no such allowance. The change replaced it with a counted factor: at nodes outside the principal variation, the search counts how often it actually searches the first, second and so on up to the ninth move. The more rarely nodes search as many moves as this one, the larger the bonus, at most 4 times and capped by the existing upper limits; at other nodes the factor stays 1. Maluses, killers and the countermove stayed the same.

Why it was rejected. 27,502 games: −0.10 nElo, LLR −2.96. The interval runs from −4.21 to +4.00.

T-0209: history pruning removed

What was tested. At small remaining depth the engine did not search quiet moves at all whose history value lay below a negative threshold that falls further with depth. Checks and threatening moves were exempt. The change removed this pruning together with its 2 tuning parameters; all other pruning stayed. Moves that had been dropped only because of their poor history were now searched. The author had named the counter-risk: the extra search can crowd out better work in the same time.

Why it was rejected. 20,120 games: −1.05 nElo, LLR −2.96. The interval runs from −5.85 to +3.75.

T-0210: no evaluation correction from draw results

What was tested. At the end of a node the search also learns a correction to its static evaluation. The entries are keyed by pawns, pieces and moves, not by the path to the position. Draw scores from repetition and the fifty-move rule do depend on the path, though; so the score of one path could shift the correction for other paths. The change skipped this learning when the result was exactly a draw. The author had named the limit: the filter also hits genuine drawn positions such as a fortress, where the draw score would be the right information.

Why it was rejected. As with T-0204, the estimate was positive but below the midpoint: +1.26 nElo after 57,582 games in 7.5 hours, LLR −2.96. The interval runs from −1.58 to +4.10.

T-0211: null-move probe also on a lower bound from the table

What was tested. In the null-move probe the search passes a move and continues at a shallower depth. If the result still reaches at least beta, the node is cut, at great depth only after a verification search. Until now the static evaluation also had to be at least beta. The change also allowed the probe when only a lower bound from the table reached beta and the static evaluation lay below it, provided at least 2 plies remained after the reduction. With the current values this concerned nodes from depth 9. As risks the author named over-optimistic shallow table values, zugzwang and the cost of unsuccessful probes.

Why it was rejected. 8,930 games in 1.1 hours: −5.54 nElo, LLR −2.97. The interval runs from −12.75 to +1.66.

T-0212: quiet moves in a round-robin over origin squares

What was tested. Move ordering ranks the quiet moves by a score. The change reordered the rear part at nodes outside the principal variation and not in check: in each round, the best remaining move from each origin square, then the next round. The aim was that moves of different pieces come up earlier, before late moves are pruned. The front part of the list, with killers, the countermove, escapes and checks, stayed unchanged. The author had named the counter-risk: several moves of the same piece can be the better ones.

Why it was rejected. The shortest run: 3,008 games in 23 minutes, −21.29 nElo, LLR −2.96. Here the whole nominal interval lies below zero, from −33.70 to −8.87. After so early a stop the magnitude is more likely exaggerated.

T-0213: keep the null-window score when the re-search is aborted

What was tested. At the root the search first checks every later move with a null window: is it better than the best so far? If the probe says yes, the move is searched again with a full window to find its score. If time ran out during that re-search, only fully searched results used to count, and the move was ignored even though the probe had already placed it above the best so far. The change took it as the best move of the iteration in this case, with the probe's score as a lower bound. It required a complete probe at full depth; it did not use the aborted score or the incomplete line.

Why it was rejected. The short stage passed: +4.01 nElo after 47,622 games in 6.0 hours, LLR +2.97. Its interval from +0.89 to +7.13 lies wholly above zero. The long stage rejected after 3,064 games: −8.20 nElo, LLR −1.36, just below its bound of −1.335. Its interval runs from −20.50 to +4.10 and overlaps that of the short stage. The long stage has a nominal type II error of β = 0.25: by design it rejects even a change with a true +5 nElo in about a quarter of cases. In return it needs fewer games on average. These games do not say which measurement is closer to the truth. The rule decides: a run must pass both stages.

T-0214: start deeper when the game follows the prediction

What was tested. Iterative deepening starts every search at depth 1. The change remembered, after each search, the first 2 moves of the principal variation it reported: its own move and the expected reply. If the game followed exactly this prediction and the table held an exact entry for the new position with a legal move and a depth of at least 4 but below the search's maximum depth, the next search started directly at that depth, with a search window around the stored score. The skipped shallow iterations were not replaced.

Why it was rejected. 3,984 games in 31 minutes: −15.41 nElo, LLR −2.95. As with T-0212, the whole nominal interval lies below zero, from −26.20 to −4.63.

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 these changes went into the engine.

How this was checked