node tools/ledgerjoint.js --write (seeds T-608:*, deterministic; every number in reports/tiers/2026-10-03-ledger-normalised.json, stepwise). Every figure through docs/lab/ledger/ledger.js's own compute(), each unit at its best solo form (leaders alone). Tista Minis is out of fitting and scoring (Jordan, 3 Oct). Jordan's method (3 Oct): one change at a time, each at fixed settings and measured against the step before, with the same yardstick. A report: the page gains the steps as benchmarks; nothing on the site changes.
What each step changes
- Baseline: the four-list benchmark as it is (tools/ledger-benchmarks/2026-10-03-joint-four-lists.json, raw lines).
- Lines on one scale, nothing else. Each line (Kill, Soak, Score, Actions, Hold, Spawn, Presence) is divided by its scale, the median of that line over every unit's best solo form at the page defaults (ledger.js works it out when the data loads). The Tyranids' median unit: Kill 142, Soak 167, Hold 8.1, Spawn 15.6, Score 2.45, Presence 0.78, Actions 0.75; the Marines': 109, 134, 5.3, none (1), 2.38, 0.95, 0.95. To isolate the scale change, the baseline's weights are rescaled so each line's typical contribution stays as it was: each weight × the geometric mean of the two armies' scales for that line (Kill × 124.5, Soak × 149.7, Hold × 6.54, Spawn × 3.95, Score × 2.41, Presence × 0.86, Actions × 0.85). One setting can't keep both armies exactly (their scales differ), and the geometric mean is the closest in the log sense, off by the same ratio either way; so what moves in this step is only each army now being measured against its own typical unit.
- Maelstrom in the yardstick (its letters merged into the Tyranid ledger as a comparator): step 1's setting, the objective now the mean ρ over five lists. No model change.
- A re-search on the five lists with the lines normalised: settings only (weights 0 to 4 with Score, Actions, Presence ≥ 0.5 and Hold ≥ 1; lands 0.2 to 1.5; rule kinds 1 to 3), arrival reach held at 1 and placed anywhere at 1; best of three starts (0.476, 0.438, 0.413).
- Arrival reach on Presence, fixed at 1.5: a form the charge model lets arrive far from its own zone (Deep Strike, Infiltrators, Scouts, tunnels, Rapid Ingress, Aerial Seeding, Meteoric Descent) or that goes back into reserves counts its own bodies × 1.5. 384 Tyranid and 1,736 Marine forms carry an arrival way (tools/ledger-merge.js, from the charge model's files).
- The Biovore call (Jordan, 3 Oct: "it is truly a one of a kind unit"): placed anywhere set by hand to the smallest value that puts the Biovores in the Tyranids' top 10% at step 4's settings: 36.85 (rank 5 of 52; 30th before).
The table
ρ, pairwise accuracy (pairs a reviewer puts in different tiers that we order the same way) and the same on pairs 2+ tiers apart, per list. The objective: the mean ρ over the four lists for steps 0 and 1, over five (Maelstrom in) from step 2. Δ: the objective's change from the step before; 90%: a paired bootstrap of Δ (units resampled within each list, 500 draws). Noise: the six searches on scrambled letters reach objectives with a standard deviation of 0.065 over five lists (0.080 over four; range −0.00 to 0.17), so a step "helps beyond noise" when its Δ is above that.
| Step | Tyr Auspex ρ / pw / 2+ | Tyr Hivemind | Tyr Second | Tyr Maelstrom | SM Auspex | Objective | Δ (90%) | Beyond noise? |
|---|---|---|---|---|---|---|---|---|
| 0 baseline, raw | 0.61 / 78% / 85% | 0.51 / 74 / 82 | 0.48 / 72 / 81 | 0.51 / 72 / 81 | 0.41 / 68 / 81 | 0.503 (of 4) | ||
| 1 lines normalised | 0.60 / 77 / 84 | 0.51 / 74 / 82 | 0.48 / 72 / 81 | 0.50 / 72 / 80 | 0.41 / 68 / 80 | 0.499 (of 4) | −0.004 (−0.011 to 0.003) | no: no change |
| 2 Maelstrom in the yardstick | as step 1 | 0.50 / 72 / 80 | 0.499 (of 5) | (no model change) | – | |||
| 3 re-searched, five lists | 0.66 / 80 / 88 | 0.46 / 71 / 82 | 0.41 / 68 / 77 | 0.50 / 71 / 81 | 0.35 / 65 / 75 | 0.476 | −0.023 (−0.104 to 0.046) | no |
| 4 arrival reach 1.5 | 0.66 / 80 / 88 | 0.46 / 71 / 82 | 0.39 / 67 / 76 | 0.49 / 71 / 80 | 0.33 / 64 / 73 | 0.466 | −0.010 (−0.020 to −0.001) | no (a small, steady loss) |
| 5 Biovore call (36.85) | 0.67 / 80 / 87 | 0.52 / 74 / 86 | 0.44 / 70 / 81 | 0.51 / 72 / 81 | 0.33 / 64 / 73 | 0.491 | +0.025 (−0.010 to 0.062) | no |
| Combined run, reported first (reach searched, call 32.2) | 0.69 / 82 / 88 | 0.46 / 71 / 81 | 0.44 / 70 / 80 | 0.57 / 74 / 84 | 0.34 / 65 / 74 | 0.499 | −0.005 against step 0 on five lists (−0.099 to 0.087) | no |
Reading, step by step.
- Step 1 changes almost nothing (−0.004): with the weights rescaled the values are the baseline's up to each army's own scale, so the lines' scale was never what the fit turned on. Its use is that a weight now reads as "typical units of this line": in the baseline, Kill carried 90% of every Tyranid's Value (Soak 3%, Hold 4%, Score 2%, Spawn 1%, Presence and Actions under 1%), and the rescaled weights show it plainly (Kill 498 against Presence 2.5).
- Step 2 is bookkeeping: Maelstrom agrees with the baseline as well as Hivemind does (0.50).
- Step 3, the re-search with the floors now binding in earnest, loses 0.023 overall, within noise: Auspex rises (0.60 → 0.66, pairwise 77 → 80%) while Hivemind, the second creator and the Marines fall 0.05 to 0.08. The search wants Kill 4 (the ceiling), Hold 2.5, Spawn 3, Soak 1.43, and Score, Actions and Presence at their 0.5 floors. Kill's share of the Tyranids' Value falls to 41% (Hold 27%, Soak 13%, Score 6%, Actions 5%, Presence 5%, Spawn 4%).
- Step 4, arrival reach at 1.5, costs 0.010: small, but below zero in 95% of the bootstrap draws. The reviewers don't reward bodies that can arrive far away; the combined run, where reach was searched, also put it at 1.
- Step 5, the Biovore call, gains 0.025: all four Tyranid lists grade the Biovores S, and Hivemind gains most (0.46 → 0.52). Within noise by the scrambled spread; its bootstrap interval just reaches below zero.
- No step clears the noise, and the steps' net is −0.012 from the baseline (0.503 of four → 0.491 of five). The normalisation is a change of units, not of fit; what moves the numbers is the re-search, and two equally good searches land on different weights (step 3: Soak 1.43, Score 0.5, Hold 2.5, lands 1.18; the combined run: Soak 2.78, Score 1.81, Hold 1.75, lands 0.40), so the weights are poorly pinned down by five lists.
The four units, ranks among the 52 Tyranids
| Unit | Letters (Auspex, Hivemind, Second, Maelstrom) | 0 | 1 | 3 | 4 | 5 | Combined |
|---|---|---|---|---|---|---|---|
| Tervigon | B, C, C, C | 14 | 15 | 15 | 15 | 16 | 14 |
| Genestealers | –, A, A, A | 32 | 32 | 33 | 33 | 34 | 28 |
| Raveners | S, B, A, B | 33 | 33 | 44 | 44 | 45 | 44 |
| Biovores | S, S, S, S | 47 | 49 | 30 | 30 | 5 | 5 |
Raveners fall at the re-search (Kill's share drops as Hold and Spawn come to count) and reach 1.5 doesn't bring them back. The Tervigon stays too high for three lists; Genestealers too low for three.
Outliers flagged by two or more reviewers (20+ points outside the reviewer's tier region)
- Step 0: Biovores (all four, too low), Genestealers (3, too low), Tervigon (3, too high), Tyranid Warriors with Ranged Bio-Weapons (3, too high), Neurotyrant, Raveners, Tyrant Guard (too low), Von Ryan's Leapers, Zoanthropes (too high).
- Step 5: Exocrine (all four, too low), Neurogaunts (all four, too high), Genestealers and Raveners (3, too low), Tervigon and the ranged Warriors (3, too high), Haruspex and Neurotyrant (2, too low), Harpy (Auspex D, Maelstrom F, too high: the Biovore call lifts it too), Von Ryan's Leapers (2, too high). The Biovores are off the list.
- Space Marines (Auspex alone, so no cross-check): the Librarians S at our bottom; Impulsor, Infiltrators, Outriders and Tactical Squads near our top.
The combined run (reported first, kept for comparison)
Before Jordan's stepwise method, the same changes were run as one bundle: normalised lines, reach searched (it settled at 1), the re-search, then the call (placed anywhere 32.2, Biovores 26th → 5th). Mean ρ of 5 0.499 (of 4 0.482): Auspex 0.69 (pairwise 82%), Maelstrom 0.57, Hivemind 0.46, Second 0.44, Marines 0.34. Three starts 0.474, 0.437, 0.435; six scrambled −0.00 to 0.17. Fit on four, scored on the fifth (held out against fitted): Tyr Auspex 0.67 (0.68), Hivemind 0.41 (0.42), Second 0.32 (0.39), Maelstrom 0.50 (0.54), SM Auspex 0.24 (0.34); without Maelstrom the fit gives Auspex 0.69, Hivemind 0.40, Second 0.38, Marines 0.37 and Maelstrom unseen 0.50. Weights: Kill 4, Soak 2.78, Score 1.81, Hold 1.75, Spawn 3.75, Actions 0.5 and Presence 0.5 (floors), lands 0.40, reach 1.
Do Presence and Actions now carry weight?
Only as much as the floors make them. In every search (steps 3 and the combined run) Actions and Presence sit at their 0.5 floors, as does reach when searched; their share of a Tyranid's Value is about 5% each (Presence 10% with the Biovore call), from under 1% in the baseline. The reviewers' orders reward Hold, Soak and Spawn once the lines are on one scale; they don't reward more Presence or Actions than the floor.
Saved (tools/ledger-benchmarks/, and on the page)
Step 0: 2026-10-03-joint-four-lists.json (as it was). Steps 1 and 2: 2026-10-03-step1-normalised.json (one setting; step 2 moves only the yardstick). Step 3: 2026-10-03-step3-research.json. Step 4: 2026-10-03-step4-reach.json. Step 5: 2026-10-03-step5-biovores.json. The combined run: 2026-10-03-normalised-joint.json. docs/lab/ledger/benchmarks.json rebuilt (settings saved before this card are read on raw lines; their Maelstrom ρ worked out).