Phase 1 (reports/tiers/2026-10-05-army-rules.md) catalogued every army rule and proposed eight dials. This step merges the four armyfx.json corrections, re-freezes the ledger's inputs, builds five of the dials (each 0 = today exactly) and measures each alone. Rules read on Wahapedia's 11th-edition pages in the sense of BSData 374f505; nothing here is their wording. Tools: tools/armyburst.js (the Burst variants), tools/armymeasure.js (held out and placebo), tools/exam.js (intervals). Numbers: build/t695/ (git-ignored), reproduced by the commands at the end.
The short answer
- Phase 1 was right about the ledger as built. The code path exists, as the T-687 builder said, but no army-rule effect of the 16 armies reached a form's dice (table below). The corrections put the first one in: Death Guard's −1 Toughness in melee.
- The corrections move Death Guard only: 53.4 → 54.6 on its 11th-edition list. Every other army and the Tyranids are unchanged to the bit. New snapshot: code d8b5a1bb14, data kept at eb3590a, inputs hash c5e7d85b43f8.
- One dial is worth taking into the cascade: armyEnabler. It adds +0.3 pooled at 1 [+0.0, +0.8], its placebo −0.04, and Thousand Sons +4.9 (the Cabal casters, toward the reviewers). armyOrders is a smaller second: Astra Militarum +1.2, pooled +0.1, placebo −0.18.
- The other three don't earn their place game-wide. armyMarks is no better than its placebo (+0.04 against +0.05). It helps the Space Marines, Blood Angels and Dark Angels but costs the Space Wolves and Thousand Sons. armyRounds costs the World Eaters 2.3, as phase 1 predicted. armyStates costs Death Guard and Drukhari more than it gives the Orks.
- The held-out design can't judge a one-army dial. When the army sits in the 5 held out, the 10 choosing armies never see the dial work, so the strength chosen is 0 and the held-out gain is 0. That is why four rows read 0.00 there; the per-army rows with intervals and the placebo carry the evidence.
- The Tyranids are unchanged by every dial (82.4 on the three 11th-edition lists, 79.1 on all five): no Tyranid rule has a table entry or variant.
The conflict: does the ledger apply army-rule dice?
tools/ledger.js formEffects takes the rules a datasheet lists (DetFx.armyRules with kindfx.json's patches) and passes each effect through matrix.js unitLevel, so an unconditional, non-choice, unmarked effect would apply. None of the 16 armies had one. Effect by effect, on the snapshot before this step (31 effects):
| Army | Effects | Fate |
|---|---|---|
| Tyranids | Synapse's +1 S in melee | dropped: the rule is an aura from a keyword (reaches others only); Synapse enters as the synapse kind |
| Space Marines (and the three chapters) | Oath's re-roll hits; +1 to wound (Codex) | dropped: a chosen target (unitLevel) |
| Adeptus Mechanicus | Protector's +1 BS and −1 to be hit; Conqueror's +1 WS and +1 AP | dropped: a choice's options (ARMY_PICK null) |
| Astra Militarum | the four Orders | dropped: a choice's options |
| Death Guard | −1 Toughness; Skullsquirm's −1 to be hit; Rattlejoint's +1 AP | the first switched off; the Plagues a choice |
| Leagues of Votann | the footings' +1 to hit (2); −1 to be wounded | dropped: a choice's options (and vouched) |
| Orks | the riled 5+ invulnerable save | dropped: vouched, counted never met (v4walk none) |
| Thousand Sons | the four ritual effects | dropped: a choice's options (and marks) |
| World Eaters | the nine blessing effects | dropped: a choice's options |
T-672's armyPick puts a choice's first option in, only in tools/burst.js --army-pick's file (none built today). The Drukhari's Pain and the Orks' riled dice live in unitfx.json and leaderfx.json, vouched, so they never applied either.
After the corrections: Death Guard's −1 Toughness in melee is now unconditional and applied. Its ranged half, the Plagues and the other three corrections sit in a choice or are vouched, so they change no ledger number.
The corrections and the snapshot
- docs/data/armyfx.json: the four corrections from tools/armyrules-draft.json.
- The Cabal's Destiny's Ruin and Twist of Fate apply to ranged attacks only.
- Doctrina's Battleline halves are a BATTLELINE unit keyword, plus a 6" aura named in
when.aura. The aura's carriers are kept asauraOffor later. - Nurgle's Gift's −1 Toughness and Rattlejoint Ague apply unconditionally in melee and are vouched at range. Skullsquirm Blight applies in melee, and a vouched cover against an Afflicted shooter is added.
- Fortify Takeover's wound penalty now needs Strength above Toughness.
- docs/data/kindfx.json: the Death Guard patch on the old "−1 Toughness (as +1 S)" label matched nothing after the merge, so it is dropped (the effect is written as −1 Toughness now).
- The calculator: army effects still start off (detfx.js armyEffects). tests/browser/kinds.test.js now uses the ranged half for a boltgun, and tests/unit/vocab.test.js expects the two halves. kinds (11), detachments (7) and bestmatch (2) pass. marks has 1 failure, the same before the change.
- Re-freeze:
node tools/ledger-inputs.js --freeze d8b5a1bb14 --keep eb3590a --keep-files "docs/data/index.json,reports/tiers/panel/*.json" --built-json <T-687's three built files>. armyfx.json had no commit since eb3590a other than this one, so no dataslate change rides along. Only armyfx.json and kindfx.json differ from the old lock, which is kept as tools/ledger-inputs.lock-8eb69bc7af.json. The old rankings.json build stands, because build_rankings.js reads no army rule. - What moved (Track A, dials at 0): Death Guard 53.4 → 54.6. All 36 units moved: Lord of Contagion 6th → 4th, Poxwalkers 3rd → 2nd, Plague Marines 7th → 5th, Blightlord Terminators 26th → 20th; the heavy blight launcher drone and the Plaguecaster fall two places. No other army's unit moved. The pooled exam on 15 armies goes 59.1 → 59.2.
The dials (docs/lab/ledger/ledger.js, design/ledger.md section 38)
The three Burst dials read burstFx, which tools/armyburst.js writes and ledger-merge merges. That file holds each solo form's Burst again with the rule taken (tools/burst.js --field --army-variant). They act on Track A's Burst (burstKill on), as armyPick does, and only on attacks.
- armyMarks m. Burst + m × odds × (mark − Burst). The mark variant takes a chosen target's effects as met: Oath of Moment with its unit and detachment riders, and the Cabal's two rituals for every Thousand Sons unit, not just the casters who list it. The odds are 30/36 for the Cabal's test and 1 otherwise. The mean gain is +57% for the Space Marines (Codex +1 to wound), +26% for the Dark Angels and Space Wolves, +21% for the Thousand Sons and +13% for the Blood Angels.
- armyRounds r. A rule's options at their odds, in place of none.
- World Eaters: both Martial Excellence and Warp Blades in 58% of rounds, Warp Blades alone 29%, Martial Excellence alone 10% (phase 1's simulation).
- Adeptus Mechanicus: Protector at the army's ranged share of Burst, Conqueror the rest.
- Death Guard: Rattlejoint Ague all game.
- armyStates s. States the ledger counts never met, at share s: riled up and the Waaagh! (Orks), Empowered (Drukhari), Afflicted at range (Death Guard).
- armyEnabler w. A unit that switches a rule on gains w × 50 points × P ÷ its points, P being the army's median reference Value per 100, as the character dials. Each group's slots saturate: only its best units by reference Value get the credit.
- The Cabal's 12 casters: four slots.
- The six Ork bosses who rile up: one slot.
- Ghazghkull and the Stompa: one slot.
- Angron and the Lord of Skulls: one slot.
- armyOrders w. Each of the 14 officers gains w × 20 points × its Orders a turn × P ÷ its points (tools/armyrules.json ORDERS; Lord Solar Leontus counted as 2).
Not built: armyAura, armySpawn, armyMove.
- armyAura: Doctrina's Battleline aura is half defence, and the Wulfen's is OC, so a Burst variant sees neither. It needs a Soak variant and the OC line, and phase 1 expected the Wulfen half to move away (−44).
- armySpawn: Cult Ambush needs the Spawn line's Resurgence budget, a new model. Phase 1's misses are mixed (−0.3, +12.6).
- armyMove: advance-and-charge needs a new input to charge.js and the charge chain re-run for two armies. Phase 1 expected a cost (Emperor's Children's melee −8.4, Orks −5.1).
Measured (each alone over Track A, 11th-edition lists, wCarry 0)
Strengths 0, 0.25, 0.5 and 1. "Held out": 3 seeded splits of the 15 armies, choosing the strength on 10 and scoring the gain on the other 5; the mean of the three folds ± their sd. Placebo: the same credit given to random units of each army, 3 draws. For a Burst dial, each unit's relative gain goes to another unit of its army; for a credit dial, the tables' units are swapped for as many random others. The placebo is chosen and scored the same way. Per-army Δ at 1 carries the exam's 95% interval (2,000 draws, seed 1).
| Dial | Pooled Δ at 0.25 / 0.5 / 1 | Held out ± spread (strengths chosen) | Placebo held out | Placebo at 1 | Tyranids | Per army at 1 [95%] |
|---|---|---|---|---|---|---|
| armyMarks | −0.07 / −0.10 / +0.04 | 0.00 ± 0.00 (0, 0, 0) | +0.01 | +0.05 | 0.0 | SM +0.7 [−1.9, +3.5], BA +1.6 [−5.5, +9.1], DA +1.4 [−0.7, +3.9], SW −2.1 [−10.3, +5.4], TSons −1.0 [−6.9, +4.2] |
| armyRounds | −0.01 / −0.00 / −0.14 | 0.00 ± 0.00 (0, 0, 0) | +0.01 | −0.32 | 0.0 | AdMech −0.9 [−6.3, +4.2], DG +1.1 [−2.3, +4.5], WE −2.3 [−7.4, +2.4] |
| armyStates | −0.03 / −0.03 / −0.11 | 0.00 ± 0.00 (0, 0, 0) | −0.07 | +0.04 | 0.0 | DG −1.7 [−5.5, +1.3], Drukhari −1.4 [−5.0, 0.0], Orks +1.5 [−0.9, +5.2] |
| armyEnabler | +0.16 / +0.28 / +0.33 [+0.0, +0.8] | +0.17 ± 0.24 (1, 1, 0.25) | +0.01 | −0.04 | 0.0 | TSons +4.9 [+0.0, +11.7], Orks +0.2 [−1.1, +1.5]; WE 0.0 |
| armyOrders | +0.03 / +0.06 / +0.08 [−0.1, +0.3] | 0.00 ± 0.00 (1, 0, 1) | 0.00 | −0.18 | 0.0 | AM +1.2 [−1.8, +4.1] |
Track A: 59.2 pooled over 15 armies; Tyranids 82.4 on the three 11th-edition lists. The exam at strength 1 on all five dials is in build/t695/exam.md.
Who moved (strength 1, Track A ranks).
- armyEnabler: Ahriman 22nd → 10th (A), Rubric Marines 7th → 1st (S), both Daemon Princes up 3 to 4 places; Beastboss on Squigosaur 11th → 7th, Ghazghkull 12th → 9th.
- armyOrders: officers jump, too far at 1, since a cheap officer's credit is large against its own Value. Commissar 69th → 57th, Ursula Creed 68th → 55th, Lord Marshal Dreir 47th → 12th, Gaunt's Ghosts 51st → 32nd.
- armyMarks: the Space Marines' characters rise with their Oath riders (Ancient, Phobos officers). Fenrisian Wolves and Wulfen rise against their B letters. In the Thousand Sons, Rhinos and Horrors rise beside the Sorcerers.
- armyRounds: World Eaters' Goremongers, Rhinos, Spawn and Jakhals rise. The daemons and engines without the Blessings fall about 10% (the army's median moves), against their A and S letters.
- armyStates: the Ork aircraft rise (Waaagh!-conditioned dice), toward their B letters. Death Guard's Miasmic Malignifier and Rhino rise, away.
Prediction against result
- The corrections move Death Guard only, toward: right, +1.2.
- armyMarks, Marines' level up, order barely moving: partly. The Space Marines, Blood Angels and Dark Angels gain +0.7 to +1.6, but the Space Wolves lose 2.1.
- armyMarks, Thousand Sons toward: wrong, −1.0. The marks lift Rhinos and Horrors, not just the underrated Sorcerers.
- armyRounds, World Eaters away and less than armyPick's −2.2: right on direction, about the same size (−2.3). Adeptus Mechanicus near 0 (−0.9) and Death Guard near 0 (+1.1).
- armyStates, Death Guard toward: wrong, −1.7. Drukhari small: −1.4. Orks away: wrong, they went toward (+1.5).
- armyEnabler, Cabal casters and Ork bosses toward: right, Thousand Sons +4.9 and Orks +0.2. Angron and the Lord of Skulls away: no visible change (World Eaters 0.0).
- armyOrders, officers toward: right, +1.2.
- Tyranids unchanged: right.
- Likeliest to hold out (enabler, orders): right, they are the two above their placebos.
For the cascade
- Keep armyEnabler at 0.5 to 1: +0.28 and +0.33 pooled, placebo at or below 0. It is not in crack2core's fast path, but it is linear in w at fixed sliders (P and the slots don't depend on it), so it can join as a fast dial: precompute each form's credit at w = 1.
- armyOrders at 0.25 to 0.5 as a small extra: Astra Militarum only; at 1 the cheap officers overshoot. It is linear in the same way, so it could be a fast dial too.
- Leave armyMarks, armyRounds and armyStates at 0 game-wide. They act on the Burst view, so in crack2 each strength would be a model rebuild, not a fast dial. If the cascade wants army-level settings:
- armyMarks helps the three Marine armies and costs the Space Wolves and Thousand Sons;
- armyRounds helps Death Guard and costs World Eaters, the cascade's first army: keep it at 0 there;
- armyStates helps Orks only.
- World Eaters: no dial built here helps them. Enabler 0.0; rounds −2.3.
- Tyranids: none touches them.
Doubts
- Burst is attack only, so each variant's defensive half is missing:
- Skullsquirm Blight and Protector's −1 to be hit;
- the Orks' 5+ invulnerable save while riled;
- Fortify Takeover.
- armyStates puts every state's share at one game-wide s. The Drukhari's Pain tokens are a budget phase 1 asked to allocate best-first; this treats them as a share.
- Death Guard's Rattlejoint Ague at range needs both a pick and a state, so it is in neither variant.
- The enabler and Orders sizes (50 and 20 points) are stated, not measured, as the character dials' 50 is. Lord Solar Leontus's Orders are taken as 2.
- Held out by army can't judge a dial that touches one or two armies (above). A within-army split, such as one unit fold or one list left out, would.
- The marks variant counts the mark as met on every target. m is the share of a unit's Kill that goes into the marked unit, not a probability.
Commands: node tools/armyburst.js --army <a> (or tools/ledger-all.js, whose chain now runs it), node tools/ledger-merge.js --army <a>, node tools/armymeasure.js --json build/t695/measure.json --write-candidates build/t695/cand (about 2 minutes), node tools/exam.js tools/ledger-benchmarks/2026-10-05-step34b-baseline.json build/t695/cand/<dial>-1.json … --md.