Each run: tools/ledgerfit.js fits the base (every step switch off) and fits again with the run's switches on, by the same procedure: the seven weights and lands fitted, everything else hibernated at tools/ledger-benchmarks/2026-10-03-step6-baseline.json; ridge λ 0.01 toward the base benchmark's values; the same seeds. Lists: tyr.auspex, tyr.hivemind, tyr.second, tyr.maelstrom, tyr.astrategas, sm.auspexFull, sm.tobias. Yardstick through compute() at each fit (ρ; pairwise on the tiers S to D, as the step log). Leave one list out: each list scored by the fit on the other 6. Noise: each army's SD of mean ρ over the scrambled fits (10 per ledger, the base's and the run's pooled: 20). Hint by the keep rule: KEEP only when the mean ρ and mean pairwise both rise and neither army's mean ρ falls past its noise. A hint; the supervisor decides.
| Run | Mean ρ (base → on) | Mean pairwise | Tyranids ρ | Space Marines ρ | Left out: mean ρ | Left out: mean pairwise | Hint | Left out agrees |
|---|---|---|---|---|---|---|---|---|
| base re-fit (against the step-6 weights) | 0.472 → 0.464 (−0.008) | 70.1% → 69.7% (−0.4) | 0.564 → 0.554 (−0.011) | 0.241 → 0.238 (−0.003) | 0.472 → 0.460 (−0.012) | 70.1% → 69.6% (−0.5) | – | – |
| charsJoined | 0.464 → 0.442 (−0.022) | 69.7% → 68.7% (−1.0) | 0.554 → 0.541 (−0.013) | 0.238 → 0.195 (−0.043) | 0.460 → 0.437 (−0.023) | 69.6% → 68.4% (−1.2) | REVERT: mean ρ −0.022; mean pairwise −1.0 points | yes (REVERT) |
| killOverGame | 0.464 → 0.394 (−0.069) | 69.7% → 66.3% (−3.4) | 0.554 → 0.460 (−0.094) | 0.238 → 0.231 (−0.007) | 0.460 → 0.396 (−0.064) | 69.6% → 66.4% (−3.1) | REVERT: mean ρ −0.069; mean pairwise −3.4 points; Tyranids ρ −0.094, past noise 0.042 | yes (REVERT) |
| joinedMarginal | 0.464 → 0.439 (−0.024) | 69.7% → 68.7% (−1.0) | 0.554 → 0.519 (−0.035) | 0.238 → 0.239 (+0.001) | 0.460 → 0.438 (−0.022) | 69.6% → 68.7% (−0.9) | REVERT: mean ρ −0.024; mean pairwise −1.0 points | yes (REVERT) |
| joinedMarginal + joinedShapley | 0.464 → 0.456 (−0.008) | 69.7% → 69.3% (−0.4) | 0.554 → 0.545 (−0.009) | 0.238 → 0.233 (−0.005) | 0.460 → 0.455 (−0.005) | 69.6% → 69.3% (−0.3) | REVERT: mean ρ −0.008; mean pairwise −0.4 points | yes (REVERT) |
| synapseMarginal | 0.464 → 0.432 (−0.031) | 69.7% → 68.2% (−1.5) | 0.554 → 0.508 (−0.046) | 0.238 → 0.242 (+0.005) | 0.460 → 0.427 (−0.034) | 69.6% → 68.0% (−1.6) | REVERT: mean ρ −0.031; mean pairwise −1.5 points; Tyranids ρ −0.046, past noise 0.043 | yes (REVERT) |
| leadersLeading | 0.464 → 0.424 (−0.039) | 69.7% → 67.7% (−2.0) | 0.554 → 0.541 (−0.013) | 0.238 → 0.132 (−0.106) | 0.460 → 0.425 (−0.035) | 69.6% → 67.7% (−1.9) | REVERT: mean ρ −0.039; mean pairwise −2.0 points; Space Marines ρ −0.106, past noise 0.090 | yes (REVERT) |
| landsNoClamp | 0.464 → 0.458 (−0.005) | 69.7% → 69.5% (−0.3) | 0.554 → 0.542 (−0.012) | 0.238 → 0.248 (+0.010) | 0.460 → 0.457 (−0.003) | 69.6% → 69.4% (−0.2) | REVERT: mean ρ −0.005; mean pairwise −0.3 points | yes (REVERT) |
| condShares | 0.464 → 0.459 (−0.005) | 69.7% → 69.5% (−0.2) | 0.554 → 0.553 (−0.001) | 0.238 → 0.225 (−0.013) | 0.460 → 0.457 (−0.004) | 69.6% → 69.4% (−0.2) | REVERT: mean ρ −0.005; mean pairwise −0.2 points | yes (REVERT) |
The base row compares the step-6 baseline as it stands (its weights, unfitted; left out is in sample there) with the base re-fitted on the 7 lists. Noise (SD of mean ρ, scrambled fits): Tyranids 0.038, Space Marines 0.100, all lists 0.039 (first run's pool).
Notes
- No step is kept after a re-fit either. All eight runs fall on both mean ρ and mean pairwise against the re-fitted base, and leave-one-list-out agrees on every one. The closest are landsNoClamp and condShares (−0.005 mean ρ, −0.2 to −0.3 points) and joinedMarginal + joinedShapley (−0.008); killOverGame (−0.069) and leadersLeading (−0.039, Space Marines −0.106) are the furthest.
- Re-fitting the base on the seven lists makes the yardstick slightly worse, not better: mean ρ 0.472 → 0.464, pairwise 70.1% → 69.7%, both armies down a little, and the same held out. The fit improves its own objective (the reliability-weighted pairwise likelihood, which counts Maelstrom's F letters and weights the lists unequally), not ρ. The ridge (λ 0.01 toward the step-6 weights) keeps every weight within a few percent of step 6 except Kill (498 → 411) and lands (1.50 → 1.45); Biovores move from 5th to 1st.
- What the re-fit changes is the base, more than the steps. At fixed step-6 weights the same switches on the seven lists give mean ρ: charsJoined 0.448, killOverGame 0.395, joinedMarginal 0.439, + joinedShapley 0.460, synapseMarginal 0.426, leadersLeading 0.430, landsNoClamp 0.461, condShares 0.462. Re-fitted, the switched-on ledgers land within ±0.01 of those (charsJoined 0.442, killOverGame 0.394, joinedMarginal 0.439, + joinedShapley 0.456, synapseMarginal 0.432, leadersLeading 0.424, landsNoClamp 0.458, condShares 0.459); the gaps narrow mainly because the re-fitted base sits 0.008 lower. Within this procedure, re-tuning the weights doesn't rescue any of the mechanisms: the losses come from the units each switch moves (the movers below repeat the step log's), not from weights tuned to the old model.
- killOverGame moves the weights most (Kill 411 → 313, the fit damping the monsters' rise); the Marines' Tobias list still rises (0.195 → 0.225) while every Tyranid list falls (Hivemind 0.616 → 0.427).
- The fitter's assumptions held. Every switch keeps Value linear in the weights (killOverGame's factor reads Soak and the rules, never a weight); with joinedMarginal a row is a joined form less its partners' best forms alone, so the latent is piecewise linear and not convex in the weights. It is re-picked at every evaluation and BFGS finds a local optimum; no extra basis passes were needed. The latents matched compute() on every fit.
- Noise: Marines carry two lists, so their scrambled spread is wide (SD 0.100) and the per-army test only binds on them for leadersLeading. The Tyranid spread (0.038) binds for killOverGame and synapseMarginal.
Per list (ρ / pairwise, S to D)
| List | Step 6 | Base re-fit | charsJoined | killOverGame | joinedMarginal | joinedMarginal + joinedShapley | synapseMarginal | leadersLeading | landsNoClamp | condShares |
|---|---|---|---|---|---|---|---|---|---|---|
| tyr.auspex | 0.662 / 79.8% | 0.656 / 79.4% | 0.644 / 78.8% | 0.579 / 75.3% | 0.559 / 75.9% | 0.606 / 77.6% | 0.562 / 74.7% | 0.636 / 78.3% | 0.651 / 79.0% | 0.653 / 79.4% |
| tyr.hivemind | 0.622 / 78.6% | 0.616 / 78.5% | 0.596 / 77.1% | 0.427 / 69.0% | 0.575 / 76.9% | 0.605 / 78.3% | 0.537 / 74.8% | 0.591 / 76.9% | 0.607 / 77.8% | 0.611 / 78.3% |
| tyr.second | 0.587 / 76.7% | 0.568 / 75.7% | 0.542 / 74.4% | 0.498 / 72.5% | 0.488 / 71.9% | 0.524 / 73.8% | 0.587 / 76.7% | 0.550 / 74.9% | 0.552 / 74.9% | 0.561 / 75.4% |
| tyr.maelstrom | 0.571 / 71.4% | 0.554 / 71.0% | 0.547 / 70.4% | 0.449 / 64.0% | 0.576 / 71.9% | 0.585 / 72.0% | 0.510 / 68.8% | 0.569 / 71.6% | 0.539 / 70.2% | 0.561 / 71.0% |
| tyr.astrategas | 0.381 / 65.9% | 0.376 / 65.5% | 0.375 / 65.8% | 0.346 / 64.1% | 0.399 / 66.1% | 0.403 / 66.0% | 0.346 / 64.3% | 0.359 / 64.3% | 0.362 / 65.0% | 0.377 / 65.5% |
| sm.auspexFull | 0.284 / 63.4% | 0.281 / 63.2% | 0.223 / 60.5% | 0.237 / 61.1% | 0.292 / 63.6% | 0.284 / 63.2% | 0.288 / 63.5% | 0.190 / 58.7% | 0.283 / 63.4% | 0.268 / 62.6% |
| sm.tobias | 0.197 / 54.9% | 0.195 / 54.7% | 0.167 / 53.7% | 0.225 / 58.2% | 0.185 / 54.9% | 0.181 / 54.5% | 0.197 / 54.7% | 0.074 / 48.9% | 0.213 / 56.0% | 0.181 / 54.4% |
Left out (each list by the fit on the others), ρ / pairwise:
| List | Base re-fit | charsJoined | killOverGame | joinedMarginal | joinedMarginal + joinedShapley | synapseMarginal | leadersLeading | landsNoClamp | condShares |
|---|---|---|---|---|---|---|---|---|---|
| tyr.auspex | 0.649 / 79.0% | 0.634 / 78.3% | 0.584 / 75.6% | 0.559 / 75.9% | 0.605 / 77.5% | 0.556 / 74.3% | 0.636 / 78.3% | 0.642 / 78.7% | 0.648 / 79.1% |
| tyr.hivemind | 0.608 / 78.2% | 0.587 / 76.9% | 0.434 / 69.3% | 0.562 / 76.4% | 0.605 / 78.3% | 0.521 / 74.0% | 0.591 / 76.9% | 0.607 / 77.8% | 0.604 / 78.1% |
| tyr.second | 0.556 / 75.2% | 0.533 / 74.0% | 0.498 / 72.5% | 0.484 / 71.7% | 0.527 / 74.0% | 0.585 / 76.7% | 0.550 / 74.9% | 0.552 / 74.9% | 0.560 / 75.4% |
| tyr.maelstrom | 0.556 / 71.0% | 0.547 / 70.4% | 0.452 / 64.0% | 0.578 / 71.8% | 0.583 / 71.9% | 0.501 / 68.7% | 0.573 / 71.6% | 0.539 / 70.2% | 0.560 / 71.1% |
| tyr.astrategas | 0.381 / 65.9% | 0.373 / 65.6% | 0.346 / 64.1% | 0.407 / 66.3% | 0.406 / 66.1% | 0.341 / 64.1% | 0.363 / 64.4% | 0.362 / 65.0% | 0.378 / 65.6% |
| sm.auspexFull | 0.272 / 62.9% | 0.223 / 60.3% | 0.230 / 60.9% | 0.291 / 63.6% | 0.280 / 62.8% | 0.281 / 63.1% | 0.189 / 58.6% | 0.281 / 63.2% | 0.263 / 62.4% |
| sm.tobias | 0.199 / 55.0% | 0.164 / 53.6% | 0.231 / 58.7% | 0.186 / 54.9% | 0.180 / 54.4% | 0.201 / 54.9% | 0.074 / 49.0% | 0.215 / 56.1% | 0.183 / 54.4% |
The fitted knobs
| Knob | Step 6 | Base re-fit | charsJoined | killOverGame | joinedMarginal | joinedMarginal + joinedShapley | synapseMarginal | leadersLeading | landsNoClamp | condShares |
|---|---|---|---|---|---|---|---|---|---|---|
| lands | 1.500 | 1.451 | 1.451 | 1.423 | 1.216 | 1.256 | 1.519 | 1.451 | 1.664 | 1.451 |
| wKill | 498.2 | 411.4 | 439.4 | 313.0 | 360.2 | 392.5 | 422.5 | 408.3 | 422.2 | 392.5 |
| wSoak | 14.97 | 14.71 | 14.64 | 14.29 | 14.56 | 14.88 | 14.32 | 15.44 | 14.80 | 15.04 |
| wScore | 9.652 | 10.02 | 9.970 | 10.23 | 9.677 | 9.940 | 10.41 | 9.700 | 10.01 | 10.07 |
| wActions | 1.306 | 1.292 | 1.298 | 1.307 | 1.307 | 1.303 | 1.291 | 1.303 | 1.292 | 1.295 |
| wHold | 18.89 | 19.87 | 19.38 | 19.27 | 18.49 | 19.77 | 20.89 | 19.52 | 19.84 | 20.07 |
| wPresence | 2.515 | 2.739 | 2.732 | 2.963 | 3.169 | 2.963 | 2.502 | 2.845 | 2.702 | 2.702 |
| wSpawn | 15.65 | 15.34 | 15.28 | 15.37 | 14.22 | 13.60 | 15.41 | 14.46 | 15.33 | 15.32 |
Movers (ranks between the base re-fit and the run's re-fit; letters per list)
charsJoined. Tyranids: Toxicrene 26 → 32 (–/–/–/D/D), Carnifexes 32 → 27 (C/C/C/C/C), Winged Tyranid Prime 31 → 35 (–/B/B/C/B), Barbgaunts 40 → 36 (–/C/B/C/D), Raveners 36 → 40 (S/B/A/B/A), Hive Guard 29 → 26 (A/B/B/C/C), Hierophant 42 → 39 (D/C/–/D/–), Neurotyrant 39 → 42 (A/–/–/A/B). Space Marines: Techmarine 15 → 32 (A/B), Librarian in Phobos Armour 45 → 62 (B/C), Chaplain with Jump Pack 29 → 45 (A/D), Lieutenant in Reiver Armour 60 → 46 (C/D), Reiver Squad 24 → 11 (B/B), Captain in Terminator Armour 28 → 39 (B/D), Librarian 58 → 69 (S/A), Captain in Phobos Armour 36 → 26 (B/D).
killOverGame. Tyranids: Hierophant 42 → 20 (D/C/–/D/–), Harridan 44 → 22 (D/C/C/D/–), Broodlord 15 → 36 (–/A/A/A/B), Tyranid Prime with Lash Whip 14 → 34 (C/A/B/–/D), Lictor 3 → 16 (–/A/S/S/S), Winged Tyranid Prime 31 → 44 (–/B/B/C/B), Tyrannofex 25 → 14 (S/A/A/A/S), Hive Guard 29 → 18 (A/B/B/C/C). Space Marines: Hammerfall Bunker 74 → 18 (D/F), Astraeus 75 → 21 (C/–), Thunderhawk Gunship 78 → 25 (D/–), Land Raider Crusader 64 → 16 (B/D), Stormraven Gunship 79 → 32 (B/B), Terminator Assault Squad 62 → 19 (S/B), Land Raider 53 → 11 (A/C), Land Raider Redeemer 50 → 9 (S/A).
joinedMarginal. Tyranids: Tyrant Guard 49 → 20 (B/B/A/C/C), Carnifexes 32 → 4 (C/C/C/C/C), Neurotyrant 39 → 14 (A/–/–/A/B), Gargoyles 47 → 26 (–/B/B/A/S), Winged Tyranid Prime 31 → 12 (–/B/B/C/B), Genestealers 35 → 18 (–/A/A/A/B), Raveners 36 → 22 (S/B/A/B/A), Termagants 34 → 21 (–/B/–/B/A). Space Marines: Desolation Squad 54 → 20 (B/C), Captain in Phobos Armour 36 → 4 (B/D), Apothecary Biologis 83 → 54 (A/C), Brutalis Dreadnought 5 → 33 (A/C), Librarian in Terminator Armour 69 → 41 (S/B), Terminator Assault Squad 62 → 35 (S/B), Bladeguard Veteran Squad 37 → 11 (S/A), Outrider Squad 4 → 30 (A/C).
joinedMarginal + joinedShapley. Tyranids: Carnifexes 32 → 8 (C/C/C/C/C), Neurotyrant 39 → 18 (A/–/–/A/B), Tyrant Guard 49 → 31 (B/B/A/C/C), Winged Tyranid Prime 31 → 16 (–/B/B/C/B), Genestealers 35 → 20 (–/A/A/A/B), Raveners 36 → 25 (S/B/A/B/A), Trygon 24 → 35 (B/C/–/B/A), Termagants 34 → 24 (–/B/–/B/A). Space Marines: Captain in Phobos Armour 36 → 6 (B/D), Desolation Squad 54 → 26 (B/C), Brutalis Dreadnought 5 → 27 (A/C), Terminator Assault Squad 62 → 41 (S/B), Bladeguard Veteran Squad 37 → 17 (S/A), Terminator Squad 57 → 37 (A/D), Captain in Terminator Armour 28 → 9 (B/D), Outrider Squad 4 → 23 (A/C).
synapseMarginal. Tyranids: Neurolictor 21 → 41 (S/S/B/–/S), Neurogaunts 22 → 42 (B/C/C/C/C), Norn Emissary 19 → 38 (S/B/S/A/A), Maleceptor 17 → 35 (S/A/–/A/A), Broodlord 15 → 31 (–/A/A/A/B), Tervigon 16 → 32 (B/C/C/C/D), Tyranid Warriors with Melee Bio-Weapons 18 → 34 (B/B/A/B/B), Winged Tyranid Prime 31 → 46 (–/B/B/C/B). Space Marines: Captain 26 → 23 (A/B), Lieutenant 34 → 31 (S/C), Aggressor Squad 8 → 6 (S/C), Captain with Jump Pack 6 → 8 (A/B), Bladeguard Veteran Squad 37 → 35 (S/A), Dreadnought 52 → 50 (C/D), Land Raider Crusader 64 → 66 (B/D), Assault Intercessor Squad 14 → 13 (A/B).
leadersLeading. Tyranids: Neurotyrant 39 → 7 (A/–/–/A/B), Winged Tyranid Prime 31 → 15 (–/B/B/C/B), Old One Eye 11 → 2 (B/B/–/B/C), The Swarmlord 2 → 8 (S/S/A/–/A), The Red Terror 12 → 16 (A/A/S/–/–), Tyranid Warriors with Ranged Bio-Weapons 13 → 17 (C/C/B/D/C), Hive Tyrant 6 → 9 (S/A/S/A/A), Hyperadapted Raveners 9 → 12 (S/A/B/A/S). Space Marines: Apothecary Biologis 83 → 28 (A/C), Chaplain on Bike 59 → 17 (B/D), Lieutenant in Phobos Armour 44 → 6 (C/C), Librarian in Phobos Armour 45 → 10 (B/C), Captain in Phobos Armour 36 → 2 (B/D), Ancient 67 → 37 (B/C), Chaplain 66 → 40 (A/C), Captain 26 → 9 (A/B).
landsNoClamp. Tyranids: Hive Guard 29 → 25 (A/B/B/C/C), Trygon 24 → 28 (B/C/–/B/A), Raveners 36 → 40 (S/B/A/B/A), Mawloc 41 → 44 (B/B/C/B/C), Carnifexes 32 → 30 (C/C/C/C/C), Lictor 3 → 2 (–/A/S/S/S), The Swarmlord 2 → 3 (S/S/A/–/A), Tyranid Warriors with Ranged Bio-Weapons 13 → 12 (C/C/B/D/C). Space Marines: Chaplain with Jump Pack 29 → 37 (A/D), Judiciar 43 → 51 (B/D), Captain 26 → 33 (A/B), Captain in Terminator Armour 28 → 35 (B/D), Vanguard Veteran Squad with Jump Packs 17 → 23 (A/D), Eradicator Squad 31 → 26 (A/B), Eliminator Squad 35 → 30 (B/C), Centurion Devastator Squad 32 → 28 (B/C).
condShares. Tyranids: Psychophage 28 → 24 (B/B/A/B/C), Exocrine 20 → 22 (A/A/A/S/S), Toxicrene 26 → 28 (–/–/–/D/D), Neurotyrant 39 → 37 (A/–/–/A/B), Tyranid Warriors with Melee Bio-Weapons 18 → 17 (B/B/A/B/B), Maleceptor 17 → 18 (S/A/–/A/A), Neurolictor 21 → 20 (S/S/B/–/S), Neurogaunts 22 → 21 (B/C/C/C/C). Space Marines: Librarian in Phobos Armour 45 → 57 (B/C), Eliminator Squad 35 → 27 (B/C), Repulsor Executioner 56 → 48 (A/A), Centurion Assault Squad 30 → 37 (B/C), Land Raider Redeemer 50 → 56 (S/A), Librarian 58 → 64 (S/A), Captain in Phobos Armour 36 → 31 (B/D), Storm Speeder Hailstrike 39 → 34 (B/C).
Base re-fit against step 6: Tyranids: Neurogaunts 29 → 22 (B/C/C/C/C), Harpy 33 → 27 (D/–/–/F/D), Haruspex 24 → 30 (B/B/A/A/B), Biovores 5 → 1 (S/S/S/S/S), Hive Tyrant 3 → 6 (S/A/S/A/A), Hormagaunts 26 → 23 (S/A/B/A/S), Toxicrene 23 → 26 (–/–/–/D/D), Von Ryan's Leapers 6 → 4 (S/B/A/B/C). Space Marines: Tactical Squad 21 → 16 (B/D), Land Raider 57 → 53 (A/C), Land Raider Crusader 68 → 64 (B/D), Outrider Squad 7 → 4 (A/C), Scout Squad 23 → 20 (S/S), Eradicator Squad with Heavy Bolters 18 → 21 (A/B), Invictor Tactical Warsuit 19 → 22 (B/D), Lieutenant 31 → 34 (S/C).
Checks and run times
- Each fit's latents (every unit's ranking row) matched compute() at the fitted setting, the largest relative difference 1.4e-15; every form's basis matched valueForm() (6.6e-16).
- Ranking rows: base solo/solo; charsJoined solo/solo; killOverGame solo/solo; joinedMarginal marginal/marginal; joinedMarginal + joinedShapley marginal/marginal; synapseMarginal solo/solo; leadersLeading leading/leading; landsNoClamp solo/solo; condShares solo/solo.
- Run times (the main fit; with folds and scrambles on 11 threads): base 3.15 s (11.8 s); charsJoined 1.79 s (9.7 s); killOverGame 2.6 s (12 s); joinedMarginal 3.07 s (18.7 s); joinedMarginal + joinedShapley 2.55 s (18.1 s); synapseMarginal 2.49 s (11 s); leadersLeading 2.23 s (11.2 s); landsNoClamp 1.81 s (11.3 s); condShares 2.9 s (10.9 s). Total 115.3 s.