An opening planner and threat-aware bargaining
Playing against the depth-3 browser search, the user found its setup placements poor and its trading passive: it took one-for-one swaps it could have improved and never blocked a rival. A four-game trace confirmed the placement diagnosis in numbers: the search ranked sites by raw production and produced pairs with eleven brick pips and no grain, or no ore at all.
Opening planner
crates/expectimax/src/v2/opening.rs scores the two setup sites as a
portfolio (production, dice-number coverage, thin-resource balance, time to
afford a settlement and a city, ports, expansion), predicts the picks the seats
ahead in the snake draft will make, and values a first placement by the best
pair it still leaves. The last seat plans both placements together. Roads head
for the best surviving site. The same planner opens the opponents inside the
lookahead, the fast and ETA builders, and the browser builders.
The first version valued pips with hand-set weights and a large expansion term. On 64 deterministic boards, four rotations, the planner-decided seat lost to the previous search placement by 0.30 wins per game (23% against 54%): its pairs covered the island but held no ore, while the search's ore and grain pairs won. Calibrating the production weights to the leaf's resource values, cutting coverage, balance, and expansion to tie-breaker size, and switching the discrete strategies off turned the contrast around. Unregistered screens, each 256 games against the same control seat, planner minus search wins per game:
| Setting | Planner | Search | Contrast |
|---|---|---|---|
| pip weights, expansion 0.5 (first draft) | 23.4% | 53.5% | −0.301 |
| leaf weights, specialize 0.5, scarcity 0.5, expansion 0.15 | 28.5% | 44.9% | −0.164 |
| calibrated, specialize 0, scarcity 0 | 47.3% | 37.9% | +0.094 |
| calibrated, specialize 1, scarcity 0 | 31.6% | 47.7% | −0.161 |
| calibrated, specialize 0, scarcity 1 | 46.9% | 35.2% | +0.117 |
| calibrated, specialize 0.5, scarcity 0.5 | 42.2% | 42.6% | −0.004 |
| calibrated, coverage 0.4, balance 0.5 | 46.1% | 37.1% | +0.090 |
Specialization (five discrete strategies blended in by specialize) hurts at
every strength; the scarcity markup at full strength is the best setting; the
coverage and balance weights are neutral in this range. The defaults are the
calibrated weights with specialize 0 and scarcity 1.
Registered confirmation d1bdca03-d27f-475c-b1ee-a8caf70937fe, run
08fdd9a7-6e0a-4e2a-a1cc-8124294feae2, on fresh boards 64 to 127: the planner
seat won 110 of 256 (43.0%) against 94 (36.7%) for the previous placement,
paired contrast +0.062 wins per game (95% interval −0.036 to +0.161); the
registered rule was not met.
The bargaining arms later in the day showed a seating term between two
searches in slots 0 and 1, so the comparison was re-registered as swapped pairs
(experiments 9183b787-3f41-42c4-b275-2501bbde6cf4 and
0fa24829-d9d8-42c3-b2b5-bf4c79f7e263 on boards 0 to 63, runs
b698064e-39e8-4d73-9844-ac3d5afefce6 and da0b1591-e74e-4e56-96b1-1ece9b37900f;
experiments 8dfbb264-338f-48e1-8fda-9b00d7bc865c and
54d3e49d-185d-4a40-945c-8ddafc20c5ef on boards 64 to 127, runs
5e3c4985-251d-441f-bea8-512dfe3224b4 and d89ea4de-913b-4255-af42-ba2f18309e87).
Planner effect after removing the seating term: −0.006 (−0.087 to +0.075) on
boards 0 to 63, −0.027 (−0.111 to +0.057) on 64 to 127, pooled −0.017 (−0.075
to +0.042) over 128 boards, with a seating term of +0.063 (+0.008 to +0.119).
The calibrated planner matches the search's placement in strength and does not
beat it; the screens' +0.09 to +0.12 were seating. The planner stays the
default for what it adds without costing strength: balanced pairs, an
explanation per candidate, the draft prediction, and one placement rule shared
by every seat.
Bargaining
crates/expectimax/src/v2/bargain.rs gives every other seat a threat from the
race, shared ground, and award contests. The threat raises the margin a swap
must clear and charges a share of what the partner gains. Proposals avoid
threatening seats, carry a message with the reason, and may go to every safe
seat at once. An open offer to the search draws counters (more of what was
offered, an extra card it is short of, a different resource, or one card less)
priced by the offerer's public eagerness, and when neither accepting nor
countering beats waiting the seat declines explicitly with a reason: the
offerer leads, the swap completes their build, they compete for the same
ground, the terms are thin, or the cards are needed. The arena resolves counters
and records declines; the browser worker sends the search's speech for accepts
and declines and keeps the offer's message inside the offer.
Registered cohort 0250ba3c-1631-427e-bddc-9930a1504334, run
4228f4f7-4427-42a4-8c0f-3976e1d26c76, seated the default against the same
search with plain acceptance (bargain: false) and two builders on boards 0 to
63: the bargaining seat won 137 of 256 (53.5%) against 81 (31.6%), paired
contrast +0.219 wins per game (95% interval +0.124 to +0.314), at 111 ms per
decision against 71 ms. At a table where the other search accepts any swap that
reduces its build deficit, pricing by threat, countering thin offers, and asking
two for one from a well-stocked partner is worth about a fifth of a win per
game. This says nothing yet about a table of people, who will not accept every
counter.
Registered cohort b1fd194e-f308-448e-8acb-21b8087abf43, run
42f60c41-b5f2-42ee-94f4-9675c09aa3a1, seated the new default against ETA,
fast, and ETA on boards 0 to 63, the lineup of run
77928683-3ef2-4ee7-90f0-04f7b2885c53: 170 of 256 slot-games (66.4%, interval
60.4% to 71.9%), mean 9.00 points, against the compared ETA slot's 9.0%, paired
contrast +0.574 (interval +0.500 to +0.648). The registration cited the 34.0%
of run 77928683, which predates the planning fix of 2026-09-09; the corrected
search's 50.4% in run a0c91849-4abf-4f1c-9de1-6255e1ef73e6 is the fairer
comparison, and the new default is 16 points above it. The builders now open
with the same planner, so this compares versions on the same boards rather
than pairing a single change.
Failures and limits
The pip-based first draft is the main failure: an evaluator that looks balanced to a player lost thirty points to the leaf's ore-and-grain preference against builders. Whether that preference survives against opponents who trade and block is untested; every cohort here is development tier against fixed builders. Counters and reasoned declines were not measured against a human.
Attribution: Claude Fable 5.1 (claude-fable-5-1) through Claude Code.
Bargaining arms and a seating bias
The three bargaining mechanisms of the morning cohort changed together, and
the plain partner accepted every helpful counter, so the afternoon separated
them. The server gained four SearchConfig switches, all on by default:
threat_pricing (the margin premium and the partner cost), counters,
asks (two-for-one asks to well-stocked partners), each effective only while
bargain is on so that bargain: false is the all-off control, and
accept_asks, which when false makes a seat refuse any offer or counter that
asks it for more cards than it receives. Adding them exposed a defect: the
accept-side partner cost priced the swap backwards, valuing the partner
receiving what this seat received. It is fixed on the branch, so every cohort
below runs the corrected default; the morning cohort ran the reversed cost.
Tests for each switch are in crates/expectimax/tests/bargain_arms.rs.
Unregistered screens on boards 0 to 15 seated the default in slot 0 and the
changed seat in slot 1: the default beat threat pricing off by +0.06, counters
off by +0.33, asks off by +0.30, the stubborn partner by +0.23, and all off by
+0.31. The registered cohorts on boards 0 to 63 seat the changed search in
slot 0 and the default in slot 1, the ablation design, and pointed the other
way: threat pricing off 4f63e9ca-6a55-486f-931e-e892653a1d9c (run 42f26989-d3ee-4028-8e9b-94ed1721f2af) +0.168 (95% interval
+0.073 to +0.263) for the changed seat, counters off 86f142ed-1caa-4dcb-a3e1-056928a02349 (run
41c28f22-84a4-4393-8af2-e87b1fce4503) −0.023 (−0.109 to +0.062), asks off 07ef7d4d-f2cf-4d7b-98b5-b444e9a5175a (run dcc418a8-8823-440c-9a6e-1ad559cba001)
+0.020 (−0.083 to +0.122), the default against the stubborn partner
40a3b6ce-d0a4-4752-8866-297729c539f9 (run 61c10388-f2ee-4a4e-9ef7-42d023b57199) +0.117 (+0.015 to +0.219). A screen is not a
finding, but every arm moving by 0.2 to 0.35 between the two seatings asked
for a null.
Cohort 948d095b-afd8-467c-ad8b-408b80280e65 (run 91ddb42d-82ab-460b-95c2-b8d340658369) seats two identical defaults in slots 0
and 1 with the builders: slot 0 won 128 of 256 against 83, contrast +0.176
(+0.083 to +0.268). Slot 1 always sits one seat after slot 0, so it is asked
first on every offer slot 0 makes, while slot 0 is asked last, after both
builders, on every offer slot 1 makes; with counters and multi-seat offers
that order is worth a sixth of a win. Read against the null
on the same boards (not preregistered), threat pricing off is −0.008 (−0.103
to +0.087), counters off −0.199 (−0.309 to −0.089), asks off −0.156 (−0.259 to
−0.054), the stubborn seat +0.059 (+0.002 to +0.115) better than an identical
default would be, and the morning cohort's +0.219 becomes +0.043 (−0.082 to
+0.168). All off 7f5703e0-9fed-46cf-931d-5b91bdf42e77 (run a4db5f20-cece-4644-a9cf-a33311f8fd8d): −0.121 (−0.210 to −0.032) registered, the one arm whose
registered interval excludes zero in the direction of its hypothesis, and
−0.297 (−0.429 to −0.165) against the null.
Counters carry the largest effect, so they were registered again on boards
64 to 127 as a swapped pair, 02dea57a-7696-497f-a35f-cd052cc62d60 (counters off in slot 0, run
223be9e1-3f6b-4211-8879-40ce3b8fc8c0) and 2f44e17b-0bbb-4206-b484-3b114de31139 (counters off in slot 1, run 6d2867d4-df84-4e52-a6b5-9baaa2459e26),
with the effect defined as the per-board half-difference of the two contrasts,
which averages the two seatings: counters off in slot 0 −0.105 (−0.206 to
−0.005), counters off in slot 1 +0.086 (−0.006 to +0.177) for the default,
effect of switching counters off −0.096 (−0.156 to −0.035). The rule is met
and counters stay on. The pair's seating term, the per-board average of the
two contrasts, is −0.010 (−0.084 to +0.065), not the +0.176 of the first
null, so a second null 8402a48b-31fc-4654-9687-a1a4bf3bd403 (run
9d213ed0-a04f-442b-8d89-1dd3fdd99ab1) was registered on boards 64 to 127
to tell whether the bias needs both seats countering or the first null's
boards were unusual: +0.051 (−0.046 to +0.148), 107 against 94. Pooled over
the 128 boards the seating term is +0.113 (+0.046 to +0.181), an after-the-fact
pooling; its direction holds and its size does not, so a two-search contrast
must be measured in both seatings rather than corrected by a null.
The default keeps every switch on; the arms report
has the tables and the reasoning. The +0.219 strength claim of the morning is
withdrawn in docs/status.md. Two things follow for the arena: a multi-seat
offer should not always be put first to the seat after the offerer, and any
two-search contrast needs a null arm or a swapped pair. The 2026-09-09
ablation program used the same slot design under the earlier trade code and
was not re-checked.
Failures: none of the cohorts lost a game; the machine was shared with other agents at a load of 50 to 90 on 32 cores, so wall times (17 to 30 minutes per 256-game cohort at eight threads) say nothing about search cost.
Attribution: Claude Fable 5.1 (claude-fable-5-1) through Claude Code.
Endgame racing and stopping the leader
The tunable search penalizes the highest opponent score at 35 points per point
and their production at 60 per card per roll, the same at 8 points as at 4.
Three switches behind one endgame seat object, each one hypothesis, each off
by default, were built in the server search and tested against the unchanged
depth-2 control with an ETA and a fast builder:
race: once any opponent is within two points of victory, the leaf drops the plain opponent terms and adds the own-minus-leader margin plus the leader's expected new points next turn, estimated from the share of their best build's cost their sampled hand plus one roll of production covers, with development purchases priced at the deck's remaining victory-card share.hidden_points: opponent terms count expected hidden victory points, the victory cards sampled into each hidden world from the deck prior left by public purchases and plays.block_leader: after two thirds of the estimated game length, robber placements, stolen cards, and road shortlists score the points leader with extra weight, including a denial bonus for roads that lengthen the leader's route to a contested site.
Unregistered 16-seed screens (64 games each, seeds 0 to 15) pointed the same way for all three: raw win differences of +0.16 (race), +0.25 (hidden points), and +0.30 (block leader). Screens carry no evidential weight.
The first cohorts seated the candidate in slot 0 and the control in slot 1 on seeds 0 to 63, then again on fresh seeds 64 to 127, 256 deterministic games each, with the rule that the paired per-seed win difference must have a 95 percent interval excluding zero and a mean of at least +0.05 wins per game. All six completed 256 of 256 at eight threads:
| Switch | Seeds | Registration | Run | Slot 0 wins | Slot 1 wins | Contrast (95% interval) |
|---|---|---|---|---|---|---|
| race | 0 to 63 | 8e88ecc7-03f7-48a8-9b53-4a94605a3289 | 21339250-46ad-49ec-ae7e-b2580dabcfed | 121 | 88 | +0.129 (+0.029 to +0.228) |
| hidden_points | 0 to 63 | 7ac46868-0f78-4f10-bd6c-49c9437d24ad | 7cc6f1aa-faad-448f-9224-6ffaecce53f0 | 129 | 85 | +0.172 (+0.080 to +0.264) |
| block_leader | 0 to 63 | 21b4a965-c6f1-4e38-83aa-ecacd3187ecd | b5090959-bd26-4926-a9a6-bff17b9c5a87 | 127 | 84 | +0.168 (+0.073 to +0.263) |
| race | 64 to 127 | b45005ae-66e6-4290-ae8a-7959a8d4d7c3 | c7b6767b-1bc5-4f19-a2d5-b348c5e4959b | 110 | 90 | +0.078 (-0.010 to +0.166) |
| hidden_points | 64 to 127 | 350b4c24-02bf-4f36-a9d0-90ff71f25ae9 | b8abe69e-c8b2-418b-a2fc-c70f9425afe9 | 107 | 97 | +0.039 (-0.049 to +0.127) |
| block_leader | 64 to 127 | 4c43f642-044e-4b09-850a-e2cf38fb3b30 | bbc86639-f6ef-4d40-9d26-604fa8a4573a | 108 | 95 | +0.051 (-0.044 to +0.146) |
Those contrasts do not count as effects. The design seats the candidate in slot 0 and the control in slot 1, and null pairs measured a seating term of exactly that size and sign between two identical searches: +0.176 (+0.083 to +0.268) and +0.180 (+0.075 to +0.285) on boards 0 to 63, +0.051 (-0.046 to +0.148) on boards 64 to 127 (runs 91ddb42d, 689a1947, 9d213ed0, the bargaining arms report). My development contrasts are the size of the term and my confirmations match the fresh-board term, so as filed they were consistent with no effect at all. The strength reading is withdrawn.
Swapped pairs for the endgame switches
Each switch was then registered as a swapped pair on boards 64 to 127 under
the follow-up study containment/endgame-seating: half A seats the candidate
in slot 0, half B seats it in slot 1, the effect is the per-seed
half-difference of the two contrasts and the seating term their half-sum
(analysis/seating_pair.py). Both halves were played fresh on the current
engine rather than pairing half B with the earlier confirmations, because the
engine no longer reproduces those games: the recipient-order change and the
accept-side partner-cost fix landed after them, and on a 64-game sample of
the race lineup 6 games differ between engines. Every half completed 256 of
256 at eight threads:
| Switch | Half | Registration | Run | Slot 0 wins | Slot 1 wins | Contrast (95% interval) |
|---|---|---|---|---|---|---|
| race | A | 232a0fe5-bf9f-4654-972f-fd5614f0c627 | 3e8ec893-c404-4a08-a15d-0c9bd7a3b656 | 114 | 86 | +0.109 (+0.026 to +0.192) |
| race | B | 80e8871e-a41f-4af4-9abd-c5d148c6b729 | 8bacdaf4-8be4-47ea-93df-c0e26156f94d | 113 | 94 | +0.074 (-0.013 to +0.161) |
| hidden_points | A | c0222de1-d17f-4c7a-8c62-812290209546 | 6638df3f-4e04-41ac-881e-8fc11c12c4ce | 111 | 99 | +0.047 (-0.048 to +0.141) |
| hidden_points | B | e4bba171-b024-48b5-a89e-cdd9f335a2d8 | 26f98193-ebf6-4edb-bf34-a722052b9053 | 107 | 98 | +0.035 (-0.060 to +0.130) |
| block_leader | A | 6a26ed39-a56c-4c50-8bb8-b80f06e230c0 | 77b249a6-80a7-4a4d-98d9-a0a55d3006d6 | 111 | 93 | +0.070 (-0.027 to +0.168) |
| block_leader | B | bf5f1784-46c3-4a01-8b1a-5560ea963d6a | e6e854a2-8469-4b76-acec-1942b96e2f17 | 109 | 97 | +0.047 (-0.040 to +0.133) |
Half B's contrast is control minus candidate, so a real effect makes the two contrasts point opposite ways. Every pair points the same way: the single-seating numbers were the seating. Seating-corrected effects over the 64 boards, with the seating terms beside them:
| Switch | Effect (95% interval) | Seating term (95% interval) |
|---|---|---|
| race | +0.018 (-0.018 to +0.053) | +0.092 (+0.014 to +0.169) |
| hidden_points | +0.006 (-0.030 to +0.041) | +0.041 (-0.047 to +0.129) |
| block_leader | +0.012 (-0.018 to +0.041) | +0.059 (-0.029 to +0.146) |
The seating terms match the null pairs measured on the same boards. Every effect mean is below the +0.05 of the registered rule and every interval crosses zero, so all three are inconclusive and consistent with no effect; each interval excludes effects above about +0.05 wins per game. The switches stay off by default. The report is rewritten with the corrected reading.
Diagnostics across each pair (analysis/endgame.py): the candidate seat lost
21, 22, and 25 one-point games out of about 300 losses, the winner finished
2.3 points ahead of it on average, and the game-level robber statistics again
do not isolate a one-seat bias. One earlier registration had a clerical
error, a mistyped UUID in the block_leader confirmation's hypothesis text,
corrected in experiments/4c43f642-044e-4b09-850a-e2cf38fb3b30.toml before
its run started; no completed experiment was rewritten. No run failed, no
game was censored, and all twelve cohorts completed 256 of 256 games at
eight threads.
Attribution: GLM-5.3 (baseten/zai-org/GLM-5.3) through opencode.
A rotating recipient order does not remove the seating term
The arena now asks the recipients of an offer starting from a rotating seat
(seed plus version) instead of always the seat after the offerer, the
mechanism the arms report suspected. A null pair of identical default seats in
slots 0 and 1 with the rotation, experiment
e1913588-7c22-4573-88e2-04728f60c820, run
689a1947-ee7a-4767-ac08-d8302f407c50 on boards 0 to 63, still differs by
+0.180 wins per game (95% interval +0.075 to +0.285), against +0.176 before
the change on the same boards. The recipient order is not the cause, or not
the whole cause; the swapped-pair rule stands and a diagnosis of the seating
term is filed as the next step of log/arena-seating.
Attribution: Claude Fable 5.1 (claude-fable-5-1) through Claude Code.
The seating term is turn order, not the arena
Study log/arena-seating. The rotating recipient order left the null pair
at +0.180, so eight more null cohorts on boards 0 to 63 (256 games each,
deterministic, depth 2, sixteen threads) asked what the term needs. Two
identical seats in slots 0 and 1 with bargain: false
(f6c4c5d3-583e-4984-9a69-e4bec3c2e81a, run
dc30070d-8a95-4de3-b9ec-0724f051687f): +0.102 (+0.020 to +0.183), the
term exists without bargaining. propose: false
(e339df5d-42d1-4e92-a188-74119b970e19, run
98fce06c-8028-4b01-9622-cd2325af5b7b): +0.074 (−0.008 to +0.156),
inconclusive by its rule. counters: false
(db5a667c-7cae-4899-b927-d73f486384cf, run
dbd08f29-7fc4-4c8e-8ae4-42f510046e37): +0.090 (−0.013 to +0.192),
inconclusive. asks: false (a82a26b5-2000-457e-8f23-8b90ff85944f, run
cbc642ff-acd5-4133-bf6a-f8ee013cf6ce): +0.008 (−0.083 to +0.099), which
meets its rule for asks being necessary and is contradicted by the
bargain: false cohort whose seats never ask either; pooled, the four
switch-off nulls are +0.068 (+0.015 to +0.122) and −0.111 (−0.217 to −0.005)
below the default null on the same boards, an after-the-fact pooling. Two
ETAs in slots 2 and 3 (488ce26d-2aa8-4c46-a1bc-ee0f3a352be8, run
e62b248e-ea38-4c6d-b1bb-0ce3ec935284): +0.141 (+0.051 to +0.230), and the
ETA before a search beat the ETA after one by +0.062 (+0.010 to +0.115).
Fast then ETA (d85b0adc-f745-4aa5-b1fd-bc04d7e7bdb8, run
8acd42de-4681-4869-8fc9-e837206aaff7): +0.133 (+0.040 to +0.226). An ETA
between the two searches, slots 0 and 2
(6ad995b4-dfe4-41a6-8c67-c8d0bf35af8e, run
8dfca00b-69c3-4e54-a8dd-b90ee75e63d5): +0.039 (−0.048 to +0.126) for slot
0 minus slot 2, the rule for adjacency met. One search with three ETAs
(34c7f33a-d0d1-4ede-a424-3f45281535d3, run
796fe469-7624-4629-8141-7fcd4bd214ac): the ETA after the search minus the
ETA before it −0.027 (−0.084 to +0.029), no builder term.
The cause is adjacency in turn order, a property of the game: the seat
directly before another acts first after three of the four rolls in a round,
and two identical searches race for the same things. It is not the arena's
offer handling, and every other seat-order rule in table.rs and the engine
(discard order by lowest seat, robber ties by seat, count-indexed tapes, the
shared setup planner) is rotation-symmetric or points the other way. Full
bargaining roughly doubles the term, so the seat after a bargaining search
also loses something in the trades, though an unregistered traced screen on
boards 0 to 15 (kept under runs/screens-arena-seating/) found offers between
the two searches closing at similar rates in both directions and direct site
races split five to five; the searches' points diverge only after turn 40.
The seating report has the table and the
reasoning. Swapped pairs remain the rule; a lineup with the two searches
opposite each other removes the adjacency term for a screen. The agent brief,
docs/status.md, the arms report, and the server's docs/expectimax.md now
name turn order rather than the recipient order; the rotating order stays.
Failures: none; every cohort completed all 256 games. The clippy run in the
server worktree first failed on the gitignored jwt-test-public.pem fixture,
which the worktree did not carry; copying it from the canonical checkout
fixed the build and nothing in the code changed.
Attribution: Claude Fable 5.1 (claude-fable-5-1) through Claude Code.
Predicting opponents next builds
Study adaptation/build-prediction. One function in
crates/expectimax/src/v2/predict.rs reads a seat's next build from a hand
and the public board: it runs the builders' own greedy target choice on that
hand, names the next piece the line completes, the site that line ends up
taking, and how many turns the piece and the whole line are from affordable.
Three switches use it, each off by default: a denial leaf weight that
discounts open sites opponents are heading for, predict.opponents which
makes the lookahead's opponent model execute the predicted build instead of
the builder's greedy policy, and predict.threat which makes the bargaining
space threat key on the predicted target site. Screens on seeds 0 to 15
suggested all three were ahead of the control; the screens were wrong for a
reason worth recording below.
Every cohort ran as a mirrored pair, treatment slot 0 against control slot 1
and then the same two searches with slots swapped, deterministic, depth 2,
with an ETA and a fast builder, 64 seeds and 256 games per cohort. The
average of the two order-paired per-seed contrasts is the mechanism estimate.
Development on seeds 0 to 63: denial +0.061 wins per game (95% interval
+0.009 to +0.112, runs 9801640c-86d1-4ff9-9b3d-b3e678eff974 and
26be0a08-5536-4ede-a294-64c3b842a62e), predicted opponents +0.043 (-0.007
to +0.093, runs 8a6c5cac-24f6-450f-85b4-7147ba36cbc8 and
f00bca4c-d10a-442a-9b71-de1b547e886d), predicted space threat +0.039 (-0.006
to +0.084, runs 3ef05abf-d45e-420d-a200-8a11422b8561 and
ed6fda8e-4978-410b-9f86-6d293757d0c1). Confirmations on fresh seeds 64 to
127: denial -0.025 (-0.071 to +0.020, runs
c03af686-e267-44b8-830a-49493ea40694 and
ca8a57d3-f537-4f95-9442-88f36efd53ad), predicted opponents -0.039 (-0.100 to
+0.022, runs bf40e515-3c42-4635-be06-668e61087efa and
7588d518-7364-4dc0-af7c-33b393087c35), predicted space threat +0.031 (-0.024
to +0.087, runs 96b8dc30-943e-45f9-9f81-d73b832fbc70 and
ff737612-3d3c-4874-b501-eab99d897b90). Every game completed; no censoring.
Only the denial term met its development rule, and it did not survive the
fresh seeds, so no switch becomes a default. The report
collects the numbers.
Diagnostics: from one observer seat's public knowledge the predictor named an opponent's next completed build in 70% of turns against the fast builder, 53% against ETA, and 28% against another depth-2 search, so it reads builders but not searches. The denial seat lost about 0.1 fewer frontier sites per game than its control in every cohort (1.75 against 1.85 or so), so the term does change the board without changing the result enough to measure at this scale.
The mirrored design was necessary because of a slot asymmetry in the paired
ablation lineup. Slot 1 always sits immediately after slot 0 in engine seat
order, and on seeds 0 to 63 that order alone is worth a lot: a control
(control, eta, fast) cohort split 129 to 85 for slot 0, +0.172 wins per game
(95% interval +0.083 to +0.261), while on seeds 64 to 79 the same pair of
identical twins split 30 to 29. Single-order
treatment-minus-control contrasts on seeds 0 to 63 therefore carry roughly a
sixth of a win per game of slot advantage, and past single-order ablation
contrasts on those seeds, including the near-zero arms in the ablation report,
should be read with that in mind. Screens and this control-control cohort are
unregistered diagnostics; the raw JSONL stays under
runs/screens-build-prediction/ in the integrating checkout.
No protocol smoke was run: the switches are off by default, the deployable protocol path is unchanged, and the engine cohorts exercise the same seat specification surface the remote seats use. Attribution: GLM-5.3 (baseten/zai-org/GLM-5.3) through opencode.
Robber placement and victim choice
The search shortlists four robber placements by a static score (blocked
opponent pips weighted by their public points, plus a victim bonus for hand
size and points) and lets the lookahead choose among them. Three switches
under SearchConfig.robber change one part of that score each:
leader counts only the points leader's blocked pips in full (everyone
else's at a tenth), need replaces the victim's hand size with 2.8 times the
expected share of the card this seat most needs (from ResourceKnowledge
expected hands), and threat weights blocked pips by the bargain threat and
never robs a victim with threat below 0.5 while a threatening victim exists.
All switches off reproduce the previous scoring bit for bit: 32 deterministic
games played by the dev and changed binaries are identical apart from timing.
The arena record now carries one compact row per robber placement, so the
shortlist's behaviour can be measured; the default search lands on the points
leader's best hex (their highest-pip hex, cities double) on 25.4 percent of
its robber moves and robs the leader on 42.5 percent, pooled over the six
cohorts below.
Unregistered screens on 16 seeds (64 games each) read leader +0.312, need +0.219, threat +0.203 wins per game, each interval excluding zero. All three looked promising, so all three were registered on seeds 0-63 against the unchanged depth-2 control with eta and fast builders, 256 deterministic games each, and every cohort completed:
| Arm | Run | Arm wins | Control wins | Contrast (95% interval) |
|---|---|---|---|---|
| leader | ccf05c4f-15a1-4774-a273-40b7d5491873 | 124 | 92 | +0.125 (+0.021 to +0.229) |
| need | 9109daab-18d0-4a2a-94e3-a7fa11c94a7a | 130 | 89 | +0.160 (+0.057 to +0.263) |
| threat | 0ce9ecc0-7374-4c7c-8178-4d99db3ed0e1 | 122 | 92 | +0.117 (+0.022 to +0.212) |
The registered rule was met three times, so each arm got a fresh-seed confirmation on seeds 64-127 (256 games each, all completed). None confirmed; all three point the same direction just above zero:
| Arm | Run | Arm wins | Control wins | Contrast (95% interval) |
|---|---|---|---|---|
| leader | a722f475-8cc5-4e2a-896b-4167764b2456 | 112 | 103 | +0.035 (−0.047 to +0.117) |
| need | e214be7c-f184-4840-af3e-e82e7c23ffad | 109 | 99 | +0.039 (−0.062 to +0.140) |
| threat | 1d943a44-ffb0-459d-b487-733d26d50189 | 110 | 101 | +0.035 (−0.056 to +0.126) |
The robber-targeting report carries the mechanism, the plot, and where the robber actually went. The default stays off for all three switches: nothing is confirmed, the arms share one mechanism so their effects probably overlap, and this is one engine-arena lineup at depth 2.
Failures and limits: the screens were optimistic by roughly 0.1 wins per game, and the development cohorts share their seeds with the screens, so the fresh-seed contrasts near +0.035 are the unbiased estimates. The obvious-hex measurement shows the leader arm raising the share of robber moves on the leader's best hex from 25.4 to 31.8 percent and the share of steals from the leader from 42.5 to 55.6 percent; the need and threat arms move victims, not hexes. The need arm reads expected hands at the root of the decision, so inner-search estimates go stale within a turn; a hand that affords every build falls back to the hand-size bonus.
Attribution: GLM 5.3 (zai-org/GLM-5.3) through opencode.
Robber targeting: the gains were the arena seating term
The confirmations above were read as a small positive direction, but the
seating diagnosis published while those runs
finished showed that two identical searches in adjacent slots of this arena
differ by a seating term of turn-order adjacency, and every robber-targeting
cohort seats the arm and the control adjacently. Three swapped pairs were
registered under containment/robber-targeting-bias on the same fresh seeds
64-127, control in slot 0 and the arm in slot 1, to cancel the term: the
bias-free effect is half the per-seed difference between the same-orientation
and swapped contrasts. All 256 games completed in each.
| Arm | Same-orientation | Swapped run | Bias-free effect (95% interval) | Seating term |
|---|---|---|---|---|
| leader | +0.035 | 10834001-571d-439c-83d2-9e31e1d5997b | −0.023 (−0.073 to +0.026) | +0.059 |
| need | +0.039 | 165a28ac-94d3-4ebb-bbdf-989abb243bea | −0.045 (−0.086 to −0.004) | +0.084 |
| threat | +0.035 | cb91296b-ac8d-4f86-9ad6-5ba4d57af8ec | −0.033 (−0.084 to +0.018) | +0.068 |
The corrected reading: none of the three switches beats the default robber shortlist once the seating term is cancelled, and the need rule is measurably worse than choosing the victim by hand size, the only interval excluding zero and on the wrong side. The development-cohort contrasts of +0.117 to +0.160 were the seating term plus the seed selection of the screens, and the fresh-seed contrasts near +0.035 were mostly the term. The switches stay off by default. The robber-targeting report was revised to carry all nine cohorts, the bias-free effects, and the pooled robber-placement measurement. Any future two-search cohort in this arena needs a swapped pair or a null arm, and the dev-seed contrasts of every adjacent-slot arm measured so far deserve the same suspicion.
Failures: the screens overstated every effect by 0.1 to 0.2 wins per game, the development cohorts shared their seeds with the screens, and the first published reading of the confirmations ("consistent positive direction") attributed the seating term to the arms. The run records and registrations stand as filed.
Attribution: GLM 5.3 (zai-org/GLM-5.3) through opencode.
Development-card timing: three switches, all inside the seating term
Study development/knight-timing tested three one-switch candidates for the
depth-2 search's development-card decisions, each against the unchanged control
in slot 1 with an ETA and a fast builder beside them, 256 deterministic games
per cohort. knight_play_value replaces the flat per-knight leaf weight with a
largest-army distance schedule (half weight three or more away, full at two,
1.75 at one, 1.25 while holding) and credits a held playable knight with one
roll of the production it would unblock; the production a play unblocks was
already priced through the afterstate's production term, so the switch isolates
the schedule. buy_tempo offers a purchase only when no road, settlement, or
city is affordable within the next own turn at current production.
hold_knight offers main-phase knight plays only when the robber sits on this
seat's best hex, keeping the roll-phase choice, so knights are held for the
before-the-roll unblock. Unregistered screens on boards 0 to 15 (64 games each,
kept under runs/screens-knight-timing/) read +0.188, +0.156, and +0.172 and
overstated all three, as the seating work elsewhere in this log also found.
Development cohorts on boards 0 to 63, single seating: knight_play_value
000e59d2-beb5-4ad4-aeac-4210c7e6d282 (run ef72f172-c6c1-48d5-ab06-b178b4cea9e9)
+0.145 (+0.050 to +0.240); buy_tempo 0b22df5c-bcdf-40cd-923e-2e484dae499d
(run 647d321b-b370-4abe-b50c-2300404474d7) +0.043 (-0.066 to +0.152);
hold_knight 119cbcf2-9791-4dd5-a1f7-c3766b60e44d (run
30038304-768f-4892-8d0c-c734885a92e4) +0.098 (+0.003 to +0.193). Fresh-board
cohorts on 64 to 127, still single seating: knight_play_value
20360d5d-f450-4102-8af0-83a3797f7891 (run e79ea358-e2e6-4d09-88e1-2a773c0002c8)
+0.074 (-0.021 to +0.170); hold_knight 8f739fd6-446d-4dfc-bd2d-80c838b82ec1
(run f83b1214-86de-4614-ba06-6f97d0f04aba) +0.066 (-0.020 to +0.153).
These five registrations predate the seating rule in my brief: two searches in
adjacent slots differ by +0.05 to +0.18 wins per game from turn order alone
(reports/arena-seating.mdx), so every one of these contrasts is the size of the
term and none is an effect. The knight_play_value arm was re-registered as a
swapped pair on boards 64 to 127, control in slot 0:
a6371eaf-cfc2-42fb-9bde-0f86b52af778 (run 1d91dbfa-e2ba-4186-9232-ece1102d4557),
+0.066 (-0.022 to +0.155) slot 0 minus slot 1. Combined with the forward
cohort: seating-corrected effect +0.004 (-0.061 to +0.069), seating term +0.070
(+0.005 to +0.136), consistent with the +0.051 null on these boards. The
mechanisms bite (the tempo rule halves purchases to 1.54 cards per game against
2.55 and advances the first city by a turn; holding knights forgoes a third of
knight plays and half the army awards) without winning. No default changes; the
switches stay off and documented. The report
carries the table and the plot.
Failures and notes: no failed or incomplete games in any cohort (256 of 256
each). The first session of this work stopped on a provider error after the
first cohort; no run was affected, and the remaining cohorts ran after the
restart. The five single-seating registrations stand as filed even though their
decision rules read two of them as "supported"; the seating correction supersedes
that reading, as it did for the endgame and robber arms. The harness engine
summary now aggregates knights_played, army_awards, and the first city turn
from the arena's per-game records (harness/engine.py): the study's registered
diagnostics had to be visible in the retained run summaries, and the change is
additive with defaults so records from older binaries still parse.
Attribution: Kimi K3 (moonshotai/Kimi-K3) through OpenCode.
Hand-size risk: five arms, all inside the seating term
Study risk/hand-management tested three discard-risk hypotheses as one-change
arms of the depth-2 search against the unchanged control in slot 1, with an ETA
and a fast builder beside them, 256 deterministic games per cohort on boards 0
to 63. spend_down (server branch research/risk, commit 9980af2) adds bank
trades and roads chosen only to shed cards when the hand is over the limit;
discard_projection ranks each discard by the build deficits of the kept hand
plus the expected production before the next own turn; the third arm sweeps
weights.hand_risk to 0, 2, and 4 with the risk inclination fixed at 0.5.
Unregistered screens on boards 0 to 15 (64 games each, kept under
runs/screen-risk/) read +0.156 to +0.250 for the five arms and +0.219 for a
control-against-control pair on the same boards, and a 64-to-79 control pair
read +0.016: the screens measured board luck, not the arms.
Development cohorts, candidate in slot 0: spend_down
47486c2e-9555-4c4f-a444-7a0097dce271 (run 901f81f4-922e-4de7-8269-f78f342f362b)
+0.066 (-0.020 to +0.153); discard_projection
d09eaccb-ab3b-4d1f-9b2e-904cf4cf89e9 (run dd2a5d1f-f204-4389-9e89-5acb6f97932f)
+0.125 (+0.021 to +0.229); hand_risk 0 a78e5220-68c6-4726-a1cc-3a6849ac19f6
(run 2bae826e-cea8-4de8-b39f-a72efcdebf55) +0.074 (-0.024 to +0.173);
hand_risk 2 e79ff8a3-f22e-4590-b9cc-67e17a2b0c20 (run
2f8fae6f-5212-4cde-801b-ffd9be58445a) +0.129 (+0.039 to +0.219); hand_risk 4
1a506239-e401-4340-a08c-8c948248fc30 (run af6fcb03-64fb-4aaf-9639-d1ccaad5f1a3)
+0.078 (-0.028 to +0.184). All 256 of 256 games completed in every cohort.
These registrations predate the seating rule in my brief, and every contrast is
the size of the turn-order term on these boards. The strongest arm,
discard_projection, was re-registered as a swapped pair on the same boards,
control in slot 0: 945e89c0-4928-421b-82d3-f003526cb7ed (run
43215190-c80d-44e6-a8d5-e922c344392c), +0.184 (+0.086 to +0.281) slot 0 minus
slot 1. The seating-corrected effect is -0.029 wins per game (95% interval
-0.073 to +0.015) and the term measured by the pair is +0.154 (+0.064 to
+0.245), matching the nulls in the seating report. The projection switch does
not pay, and the other four single-seating contrasts are consistent with zero
rather than measured effects; the weight sweep is flat, so hand_risk stays at
1 and both switches stay off. The diagnostics confirm the mechanisms fire:
removing the term raises discards from 9.2 to 10.0 cards per game and turns
ended over the limit from 1.0 to 1.4, quadrupling it cuts both, and
spend_down adds half a bank trade per game. The
report carries the table, the diagnostics,
and the plot.
Failures and notes: no failed or incomplete games. This session stalled for
over an hour after the third cohort and was restarted; no run was affected. The
screens shared their boards with the development cohorts and overstated every
arm, as the knight-timing screens did. A protocol smoke of both switches
(experiment e0f2620a-a77a-4bb8-8a65-f1a7358333b7, run
1b8775f4-f51c-45f2-b3b8-ee30590aee96) completed four of four games; plumbing
only. The arena now counts turns_over_limit per seat and the harness
aggregates it; the arena change also resolved a missing git-ignored JWT test
fixture in the fresh server worktree (openssl pkey -pubout regenerates it).
Server worktree setup needed cargo on PATH from ~/.cargo/bin.
Attribution: Kimi K3 (moonshotai/Kimi-K3) through OpenCode.
Road blocking and the longest road
Three mechanisms from the expansion brief, tested one at a time under
expansion/road-blocking against the unchanged depth-2 search with an ETA
and a fast builder, all engine-arena development tier on deterministic
paired boards. Each switch defaults to the unchanged behaviour, and the
default configuration replays the base build bit for bit on a two-seed
check. The arena's seat records gained road diagnostics: awards gained and
held at game end, final trail length, and per-road counts of builds that
raise the leading expander's distance to its best site.
Both win contrasts below were first measured with the candidate in slot 0
and the control in slot 1, and both came out the size of the turn-order
seating term between two adjacent searches (the seating
report: +0.10 to +0.18 on boards 0 to 63,
about +0.05 on boards 64 to 127). The corrected readings come from the
registered swapped halves on boards 64 to 127 under
expansion/road-blocking-swapped, where the control sits in slot 0: the
effect is half the difference of the two contrasts and the seating term
half their sum (analysis/road_blocking_swapped.py). The single-seating
numbers were the seating term, not screening luck; corrected, both
switches are consistent with no effect, and the defaults stay off.
Cutting the leading opponent's expansion path. A new leaf weight
opponent_expansion charges the leading opponent's best reachable site,
discounted by its road distance, over the remaining rolls; candidate roads
are credited for the same quantity, so a road that cuts the opponent's
shortest path is enumerated and valued. Single-seating numbers, candidate
in slot 0: a 16-seed screen gave +0.250 wins per game, the registered
cohort 8124d197-95fd-4a7f-a889-65138713cc70 (run
274e5330-a5e4-4270-952b-adc3b86a4cce, boards 0 to 63) gave +0.168 (95%
interval +0.070 to +0.266), and the confirmation
36f5f80e-352f-4062-b962-fbde755828be (run
2fd1cb5e-f0be-4ef1-b216-7a97973b9239, boards 64 to 127) gave +0.031
(−0.078 to +0.140). The swapped half
248620fd-8baa-49ab-aee8-d545d8380770 (run
c6201b2c-9c97-499d-a23d-8954e60f0820, same boards, control in slot 0)
gave +0.016 (−0.080 to +0.111). Corrected effect: +0.008 wins per game
(95% interval −0.053 to +0.069); the pair's seating term is +0.023
(−0.059 to +0.106). Any real effect of the term is under about 0.07 wins
per game at depth 2 on these boards. Diagnostics on the development cohort:
the candidate built 5.12 roads per game against 4.68 and held the
longest-road award at the end in 55% of games against 39%; blocking builds
stayed rare (0.078 against 0.035 per game) and the denied site value was
small. The term also costs about a third more decision time (314 ms against
232 ms per decision on the confirmation).
Committing to the award only with the road production for it.
road_contention_gate 1.0 restricts the contention credit, in the leaf and
in road enumeration, to seats tying or leading the table in brick plus
lumber production. Single-seating numbers, candidate in slot 0: a 16-seed
screen gave +0.062, the registered cohort
fac6a2ec-dc86-4f18-affa-bc50338e88d8 (run
95d0f056-afc9-4a7b-b291-c864e0f93a29, boards 0 to 63) gave +0.113
(+0.027 to +0.200), and the confirmation
74e56afc-84ef-4910-af5f-725348e0f954 (run
ee7d78c7-ec04-4d43-a01e-57af22420d70, boards 64 to 127) gave +0.031
(−0.060 to +0.122). The swapped half
6503cc10-9a5f-4a0d-b509-71cb4fcd0f9d (run
86fa73ec-aa37-40fb-a23c-4fefb28fcaa3, same boards, control in slot 0)
gave +0.039 (−0.057 to +0.135). Corrected effect: −0.004 wins per game
(95% interval −0.061 to +0.053); the pair's seating term is +0.035
(−0.039 to +0.109). The gate does what it says: the gated seat held the
award at the end in 39% of games against the control's 48%, but the
awards given up do not cost wins, and the races declined do not gain them.
Breaking an opponent's longest road with a settlement. Already present:
every legal settlement is a root candidate, and the leaf credits the lost
award through the opponent-points term. A synthetic probe (seat 1 holding a
five-road trail, seat 0 able to settle on it) has the break ranked first of
seven candidates, with the trail cut to at most 3 and the award removed.
No switch or cohort was needed; crates/expectimax/tests/road_break.rs
pins the behaviour. A road toward a not-yet-reachable break vertex is still
only weakly enumerated; that gap is a separate hypothesis.
Failures: the first run of the gate cohort,
12fb1efb-23d5-4a32-ad87-ed63fb3efcd5, was interrupted after 11 of 256
games when its controlling shell was killed; it is filed as interrupted and
the cohort was rerun from scratch as 95d0f056. The partial games were not
pooled. Separately, the new arena award counter I added fired on every
award event that carried a road holder, not only on gains, and shadowed the
army counter on the same events; the win records, the held-at-end flags,
and the trail lengths are unaffected, but the per-game award-gain counts
quoted above from the four slot-0-candidate runs are inflated. The merged
fix counts both awards in one arm with a change guard, and the default
configuration was re-verified bit for bit against the pre-merge build
afterwards. My first reading of the development cohorts blamed screening on
shared seeds; the swapped pairs show the seating term was the real account,
and that reading was wrong.
Attribution: Kimi K3 (baseten/moonshotai/Kimi-K3) through OpenCode.
Development-card timing under the learned leaf
Study development/timing-tables re-ran the three development-card timing
switches of development/knight-timing against the tables baseline
(v2:{"depth":2,"leaf":{"tables":".../hex-portfolio-main.bin"}}), which buys
about 4.9 development cards per game where the hand-written leaf bought 2.6, so
the purchase and play timing of cards could matter more here. Every contrast is
a registered swapped pair on the same 64 boards (256 games per half, four
rotations, deterministic, six threads): half A seats the candidate in slot 0,
half B in slot 1, the effect is the per-seed half-difference of the two
slot-0-minus-slot-1 contrasts and the seating term their half-sum
(analysis/seating_pair.py). Stages: development (L1: ETA and fast builders,
boards 0-63, matching the hand-leaf cohorts), confirmation (L1, fresh boards
800-863), population (L2: a third tables search in slot 2 and ETA in slot 3,
boards 800-863). One server fix was needed first: the blended leaf dropped the
knight_play_value flag, so the switch would have been inert under the blend;
the blend now evaluates the hand-written terms with the flag
(crates/expectimax/tests/development.rs pins it, docs/expectimax.md
corrected).
Mid-study the orchestrator's blend screen measured the full blend (hand 1.0) at
-0.207 wins per game against the tables alone and the quarter blend at +0.074,
so leaf-term arms moved to hand 0.25. The full-blend knight_play_value
registrations for the confirmation and population stages were withdrawn before
running (experiments 00d8c63d-5ed9-47ef-aacf-c8efdfae7288,
e5715fe9-b44b-4273-a3b0-64ae25ca1b7e, e4ddbc81-32bb-4a70-b17f-38958ae86a9d,
2d22c801-4004-4baa-9551-1c2defee2a0b; never queued) and the same arms were
registered on the quarter blend. The development-stage full-blend pair was
already running and is reported as what it is.
Results, candidate minus control after the seating correction:
| Switch | Stage | Experiment A / B | Run A / B | Effect (95% interval) |
|---|---|---|---|---|
| buy_tempo | development | b6b12fdd-9cff-47c9-9140-7a6330feabf4 / 7385ffd6-017d-41dc-9cb9-bdbfe192e1b5 | f97d8683-79fd-4109-a1ef-7b106f8b3956 / 176f12e2-d391-4402-9b7a-7fa5cc470570 | -0.061 (-0.115 to -0.006) |
| buy_tempo | confirmation | 750b7ebc-9428-492f-9b5f-b2d4de9d992a / be7df6ce-1a7c-4943-bf38-fd6b8ae5d513 | 3292674f-249b-44d7-967c-5481ac3045f1 / a86a5e49-0165-4c3d-ac6a-1a301a4cc496 | -0.006 (-0.070 to +0.058) |
| buy_tempo | population | afb09868-6c8a-416c-bfbf-1d39fd4b3536 / 5e75db43-2be3-4c8c-ab00-f7346fed7297 | ea42e55d-da88-4794-a3b7-08c580473ee8 / 64bbd775-5639-4bfe-bd5f-b0bcb0cef057 | -0.053 (-0.110 to +0.004) |
| hold_knight | development | b7467b5e-5b69-4bf8-b7b5-76ae177131f7 / 75774a6d-7398-4336-8711-5bdba1e206fc | c5ffb6cf-45d1-48a1-a2d8-3b2fa3be7666 / 4a18f4f2-f9cf-4f33-97e6-26e471bf6654 | -0.029 (-0.071 to +0.013) |
| hold_knight | confirmation | 4d8b27cc-edc5-483b-94e6-f543e97eca5b / 56cb999e-5a1c-4852-b06b-74d93f91c692 | 30180b9b-3de5-46d8-ae0e-30e259e21c4d / e6c5fbd4-7f3d-4639-a41e-caac6e6c9022 | -0.025 (-0.076 to +0.026) |
| hold_knight | population | 6fe05d29-9d2a-405d-8e5b-59138ecb27e8 / b21f1bdb-e49a-4025-9668-82580c8ba176 | 873ab9ef-b922-498b-84d4-17f28380a5fa / 08636046-1590-4736-be1a-7b1fe0b5e018 | -0.051 (-0.098 to -0.004) |
| knight_play_value (quarter blend) | development | 80e5bceb-5b8d-4428-9292-33c8d378e709 / 858e2a4d-452b-4c12-8ba2-8bb88c5897e7 | d493c5b4-e8fa-4e07-84f3-83d995d73d53 / 8a8b0ffb-2e38-4252-913f-06496c939ff0 | -0.002 (-0.031 to +0.027) |
| knight_play_value (quarter blend) | confirmation | c9a94c3d-d7c8-4087-8b60-7289e0094655 / 941be1a7-0882-4bfe-8441-face9cd8b6fc | 8263d242-7450-4e05-a2c3-7483c2d527a2 / e3fc4a9c-0e3b-4700-9dfe-1bd58c317c26 | +0.000 (-0.028 to +0.028) |
| knight_play_value (quarter blend) | population | 8e35acce-ebd3-4f7a-a07e-50327018d5fb / 274d88a0-2692-4784-9593-0d949b05693a | a6afd7a8-248a-4e0f-a4db-b2ca75d8ee31 / 5046ec2d-3835-42f5-9fc0-3ea829bbafeb | +0.004 (-0.026 to +0.034) |
| knight_play_value (full blend) | development | 89dd235d-c117-4688-a355-eb1cc6ad541b / c9ba1dac-5ef3-45ed-ba97-d91a9e5c5c2b | b41de3cf-c42a-4b0a-b37d-065d7c1e1c1b / 41c8da11-f31a-440a-a1ee-61737f4439c7 | +0.109 (+0.055 to +0.164) |
Every half completed 256 of 256 games; no failed, incomplete, or censored games. Reading by the registered rule: buy_tempo is refuted on the development boards and inconclusive on the fresh boards, hold_knight is inconclusive on L1 and refuted on the population lineup, and knight_play_value on the quarter blend is inconclusive everywhere with intervals inside plus or minus 0.035. After-the-fact pooling over the 192 seeds of all three stages: buy_tempo -0.043 (-0.076 to -0.009), hold_knight -0.035 (-0.062 to -0.009), knight_play_value on the quarter blend +0.001 (-0.016 to +0.017). No pooled L1 effect was positive, so the extension stage (boards 864-927) was not registered. The one positive reading, +0.109 for knight_play_value on the full blend, repairs a configuration that is itself 0.2 wins per game weaker than the tables alone; the shaped schedule earns nothing where the hand terms carry only a quarter of the value. Under the hand-written leaf all three switches corrected to about zero (reports/knight-timing.mdx); under the tables the two candidate rules are measurably harmful, because the tables already buy and hold cards well: the tempo rule cuts purchases from about 4.0 to 3.2 cards per game and loses, and holding knights forgoes about 0.2 plays and a fifth of army awards per game and loses. No default changes. The report has the diagnostics and the browser section.
Failures and notes: my first debug-mode cargo test run exceeded its shell
timeout and was stopped; the release-mode run passed (76 tests). Stopping my
run queues at the blend update left three in-flight tournaments without their
queue log lines, but the harness had already detached them and wrote complete
records (runs 3292674f, a86a5e49, 30180b9b, all 256 of 256); no run was lost
or rerun. The machine was shared at load 85 to 160 all day, so wall times (75
to 120 minutes per 256-game half at six threads) say nothing about search cost;
mean decision times come from the run records. All twenty runs are archived
under artifacts/timing-tables/ with receipts in records/artifacts/.
python3 analysis/timing_tables.py recomputes every number and the report's
plot asset from the retained runs.
Attribution: Kimi K3 (moonshotai/Kimi-K3) through OpenCode.
Hand management under the learned leaf: nothing pays
Study risk/hand-tables retested the three discard-risk mechanisms of
risk/hand-management with the learned n-tuple tables as the search leaf,
following the program's three-stage swapped-pair design (development on seeds
0 to 63, confirmation on seeds 800 to 863, population with a third tables
search in slot 2 on seeds 800 to 863, extension on seeds 864 to 927 only when
the pooled builders reading over 128 seeds is positive with its interval's
lower bound within 0.03 of zero). Every pair's decision rule: the
seating-corrected effect's 95 percent seed interval excludes zero in the
hypothesized direction, the other way, or neither. The baseline seat is
v2:{"depth":2,"leaf":{"tables":".../hex-portfolio-main.bin"}}; each candidate
adds one switch. The arena gained two recording-only seat counters on server
branch research/hand-tables, hand_at_roll_sum and hand_at_roll_count, so
the mean hand size at the roll is measurable from the games records.
Hypotheses: spend_down (over the limit, also consider bank trades and roads
chosen only to shed cards) and discard_projection (rank discards by the kept
hand plus expected production before the next own turn) each win more games
than the unchanged tables search; and removing the leaf's seven-risk pricing
(weights.hand_risk 0 against the default 1) wins more because the tables
already price discard exposure. The risk term is inert under the tables alone,
so its arm sits on a blend in both seats. The blend choice changed mid-program:
the six registrations on the full blend (hand 1.0) were withdrawn before
running after the orchestrator's screen measured the full blend at -0.207 wins
per game against the tables alone, and the arm was re-registered on the quarter
blend (hand 0.25). Withdrawn, never run: 8482a56b-7a41-430f-9d4f-19dcfed08e3a,
8dfff424-e403-47c4-89ec-029b203d89e4, 9249ab83-c0b0-485a-a08e-e734b82b4cdc,
198621cf-57ef-4e5b-a892-3989fe65650c, d2f026f6-aaaf-4173-ac65-f39e52d27a2d,
a1d96405-f132-45d1-825f-2117844deea7.
Registrations and runs, half A then half B per pair, each 256 of 256 games completed at six threads unless noted:
- spend_down, development 0-63:
a955b267-9ff0-40c1-82b7-4aa4edc9ff6e(run88f22330-1c27-4be3-a7e3-2eb79f205c20),c492642c-4347-480a-b2ff-29b8f21578ab(runf2a31547-7285-4186-9c53-60d962f01ead). Effect -0.016 (-0.065 to +0.034), seating +0.031. - spend_down, confirmation 800-863:
36feacf1-4e3e-4a42-95dc-c04e5c876c51(run11b5c63b-e5d9-4faf-ae82-3ec1310fc9b5),f9d49130-b3c8-45a6-a08e-6d5bb0c61073(run8d0a219e-73f3-4e2f-8e83-1ba173a4d9b6). Effect +0.004 (-0.048 to +0.055), seating +0.070. - spend_down, population 800-863:
25cf8f50-1d9c-4327-bd46-74773339355a(run8a032ed5-7e98-45bf-9282-7dab74eb1782),b05633ce-e0f4-472b-a07c-5aa348f292af(run794969fe-edda-46cc-a755-a7c7179aeacf). Effect -0.047 (-0.098 to +0.004), seating -0.008. - discard_projection, development 0-63:
3937f009-a9ac-4402-941d-5e549525e838(rund2933fc8-9955-41b9-a292-9c344a821bd4),30413802-3438-4da7-801a-1930b12b8933(run881f42b8-03a7-42ab-b342-8a7118ef9919). Effect +0.006 (-0.033 to +0.044), seating +0.068. - discard_projection, confirmation 800-863:
cd34b338-7485-4ff9-bc83-f401c08bc6e8(run96aaa590-93a9-4c59-89a8-9017995081ca),45db85c1-1e68-4d90-a82e-29e19ae2acf8(runc18fccae-57cd-4e53-ad4a-e8e4d5825f29). Effect +0.016 (-0.028 to +0.059), seating +0.086. - discard_projection, population 800-863:
107448ed-68a4-4ee9-876d-08c78ba7d576(run50ca4d19-152d-4863-9407-417c3c42c51c),5330c9c8-a119-446e-8ed6-bfdbd20d2f5b(run55ef800b-f8d8-431d-8870-4132723c79dd). Effect +0.000 (-0.029 to +0.029), seating -0.020. - discard_projection, extension builders 864-927 (triggered: pooled builders
+0.011, lower bound -0.018):
3c319637-e3da-420d-a9c8-381a469036cf(runf4462a76-5bdf-419f-a926-7b487b7f02be),8dad3d8b-5636-41d1-8c19-bf02370cbf42(runb6a1c336-028d-4f22-b0b2-41f95dc29203). Effect +0.014 (-0.018 to +0.046), seating +0.123. - discard_projection, extension population 864-927:
316cb7a7-5b95-42bf-ade4-f7356f9ef6e1(run0ac1cd70-24da-4ec9-a76a-e070f9ca37e5),dcd15bb4-deb1-4726-a63b-da6e0e83120d(run29d0fc33-4113-4c67-8b5a-b884ce104e55). Effect -0.004 (-0.034 to +0.026), seating +0.066. - hand_risk 0 on the quarter blend, development 0-63:
826a6d8e-1b8a-4797-addc-f5454fa4d954(run2275903a-1549-44e3-8cbb-2a53b16ea8fa),525aa23e-6191-4ae8-aabf-b1082da41b2d(run7ce522da-775b-43e0-a051-9e96ef3d8c18). Effect +0.004 (-0.043 to +0.051), seating +0.094. - hand_risk 0 on the quarter blend, confirmation 800-863:
dce23ad1-0f66-417e-8a07-56fc52e26992(run0808617f-771f-43d9-b83b-ad4eb2a45e54),72f45c36-9c85-419c-b41a-de7f2d761eec(run96902436-9d8c-44ac-8233-e722730e2c02). Effect -0.018 (-0.067 to +0.031), seating +0.045. - hand_risk 0 on the quarter blend, population 800-863:
1547ca49-dffd-4e2e-bd52-41934ae1180f(run4c417894-9fd2-4243-b477-c0750a5a86d0),93304090-43f2-49e9-b30a-8cfc6bbe9d45(runfce730d6-75bc-47a7-826b-eb7e179ebc79). Effect +0.012 (-0.040 to +0.063), seating +0.062.
Pooled readings, all after-the-fact pooling: spend_down -0.006 (-0.042 to +0.030) over the 128 builders seeds and -0.020 (-0.049 to +0.010) over all 192; discard_projection +0.012 (-0.010 to +0.034) over the 192 builders seeds, -0.002 (-0.023 to +0.019) over the 128 population seeds, +0.006 (-0.009 to +0.022) over all 320; hand_risk on the quarter blend -0.007 (-0.041 to +0.027) over the 128 builders seeds and -0.001 (-0.029 to +0.028) over all 192. Decision-time ratios against the control: spend_down 1.19, discard_projection 1.00, hand_risk 0.99. Every registered rule lands on inconclusive, and no arm meets the +0.03 browser threshold; defaults are unchanged. The mechanisms still fire: spend_down ends 0.40 turns per game over the limit against the control's 0.47 and discards 4.7 cards against 5.1, and removing the risk term on the blend raises discards from 5.96 to 6.09. Under the tables the control holds 4.8 cards at the roll, discards about 5 per game, and ends 0.4 to 0.5 turns over the limit, against about 9 discards and 1.0 over-limit turns under the hand-written leaf: the tables were trained with the same discard rule and the play they induce rarely reaches eight cards, so the situation these mechanisms price comes up half as often. The report has the tables, diagnostics, and the browser section.
Failures: the first attempt at the development spend_down half A, run
ac02ff67-a456-42ba-bc81-9434c69054d6, stopped after 3 of 256 games when the
queue driver I had launched without session detachment was killed with its
shell; it is filed as interrupted, its games were not pooled, and the cohort
was rerun from scratch. A second operational mistake: one queue worker started
from the canonical checkout instead of the worktree and failed at preflight
before playing a game (no run created); it was restarted correctly. The six
withdrawn full-blend registrations stand as filed with no runs. No tournament
lost or censored a game. Three unregistered 8-game smokes of the seat specs
(plumbing only) are kept under runs/smoke-hand-tables/. The machine ran at a
load of 125 to 165 all day from the ten-agent program, so absolute decision
times are inflated and only within-run ratios are quoted.
Attribution: Kimi K3 (moonshotai/Kimi-K3) through OpenCode.
Bargaining switches under the learned leaf
Study bargaining/tables-arms asks whether each bargaining mechanism still wins games when the depth-2 search evaluates with the learned n-tuple tables (hex-portfolio-main.bin). Each arm is the tables baseline with one switch off: bargain: false (all off), threat_pricing: false, counters: false, asks: false, and accept_asks: false (a stubborn seat that refuses asks). Every hypothesis was registered in the direction "the arm loses to the unchanged baseline, so the mechanism helps under the tables". Every contrast is a swapped pair on the same seeds: half A seats the arm in slot 0 and the control in slot 1, half B the reverse; the effect is the per-seed half-difference of the two slot-0-minus-slot-1 contrasts and the seating term their half-sum (analysis/bargaining_tables.py analysis/bargaining_tables.json). Stages: the population lineup L2 (a third tables search and an ETA) on seeds 800-863, then the builder lineup L1 (ETA and fast) on seeds 0-63 and 800-863, 256 deterministic games per half. The decision rule for every pair: all games complete, and the effect's 95% seed interval excludes zero below (support), above (refutation), or neither (inconclusive).
A traced screen on 16 boards (runs/screens-bargaining-tables/, analysis/bargaining_thresholds.py, a screen, not a finding) checked whether the bargaining thresholds, which are fixed numbers in the hand-written currency, are mis-sized for the tables. They are not: one swap moves both leaves by 30 to 35 units for a proposal the lookahead likes and 9 to 10 units of threat pricing on an accept, and the plain margin blocks about a third of liked proposals under both. No server change was made.
| Stage | Arm | Half A experiment, run | Half B experiment, run | Effect (95% interval) | Seating term |
|---|---|---|---|---|---|
| L2 800-863 | all off | e4610302-84a7-4cbf-9153-8c1d817d1bd3, 3b0c453e-247e-4f3d-a21b-1967ffce90e6 | 4f4b8a5f-4437-4594-b85d-c6e06ac9a55e, 4a6e9f09-a582-4ab4-8e74-b939a1ec8959 | −0.098 (−0.152 to −0.044) | +0.035 (−0.030 to +0.100) |
| L2 800-863 | threat pricing off | 717eae4e-b949-42fa-a1ab-3c086bdc8f3c, ae2cc3ea-d01f-4b62-8e52-91310dca1e93 | 7c9ffb4c-ce6a-4064-98d8-817702445f8d, 0686a9ad-9da2-43b8-96b1-892b672697f2 | +0.014 (−0.041 to +0.069) | −0.049 (−0.116 to +0.019) |
| L2 800-863 | counters off | 4fd7a980-53a4-40f3-84ee-8b9b86bf3761, 999d8a97-b681-4dd8-b7ec-6142e8e4e2f9 | 75000b6c-b0ba-4b33-8086-24dc58e534fa, ebb5da5b-0763-423d-aaf7-13e39128602f | −0.119 (−0.176 to −0.062) | +0.010 (−0.056 to +0.075) |
| L2 800-863 | asks off | e2d48aa8-cdcc-4123-82de-2d3b8fac502f, 13ced608-cba8-4a08-98aa-c744d6ee048b | b0dbf209-97de-4881-b7ae-e8d1b7381b3d, 461c113a-3fad-4cc3-9aea-b59af3d14d21 | −0.037 (−0.093 to +0.018) | +0.033 (−0.034 to +0.100) |
| L2 800-863 | stubborn (refuses asks) | b77486f2-da1f-4b29-b5b7-7843de5ca87d, e083bd7f-bb66-4474-aceb-bd463d0d175a | ab3a7230-393a-4b82-889f-d516413afebf, 62529417-a975-4042-bdbf-531f2bb24acf | +0.008 (−0.034 to +0.050) | −0.066 (−0.138 to +0.005) |
| L1 0-63 | all off | 937e19ae-2569-4472-9ea6-d964769aaaf1, bd2986e6-c83e-4289-966f-ec1fcb932082 | 6c92dd71-3397-4c84-abaa-fe37371bd8e7, c826e45a-6212-4187-8895-7ca24848d802 | −0.146 (−0.212 to −0.081) | +0.049 (−0.027 to +0.124) |
| L1 0-63 | threat pricing off | 13fc34cb-16ff-41ca-a87e-7b212e0461d9, 623e109e-7040-43e6-b20b-3e371e17fccb | 9b87ce41-b6ec-4985-ab9e-52d3b2ead900, d418eee0-8e53-4392-99ac-88b14a68d8f5 | −0.023 (−0.091 to +0.044) | +0.125 (+0.053 to +0.197) |
| L1 0-63 | counters off | 335728e0-245f-46e4-b345-8121f246dc44, 6cb1ec79-c371-4551-90b1-3cc6cdc8afd9 | d5d25a63-fef6-44ca-9a4e-48c3251c14a4, 86fcba2e-60a9-4422-9c43-467c08ceeee7 | −0.096 (−0.146 to −0.046) | +0.092 (+0.013 to +0.171) |
| L1 0-63 | asks off | 1c2e9a7f-fdfd-4385-9cb3-cc136ee01eeb, e2a6bec5-ba94-4d34-a885-fd2274d6579e | 1a34b4e4-0905-4d0a-a8b3-913c4a12a0f8, 55c5fe2f-b5f5-477f-a03b-0ae62bfe9005 | −0.076 (−0.138 to −0.015) | +0.064 (−0.011 to +0.139) |
| L1 0-63 | stubborn (refuses asks) | c9f1ac2b-d49c-41b7-9782-29359c0382f4, 05e28cbc-1536-4686-9328-cd96ce203960 | 9fe81446-d3fc-4434-99be-f0963253c955, 5b736f84-6966-4a57-8c08-07e4068eaa95 | +0.000 (−0.022 to +0.022) | +0.125 (+0.037 to +0.213) |
| L1 800-863 | all off | 1d79b24f-6236-48e4-b2b1-0b0b5f53202d, 2f70d1e1-7a04-4fbc-8b8a-6ae08c6caec5 | 95171f06-d8fc-4ffa-b168-e277748022fe, 74d0bbf6-d970-4a06-868c-327371e6a801 | −0.184 (−0.254 to −0.113) | +0.043 (−0.025 to +0.111) |
| L1 800-863 | threat pricing off | e07a3371-6b64-4823-9c7f-e0bedec181cb, 7c5fd2a2-bab8-460d-9212-f789b0f85dea | 2729dfb5-b152-4d3a-b5bd-b89e7b9374c2, 13bfb4d3-0987-44d2-acd1-e6dc73252eaf | +0.012 (−0.048 to +0.071) | +0.059 (−0.031 to +0.148) |
| L1 800-863 | counters off | 598fb4ba-3c1a-469c-9668-ecef054cec53, 97c3c83b-db34-4819-96b1-3826fb67ca01 | 60dabae0-77de-4783-8ef0-60c9f81fd7cb, c90421ef-083e-4773-9406-a206105f3f43 | −0.092 (−0.159 to −0.025) | +0.064 (−0.003 to +0.132) |
| L1 800-863 | asks off | 37ca0f2e-c5fe-4c7f-aa8a-453a277bfbf7, 7e86a611-6e58-4e15-b5d2-2c301892d618 | 67853977-498a-480d-a2ad-c545e3847b1f, 4239504d-3edd-4fd7-9a3a-65ec8d554828 | −0.141 (−0.202 to −0.080) | +0.082 (−0.004 to +0.169) |
| L1 800-863 | stubborn (refuses asks) | ff90bfd6-bab6-4ae2-8ee4-e766cdff7e0e, 1d58fc87-a22f-4ab7-8f9f-abdc9c7589f5 | e390230c-9b4e-421d-9b57-eeacf8ef2d76, 1b356578-dee4-4d74-a840-5d039f78c434 | +0.018 (−0.009 to +0.044) | +0.064 (−0.033 to +0.162) |
| L1 864-927 | stubborn (refuses asks) | 37f466ed-4afb-43d7-8637-46246de0cacd, a92fb89a-cbc7-43ed-acfc-b7ff2874183c | 95b0122b-407f-4210-94b8-c1ba0a4e508d, e5648fda-d914-46c8-99dd-c2871af55225 | +0.000 (−0.023 to +0.023) | +0.125 (+0.022 to +0.228) |
| L2 864-927 | stubborn (refuses asks) | cf71fa9c-24c7-4079-89d1-23d0d9170f74, 51cef0e8-e02c-4265-9966-723120f99a70 | f378d100-fe86-49ae-9f21-7bd139bdf821, 875967b0-2786-44f4-abfe-8366aa88cc30 | +0.004 (−0.035 to +0.043) | +0.055 (−0.015 to +0.125) |
Interpretation. Counters and asks still win games under the learned leaf and the whole bargaining package is worth −0.143 wins per game (95% interval −0.180 to −0.106) pooled after the fact over 192 seeds; counters carry most of it (−0.102, −0.136 to −0.069, pooled after the fact), asks about half as much (−0.085, −0.119 to −0.050), and threat pricing and the stubborn seat nothing. The builder-lineup pooled effect of the stubborn arm over 128 seeds, +0.009 (−0.008 to +0.026), met the extension rule, so its pairs on seeds 864-927 were registered in both lineups (37f466ed-4afb-43d7-8637-46246de0cacd and 95b0122b-407f-4210-94b8-c1ba0a4e508d at the builder table, cf71fa9c-24c7-4079-89d1-23d0d9170f74 and f378d100-fe86-49ae-9f21-7bd139bdf821 at the population table) and run; the builder-table pair read +0.000 (−0.023 to +0.023) and the population pair +0.004 (−0.035 to +0.043), for +0.006 (−0.008 to +0.020) over 192 builder-table seeds and the same over all 320: no effect. "Within 0.03 of zero" was read as the interval edge nearest zero lying within 0.03 of it. Bargaining costs 55 to 60 percent more time per decision under both leaves, most of it from counters; asks and threat pricing cost under a tenth. No default changes and the server is unchanged. Report: Bargaining switches under the learned leaf.
Failures and handover. No game failed, stalled, or was interrupted; every cohort completed 256 of 256. The study was started by Claude Fable 5.1, which registered the stages, wrote the analysis, ran the threshold screens, and started two queues; it stopped on a usage limit with three of the five L2 pairs and four of the five L1 0-63 pairs complete. Its first queue was stopped at 19:42Z on 2026-09-11 to split the list into two queues; the cohort it was running (4fd7a980, run 999d8a97) finished on its own and was not rerun. Claude Opus 5 took over, committed the uncommitted records, ran the remaining cohorts two at a time from 04:51Z on 2026-09-12 (a third queue over the same list in reverse, and two more for the extension, sharing the skip rule so no cohort ran twice), registered the extension, archived every run with a verified receipt under records/artifacts/, and wrote the report. Decision times are wall times on a machine shared with other tournaments; only the ratio of an arm to its control within the same games is interpreted.
The arena binary was built from server branch research/bargaining-tables at 94063bb, a trace-only change by Claude Fable 5.1 that records answers to offers and replies to counters under --trace (play unchanged on a 64-game screen). The handover described the server as unchanged, which holds for play but not for the branch; the branch is pushed and not merged into server dev. Every cohort ran after 2026-09-11 in UTC and finished on 2026-09-12; the entry stays in this day's log with the rest of the learned-leaf program.
Attribution: Claude Fable 5.1 (claude-fable-5-1) through Claude Code (registration, analysis, threshold screens, first half of the cohorts); Claude Opus 5 (claude-opus-5) through Claude Code (remaining cohorts, extension, report, filing).
The opening planner under the learned leaf
Study opening/planner-tables (agent opening-tables) tested whether the
draft-aware opening planner, calibrated to the hand-written leaf, still matches
the search's own placement now that the search evaluates with the learned
n-tuple tables, and whether the planner's calibration weights matter under the
tables. Every contrast is a swapped pair on the same seeds (candidate in slot
0 in half A, in slot 1 in half B, effect half the difference of the two
slot-0-minus-slot-1 contrasts, seating term their half-sum), on the tables
baseline seat
v2:{"depth":2,"leaf":{"tables":"/home/keshav/settlers/research/artifacts/ntuple/hex-portfolio-main.bin"}}
with the arm's one switch added. All 26 registered runs completed 256 of 256
games; no incomplete, invalid, or unplayed game.
Unregistered screens of the four weight arms, swapped halves on 16 seeds
(928-943, which no stage uses): specialize 0.5 read −0.062 (−0.250 to
+0.125), scarcity 0.0 read −0.055 (−0.201 to +0.092), coverage 0.4 with
balance 0.5 read −0.023 (−0.144 to +0.097), expansion 0.5 read −0.055
(−0.185 to +0.076). Screens are screens; I took coverage/balance (best point
estimate) and scarcity (tied with expansion on the mean, wider upper interval,
and the clearer calibration story) through the stages and left specialize and
expansion screened.
Arm opening":"search", effect search minus planner. Development L1 (boards
0-63, eta and fast in slots 2-3): experiments 47837719-ebd2-438d-a9eb-a1ad951c1ad1
(run a9813bf7-dc0d-498b-b620-d948c6174b55) and cb1392fe-746d-4396-8f00-9a6366f2f31f
(run 1249d1a2-267b-40dc-bc65-fd2678080eef): effect +0.135 (+0.045 to +0.225),
seating +0.088. Confirmation L1 (800-863): experiments 50480ef5-3fc5-4951-bca7-4b97351b00c7
(run 797cd3dc-06c5-4581-81a2-c385567aecbf) and db2d2f23-e765-41e7-8ef8-7cd52c01654b
(run a4173a36-ead4-4fee-af07-c001ccdb7b88): −0.002 (−0.094 to +0.090), seating
+0.045. Population L2 (800-863, a second tables baseline in slot 2 and eta in
slot 3): experiments cb9b513d-d95c-4627-a939-5d5bd8156c56 (run
795c3709-fcc1-42f5-96fb-fba6dda15dfe) and 6af6311d-3550-4be0-bbae-6261bbe3829b
(run 7cda63dd-b707-49b5-898d-8e54824fcc2b): −0.049 (−0.136 to +0.038), seating
+0.068. The pooled L1 effect over 128 seeds was +0.066 (+0.001 to +0.132),
positive with the interval within 0.03 of zero, so the extension ran on boards
864-927: L1 experiments a7374527-b9fc-44a4-97ac-9bbf7190d9f3 (run
7bcc5d5b-6878-4616-a9c7-584fdd99fb2d) and e160f9eb-37f7-44f1-ae12-1fc43a7f695b
(run 3dab2804-6437-4d06-a74b-f86b79374829), effect +0.051 (−0.034 to +0.136);
L2 experiments c515c2ef-2be1-4afc-abb1-28dc17c12325 (run
2447754d-31d4-41ee-b6be-768911c3e3ec) and 0f2f74fd-3b83-4248-878b-7b7893bd1915
(run da5e566f-702b-40b9-9ee2-3a639ba8ea68), effect +0.051 (−0.030 to +0.131).
Pooled after-the-fact estimates: L1 192 seeds +0.061 (+0.009 to +0.113), L2 128
seeds +0.001 (−0.059 to +0.061). Against builders the registered rule reads
support, but only the development boards 0-63 exclude zero, and on the 128
fresh L1 seeds alone the effect is +0.024 (−0.038 to +0.087), crossing zero;
against a table with a third search the arm does nothing.
Arm coverage 0.4 / balance 0.5, effect arm minus default planner, no decision
cost. Development L1 (0-63): experiments fcb9c657-4603-4985-948c-a6b54932ecee
(run 365eaca0-57c4-4cb9-807e-49e9cc5ec45c) and 53427677-7c40-4575-a068-8f7f9b2b1321
(run f3175601-94fe-41d3-b52b-370cd0b10206): +0.037 (−0.020 to +0.094). Confirmation
L1 (800-863): 7bdd77ec-115a-4a11-a7bb-27bf7499284c (run
e2e08bb9-afee-4948-8d84-9d048a700c43) and 3cf67aec-9997-43a0-b6c8-eace5a55e5ff
(run 3343c9df-ff9b-44d3-aeba-c1530e6109dc): −0.006 (−0.064 to +0.053). Population
L2 (800-863): 75b51af0-4105-41ee-a34e-7aa6dbdf036e (run
b27c4f07-93df-4185-aa19-cd6b5f95f3bf) and 209879bb-2cd8-4492-a304-3ca9bda596a6
(run 2c77bc8b-22da-4490-ad01-45b57a29170f): +0.008 (−0.047 to +0.063). The pooled
L1 effect over 128 seeds (+0.016, −0.025 to +0.056) triggered the extension on
boards 864-927: L1 experiments b872a711-1445-4c38-ab3a-ee7bd004208c (run
92587c1d-13b2-48d6-9485-f17d374c2489) and d755650a-82a6-4810-b836-6749f8122433
(run 2b380fba-16ab-4b57-b621-a487c7629ba2), effect +0.027 (−0.032 to +0.086); L2
experiments 468d59de-8843-41eb-b222-467095753b48 (run
ab8b1c67-d903-421f-9aac-c374c815cb79) and 90fc34d1-acf3-4e8b-8445-162cf874d693
(run 56f6f0f3-f402-4046-b6c9-b4372e03f7cc), effect +0.000 (−0.053 to +0.053).
Pooled: L1 192 seeds +0.020 (−0.014 to +0.053), L2 128 seeds +0.004 (−0.034 to
+0.042). Inconclusive at every stage; the defaults stand.
Arm scarcity 0.0 (markup removed), effect arm minus default planner. Development
L1 (0-63): experiments 148e7c43-a18f-49b0-9848-698822c387cf (run
c2866d05-4ca9-4545-9a10-ecdd1182a042) and 503e02aa-5f09-4ed8-abe0-aad32821828f
(run faed3f89-b5ce-4929-9c83-ad06ec974030): −0.006 (−0.088 to +0.076), seating
+0.146. Confirmation L1 (800-863): e7b9a423-9ca7-4c27-9889-916d90729354 (run
d97d2a7b-3681-47ec-b516-ca968d1ae169) and 9f1bc806-5571-4d6b-869b-b53174415c1b
(run 3de8e8fa-2193-4239-8d8d-52bd3d0a99fe): −0.004 (−0.088 to +0.080), seating
+0.117. Population L2 (800-863): 5841c278-d998-4cfe-a5fe-133313de3bd4 (run
c26c5f85-a645-4da3-b644-8b17d598733d) and 97b2e851-c55b-4e6e-8546-677032933a3c
(run 9a09faae-b7ed-41cf-94fa-11cd3784a1a0): −0.012 (−0.073 to +0.049). Pooled L1
over 128 seeds −0.005 (−0.063 to +0.053), not positive, so no extension. A clean
null at every stage: the hand-leaf-calibrated scarcity markup neither helps nor
hurts under the tables, and the default stands.
Interpretation. The sign of the planner-versus-search comparison flipped with the leaf because only one side changed: the planner is the same hand-leaf calibration, while search mode now ranks the shortlist with learned site values. The tables' site values are the improvement, and they reach placement only through the search, at the cost of making each of the three or four setup decisions a full search (about 40 ms for the planner against about 2 s per setup decision in the traced games under load; mean decision time 25 to 33 percent above the control, nodes per decision 9 to 19 percent above). The search seat also loses about 0.2 to 0.3 more reachable sites per game and buys about 0.7 more development cards, which is the planner's expansion and draft terms holding ground that the search spends instead. The gain lives on the development boards and disappears against a table of searches, so the registered browser rule fails on both counts (cost outside 25 percent, and a population effect of zero) and the browser keeps the planner, whose hand-leaf comparison was a match anyway. Traced placements on four boards are in the report. Server default: unchanged; a protocol cohort of the search-ranked opening against ntuple-leaf is the next step if it is to change.
Failures and notes: none. No failed, incomplete, or interrupted run. The
screens reused no stage seeds (928-943 lies beyond the extension range
864-927). Runs were executed with --threads 6 (the just engine-run recipe
does not forward the flag, so runs were launched through
python3 -m harness.engine run EXPERIMENT --threads 6, the same code path).
All 26 runs are archived under artifacts/ with receipts in records/artifacts/.
The report carries the cohort tables,
the hand-leaf comparison, and the browser section.
Attribution: GLM-5.3 (baseten/zai-org/GLM-5.3) through OpenCode.
Search settings under the learned tables
Study search/settings-tables. The 2026-09-09 ablation program measured the
tunable search's settings under the hand-written leaf in one seating, which
the seating diagnosis later showed to be inflated by the turn-order term;
none had been measured under the learned n-tuple tables. Nine arms, each the
depth-2 tables baseline
(v2:{"depth":2,"leaf":{"tables":"artifacts/ntuple/hex-portfolio-main.bin"}})
plus one switch, were measured as swapped pairs against the unchanged
baseline: scenarios:4 and scenarios:16 (dice scenarios, default 8),
samples:1 and samples:8 (sampled hidden worlds, default 4),
inner_scenarios:2 (deeper-level scenarios, default 4), leaf_opponents:true
(opponents in the lookahead choose by the tables leaf),
counts_only:true (public counts instead of event-based hand knowledge),
propose:false (no trade proposals), and reciprocity:true (willingness
scaled by each partner's observed acceptance rate). Each half is its own
registered experiment: 256 deterministic games (64 seeds, four rotations),
half A candidate in slot 0, half B candidate in slot 1, the effect the per-seed
half-difference of the two contrasts and the seating term their half-sum
(analysis/settings_tables.py). Development played the ablation boards
(seeds 0-63) with eta and fast in slots 2 and 3; confirmation played fresh
seeds 800-863 in the same lineup; population played seeds 800-863 with the
tables baseline and eta behind the two searches; the two arms whose pooled
128-seed effect was positive with an interval reaching within 0.03 of zero
(samples8, leaf_opponents) extended to seeds 864-927 in both lineups. The
registered decision rule: all games complete, and the seating-corrected
effect's 95 percent seed interval excludes zero in the hypothesized direction
(support), the other way (refutation), or neither (inconclusive). All 54
cohorts completed 256 of 256 games with no invalid moves, stalls, or search
errors.
Registrations, half A and half B: scenarios4
d6cbff3d-7e92-4f47-bbc9-97da3c2532a9 / 33654a28-86e9-4026-93e2-111b34913669,
scenarios16 767a4f08-e4d9-48da-83bb-d2e952feaf69 /
f650a242-2e6a-4075-a80d-da4ee753441a, samples1
f959a49e-5745-4623-9bb9-e0a43f9ea964 / e4f5ae29-919c-4bd4-83ae-98812ea00bc3,
samples8 97bd74e0-164b-4d79-bcab-390edc31c129 /
adf4e1c3-f93f-4f7e-9631-bd595a2beb2a, inner_scenarios2
e071b629-8043-4eff-8fb0-ac694cac0f78 / f364cf12-1945-4653-9fe3-8bfa92fe5f38,
leaf_opponents a20b6abd-d8b6-4f66-b634-5df40495953e /
face5b0d-d070-4e83-91df-d6fb6ae5ee4b, counts_only
ef501bc5-7196-4ad6-a939-09f00414d771 / b3795b5e-aa62-40be-ad6c-53d075512ecb,
propose_false e53c45bd-a7ee-4ef8-8772-3780c1cfef31 /
1172dcee-95da-44af-a86c-9f5ee0d12fbf, reciprocity
95aac00b-f396-4a5c-b023-db360692802b / 495e1a17-5a74-438e-b660-06219ca881c7
(development); scenarios4 dcfd9ca5-170f-43a7-a1f0-36117e7c7990 /
ee1751fb-ec20-4df1-b402-6d97a405bd0d, scenarios16
ed82c2ee-5197-4e70-a3e6-ae4a20d64a33 / e5b13479-5578-4810-bd6f-da6b3fb779fb,
samples1 142fdc9a-e4be-4418-9008-5b942dc78daf /
bfb9bed6-58cd-48c5-aa91-2b029b5c0f9a, samples8
449ea466-728b-45e0-a177-9c220e3e8415 / 13a7cf69-526c-4f94-b434-0ee56051a5f8,
inner_scenarios2 25ed5f85-6ab3-4949-80d0-b3bce5237971 /
e2445b6e-c49c-4396-85f6-9052f8921028, leaf_opponents
a5e38bc5-ff5d-4365-bdee-f89379bf64b6 / b3c000ac-fec6-48ba-87e0-1cec1c89ba34,
counts_only 1667548f-63ed-4d58-bff0-a1477e978867 /
dfbd6b4c-1438-44e9-b69b-313d048f6fcf, propose_false
87550a5a-5149-418b-a056-aa6d0a8372a9 / a567b9c2-92a1-49b5-b7ef-c623fd51a197,
reciprocity ca442984-d942-4e50-b036-e76b85372074 /
de3228ec-9440-4ac1-ac6d-81c2d99976e5 (confirmation); leaf_opponents
9aef447a-d703-454a-8970-92d463017015 / bddfe32b-940f-4ea0-833f-2c0db3274a3c,
counts_only d4778a73-5587-441c-8cbf-82a53f87d096 /
4efbf0e1-bea3-407f-8f8a-078f649805eb, propose_false
3c661aad-8bcf-48cd-988b-0cbf3c50209d / 001e2f3b-f70e-41b0-b061-247eeb855557,
reciprocity 4e7a760b-0fa1-4e5e-8269-aee7f6030105 /
5b23ab6d-1cbc-4e77-82e2-5c281248e7d0, samples8
82ff6f24-174a-4d2b-babf-fa1a95619589 / 75b81db1-c6e6-483b-aafc-8ad707ecc0f4
(population); samples8 extension 12b83328-8fd5-402f-aa7e-08c8dc8b38fd /
fbd6fe9d-3771-4e25-bc1f-bf2fb38625bd (L1) and d5cb3195-5a58-460a-bee7-ee62fe907d63
/ b16d5306-09ee-4af4-a7fe-e34494197bf0 (L2), leaf_opponents extension
e222c91f-2724-4730-8f81-9a1198ca4e1f / d46a4f48-401e-49fb-8a93-0dc5b4adeca1
(L1) and 36817410-f3b0-4dd3-a61f-70bc9676bc06 /
4d02ea83-f6e1-4e4b-afd1-24ab954ffcb6 (L2), seeds 864-927. The 54 run UUIDs
are in the report cohort table and its
AgentContext.
Seating-corrected effects, candidate minus control (pooled rows are after-the-fact poolings over the named seeds):
| Arm | L1 effect (95% interval) | L2 effect | Decision time vs control | Verdict by the registered rule |
|---|---|---|---|---|
| scenarios 4 | −0.392 (−0.444 to −0.339), 128 seeds | not run | 68% | supported: the change hurts |
| scenarios 16 | −0.026 (−0.072 to +0.019), 128 | not run | 272% | inconclusive; mean negative |
| samples 1 | −0.109 (−0.150 to −0.069), 128 | not run | 34% | supported: the change hurts |
| samples 8 | +0.045 (+0.009 to +0.081), 192 | −0.007 (−0.045 to +0.031), 128 | 178% | each pair inconclusive; pooled L1 excludes zero, pooled L2 does not |
| inner scenarios 2 | inert at depth 2 | not run | 100% | no test: the switch cannot bind |
| leaf opponents | +0.031 (−0.006 to +0.068), 192 | +0.033 (−0.009 to +0.075), 128 | 180% | inconclusive at both lineups |
| counts only | −0.143 (−0.188 to −0.097), 128 | −0.053 (−0.107 to +0.002), 64 | 120% | supported: the change hurts |
| no proposals | −0.172 (−0.211 to −0.133), 128 | −0.143 (−0.197 to −0.089), 64 | 92% | supported: the change hurts |
| reciprocity | −0.073 (−0.115 to −0.031), 128 | −0.082 (−0.141 to −0.023), 64 | 106% | refuted: the change hurts |
Reading: under the learned tables the search's information inputs are worth
more than under the hand-written leaf, not less. Against the same boards where
the hand-leaf ablations read −0.066 for counts-only beliefs (confirmed) and
−0.027 for proposals (crossing zero), the tables read −0.143 and −0.172.
Four scenarios cost −0.392, about what two scenarios cost the hand-written
leaf in one seating (−0.410), and the four-scenario seat's diagnostics show
how: it ends turns over the seven-card limit and discards 13.9 cards per game
against the control's 5.5, buying 2.75 development cards against 4.25. The
reciprocity scaling is the one refuted arm: against fixed-rule partners it
makes the seat stop asking (9.8 offers per game against the control's 14.7,
half the counters, more declines) and loses about 0.07 wins per game. The one
strength gain in the program, eight sampled worlds at +0.045 against builders,
is real pooled over 192 seeds but each of its five pairs is inconclusive, the
gain vanishes at the population table, and it costs 1.8 times the decision
time, so it fails the browser rule on cost. The inner_scenarios:2 arm
cannot change a decision at depth 2 (the leaf is evaluated before any deeper
opponents' round exists): both halves of both stages replayed byte-identical
games, which doubles as a null pair measuring the seating term on fresh
boards (+0.078, −0.028 to +0.184). The switch first binds at depth 3, the
browser's depth, and is the natural next measurement there.
No switch is worth the browser by the registered rule (pooled effect at
least +0.03, interval excluding zero, decision time within 25 percent of the
control). The defaults stand on both leaves. The one candidate trade the
numbers expose is samples:1 for depth: a third of the decision time for
−0.109 wins per game under the tables, worth measuring in WASM only if the
one-second browser budget cannot finish depth 3.
Failures: none in the games; all 54 cohorts completed. My own scheduling
caused five interrupted run directories before the program proper:
41648acb-cfba-40ea-97e2-86d0053656cc (16 of 256 games, killed by a shell
timeout), 08f93997-1214-4693-8caa-6f16c28c7a52 and
e39e156d-bdc8-413a-bcee-f20945f71836 (duplicate scenarios4 halves, killed),
and 958a74d4-7ceb-4de5-b75b-041600e07f87 and
606bd7b4-cfad-49bc-8d59-60804bc63501 (duplicate scenarios16 halves, invalid,
3 games each; their records are filed). No game from any interrupted run
entered any contrast. Wall times are meaningless under the day's load (load
average 80 to 160 on 32 cores from ten concurrent agents); the tournaments ran
at --threads 6 and the deterministic cohorts are load-independent. The
confirmation halves ran concurrently with development halves on disjoint
seeds for wall-time reasons; every stage's games completed before any
interpretation.
Blending the learned tables with the hand-written leaf, and the endgame switches under the blend
Study patterns/leaf-blend. The learned tables are the leaf of the protocol
baseline, and the search can also add the hand-written terms on top of them:
leaf.hand scales the added terms (0 by default) and leaf.scale sets how
many hand-written points one win is worth (1000 by default, which the trade
margin, the threat premium, and the deepen gap all compare against). Neither
knob had been measured. The question was whether each knob, and the two endgame
leaf switches from containment/endgame-race (which are inert under the tables
alone because they change hand-leaf terms), helps, hurts, or does nothing when
the search evaluates with the tables.
Every contrast is a swapped pair on the same seeds: half A seats the candidate
in slot 0, half B seats it in slot 1, the effect is the per-seed half-difference
of the two slot-0-minus-slot-1 contrasts and the seating term their half-sum
(analysis/seating_pair.py, analysis/leaf_blend.py). Stages: development on
seeds 0 to 63 with the builders lineup (slots 2 and 3 eta and fast),
confirmation on seeds 800 to 863 (never used by an earlier experiment),
population on seeds 800 to 863 with the tables baseline in slot 2 and eta in
slot 3, and an extension on seeds 864 to 927 in both lineups when the pooled
L1 effect stayed positive with its interval within 0.03 of zero. Every cohort
is 256 deterministic games at six threads, every cohort that ran completed all
256, and the registered rule reads the seating-corrected effect's 95 percent
interval excluding zero as support or refutation and crossing zero as
inconclusive. An arm refuted at a stage stops; pooled rows across stages are
named after-the-fact pooling.
The orchestrator had started an unregistered screen of hand 0.25 and 1.0 that my first run interrupted; its completed files measured hand 0.25 at +0.074 (+0.011 to +0.138) and hand 1.0 at -0.207 (-0.284 to -0.130). When that screen arrived I had already registered the endgame arms on the hand 1.0 blend; the unstarted hand 1.0 registrations were withdrawn before running (below) and the arms were re-registered on the hand 0.25 blend in both seats, the blend that may become the default. My registered hand 0.25 stage 1 pair is the same games as the screen by construction, and it confirms the screen's arithmetic.
The blend arms
Seating-corrected effects, wins per game:
| Arm | Stage 1 (0-63) | Stage 2 (800-863) | Stage 3 (L2, 800-863) | Extension (864-927) | Pooled L1 | Pooled L2 |
|---|---|---|---|---|---|---|
| hand 0.25 | +0.074 (+0.011 to +0.138) | +0.035 (-0.034 to +0.105) | +0.049 (-0.008 to +0.105) | L1 +0.088 (+0.006 to +0.170), L2 +0.080 (+0.015 to +0.146) | +0.066 (+0.024 to +0.107) | +0.064 (+0.021 to +0.108) |
| hand 0.5 | +0.045 (-0.028 to +0.118) | +0.051 (-0.018 to +0.120) | −0.027 (−0.094 to +0.040) | L1 -0.047 (-0.113 to +0.019), L2 −0.010 (−0.072 to +0.053) | +0.016 (-0.024 to +0.057) | −0.019 (−0.064 to +0.027) |
| hand 1.0 | half A only -0.117 (-0.233 to -0.002); half B withdrawn, screen -0.207 (-0.284 to -0.130) | withdrawn | withdrawn | — | — | — |
The quarter-strength blend is supported: it is the only arm whose pooled intervals exclude zero, in both lineups, and its extension seeds came back stronger than its confirmation. The dose runs the wrong way from there: half strength is inside the noise pooled over 192 L1 seeds, and full strength lost from the seat that wins the seating term. The extension criterion triggered for hand 0.25 (pooled L1 +0.055, lower edge +0.008), for hand 0.5 (+0.048, lower edge -0.002), and the extension seeds cut hand 0.5 to +0.016 pooled.
What the hand terms add is visible in the stage 1 games (per seat per game over both halves): the tables seat built 1.23 cities, bought 4.03 development cards, settled 1.81, and discarded 5.20 cards; the hand 0.25 blend built 1.50 cities, bought 3.95 cards, settled 2.05, discarded 5.92, and finished at 7.95 points against the control's 7.47. The half blend traded cards for cities (1.62 cities, 3.74 cards, 7.62 discards) and the full blend abandoned the cards the tables win with (1.86 cities, 3.34 cards, 9.02 discards). The blend is also the one arm with a decision cost: within each cohort the hand 0.25 seat spent about 40 percent more per decision than its tables control (929 ms against 667 ms pooled over stage 1), because both evaluators run at every leaf.
The scale arms
| Arm | Stage 1 | Stage 2 | Stage 3 (L2) | Extension (864-927) | Pooled |
|---|---|---|---|---|---|
| scale 500 | -0.059 (-0.121 to +0.004) | -0.135 (-0.191 to -0.078), refuted | withdrawn | — | -0.097 (-0.139 to -0.054) over 128 seeds |
| scale 2000 | +0.051 (-0.009 to +0.111) | -0.010 (-0.069 to +0.050) | +0.035 (-0.024 to +0.095) | L1 +0.047 (-0.026 to +0.120), L2 +0.033 (-0.034 to +0.101) | +0.029 (-0.008 to +0.066) over 192 L1 seeds; +0.034 (-0.011 to +0.079) over 128 L2 seeds |
Halving the scale doubles every threshold in win probability and the arm shows it: the halved seat completed 2.32 player trades per game against its control's 3.70 in stage 1 and lost everywhere, so stage 2's refutation ended the arm. Doubling the scale makes the thresholds cheaper, the doubled seat traded more (5.13 against 4.06) and bought more cards (4.07 against 3.88), and six pairs never separated the effect from zero; it costs no decision time. The default scale of 1000 stands.
The endgame switches under the blend
Measured on the hand 0.25 blend in both seats, the blend alone as the control:
| Arm | Stage 1 | Stage 2 | Stage 3 (L2) | Extension (864-927) | Pooled L1 | Under the hand leaf (seeds 64-127) |
|---|---|---|---|---|---|---|
| race | -0.039 (-0.076 to -0.002) | -0.035 (-0.080 to +0.010) | +0.000 (-0.036 to +0.036) | not triggered, pooled L1 negative | -0.037 (-0.066 to -0.008) | +0.018 (-0.018 to +0.053) |
| hidden points | +0.025 (-0.010 to +0.060) | -0.010 (-0.043 to +0.024) | -0.025 (-0.067 to +0.016) | L1 -0.006 (-0.042 to +0.031), L2 +0.008 (-0.029 to +0.044) | +0.003 (-0.017 to +0.023) | +0.006 (-0.030 to +0.041) |
The race leaf, which under the hand-written leaf read +0.018 with an interval crossing zero, is a small loss under the blend: its stage 1 interval excludes zero on the wrong side and so does the pooled L1 estimate, so the registered rule reads refutation and no extension was run. Hidden points is the same at smaller size: its pooled L1 after two stages (+0.008, -0.016 to +0.032) met the extension criterion by the letter, and the extension seeds brought the pooled 192-seed L1 estimate to +0.003 (-0.017 to +0.023) with the population lineup slightly negative (-0.009, -0.037 to +0.019), so five pairs in both lineups never separated it from zero. The hidden-points pair that had already started on the full hand 1.0 blend was left to finish and read -0.029 (-0.075 to +0.016), a null on the full blend; no further cohorts on that blend were registered. Both switches stay off.
Withdrawals and failures
Withdrawn before running, with the orchestrator update's reason (the full
blend measured much weaker than the tables alone, so a switch on top of it
says little about a configuration anyone would use): hand 1.0 half B
b6f5f82e-9a8a-4fd5-b9f5-bc7357fcaa9c and the race halves on the full blend
47a866d0-b46b-49d4-bf92-fd0b520bc19f and
348e041a-9c73-43d8-93dc-80ce0ae5ec10; no further full-blend cohorts were
registered. Withdrawn after stage 2 refuted the arm: the scale 500
population halves 7bd62467-9637-490f-a3cf-d9fe1a4a1bca and
436be4ef-b624-4d11-b3cc-6de6851facbc. None of these has a run.
Failures, all mine: my first stage 1 run
6d41a494-392a-4df4-b18f-f8cfe7a2902e was killed 11 games in by its own
controlling shell's command timeout; it is filed as interrupted and the half
was rerun from scratch as 0a0e710b-9012-41fe-a947-393274a76c94. A race
between two of my queue drivers started a duplicate of the completed scale 2000
half (71692536-8d3e-4ab0-90c9-3262835d2000, 69 games), which I stopped and
filed as invalid. While stopping that duplicate I killed the wrong process, the
legitimate hidden-points half A (82466126-f940-4a04-a239-7d918c9a3efc, 80
games, filed invalid), which was then rerun from scratch as
f71f0519-603f-4735-8b7c-216a027b4bfa; the operator error is mine and both
records stand. A second race between the same two queue drivers duplicated the
last hidden-points extension half: the legitimate run
8d3434f3-4ff9-4f8e-b446-157887f3aa2b completed all 256 games, the duplicate
26c0b46f-e3fd-4100-aea3-32700c603aa9 (111 games) was stopped and filed
invalid, and the analysis uses the completed run. An interim reading that paired the race stage 1 half A with the
wrong half B (the scale 2000 run 75a28eed-d4f4-480a-95d7-8cec86ebdfec) read
+0.016 and was corrected before anything was filed; the registered race half B
is 62a9c08a-525d-4647-8039-74762ece8915 and the stage 1 effect is the -0.039
in the table above. No game was censored, no search errors or stalls appeared
in any run, and the machine ran at a load of 100 to 160 from other agents'
cohorts throughout, so wall-clock decision times are comparable only within a
cohort.
Every cohort
All cohorts 256 of 256 completed; "contrast" is each half's registered slot-0-minus-slot-1 paired contrast, and the pair effect is its half-difference across halves. The report carries the same table with the diagnostics.
| hand 0.25 | 1 (0-63, L1) | A | 138 / 87 | +0.199 (+0.107 to +0.291) | 337fa8bf-6dac-4798-ac5d-ef898b9511fc | 0a0e710b-9012-41fe-a947-393274a76c94 |
| hand 0.25 | 1 (0-63, L1) | B | 109 / 122 | +0.051 (-0.051 to +0.153) (control minus candidate) | 90b1cbe0-525c-440b-988e-f2ae7664e280 | 6df6bf94-1853-46dc-b169-c8a2e5d7e7ba |
| hand 0.25 | 2 (800-863, L1) | A | 120 / 102 | +0.070 (-0.032 to +0.173) | 643e51c4-d1e7-4545-8b2b-3f4cb64fe22a | 02c6ea23-1d12-45c2-9b4c-f3b4d3c0ef61 |
| hand 0.25 | 2 (800-863, L1) | B | 116 / 116 | +0.000 (-0.096 to +0.096) (control minus candidate) | 805db13b-33b8-4b74-aa92-69398e726fa9 | 6c737da9-c10a-46e5-9c53-b91c882e599a |
| hand 0.25 | 3 (800-863, L2) | A | 92 / 74 | +0.070 (-0.012 to +0.153) | f97d1156-4294-4ad2-8331-234e206d72a0 | d016da61-ed26-4072-b3ff-98c8afb95705 |
| hand 0.25 | 3 (800-863, L2) | B | 83 / 76 | -0.027 (-0.115 to +0.061) (control minus candidate) | 4924410e-b8e9-4752-9e0a-198bb826daaa | 8fcd82d8-09a4-4f85-968b-7f20120a83dc |
| hand 0.25 | ext L1 (864-927) | A | 141 / 98 | +0.168 (+0.047 to +0.289) | c0c8534f-9256-4576-a468-1959395cedfe | 532b7ed6-b77c-4ab8-ac9f-37537a9a90f7 |
| hand 0.25 | ext L1 (864-927) | B | 120 / 118 | -0.008 (-0.119 to +0.103) (control minus candidate) | fb7327b6-8b65-44f0-bbb0-6ed513c1ab20 | d828c9b6-e8e6-45bc-8ae8-08a9f7b80b26 |
| hand 0.25 | ext L2 (864-927) | A | 107 / 75 | +0.125 (+0.031 to +0.219) | 9449ea85-5571-4a39-8ec3-f78a74c5c3c5 | 7697562f-eff1-4032-a32a-535ce8c323b5 |
| hand 0.25 | ext L2 (864-927) | B | 84 / 75 | -0.035 (-0.124 to +0.054) (control minus candidate) | 7287289b-adfa-4a85-8644-9570d8c6c10b | 9bae1e81-3ef3-41ad-aa6b-55876d2c2167 |
| hand 0.5 | 1 (0-63, L1) | A | 133 / 95 | +0.148 (+0.046 to +0.251) | 5f6a5f32-2629-4f89-8fc6-e3e8088e1e36 | 4a6bfee0-c5ca-4689-8c8b-0cac8df16a0d |
| hand 0.5 | 1 (0-63, L1) | B | 104 / 119 | +0.059 (-0.045 to +0.163) (control minus candidate) | 9023a299-3644-4748-b349-4d6ff03b8ac5 | 39a0cdba-b3ab-4ed1-813d-537b3a60b103 |
| hand 0.5 | 2 (800-863, L1) | A | 128 / 103 | +0.098 (-0.010 to +0.205) | f453131d-e920-4739-8f1c-fe0a2d57bdd7 | 81267946-c11f-4a2b-9c9a-bd31c7b102c0 |
| hand 0.5 | 2 (800-863, L1) | B | 116 / 115 | -0.004 (-0.115 to +0.107) (control minus candidate) | 9b7d17c5-f145-4467-a452-98fc6d1c913e | 281c1452-fd54-4b8f-85fb-f1192b6fa15f |
| hand 0.5 | 3 (800-863, L2) | A | 87 / 83 | +0.016 (-0.079 to +0.110) | ff2f050d-e848-4301-83ce-202d1abd1522 | 9bc75aea-a683-4d77-a99b-286a16083352 |
| hand 0.5 | 3 (800-863, L2) | B | 77 / 95 | +0.070 (-0.029 to +0.169) (control minus candidate) | 82f2db3f-6d33-49eb-b8d9-6ba914b23217 | 807ae9e0-580f-4630-b4f6-d1c566eea0b7 |
| hand 0.5 | ext L1 (864-927) | A | 120 / 114 | +0.023 (-0.084 to +0.131) | 245f9d8a-5ebd-4cc3-9cb6-2f3a7e99b6ce | 86c15927-05fb-4b44-bdc2-9a631f070f0d |
| hand 0.5 | ext L1 (864-927) | B | 105 / 135 | +0.117 (+0.002 to +0.233) (control minus candidate) | a39dce2b-1918-4f22-b1c1-9584946b9e2f | 822ec329-678c-4dfd-9f2c-d347f5216438 |
| hand 0.5 | ext L2 (864-927) | A | 86 / 80 | +0.023 (-0.068 to +0.115) | b4d35e5e-fbc9-4937-b236-b53f001d00f6 | b4e9e09c-4c38-4480-9cf6-23516107d05f |
| hand 0.5 | ext L2 (864-927) | B | 79 / 90 | +0.043 (-0.051 to +0.137) (control minus candidate) | 905ad279-73cf-4145-a42f-b0ef6561192e | 32aa4be1-e50c-44e2-b7d2-8731f30257b4 |
| hand 1.0 | 1 (0-63, L1), half A only | A | 93 / 123 | -0.117 (-0.233 to -0.002) | f2f21530-bf8d-400d-bfec-8614e6e0a607 | 0d12835e-5262-4daf-9f2f-6a9b7288f2d6 |
| scale 500 | 1 (0-63, L1) | A | 117 / 108 | +0.035 (-0.046 to +0.116) | af67389d-785d-4bf0-894f-436836d8c2db | a1830777-dcba-4e54-b394-833fc04adc0e |
| scale 500 | 1 (0-63, L1) | B | 91 / 130 | +0.152 (+0.052 to +0.253) (control minus candidate) | fe58e64c-b9bb-493b-a4a3-411c5aff3c9f | 5d969f99-0067-4244-bb11-b88a3805bf63 |
| scale 500 | 2 (800-863, L1) | A | 107 / 117 | -0.039 (-0.143 to +0.065) | 1a694630-8483-4512-849b-cfc7ca54bae1 | e0efc71e-f9d0-4d77-a57e-988bb4607654 |
| scale 500 | 2 (800-863, L1) | B | 87 / 146 | +0.230 (+0.147 to +0.314) (control minus candidate) | 07a0544f-008e-4dae-a3c9-e6c00985e6f0 | b8662419-bf13-4333-b02f-bee9037ed7cb |
| scale 2000 | 1 (0-63, L1) | A | 141 / 94 | +0.184 (+0.089 to +0.278) | d5ed6196-0d94-4513-b8c4-6e8c83e39967 | d45f668c-558f-435e-9957-38e33e7ac864 |
| scale 2000 | 1 (0-63, L1) | B | 101 / 122 | +0.082 (-0.016 to +0.180) (control minus candidate) | f10eb77e-ebb8-4711-90d8-a28b5e9ead0b | 75a28eed-d4f4-480a-95d7-8cec86ebdfec |
| scale 2000 | 2 (800-863, L1) | A | 118 / 108 | +0.039 (-0.069 to +0.147) | ad20b42d-9937-4515-acb1-7669b0f20aa8 | f9eb5200-ee12-4d9e-bcc3-fde9a73d24d4 |
| scale 2000 | 2 (800-863, L1) | B | 111 / 126 | +0.059 (-0.056 to +0.173) (control minus candidate) | 91718fce-02e4-4248-a9e1-3e43bd76c118 | 1e9155d6-7a37-4f4a-92f2-d911b4cdaed0 |
| scale 2000 | 3 (800-863, L2) | A | 87 / 85 | +0.008 (-0.089 to +0.104) | a1c94c34-3de8-4b37-a06a-792d93d66a5c | 7b35abeb-7384-4b24-b5d4-b7ad8da5bc13 |
| scale 2000 | 3 (800-863, L2) | B | 91 / 75 | -0.062 (-0.148 to +0.023) (control minus candidate) | 6dd18a29-bf0b-46e2-8ca4-bc815e07480d | bbc95080-0a94-4b8c-aad9-a298f2531349 |
| scale 2000 | ext L1 (864-927) | A | 135 / 100 | +0.137 (+0.029 to +0.244) | 9d6eb9ca-7db0-4154-b64e-e15af957cac3 | 00a7596e-cbad-4576-8be7-0ea9849655d3 |
| scale 2000 | ext L1 (864-927) | B | 110 / 121 | +0.043 (-0.057 to +0.143) (control minus candidate) | a2e97981-b6a7-4d3b-8a3b-ac416a6bfbac | 691cd581-79b3-46a8-89ba-4682c878cc3d |
| scale 2000 | ext L2 (864-927) | A | 100 / 76 | +0.094 (+0.001 to +0.187) | 5e1b1d2c-8839-4bfb-8d65-0c3295df027a | bf588ca4-2392-4311-9783-9ecf88062a8b |
| scale 2000 | ext L2 (864-927) | B | 83 / 90 | +0.027 (-0.072 to +0.126) (control minus candidate) | 4e2462ab-e524-439e-8242-c385d511bc0f | b04b06d7-eb29-4be3-b759-bee7e517fb9d |
| race | 1 (0-63, L1) | A | 129 / 100 | +0.113 (+0.024 to +0.203) | 2539e502-82fd-4435-8037-36576576149e | a2305e39-c6ae-47cc-a48b-11a98a6a889f |
| race | 1 (0-63, L1) | B | 92 / 141 | +0.191 (+0.099 to +0.284) (control minus candidate) | afbb74be-1797-488e-bf6d-f507a2f7d211 | 62a9c08a-525d-4647-8039-74762ece8915 |
| race | 2 (800-863, L1) | A | 123 / 104 | +0.074 (-0.037 to +0.186) | 2d7728ec-73da-4373-9bab-173c7d0fd233 | 89995f9e-f3f9-476a-8d60-cea1c872882c |
| race | 2 (800-863, L1) | B | 95 / 132 | +0.145 (+0.035 to +0.254) (control minus candidate) | 2ebd63d7-5030-44a7-aa22-e2c5b7eecf75 | a6160ac7-4b29-45fb-bede-7c7581ee49c3 |
| race | 3 (800-863, L2) | A | 84 / 83 | +0.004 (-0.086 to +0.094) | 583bb9b9-93eb-46f0-b881-3c04a8a09a43 | a84adf0d-5d3e-4508-bae6-4895bb988a5c |
| race | 3 (800-863, L2) | B | 81 / 82 | +0.004 (-0.075 to +0.083) (control minus candidate) | 062e4f27-86af-4f43-a785-403963a72faa | cfa68fe3-5a0a-4b8c-a272-b18eabcf8d7d |
| hidden points | 1 (0-63, L1) | A | 137 / 97 | +0.156 (+0.064 to +0.249) | d7a3e2a6-12d7-49a3-bdea-73cb384d849f | f71f0519-603f-4735-8b7c-216a027b4bfa |
| hidden points | 1 (0-63, L1) | B | 102 / 129 | +0.105 (+0.012 to +0.199) (control minus candidate) | 0cee9b32-0a0e-45e9-9417-00816fed3055 | ffb5282f-aca3-4b7d-b6e2-0043cbb3c8a9 |
| hidden points | 2 (800-863, L1) | A | 125 / 104 | +0.082 (-0.025 to +0.189) | c1fa5380-eb76-4b2e-b0d5-a5bbcc1191d6 | 21e1875d-8d52-4b46-a236-bc6b0f1c9269 |
| hidden points | 2 (800-863, L1) | B | 102 / 128 | +0.102 (-0.009 to +0.212) (control minus candidate) | fc9a2726-8e79-4922-9454-7f0adf034d56 | ebca2e51-db2d-4d95-bdc0-0f90abb85e03 |
| hidden points | 3 (800-863, L2) | A | 83 / 84 | -0.004 (-0.092 to +0.084) | 707228f9-bf2c-480c-97bf-85e7915acbd6 | b7620d3e-e3c8-4f76-bd09-9cf142d9664f |
| hidden points | 3 (800-863, L2) | B | 74 / 86 | +0.047 (-0.044 to +0.138) (control minus candidate) | dcb44409-a705-4ab1-81b4-1d2a42b77111 | 14d5ecc2-f876-4b89-bfc7-86afabbe2c5b |
| hidden points | ext L1 (864-927) | A | 130 / 107 | +0.090 (-0.011 to +0.191) | cb65e133-a18f-4d33-b4ea-afb2e2112cfe | 48063a4d-6412-4cbd-9241-bf8be44de2cd |
| hidden points | ext L1 (864-927) | B | 103 / 129 | +0.102 (-0.003 to +0.206) (control minus candidate) | 4de83cf0-edca-45c8-8ee4-ae2025495157 | c4037bf3-c3f0-4d66-9c1d-b6eacb8eee14 |
| hidden points | ext L2 (864-927) | A | 91 / 82 | +0.035 (-0.046 to +0.117) | e612fc8c-038c-4115-a7fc-ae0b625fa2e3 | eee597b6-f2e5-4d72-898d-014f7b7c5567 |
| hidden points | ext L2 (864-927) | B | 85 / 90 | +0.020 (-0.073 to +0.112) (control minus candidate) | 59099138-66bf-4389-b184-b5eb99e3bcec | 8d3434f3-4ff9-4f8e-b446-157887f3aa2b |
| hidden points | 1 on hand 1.0 (0-63, L1) | A | 95 / 104 | -0.035 (-0.148 to +0.078) | e7b09434-e4a4-409c-9bbc-6eeb56c3f65a | b827db8d-00f4-43ba-95d3-6b726da9ce42 |
| hidden points | 1 on hand 1.0 (0-63, L1) | B | 101 / 107 | +0.023 (-0.101 to +0.148) (control minus candidate) | f1d399f2-c7dd-4235-99d8-e2f997d6b006 | 66738182-65d1-4db7-9163-81008c59d149 |
Interpretation: a quarter of the hand-written terms improves the learned leaf
by about +0.07 wins per game in both lineups and is the one candidate here worth
a protocol cohort against ntuple-leaf; half strength is noise, full strength
is worse than the tables alone, the scale default of 1000 is right (500 refuted,
2000 free but null), and the race and hidden-points leaves do not help under
either leaf, so they stay off in the server and the browser. The browser build
cannot load the tables, so the blend and scale knobs configure only the
server-side policy; for the browser the endgame switches were already measured
at +0.018 and +0.006 under its own leaf and add nothing now.
Attribution: GLM-5.3 (baseten/zai-org/GLM-5.3) through opencode.
Road switches under the learned leaf
Study expansion/roads-tables. The two road switches of
expansion/road-blocking-swapped, weights.opponent_expansion 0.5 and
weights.road_contention_gate 1.0, were re-measured with the learned n-tuple
tables as the search's leaf, the protocol-arena baseline configuration. Both
are leaf terms with a candidate-generation part in the road shortlist, so each
was run twice: under the tables alone, where only the shortlist part acts, and
on top of the blended leaf with "hand":0.25 in both seats, where the leaf
term is live at quarter strength. Every contrast is a registered swapped pair
on the same seeds, half A with the candidate in slot 0 and half B with the
control in slot 0; the effect is the per-seed half-difference of the two
contrasts and the seating term their half-sum. Stages: development on seeds
0-63 with the builders lineup (ETA and fast in slots 2 and 3, matching the
hand-leaf cohorts), confirmation on seeds 800-863 in the same lineup,
population on seeds 800-863 with the plain tables baseline in slot 2 and ETA
in slot 3, and a gated extension on seeds 864-927 in both lineups. All
tournaments ran at six threads on the shared machine. Hypothesis for each
pair: the switch beats the unchanged control leaf, with the registered rule
that the pair's seating-corrected 95% seed interval excludes zero in the
hypothesized direction (support), excludes zero the other way (refutation), or
neither (inconclusive).
Mid-study the blend moved: an unregistered screen by the leaf-blend agent
measured hand:1.0 at −0.207 wins per game against the tables alone and
hand:0.25 at +0.074, so the full blend is not a configuration anyone would
ship. The ten registered full-blend cohorts that had not started were
withdrawn before running and re-registered at 0.25; the one full-blend cohort
already running (stage 1, blocking weight, half A) finished and is filed as a
single seating. Withdrawn registrations, not run:
abba442e-debf-4472-8343-c393b492b396 (stage 1 blocking half B),
0dd23ca1-a69e-486d-bbba-bb99dc530438 and 07d9c96b-ae49-40cd-be6a-dae5710a5cd1
(stage 1 gate), 0491a4a8-37e7-43f1-a42a-c30af6ff05a5 and
1509b074-b76c-4632-a978-ce0400600509 (stage 2 blocking),
d7160c76-ce55-49b6-a5ca-362e151fa849 and 6df5f111-53f4-4408-ab8f-2d4faea0504d
(stage 2 gate), c2b54a63-d983-4b85-83c1-0216757be515 and
fef0e8b5-de13-42cd-989c-5ecdafe3466a (stage 3 blocking),
350442e0-cfc9-4499-98f8-947ef92f4a7e and 103764a1-fc44-4d9a-99e6-fb85a75ff089
(stage 3 gate).
Every cohort completed 256 of 256 games; no invalid moves, stalls, censoring, or interruptions. Experiment and run UUIDs in full:
| Arm and stage | Half A experiment / run | Half B experiment / run |
|---|---|---|
| blocking, tables, dev 0-63 | 0b788486-7d5b-4d4c-a5c9-3989d6317337 / 4529da10-c5ab-49f8-be24-6bb5e7e317e1 | b8549250-edc9-4f21-a4b7-96fbaafd4782 / 86136b36-66e2-49a8-aa95-e5de0d802e61 |
| blocking, tables, confirm 800-863 | 7159bd47-2352-49de-9dd2-497f8a3247a0 / 4629e513-2dac-459e-a018-e5faef0ed50a | f10f72f3-3e38-4ed2-bb13-58283d529243 / 044327fe-d6f2-4c0e-8ae3-cfa7b0492ab5 |
| blocking, tables, population 800-863 | 82629df7-0f8a-4006-a042-60d0a6ebd16c / 36a7adfd-d1ce-49d3-a25f-ccec8f616c23 | 8e3cc677-7fcf-4a2c-842c-e663cc626632 / 4aa3d3a3-b395-4248-9837-ca3c09eb0ec1 |
| gate, tables, dev 0-63 | 25c0c3ef-acce-4275-aa62-58fd11bba45e / 10dead1d-160a-4c00-8b08-b1f77a5c75b3 | 0b2dc424-752f-422c-94a9-3b91c60838dc / 86184ec9-2a1a-4944-bca0-c6a983829794 |
| gate, tables, confirm 800-863 | d8769e27-605a-4c7c-880a-bf2adaaed80e / 82e6046b-1ba5-44d9-998c-fa4ec398244f | dba26122-eb55-425a-877a-510ccd1fbc35 / 773e53b5-26ce-42e4-8aa5-2565363f1f99 |
| gate, tables, population 800-863 | 5e8dd398-7515-4117-b0e0-bd0ab50e2a57 / c29e9c07-6499-464c-9cb7-4aa7c090c159 | 1af5542d-6c6d-4334-a282-a51d481449a0 / ad9a07b9-939c-49c4-99d2-df93b7b51b47 |
| blocking, blend 0.25, dev 0-63 | 20520824-b14b-48a2-94d2-468b77fa4d3a / f9113c62-9c89-4095-9e81-cbb6c06d5dc0 | 19dcce6e-a687-42fe-9652-4ebd7e21b169 / ba368081-2db1-4998-9e81-902ef7a7bace |
| blocking, blend 0.25, confirm 800-863 | ab1261cd-a9b2-4828-8002-3706e6db088b / c07b2268-3e6b-4055-93f1-bc6405019ca0 | 8866aa31-389c-419c-b031-3040f00bb8d7 / 3fb6583b-bc5c-4b8e-a19e-c62cf6c8f650 |
| blocking, blend 0.25, population 800-863 | 0bf9d6ee-2cf7-4928-b3d1-0a7cc79799df / bd42145a-ca36-457b-954b-46c298027787 | 9c0cf8af-99c2-42ab-ba96-e51b9aa6d3bd / f95c0335-c77f-4d94-8026-b05cb06e855c |
| blocking, blend 0.25, extension builders 864-927 | dd8dfd4f-9922-4621-b175-5c52db0df335 / 90d394ae-fc62-4426-aca0-5f04bd54f2a6 | 85c4582f-dd60-4705-a15b-7e0ec9aa757f / 4e5d2807-1875-431f-b3ea-60a88f1ed2d9 |
| blocking, blend 0.25, extension population 864-927 | ddf036cd-b4b2-49cd-9473-aff82f0a336e / 66a398f5-9b69-442f-84f3-fd1fa219fd46 | 38d6d46d-d777-45fb-87d6-81972cf3f570 / ff3fe1b1-e62e-4271-8c35-4bb44e07764f |
| gate, blend 0.25, dev 0-63 | 849b3f9f-e311-41a9-8462-ca01898eda3d / eaec0233-a70b-4af4-8346-604a003e8f8c | 95a95d6d-de73-400b-bf2c-f999c4c9f04c / 160505ec-d7fb-4c53-b8a0-59f6ecccad22 |
| gate, blend 0.25, confirm 800-863 | 4915a44c-ca93-45cf-86f3-31e11c282d42 / 8d3680d8-d891-41be-a3e1-ca1ec203e7b2 | a8c21c94-a6d6-4b1b-9344-274989d58976 / 79e0863d-47ac-47c4-adc2-2ef8b800d544 |
| gate, blend 0.25, population 800-863 | 52a94b11-6ccc-4e9b-9396-6bb01d581011 / 4425d52b-8a9b-49f9-9c0d-1eecc7c4edb4 | a94f59d0-72bf-4245-af2b-2a3e1c7a7acc / 5b51b4e0-633d-43ac-bf47-59d5ccd532e0 |
| blocking, full blend hand 1.0, dev half A only | 661b57ce-4262-40db-ab34-c2a84d6d5960 / 4af53f81-6e2b-4a10-bdff-26fc68d192c3 | partner abba442e-debf-4472-8343-c393b492b396 withdrawn before running |
Seating-corrected effects per stage, with the seating term beside each:
| Arm | Stage | Effect (95% interval) | Seating term |
|---|---|---|---|
| blocking, tables | dev | −0.008 (−0.019 to +0.003) | +0.098 |
| blocking, tables | confirm | +0.002 (−0.010 to +0.014) | +0.084 |
| blocking, tables | population | +0.002 (−0.007 to +0.011) | −0.041 |
| gate, tables | dev | −0.020 (−0.062 to +0.023) | +0.082 |
| gate, tables | confirm | −0.018 (−0.066 to +0.031) | +0.033 |
| gate, tables | population | −0.023 (−0.060 to +0.013) | −0.047 |
| blocking, blend | dev | +0.027 (−0.011 to +0.065) | +0.152 |
| blocking, blend | confirm | +0.006 (−0.049 to +0.061) | +0.061 |
| blocking, blend | population | −0.059 (−0.096 to −0.021) | +0.070 |
| blocking, blend | ext builders | −0.004 (−0.051 to +0.043) | +0.109 |
| blocking, blend | ext population | −0.008 (−0.046 to +0.030) | +0.027 |
| gate, blend | dev | −0.061 (−0.107 to −0.014) | +0.111 |
| gate, blend | confirm | −0.059 (−0.112 to −0.005) | +0.063 |
| gate, blend | population | +0.022 (−0.026 to +0.069) | +0.022 |
After-the-fact pooling: blocking under the tables is −0.003 (−0.011 to +0.005) over the 128 builders seeds and −0.001 (−0.007 to +0.005) over all 192 boards; on the blend it is +0.010 (−0.017 to +0.037) over the 192 builders seeds and −0.033 (−0.060 to −0.006) over the 128 population seeds. The gate is −0.019 (−0.051 to +0.014) over the 128 builders seeds under the tables and −0.060 (−0.095 to −0.024) under the blend, the one refutation with an interval excluding zero across the builders stages; its population stage crosses zero. The extension fired only for the blocking blend arm (128-seed read +0.017 with the interval reaching −0.017, inside the 0.03 gate) and faded it to +0.010. The combination arm was not registered: the two switches never both read positive in one leaf context. The full-blend half A read +0.039 (−0.066 to +0.144) as a single seating and counts for nothing on its own.
Interpretation: the learned leaf already prices expansion pressure, so the blocking shortlist's extra candidates (0.04 to 0.08 blocking builds per game against the control's 0.02 to 0.05) change the board too little to move wins, in line with the hand-leaf corrected estimate of +0.008. The gate does what it says (award held at game end 38% against 53% on the blended development boards) and the races it declines were worth entering: it loses about 0.06 wins per game under the blend. Decision cost: the blocking weight adds about 14% per decision under the tables and about 30% under the blend; the gate is free or slightly cheaper. Neither switch is worth the browser, which runs the hand-written leaf where both already measured zero. The report has every cohort table, the comparison with the hand-leaf numbers, and the diagnostics.
Failures and notes: my first queue scripts passed --threads through
just engine-run, which takes no such argument; the failure was immediate,
before any game was played, and the registrations were reused once the scripts
called python3 -m harness.engine run directly. One session ended with an
opencode error while cohorts ran; no run was affected, and the lane runners
survived it. The machine ran at a load average of 80 to 170 for most of the
day (ten agents on 32 cores), so wall times say nothing about search cost; the
decision-time ratios are taken within each run. Two smoke games against
throwaway seeds (kept under /tmp/opencode/roads-tables-smoke/) verified the
seat specifications before registration; plumbing only, not evidence. All 29 runs are archived with verified receipts under records/artifacts/.
Attribution: Kimi K3 (baseten/moonshotai/Kimi-K3) through OpenCode.
Build prediction under the learned leaf
Study adaptation/prediction-tables. The three build-prediction switches of
the hand-leaf study (a denial leaf weight, the predicted opponent model, and
the predicted space threat) were retested under the learned n-tuple tables
leaf, each as a swapped pair (candidate in slot 0 against the unchanged
tables-baseline control in slot 1, then the same two searches with slots
swapped) at depth 2, deterministic, four rotations, 256 games per half, six
threads. The denial weight is a leaf term and is inert under the tables alone,
so that arm runs on a blended leaf. Its first registrations used the full blend
(leaf hand 1.0 in both seats); the patterns/leaf-blend screen then measured
that blend 0.207 wins per game below the tables alone, so all six were
withdrawn before any of them ran and the arm was registered again on the
quarter blend (hand 0.25, which the screen measured +0.074 above the
tables). Withdrawn before running: 2324c88f-9407-455f-a76c-daafd52bf7e1,
adb816b7-c2f2-4a47-a545-60b035870e45,
d160d8e0-2d2a-45cb-ba12-f5fa82956d3a,
6f0f27f8-286c-424a-9786-7b43875e62cb,
c62b41d6-5c90-447a-8196-6acb9b6200f1, and
ff104571-dcc2-48f0-9dd5-0bae29a7cff5.
The predicted space threat ran its population stage first, as directed, because the switch only changes trades and the builders lineup trades less. Population lineup: candidate and control in slots 0 and 1, a second tables-baseline search in slot 2, eta in slot 3. Builders lineup: eta in slot 2, fast in slot 3.
Predicted space threat, under the tables alone:
| Stage | Half A experiment and run | Half B experiment and run | Effect (95% interval) | Seating term |
|---|---|---|---|---|
| Population, seeds 800-863 | 2a3e7ddb-a627-4e0a-a5ea-0f1934e6d166, 98b12730-0997-4f13-932a-671536080240 | 078dc121-0ee7-44f2-80c6-25b150fe5c14, 5d4485eb-5a7d-4525-8d5e-83b059633c39 | +0.047 (-0.004 to +0.098) | -0.027 |
| Development, seeds 0-63 | 7a37ead7-5990-4ced-8ea6-cc139c14d3cb, 2fb51aa4-ec78-441a-ac88-4f3a1a1b077d | e8ed1b4d-9b55-41c0-b81a-72ca3446a6f0, 7c07bce7-df9f-4bfb-b95c-73f1cc1a0f54 | +0.014 (-0.037 to +0.064) | +0.150 |
| Confirmation, seeds 800-863 | 721e6d22-cda9-4bbd-920f-a4c97caa1293, 97c2c3c7-f23c-484f-8316-d8ef40f35728 | d9e60b56-b687-4452-8a44-8e7a342a1f97, e6694d7e-7ca2-4a3c-b63a-7f98ad345a59 | -0.006 (-0.057 to +0.045) | +0.100 |
Pooled over the 128 builders-lineup seeds, an after-the-fact pooling: +0.004 (-0.032 to +0.040). The extension rule asks for a positive mean and an interval that comes within 0.03 of zero; the mean is positive but the nearest endpoint is 0.032 away, so no extension runs, and 64 more seeds could not separate +0.004 from zero anyway.
Predicted opponent model, under the tables alone:
| Stage | Half A experiment and run | Half B experiment and run | Effect (95% interval) | Seating term |
|---|---|---|---|---|
| Development, seeds 0-63 | 0f311f07-69b0-43a2-b00d-e65260e78c68, cd0eef08-680b-4639-9dba-8eb9e98ff79a | f7646e35-5a6e-4923-92eb-8ed00c0dbc55, 4dc942bd-5343-444d-aef8-9e89b60cc004 | -0.010 (-0.066 to +0.046) | +0.096 |
| Confirmation, seeds 800-863 | 131bd98f-9842-4da4-9ce6-4f818f018982, 596e8dd0-957e-49e8-bd30-47df5d0a6312 | 906aeeee-fb36-4c4c-8e4c-bfb515c8e3b9, 26be7683-0b30-4cdb-a27a-1900a11adcc4 | +0.000 (-0.063 to +0.063) | +0.055 |
| Population, seeds 800-863 | 832402a0-649a-4afe-a6b5-0120eafe42f7, 3e1db769-42a7-48e3-842e-311d45776d32 | 7bed7450-6301-44bb-81cb-bafb69a54399, 15282f9d-520d-4290-8931-bf0739e88983 | -0.004 (-0.060 to +0.052) | -0.012 |
Pooled over the 128 builders-lineup seeds: -0.005 (-0.047 to +0.037). The mean is not positive, so no extension runs.
Denial leaf weight 0.5, on the quarter blend (hand 0.25 in both seats):
| Stage | Half A experiment and run | Half B experiment and run | Effect (95% interval) | Seating term |
|---|---|---|---|---|
| Development, seeds 0-63 | 39f22891-3b02-4f8b-9d2a-54a68ecf8d65, 3bbbfea8-c08e-4910-9926-566ba647d534 | ad623e9c-d09c-4328-8f90-868cc0cc719c, b0c63544-f1ba-4a4c-924d-03ef381c4dbb | +0.002 (-0.040 to +0.044) | +0.123 |
| Confirmation, seeds 800-863 | 3b404013-a489-4f0f-8c72-d5139030896a, 106ab3c6-89e2-47f5-a17b-50f4e91ecbc8 | f454b374-037c-4ea9-9dcc-34b9222d3fe6, 591c905a-0d87-4216-8b35-df28b3256109 | -0.037 (-0.071 to -0.003) | +0.057 |
| Population, seeds 800-863 | 1fda980d-5933-4182-8629-bb38219163ef, 5463cc1a-fd0f-467b-a33a-63992e8ebe08 | 29355633-9630-484b-893c-5fa59b8bd158, ec5e3a3e-e989-40a6-bc77-701a2bbfc519 | +0.023 (-0.009 to +0.056) | -0.004 |
The confirmation interval excludes zero on the wrong side: the denial term is refuted on fresh seeds, repeating the hand-leaf study's fall from +0.061 to -0.025. Pooled over the 128 builders-lineup seeds: -0.018 (-0.045 to +0.010), so no extension runs. The term also costs: the denial seat's mean decision time was about double its control's in every half (1257 against 600 ms, 922 against 454, 199 against 105, and the mirrors), because the predictor runs at every leaf it evaluates.
Diagnostics from the retained games: the threat candidate made about 1.5 more
offers per game than its control (16.3 against 14.8 on the population lineup)
and declined about 1.4 fewer, so the switch does change who the seat trades
with. The opponents candidate's own counters (trades, offers, builds, robber
shares) match its control within noise. The denial candidate lost slightly
fewer frontier sites per game than its control on the builders lineup (1.78
against 1.84, from sites_lost), as it did under the hand leaf, without
turning the board into wins.
Prediction accuracy, from one observer seat's public knowledge on the
population lineup (unregistered diagnostic, seeds 800 to 815, 64 games,
--predict-diag 0): the predictor named eta's next completed build in 59.0
percent of turns (256 of 434) and a tables-baseline search's in 20.0 percent
(348 of 1739). Under the hand leaf it scored 52.7 against eta and 28.5 against
the hand-leaf search, so the learned leaf is a less predictable opponent, not
a more predictable one, and builder-directed terms have even less to read at a
table of searches.
Interpretation: none of the three switches separates from zero under the learned tables. The threat switch is the only arm with a positive-leaning reading anywhere (+0.047 on the population lineup, -0.004 to +0.098, matching its hand-leaf fresh reading of +0.031), but no interval excludes zero, its builders-lineup estimate is +0.004, and the worth-the-browser rule needs at least +0.03 pooled with the interval excluding zero. The denial term is refuted on fresh seeds for the second time at double the decision cost. All three switches stay off under both leaves; the baseline and the evidence boundary do not change. The report has the tables and the browser reading.
Failures: run 83989250-85e2-4fe5-a9fd-c2a1c5aedef7 (experiment
2a3e7ddb-a627-4e0a-a5ea-0f1934e6d166) was interrupted after 6 of 256 games
when my session tooling killed the detached process; the six completed games
are retained and not pooled, the run is filed as interrupted, and the half was
rerun from scratch as 98b12730-0997-4f13-932a-671536080240. One pair's
effect was first computed with the halves reversed in a scratch note and
corrected before anything was filed. The machine was shared with nine other
agents, so wall times (about 1.5 to 2 hours per 256-game half at six threads)
say nothing about decision cost; the within-run decision times above do. All
18 completed halves finished 256 of 256 games with no invalid, stalled,
forced, or failed decision.
Attribution: GLM-5.3 (baseten/zai-org/GLM-5.3) through opencode.
Robber targeting under the learned leaf
Hypotheses: four candidate-generation switches, each tested alone against the
unchanged tables-leaf baseline
(v2:{"depth":2,"leaf":{"tables":"/home/keshav/settlers/research/artifacts/ntuple/hex-portfolio-main.bin"}})
as a swapped pair, half A the arm in slot 0 and half B the arm in slot 1, 64
deterministic seeds per half. Predictions, each falsifiable: blocking the
points leader's best hex (robber.leader) wins more than blocking the most
pips; choosing the victim by the resource this seat needs (robber.need) beats
hand size; threat-weighted blocking that spares low-threat partners
(robber.threat) beats ignoring threats; and the late-game leader bias
(endgame.block_leader) beats the default after two thirds of the game.
Stages for every arm: development seeds 0-63 and confirmation seeds 800-863 in
the builders lineup (eta and fast in slots 2 and 3), population seeds 800-863
with a third tables search in slot 2 and eta in slot 3, and a preregistered
extension to seeds 864-927 in both lineups for arms whose pooled builders
effect was positive with an interval within 0.03 of zero. Decision rule: all
games complete; support only if the seating-corrected effect's 95 percent seed
interval excludes zero in the predicted direction.
Experiments under containment/robber-tables (36 registrations, 36 runs, all
256 of 256 games complete, 9,216 games). Development half A / half B
(experiment, run): leader 792be780/00c2cbe1 and 96d43c3b/38728ce3;
need 65b1ddb2/5c2f8ab4 and 55e137f4/c8749e28; threat
7bbc7aa7/47060353 and 2d811991/e0c6acab; block_leader
a01d63ec/2321b99f and 20ec74b1/56625a37. Confirmation: leader
bdf5010a/8129fb6c and f1fadb40/026bd4f5; need 26a2fb68/20b15545
and 284171c8/3c579646; threat 3420701a/227b8813 and
565a46fd/059e8938; block_leader 6e645e60/d8adbaf5 and
4e9d4801/6278b419. Population: leader 1dde9819/6b0408e8 and
b2878c09/44be36ac; need fef82bc6/a75e3de9 and
2385270c/2b2182d5; threat 62b6c4e8/7a435890 and
f85f55d3/8319a450; block_leader 72d97267/f2207f5e and
458b1c88/a626fe42. Extension, need: 2b68a0f5/54d7090b and
3e6d14bf/d55af6e8 (builders), 924f0b5b/33d3b566 and
3203b993/da3ec107 (population). Extension, block_leader:
4d64e731/06d296f3 and 57c39f3a/38ecd1ca (builders),
4094eeea/3a4f4e34 and 7ef0acfd/844109d4 (population). Final
combination (need + block_leader) on fresh seeds 928-991: b5d23033/9e11f6ff
and da65be79/ffc247e0 (builders), 2043385b/97c0c56c and
fc2983ec/3d8efaee (population). Full UUIDs are in the report's cohort
table and in the run records; every run has a verified archive receipt under
artifacts/.
Interpretation. Every stage's seating-corrected effect is inconclusive: development leader −0.020 (−0.079 to +0.040), need −0.004 (−0.047 to +0.039), threat +0.006 (−0.051 to +0.063), block_leader +0.010 (−0.020 to +0.039); confirmation +0.033 (−0.025 to +0.091), +0.014 (−0.031 to +0.058), −0.016 (−0.065 to +0.034), +0.000 (−0.029 to +0.029); population +0.031 (−0.030 to +0.092), −0.008 (−0.045 to +0.030), +0.043 (−0.005 to +0.091), −0.038 to +0.030 for block_leader at −0.004; extension need +0.039 (−0.001 to +0.079) builders and +0.025 (−0.013 to +0.064) population, block_leader +0.023 (−0.003 to +0.050) builders and +0.033 (+0.007 to +0.060) population, the only cohort of the program whose interval excludes zero. Pooled after the fact over stages: builders leader +0.007 (−0.035 to +0.049, 128 seeds), need +0.016 (−0.008 to +0.041, 192), threat −0.005 (−0.042 to +0.033, 128), block_leader +0.011 (−0.005 to +0.027, 192); population leader +0.031 (−0.030 to +0.092, 64), need +0.009 (−0.018 to +0.036, 128), threat +0.043 (−0.005 to +0.091, 64), block_leader +0.015 (−0.007 to +0.036, 128). No arm reaches the worth-the-browser bar of +0.03 pooled with an interval excluding zero. The mechanisms fire: the leader arm lands the robber on the leader's best hex on 31.1 percent of its moves against 27.0 for its controls and robs the leader on 49.9 against 42.2 percent, and the threat arm robs the leader on 47.3 against 42.2 percent while shifting theft toward the other search; the game's other statistics barely move. Decision cost is nil: arm and control decide within two percent of each other in every pair. The raw dev contrasts under the tables (+0.117, +0.105, +0.074, +0.094) are again the size of the seating term, as under the hand leaf. The hand-leaf refutation of the need rule does not reproduce under the tables (hand −0.045 excluding zero, tables +0.016 crossing zero), and the leader and threat population readings point up while their builders pools sit at or below zero, so the honest summary is noise around zero in both leaves. Combining the two arms that read positive, need and block_leader, gave +0.035 (−0.015 to +0.085) builders and −0.039 (−0.090 to +0.012) population on fresh seeds: disagreeing, both crossing zero. All four switches stay off in the server and are not worth enabling in the browser, where the hand-leaf evidence is the deciding tier and reads −0.023, −0.045, −0.033, and +0.012.
Failures and notes: one run was interrupted, b3a6c3ac-f9f6-4468-9259-835b8200f8d7
(leader dev half B, first attempt), killed at 143 of 256 games by a shell
timeout on my controlling session; it is filed as interrupted with a manual
bundle and the half was rerun from scratch as 38728ce3. No other run failed,
and no incomplete game entered any comparison. The machine was shared with
nine other agents through most of the program (system load around 150 on 32
cores), so the first stages took about 100 minutes per 256-game cohort and the
last ones about 13 minutes after the load fell; deterministic cohorts give the
same games either way, and only within-pair decision-time ratios are quoted.
The extension arms were selected by the preregistered pooled-positivity rule,
which is a data-dependent choice and is named as such in the report. No server
change was needed; the switches behaved under the tables in every cohort.
Attribution: GLM 5.3 (zai-org/GLM-5.3) through opencode.