Tactical Reroll
⋯

The bug-fix snapshot, and Track A2 as the ledger's benchmark (T-745)

From reports/tiers/2026-10-06-bugfix-snapshot.md , rendered when the site is built.

6 Oct 2026, Pacific. Jordan, 6 Oct: "go ahead with all of those, in the most sensible order". The two bugs are T-737's (reports/tiers/2026-10-06-death-guard-checks.md). The new frozen snapshot is code b3c416933e with the data kept as at eb3590a, BSData 374f505 (pre-dataslate), inputs hash 1b88e955b9b3; the old one, 8dcd24032d / dcd477d8a78c, stays reproducible through tools/ledger-inputs.lock-8dcd24032d.json. The scores come from tools/recipestep.js (its protocol, as in T-739) and the consensus score of tools/cascade2.js. The scratch numbers are in build/recipe/ (git-ignored). The live site's rankings don't read the ledger and are untouched.

In plain English

1. What changed, input by input

InputMoved?Why
docs/data/unitfx.jsonyes44 heal rules that bring slain models back to a unit carry returns: true (our words in its meta.kinds.returns).
docs/bsdata.jsyesT-723's reader of BSData's "cannot have both" errors (one model can't carry the pair). It was already on the branch; T-745's re-freeze is what brings it in.
build/units.jsonyesRebuilt at 374f505 with that reader: 10 datasheets gain an excl pair and nothing else (checked field by field).
The other 24 (ev.js, loadout.js, detfx.js, roster.js, armyfx, kindfx, leaderfx, mortalfx, tierfx, index.json, detachments.json, rankings.json, the panels, deployments, field names, the step-1a field)noSame sha256 as the T-715 lock. The three built files are the same T-687 builds.

node tools/ledger-inputs.js --drift lists the same eight kept or built files before and after the re-freeze. Before the re-freeze it also listed docs/bsdata.js and docs/data/unitfx.json; after it, it doesn't.

The ledger's own code (live, not frozen) changed in three places:

That last change keeps the yardstick as it was. The rebuild would otherwise have merged the 25 GEMINI AGGREGATE lists and the Auspex Tactics Orks candidate as reviewers, because they arrived after T-715's build. Every army's reviewers now match the T-715 ledgers, list for list.

2. Fix 1: models returned are not heals

The bug (T-737). The ledger read every unitfx.json heal as "heals or returns models" and multiplied the form's whole Value by r.heal (×1.805 in Track A). For a rule that brings back a few cheap bodies, that is the wrong shape.

The fix. It is a new kind, not a new line: "Returns slain models" (r.return on the page, × 1 unless set).

Marked returns (44 rules; the 16 ledger armies' first):

Every unit whose Value moved, Track A (rank and Value before → after):

ArmyUnitRuleRankValueReviewers
Death GuardPoxwalkersCurse of the Walking Pox2 → 17 of 361,532 → 849B
Genestealer CultsAcolyte Hybrids with AutopistolsCult Icon3 → 8 of 903,129 → 1,733A / A
Genestealer CultsHybrid MetamorphsCult Icon8 → 162,146 → 1,189B / A
Genestealer CultsNeophyte HybridsCult Icon9 → 221,879 → 1,041S / A
Genestealer CultsAcolyte Hybrids with Hand FlamersCult Icon17 → 451,292 → 716A / A
Genestealer CultsDeath Korps of KriegMedi-pack21 → 521,105 → 612–
Genestealer CultsCatachan Command SquadMedi-pack26 → 541,035 → 574–
Genestealer CultsCadian Command SquadMedi-pack46 → 68733 → 406–
Astra MilitarumDeath Korps of KriegMedi-pack9 → 37 of 721,225 → 679A
Astra MilitarumCatachan Command SquadMedi-pack11 → 411,188 → 658C
Astra MilitarumCadian Command SquadMedi-pack29 → 53836 → 463A
Astra MilitarumMilitarum Tempestus Command SquadMedi-pack32 → 55796 → 441S
Agents of the ImperiumSanctifiersSalvationist Medikit2 → 8 of 292,701 → 1,497A
Agents of the ImperiumGrey Knights Terminator SquadNarthecium4 → 121,981 → 1,098C
Agents of the ImperiumExaction SquadArbites medi-kit10 → 171,293 → 771C
Agents of the ImperiumRogue Trader EntourageHealing Serum19 → 23735 → 407B
Dark AngelsRavenwing Command SquadNarthecium (its own)3 → 26 of 931,655 → 917B
World EatersSlaughterboundRage Eternal4 → 19 of 301,353 → 750A (Red Path)
DrukhariHaemonculusFleshcraft16 → 30 of 37810 → 449C
Thousand SonsExalted SorcererRebind Rubricae26 → 29 of 35552 → 306S
Space WolvesWolf PriestHealing Balms19 → 21 of 21523 → 290B

Each fell by the same factor, ÷1.805, and nothing else in these armies moved except by rank. The Space Marines' Apothecary and the Tyranids' Tervigon didn't move: the Spawn line measures their rules. Under Track A2 the moves are the same within a place or two (Poxwalkers 2 → 16, Neophytes 13 → 28, Acolytes with autopistols 4 → 11).

3. Fix 2: the wargear rules

One model (T-723, in docs/bsdata.js and so in build/units.json). These ten datasheets gain a pair one model can't carry:

loadout.js already respected such pairs. Of the ledger's best forms, only the Helbrute's broke one.

Squad-wide (T-724 isn't built, so the ledger's own Auto-equip enforces the rules, in SQUAD_SAME). One option family per squad:

Each bound kind of model is split into one copy per family, as docs/loadout.js's packages, so no squad can mix them.

UnitSizeAuto-equip beforeAfterTrack A rank, Value
Death Guard Helbrute1hammer + power scourge (illegal)fist, heavy flamer, hammer11 → 9 of 36, 1,058 → 1,081
Brôkhyr Thunderkyn31 bolt cannon, 2 conversion beamers (illegal)3 conversion beamers5 → 4 of 22, 1,124 → 1,517
Brôkhyr Thunderkyn62 bolt cannons, 4 beamers (illegal)6 conversion beamers(not its best size)
Cthonian Beserks106 mauls, 2 axes (illegal)8 maulsbest form (5) unchanged, 3rd
Yaegirs, Aggressors, Headtakersallalready one familyunchangedunchanged

The other Votann units shift by a few points, because role scarcity is measured within the army and the Thunderkyn now kill more. Thousand Sons' and World Eaters' Helbrutes have no such rule and didn't move.

Still open (T-724):

None of them changes a best form in the 16 ledger armies today (T-737's check).

4. The scores, before and after

The consensus score is tools/cascade2.js's: pairs every 11th-edition list agrees on, or a single list's own pairs. Ties and missing units count wrong. "Before" is the T-715 snapshot's ledgers; "after" is this one.

Army11e lists, pairsTrack A beforeafterTrack A2 beforeafter
Tyranids (not in the exam)3, 58389.589.590.490.4
Space Marines2, 1,51562.162.161.961.9
Adeptus Mechanicus1, 32271.471.470.570.5
Agents of the Imperium1, 22356.163.260.166.4
Astra Militarum1, 1,31967.669.869.471.3
Blood Angels1, 12461.361.369.469.4
Dark Angels1, 2,32553.753.553.853.7
Death Guard1, 47655.056.556.157.8
Drukhari1, 20758.060.961.463.8
Emperor's Children1, 19169.669.669.669.6
Genestealer Cults2, 11255.449.155.449.1
Leagues of Votann1, 10561.061.061.061.0
Orks1, 60663.563.566.266.2
Space Wolves1, 14050.750.045.045.0
Thousand Sons1, 30938.237.541.440.8
World Eaters3, 21976.773.577.274.4
Pooled, the 15 exam armies60.060.261.261.4

The exam's own score (each army's 11e lists' mean pairwise) gives the same picture.

5. Track A2 on the new snapshot (tools/recipestep.js)

YardstickHeld-out gain over Track A [units] {armies}Up / down (not falling)Leave one out
Human lists, before (T-739)+1.2 ± 0.8 [−0.4, +2.6] {−0.3, +2.6}9 / 4 (11)+1.2
Human lists, after+1.1 ± 0.7 [−0.3, +2.7] {−0.3, +2.5}10 / 3 (12)+1.1 [−0.3, +2.7]
Gemini at half, after+1.0 ± 0.8 [−0.3, +2.5]10 / 4 (11)+1.0
Shuffled letters, seeds 11 / 12 / 13, after−0.0 / −0.4 / +0.2−0.0 / +0.2 / +0.3

All 9 folds pick step 41. Keep rule (T-739, unchanged): a positive gain, the interval's low end above −0.5, and 9 of 15 armies not falling. It passes. Track A2 (tools/ledger-benchmarks/2026-10-06-step41-stable.json) is now the ledger's benchmark. Track A stays as the base it is measured against, and as the fingerprint's base.

6. The prediction (ledger-steps.md, row snapshot-745, committed before the rebuild)

Right:

Wrong:

Doubts