In plain English
The points ledger reads a frozen copy of the engine and data (T-603). Since that copy was made, our own code and rules files had moved on: the weapon keywords are read in full (T-582), and T-694 corrected the detachment data found by the T-690 audit. Jordan asked for "that engine in the ledger, and anything else that is pre dataslate update but relevant to the snapshot". This is that re-freeze.
What came in: today's engine, docs/ev.js, with its full reading of the weapon keywords. docs/detfx.js gains two new conditions, "not against these keywords" and "not for these units". docs/bsdata.js now reads which army a detachment belongs to. T-694's detachment corrections came in too, and the Drukhari get their own nine detachments; until now they had none.
What stayed old, and why: the datasheets, points, index and reviewers' panels stay as they were at eb3590a (BSData 374f505), because the reviewers we score against graded that data. The 30 Sep update's own rule changes to two detachments (Frenzied Host, Legion of Excess) stay out. The four panel edits since then are yardstick bookkeeping, and the 23 new panel files are new lists; both are left for a later step.
What it does: almost nothing to the Tyranids or Space Marines: 79.3 → 79.1 on the five Tyranid lists, and the seven-list mean is unchanged at 73.8%. The pooled exam on 14 armies goes from 59.1 to 59.0. Underneath, the most-winning detachment changes in eight armies, as the audit asked: the ×1.065 that used to decide ties now reaches only the units a rule names, and best-case picks are now counted over the game. Orks lose 2.0 points (their Big Meks and Mek Gunz no longer get the best roll every time) and Emperor's Children gain 3.6. No setting needs re-fitting on this evidence.
The snapshot
| Old | New | |
|---|---|---|
| Lock | tools/ledger-inputs.lock-eb3590a.json (kept) | tools/ledger-inputs.lock.json |
| Code commit | eb3590a | 8eb69bc7af |
| Data | BSData 374f505 | BSData 374f505 (index.json and panels from eb3590a) |
| Inputs hash | 30f0056e6103 | a20dbd2c3316 |
| Store | build/ledger-inputs/eb3590a2aad5/ | build/ledger-inputs/8eb69bc7af60-data-eb3590a2aad5/ |
How "today's code, old data" is frozen (tools/ledger-inputs.js):
--keep eb3590a --keep-files "docs/data/index.json,reports/tiers/panel/*.json"takes those inputs as they were at eb3590a, both which files there were and their contents. Each such entry recordsfrom.--built-jsonfreezes three inputs from files built for the purpose. Each entry records how to make it again, and like build/units.json these live only in the store:- docs/data/detfx.json:
--build-detfx eb3590a --revert "…|Frenzied Host,…|Legion of Excess", which is the live file with the 30 Sep update's two changes put back. It differs from eb3590a's file in T-694's 23 detachments only. - docs/data/detachments.json: a new input, from tools/build_data.js at 374f505 with today's reader.
- docs/data/rankings.json:
--build-rankings eb3590a --overlay …, today's build_rankings.js on eb3590a's docs/data. As a check, eb3590a's own code on eb3590a's data reproduced eb3590a's rankings.json byte for byte.
- docs/data/detfx.json:
LEDGER_INPUTS_LOCK=tools/ledger-inputs.lock-eb3590a.jsonpoints every realm at the old snapshot. Under it the Tyranid chain gives Track A's and Track B's seven-list output line for line.- build/units.json, index.json and detachments.json rebuilt from 374f505 with today's reader came out byte-identical (detachments.json differs only by the new
onlyfield).
Five of the 27 inputs differ from the old snapshot:
| Input | Change since eb3590a | Call |
|---|---|---|
| docs/ev.js | T-582: weapon keywords read in full | take |
| docs/detfx.js | T-694: notTargetKw, notUnitKw | take |
| docs/bsdata.js | T-688: a detachment's only | take (no ledger read of its own) |
| docs/data/detfx.json | T-579: Frantic Focus +1 S → Sustained Hits 1, Legion of Excess's stratagem name (both the dataslate's); T-694's corrections | dataslate parts kept old; T-694 taken |
| docs/data/rankings.json | T-579 data, T-582 engine | rebuilt: old data, today's engine |
| docs/data/detachments.json | new input (matchedOf reads it) | 374f505, today's reader |
| docs/data/index.json, build/units.json | T-579's 8b91e6b data | kept at 374f505 |
| Panels (4 edits, 23 new files) | use: superseded labels; new lists | yardstick, a later step; kept as at eb3590a |
| detfx.js, loadout.js, roster.js, the other effects files, deployments, field names | unchanged | – |
Not taken: the T-695 armyfx.json corrections. They arrived after the freeze, and the ledger reads army-rule dice, so taking them would need another re-freeze.
The numbers (pairwise accuracy, %)
| Track A | Track B | B + four dials | Trio | |
|---|---|---|---|---|
| Five Tyranid lists | 79.3 → 79.1 | 77.7 → 77.7 | 81.4 → 81.4 | 76.5 → 76.5 |
| Held-out Tyranid units (diagnose, against consensus) | 78.7 → 78.5 | 77.2 → 77.2 | 81.6 → 81.6 | 75.7 → 75.7 |
| Seven lists (mean pairwise, ρ) | 73.8 → 73.8 (0.547 → 0.545) | 72.3 → 72.3 | 74.9 → 74.9 | 71.8 → 71.8 |
| Exam, 14 armies pooled | 59.1 → 59.0 | 59.2 → 59.0 | 59.3 → 59.0 | 61.1 → 61.0 |
| Against A on the same draws [95%] | – | +0.1 [−2.7, +2.7] → +0.0 [−2.6, +2.7] | +0.2 [−2.9, +3.2] → +0.0 [−2.9, +2.9] | +2.0 [−0.2, +4.3] → +2.0 [−0.4, +4.3] |
| 15 armies (Votann in) | 59.1 → 58.7 | 59.9 → 59.5 | – | – |
The exam draws units within one build, so the change between snapshots has no paired interval. Its size, −0.1 pooled, is a twentieth of the ±2.7 that separates two settings on the same build.
Track A, army by army (exam rows):
| Army | Before | After | Δ |
|---|---|---|---|
| Space Marines | 60.3 | 60.3 | 0.0 |
| Adeptus Mechanicus | 73.0 | 71.7 | −1.3 |
| Agents of the Imperium | 58.3 | 56.5 | −1.8 |
| Astra Militarum | 66.9 | 66.6 | −0.3 |
| Blood Angels | 61.3 | 61.3 | 0.0 |
| Dark Angels | 54.1 | 53.9 | −0.2 |
| Death Guard | 53.4 | 53.4 | 0.0 |
| Drukhari | 57.5 | 58.0 | +0.5 |
| Emperor's Children | 66.0 | 69.6 | +3.6 |
| Genestealer Cults | 56.4 | 56.4 | 0.0 |
| Orks | 63.7 | 61.7 | −2.0 |
| Space Wolves | 51.4 | 50.7 | −0.7 |
| Thousand Sons | 37.9 | 38.2 | +0.3 |
| World Eaters | 67.8 | 67.5 | −0.3 |
| Leagues of Votann (apart) | 59.2 | 54.6 | −4.6 * |
\* Not like for like. Votann's row now scores four lists, not two, because ledger-merge reads the panel folder live for comparators, and two Votann panels arrived after the old build.
Who moved, and why
- Tyranids:
- No Kill or Burst moved. No Tyranid weapon carries a newly read keyword, as predicted.
- Soak moved by up to 1.6%: the enemy field's guns are read in full now. Norn Assimilator +1.6%, Maleceptor −1.0%.
- Four units swap neighbouring places: Tervigon and Norn Emissary at 21 and 22, Neurotyrant and Genestealers at 29 and
- Maelstrom's list drops from 77% to 76%.
- Space Marines: every Value moves by 0.3% or less and no rank changes. Ancient in Terminator Armour, the one Marine the rankings moved, keeps its rank.
- Orks (engine and T-694), at Track A:
- Gunwagon rises from 46th to 20th: Value +108%, from Lethal Hits with a condition, Cleave X and Blast X, and its Auto-equip squad now wins.
- Big Mek falls from 19th to 29th (−17.5%), Mek Gunz from 4th to 9th (−22.6%) and Wazbom Blastajet from 34th to 42nd (−17.8%). Madcap Meks' roll is now a sixth per result, not the best result every time.
- Emperor's Children:
- Coterie of the Conceited still wins all 23 units at its ladder of shares (a fifth per step): most other detachments' dice are vouched to zero (the audit's reading), so even a share of re-rolls beats them.
- The order inside it moved, from the Burst and life rescale: the Defiler rises from 16th to 11th, the Chaos Spawn falls from 10th to 18th, the Noise Marines rise from 14th to 12th.
- Agents of the Imperium: the Deathwatch fall 9% to 13% (Kill Team, Aquila Kill Team, Artemis) with Mission Tactics at a fifth each. The Grey Knights Terminators rise from 8th to 5th.
- Astra Militarum: Born Soldiers' Regiment half now counts against non-monsters and non-vehicles. Combined Arms wins 53% of units: Cadian Recon Squad goes from 34th to 24th, Krieg Combat Engineers from 29th to 21st, Cadian Shock Troops from 14th to 10th.
- Drukhari: they now take their nine detachments. Reaper's Wager wins 75% of units, as the audit expected; Succubus +19%, Haemonculus +7%.
- World Eaters:
- Khârn and Angron lose Wrath of Khorne's +1 AP: Epic Heroes are excluded now.
- Lord Invocatus falls from 9th to 13th (−11%), moving from Vessels of Wrath to Khorne Daemonkin.
Which detachment wins most (share of units at Track A; alone, tied), against the T-690 audit
| Army | Audit (old snapshot) | Now |
|---|---|---|
| Tyranids | Subterranean Assault 58% (30, 2) | the same |
| Space Marines | Ironstorm Spearhead 65% (55) | the same |
| Adeptus Mechanicus | Rad-zone Corps 78% (22, 9) | Cohort Cybernetica 35% (10, 20) |
| Agents of the Imperium | Ordo Malleus 34% (7, 14) | the same |
| Astra Militarum | Designation Force and Siege Regiment 42% (0, 60) | Combined Arms 53% (36, 22) |
| Blood Angels | Rage-Cursed Onslaught 70% (14) | the same |
| Dark Angels | Ironstorm Spearhead 80% (74) | Ironstorm Spearhead 77% (72) |
| Death Guard | four-way tie, 25% each (0, 36) | Tallyband Summoners 76% (19, 17) |
| Drukhari | No detachment 100% | Reaper's Wager 75% (27, 6) |
| Emperor's Children | Coterie of the Conceited 100% (23) | the same (at shares) |
| Genestealer Cults | Xenocult Masses 77% (52, 34) | Final Day 44% (33, 53) |
| Leagues of Votann | Persecution Prospect 61% (5, 17) | the same |
| Orks | War Horde 66% (35, 4) | the same |
| Space Wolves | Saga of the Great Wolf 90% (19) | Ironstorm Spearhead 48% (10) |
| Thousand Sons | Ritual of Regeneration 80% (21, 14) | Changehost of Deceit 32% (5, 24) |
| World Eaters | Brazen Engines and Cult of Blood 35% (0, 21) | Khorne Daemonkin 37% (11, 1) |
Death Guard's tie now breaks toward Tallyband Summoners. Its aura rule names no units and reaches every Death Guard unit, while Paragons (characters), Shamblerot (Poxwalkers) and Mortarion's Hammer (acts once for the army) no longer reach everyone.
Prediction against result
The prediction was written in ledger-steps.md before the run:
- Tyranids within ±1.5: yes, −0.2.
- Space Marines within ±1: yes, 0.0.
- Orks move most from the engine: they lose 2.0. Emperor's Children's +3.6 is larger, and it comes from T-694.
- The armies T-694 touches change their most-winning detachment: yes, in eight armies. Emperor's Children's Coterie still wins.
- Pooled within ±1: yes, −0.1.
Benchmarks and the fingerprint
- No saved setting's fitted numbers clearly stop fitting: Tyranid list scores move by 0.2 at most, and the exam's comparisons between settings are unchanged to a tenth.
- tests/fixtures/ledger-dials-fingerprint.json was re-recorded: all 17 hashes move, the configs do not. There is no recording tool, so the test's own hash function was run on the rebuilt Tyranid ledger.
- The dated checks still pin the old Tyranid numbers, as T-686 did for the Marines:
- the step-6 baseline fingerprint;
- the T-600 check's saved Auspex ρ;
- the benchmark picker's saved ρ and the Biovores' top 10%. They now read the Tyranid ledger as it was at a715b05c8b through git (tests/unit/ledger-before-t687.js).
Doubts
- The fingerprint was re-recorded on this PC, where three of its hashes (secondaryVP, missionVP, vpLedger) already differed before any change. CI or another machine may disagree on those three.
- The shares are our assumptions, each written in the rule's
pickNote:- Coterie of the Conceited assumes one step a round.
- Master of Wolves splits Ferocious Strike's Lethal and Sustained half each, where a player picks per fight.
- Try Dat Button! is taken as two dice, with no hazard roll.
- Blood Tithe's abilities stack in the game but count one at a time here.
- The front door's earlier exam numbers (B + four dials 59.5, trio 61.4) were measured before T-681. On the old snapshot at today's tip they reproduce as 59.3 and 61.1, and those are the "before" here.
Commands:
- the freeze:
node tools/ledger-inputs.js --freeze 8eb69bc7af --keep eb3590a --keep-files … --built-json …; - the chain in design/ledger-start-here.md section 4 for Tyranids and Space Marines, then
node tools/ledger-all.js; - the measurements:
node tools/exam.js(2,000 draws, seed 1),node tools/ledgerstep.js --base <setting>,node tools/diagnose.js --base <setting> --on cpRefile(its off side),node tools/detaudit.js --no-hand.