Tactical Reroll
⋯

How we score: every factor, formula and constant

How we score: every factor, formula and constant, live and proposed, the known gaps and the changelog. From design/scoring.md, rendered when the site is built.

The canonical spec of Tactical Reroll's maths (T-535). The public summary is /about/'s "How the scores work"; this note is the long version, for anyone who wants to check our working. Everything here is our own words and our own numbers: no Games Workshop rules text. A change to tools/build_rankings.js, tools/targets.js or an effects file (detfx, leaderfx, unitfx, armyfx) updates this note in the same commit, and tests/unit/scoringdoc.test.js fails if a target, attacker, Utility part, trait, job or delivery constant in the code isn't named here.

Live means it's what the site publishes today. Proposed means it's under test in the Lab (T-523, Tier system v2) and not on the site.

1. One attack, and the table we play on

One attack (live). An attack hits on its BS or WS, wounds by comparing Strength with Toughness (twice the Toughness or more: 2+; more: 3+; equal: 4+; half or less: 6+; otherwise 5+), and is saved on the better of the armour save worsened by AP and the invulnerable save. Each unsaved wound does its Damage. Feel No Pain then ignores each point of damage on its roll. Damage beyond what a model has left is lost; it doesn't spill to the next model. Weapon abilities change the chances along the way: Lethal Hits, Sustained Hits, Devastating Wounds, Anti-X, Twin-linked, Torrent, Blast, Heavy, Rapid Fire, Melta, Lance, Ignores Cover, Psychic, Hazardous. Each keyword is read whole, the way the data spells it (T-582): an ability followed by keywords counts only against a target that meets them ("Lethal Hits: non-Monster/Vehicle" against neither a MONSTER nor a VEHICLE; "Sustained Hits 2: Monster/Vehicle" against either); Anti-X takes a slash list and "non-" the same way, with or without its hyphen or its "+"; Blast X and Cleave X add X attacks for every five models in the target (Cleave on the one target we always pick); Sustained Hits D3 rolls its extra hits on each critical hit, and Rapid Fire D3 or D6+3 rolls its extra attacks at half range; "Twin Linked" is Twin-linked; Conversion makes hit rolls of 4+ critical hits beyond 12" (read as beyond half range: every Conversion gun reaches 24" or more); Psychic Assassin makes 6 attacks against a PSYKER and isn't Psychic; Overcharge fails its hazard roll on 1 to 4. Not read, because they aren't dice: Harpooned (a charge bonus), Reverberating Summons (models returned to another unit), Linked Fire (measuring from another Fire Prism), Plasma Warhead (how the Deathstrike picks targets), Defensive Array and Hive Defences (Overwatch for no CP).

Two engines that agree (live). The calculator rolls the dice (app.js rollSingleSequence, thousands of runs). The rankings use exact averages (docs/ev.js), which walk the whole spread of unsaved wounds through the target's models, so "one unsaved wound against a 2-wound model" kills nothing on average. The unit tests hold the two together (tests/unit/ev.test.js, volley.test.js).

The neutral table (live), the same for every unit (tools/targets.js OPTS):

AssumptionValueWhy
CoveroffCover changes with the table and the turn. Off is the comparable baseline; the calculator lets you turn it on. Cover worsens the attacker's BS by 1 in 11th edition.
Heavy weapons stationaryonA unit with Heavy weapons is usually placed to shoot without moving.
Within half rangeoffMost shots in a game come from beyond half range, so Melta and Rapid Fire don't get their bonus. Proposed V2b changes this per unit (section 6).
One Shot weaponscount a fifthOnce in a five-round game.
HazardouspricedEach Hazardous weapon used risks mortal wounds to its own unit (fails on a 1 or 2). That cost is weighed in points per wound against the target's.

2. The archetypes

Targets (live, tools/targets.js TARGETS): stand-ins for what an army has to kill. Each is matched to a real unit in the calculator (app.js STAND_INS, kept in step by tests/unit/standins.test.js). Each has equal weight today; under Lenses (T-531) the weights would follow the meta.

KeyLabelProfileStands in for
chaffGEQ10 × T3 Sv5+ W1 infantrylight infantry (Cadian Shock Troops)
meqMEQ5 × T4 Sv3+ W2 infantryMarines (Intercessors)
teqTEQ5 × T5 Sv2+ 4++ W3 infantryTerminator-class elites
lvLight vehicleT10 Sv3+ W12light vehicles and monsters (a Gladiator Lancer)
hvHeavy vehicleT12 Sv2+ W16battle tanks (a Land Raider)

Attackers (live, ATTACKERS): the profiles units get shot and hit with, per hit.

KeyLabelProfile
smallSmall armsS4 AP0 D1 (bolter, lasgun)
specialSpecialS5 AP-1 D1 (heavy bolter-class)
plasmaPlasmaS8 AP-2 D2 (plasma, power fist)
eliteEliteS6 AP-2 D3 (elite melee, precision)
atAnti-tankS12 AP-3 D6 (lascannon, melta)

Proposed (T-529). Swap the heavy vehicle for a big target with an invulnerable save (T11 Sv3+ 4++ W18), add a tough horde (10 × T5 Sv5+ W1), and add a mortal-wounds attacker (D2, ignores saves, Feel No Pain still counts). Weights stay equal. In the test this raised agreement with list share from 0.119 to 0.147. Weighting the archetypes by the meta lowered it, to 0.088.

3. The live scores

Each unit is scored at its smallest size and its points, among every non-Legends unit (the pool).

4. Effects: leaders, detachments, units' own abilities, army rules

Each file holds what a rule does to the dice, in our own short words and numbers, never its text. Each effect has:

FileWhat it holdsCount (2 Oct)
data/detfx.jsondetachment rules (T-128); since T-541 (Tyranids first) each rule's status and kind, the enhancements as upgrades (enhancements: points, who, effects; not read by the calculator or the letters) and the stratagems by name275 detachments in 21 armies, 227 effects
data/leaderfx.jsonwhat a joined character does for its unit (T-145)368 characters in 32 armies, 296 effects
data/unitfx.jsona unit's own abilities (T-384; every Tyranid datasheet since T-541, each rule with a status, a kind for what isn't dice and why it can't be yet)1674 units in 36 armies, 1435 effects
data/armyfx.jsonarmy rules (T-530, filled army by army by T-542); the calculator loads it with unitfx.json since T-540 for its heals (Reanimation Protocols reaches a unit whose datasheet lists it)Tyranids, Necrons, Custodes, T'au, Emperor's Children, Orks
data/kindfx.jsonthe numbers behind the coverage files' heal and mortal rules, and the effects of auras noted in words (T-540); since T-545 effects for noted rules in the new vocabulary, patches by label, reach for army rules, keyed like them (file, army, owner, rule); a rule that carries the field itself wins, so an entry goes once the coverage files write itheals: 5 Tyranid and 3 Necron datasheets, Reanimation Protocols; mortal wounds: 10 Tyranid and 4 Necron datasheets; aura effects: 2 Tyranid datasheets
data/mortalfx.jsonmortal wounds a unit deals without a weapon, as expected mortal wounds per use against each target (T-524 round 3, proposed, not loaded by the site)83 datasheets in 27 armies
data/tierfx.jsonrules that aren't dice, as the tier test plays them (T-524 round 5, proposed, not loaded by the site): arrival, enemy, shock, aura, spawn, cp, oneUse, chosen and proposed dice effectsTyranids only: 30 datasheets
reports/tiers/2026-10-02-mortals.jsonthe first build session's per-round mortal-wound estimates for V3 (round 3)34 abilities

5. The best-loadout solver (live, docs/loadout.js)

6. Tier system v2 (proposed, not live)

Tested in the Lab: reports/tiers/, made by tools/tiertest.js, tools/banner.js, tools/archetypes.js. The letter and the job tag would be what counts. Offense and Defense stay the published raw pair under any version.

One army until the variables are found (Jordan, 2 Oct, via the supervisor): "For the purposes of ironing this out, stick to Tyranids until we can identify all the variables." The tier work now iterates on Tyranids alone, judged by the Auspex panel list, Tyranid list share and Jordan's own reading (he plays Tyranids, so he can say when a number is wrong); each missing variable is named and modelled one at a time until the Tyranid table is explained. The Space Marine and Ork panels run only as a check at the end of a round, never to steer it.

The four jobs. The names are Jordan's, our own words, not GW keywords. Each job is a percentile over the pool.

Composite and letters.

V2b's delivery model (tools/tiertest.js V2B). A five-round game on a 44" × 60" table.

ConstantValueWhy
GAP30"Deployment zones are 24" apart, and units set up a little back.
INFIL9"Infiltrators set up 9" from the enemy.
SCOUT6"A Scouts move before the game.
DS9.5"Deep Strike arrives on turn 2, just over 9" away.
ENEMY3" a turnThe enemy closes too, as both armies contest the middle.
TRANSPORT10"Infantry in an army with Transports rides this far on turns 1 and 2. A transport shortens a melee unit's charge, so it gets more fighting turns, and it shields the unit from shooting on the way, so more survival. Both are turns-in-range and durability terms.
OW_TURNS1/3Overwatch fires on a third of enemy turns from turn 2. It hits on 6s, a quarter of a 3+ hitter's damage, or in full with Torrent.
ROUNDS5A game's length.

V3: delivery modes, the bundle and the round-3 fixes (T-538, proposed; Jordan, 1 Oct (Pacific), via the design session). tools/tiertest.js V3. V2's four jobs; Hammer is damage delivered before death, as in V2b, but each unit is scored under every way it may legally reach the fight and keeps the one with the best composite. The unit page would say which: "S · Hammer, by Deep Strike" or "Best delivered by Rhino (+34% Hammer, 215 pts together)".

If the bundle doesn't beat the unit alone, the transport isn't part of the unit's story. Who may ride what is read from BSData's capacity lines at run time (tools/transports.js): the capacity, the keywords a passenger needs, the models it can't carry, and the ones that take two or three spaces. Nothing is stored. Only Dedicated Transports form bundles: a Land Raider or Battlewagon is a unit in its own right, scored alone, and bundling it handed every passenger the big tank's guns. Characters aren't bundled: they ride with the squad they join. Allies are skipped for now.

The standard table (distances, from the 11th-edition Chapter Approved 2026-27 mission deck and core rules on Wahapedia, read 2 Oct; no terrain):

ConstantValueWhy
V3C.GAP30"Units start 30" apart on a 44" × 60" table: deployment zones 24" apart, units set up a little back.
V3C.INFIL12"Infiltrators set up more than 8" from the enemy's deployment zone, and the enemy stands a few inches inside it.
V3C.SCOUT6"A Scouts move before the game (BSData doesn't give the distance for most units).
V3C.DS9"Deep Strike arrives more than 8" from every enemy unit.
V3C.RES18"Strategic Reserves arrive within 6" of a table edge, more than 8" from the enemy; typically about 18" from the unit they're after.
V3C.ENEMY3" a turnThe enemy closes too.
V3C.ADV3.5"A unit still out of range advances (the average of a D6).
V3C.OW_TURNS1/3Overwatch fires on a third of enemy turns, as in V2b.
V3C.ROUNDS5A game's length.
V3C.SHIELD1 roundA unit inside a transport can't be shot on the turn it rides.
V3C.BELOW0.35The share of a game a unit spends below half strength, where Battle-shock bites (fix c).
V3C.CAP_PER6 modelsFix (d)'s scale: a transport's Banner counts its capacity ÷ 6, at most 2.

The round-3 fixes (each switchable in the tier test, measured on its own):

Result (2 Oct, T-524 round 3). V3 (every term but d) fits list share at ρ 0.164: V2 0.127, V2b 0.087, V1 0.174. Within the army: Space Marines −0.18 (the least wrong of every system), Orks 0.18. Under V3, 579 units walk, 220 Deep Strike, 233 use Strategic Reserves and 129 ride a Dedicated Transport. reports/tiers/2026-10-02-round3.md.

The Context rule (T-539, a design rule for v2; Jordan, 1 Oct (Pacific), via the design session).

V2c: V2b with round 3's six steps (T-524 round 3, 2 Oct, tested, not live). tools/tiertest.js --round3; the report is reports/tiers/2026-10-02-space-marines.md, "Round 3". Each step was measured on top of the last:

V4: the two strands merged, Runner's points gate, solo characters and step g (T-524 round 4, 2 Oct, tested, not live). tools/tiertest.js --round4 (inside --round3's run); the report is reports/tiers/2026-10-02-space-marines.md, "Round 4", and reports/tiers/2026-10-02-tyranids.md. Every part is a switch, measured by leaving it out.

V5: eight variables, Tyranids first (T-524 round 5, 2 Oct, tested, not live; Jordan's variables, via the supervisor). tools/tiertest.js --round5 (inside --round4's run) with --colist (tools/colist.js's counts of units listed together in winning Tyranid lists, grimstat-corpus, CC BY 4.0); the report is reports/tiers/2026-10-02-tyranids.md, "Round 5". V4 plus eight switches, each measured alone and stacked, on the Tyranid units only. Each run ranks the Tyranid units against one all-units run at its scale: the switches that rescale every unit (1, 3, 9) rescore the pool; the others are Tyranid rules ranked against V4's pool. With every switch off it reproduces V4 exactly.

  1. Survival absolute (Jordan: incoming fire from a typical army turn doesn't scale with the unit's cost). Turns alive come from each attacker's hits to destroy the unit, over half the median unit's, between 1 and 5, as V2's, not from hits per 100 pts. Damage stays per point. It's used in Hammer's delivery, Runner's survival and the Battle-shock share; Anvil stays per point.
  2. Arrival rules (data/tierfx.json arrival). A unit that goes back into Strategic Reserves at the end of its own Fight phase when unengaged (the Red Terror) is off the table in the enemy turn. Its fight ends unengaged when the charge failed or the target died: its melee wounds against the target's total, the five targets' mean. A unit that goes back at the end of the enemy turn (Raveners) has already been shot; it re-arrives only when that beats staying, which in our game it never does. Both reach any objective each round, so Runner's reach part is 100.
  3. A mortal-wound attacker and the meta's incoming fire. A sixth attacker, mortal: V5C.MW_D = 2 mortal wounds a hit, no save. Feel No Pain counts, and Feel No Pain against mortal wounds too (tierfx.json proposed; the Norn Emissary's 4+).
    • The six are weighted by the meta's incoming fire: every weapon on the default wargear of every unit in winning lists, weighted by the lists taking it.
    • Each weapon is sorted by its profile: Damage 3.5 or more, or Strength 10 or more, is anti-tank; Damage 2.5 or more is elite; Damage 1.5 or more is plasma; AP or Strength 5 or more is special; the rest is small arms.
    • Each is weighed by its expected damage into the five stand-in targets. Devastating Wounds' critical wounds and data/mortalfx.json's mortal wounds go to mortal.
    • On 2 Oct: small arms 8%, special 20%, plasma 37%, elite 7%, anti-tank 22%, mortal 6%.
    • The weights apply to turns alive and to Anvil's Defense mean.
  4. Enemy debuffs and Battle-shock pressure (tierfx.json enemy, shock), into Banner as points lent per point of the unit.
    • A −1 to hit on enemies near it touches V5C.NEAR = 50% of the attacks on the unit itself (its own Defense) and on its 2 nearest friends. It's worth 2 × 50% × (4/3 − 1) of the median unit's points; a −1 to wound below half strength adds the below-half share.
    • A forced Battle-shock test fails at the meta's rate: the Leadership of winning lists' units, 36% at no modifier.
    • Each Battle-shocked enemy unit-round is worth V5C.SHOCK = 10% of the median unit: its OC, stratagems and actions for one round of five, about half its round. That's ×V5C.SAB = 2 while the Neurolictor's aura is near (−1 to hit them, +1 to wound them).
    • An army-wide test made one harder (the Neurotyrant's Psychic Terror) counts over V5C.ENEMY_UNITS = 10 enemy units.
    • The rounds a unit spends in range come from its V4 delivery profile. A Lone Operative working from 12" or more counts its turns alive × V2C.LONE.
    • A modelled aura replaces V2c's stand-in for it (tierfx.json replaces).
  5. Buff auras through the engine (tierfx.json aura).
    • The two squads most often listed with the bearer in winning Tyranid lists that it can lift at all (tools/colist.js) are run through docs/ev.js with and without the aura. A squad's lift is on its whole output: the better of shooting and melee into each target.
    • Each squad's lift × its points is lent. An aura on the unit the bearer shot (the Exocrine, the Psychophage) counts V5C.MARK = 50% of two friends' attacks.
    • Synapse (+1 Strength in melee) is credited the same way to every SYNAPSE unit, shared over the Synapse units an average winning list carries (5.7 on 2 Oct).
  6. Leader pairs: each squad's best leader and its lift on the squad's damage (leaderfx.json; the Hyperadapted Raveners' from unitfx.json). Shown, never in the letter (the Context rule).
  7. Detachment context (the Context rule). Each unit is scored under each of its army's detachments (detfx.json) and keeps the best: the ceiling. The floor is no detachment under the Even lens (no meta weights).
    • Dice effects whose condition the engine can't check count for a share of the game: within Synapse range V5C.SYN = 75%; below half strength V3C.BELOW; below Starting Strength the same, for units of more than one model; a Battle-shocked target 20%.
    • A pick made each battle round counts each option for a round in five.
    • Movement and OC rules come from a rule's tier key: arrival "tunnel" (reserves arrive V5C.TUNNEL = 7" away), "advCharge" (charge after an advance), "ds" (Deep Strike for who); oc, protean, upgrade, regen, surge. The Tyranid coverage card (T-541) wrote them under a rule's move key, which V5 doesn't read: renamed to tier they move 15 Tyranid letters and take V5's ρ with Auspex from 0.38 to 0.28 (tunnels and Crusher Stampede's OC most), so the constants behind them come first (reports/tiers/2026-10-02-tyranids-coverage.md). Round 6 reads them (mv, below).
    • Units' own abilities (--own-out, T-541, a report only): each Tyranid unit's dice effects from unitfx.json in every context. Effects marked off are left out, conditions are counted at the shares above (an objective 50%), and Singular Purpose, the enemy-side rules and Feel No Pain against mortals are left to tierfx.json. On 2 Oct it moved one letter (Venomthropes C → B) and left ρ at 0.38.
    • Singular Purpose (the Norns, tierfx.json chosen) runs here because the Talons of the Norn Queen's swap needs it. It's re-roll hits and wounds into the best chosen target all game, or OC 15 and Feel No Pain 5+ on an objective all game; with the swap, half each.
  8. Small fixes.
    • A one-use unit (tierfx.json oneUse) or an immobile one (Move "-", not AIRCRAFT) can't be a Runner or an Anvil.
    • A CP is worth V5C.CP_PTS = 15 pts, so CP gained, saved or cost to the enemy count in Banner. A CP-cost aura replaces its stand-in.
    • A unit that spawns another instead of shooting (Biovores' Spore Mines) spawns on turns 1 to 4 and shoots on turn 5; the better of that plan and shooting counts. It adds V5C.SPAWN = 50% of the spawned unit's own Runner for each round one is on the table.
  9. Banner's smooth start (found this round). Most units lend nothing, so any positive Banner raw ranked above all of them: a 0.04 jumped to the 57th percentile. Below the median positive raw, Banner's percentile now rises in a straight line from 0.

Engine kinds on V5 (T-540, --kinds, tested, not live). The kinds the dice engine now plays, read from the coverage files with kindfx.json's numbers, switched in on top of V5 one at a time and cumulative, on the Tyranid units against round 5's pool; without --kinds V5 is unchanged. The report section is "Engine kinds" in reports/tiers/2026-10-02-tyranids.md.

Every army scored (T-552, --every, tested, not live). Round 5 scored only the Tyranids with their own abilities, kinds and detachments; the pool's other units were bare, so every percentile and quota was set against bare units. With --every each unit of the pool is scored as a Tyranid is, four switches (ev { own, kinds, army, det }), cumulative: its own abilities (unitfx.json, a chapter's from the Space Marines' entry; effects marked off left out; the same condition shares as round 5's variable 7), the engine kinds (heal, mortal through mwkOf, aura on the squads its army's winning lists take most where no co-list counts exist, Damaged X, T-545's vocabulary), its army rules (DetFx.armyRules, a chapter's with the Space Marines' too; Synapse's pilot shape, an aura from a keyword, stays variable 5's; Oath of Moment's Codex +1 to wound only outside the excluded chapters; a rule with a pick takes its best option per target and per attacker, as a leader's options are taken; swapSix goes through ev.js's swapGain) and its army's best detachment (the Context rule: each of the army's detachments detfx.json has, the best composite against the bare pool at the same scale). No constant changes. --own-kinds adds the Tyranids' own abilities and every kind as one row of the Engine kinds table; --v5dump <file> writes every unit's V5 letter, job, jobs, percentiles and detachment. --tyr4-out now keeps hand-appended sections when it regenerates (writeKeeping). Results: reports/tiers/2026-10-02-tyranids.md, "Every army scored"; reports/tiers/2026-10-02-v5-every.json.

Round 6: Jordan's settings and the movement rules (T-557, --round6, tested, not live; Jordan, 2 Oct, via the supervisor). Four switches on top of the every-army run (T-552's end state), each measured alone and cumulative: cp0, tmax, pos, mv. Report: reports/tiers/2026-10-02-tyranids-round6.md.

Round 7: best-only grading (T-559, the r7 switch, --r7json <file>, tested, not live; Jordan, 2 Oct). Round 6b's run with three changes:

Round 8: step grading on fixed cuts (T-560, the r8 switch over r7, --r8json <file>, --r8sliders <file>, tested, not live; Jordan, 2 Oct). Round 7's run (its Feed the Swarm cap and one-drop Tyrannocyte kept) with its grading replaced:

Round 9: Anvil divides by points once, a survival gate, three panels (T-562, the r9 switch over r8, --r9json <file>, --sweep, tested, not live; Jordan, 2 Oct, from the independent critique's points 4, 5 and 9). Round 8's run with Anvil changed:

Round 10: Anvil as OC-turns per point, a fieldable pool, the final rank on frozen cuts, the list-share headline, the explainer (T-563, the r10 switch over r8, --r10json <file>, --explain, tested, not live; Jordan, 2 Oct, from the method appraisal's experiments 1 to 4). Round 8's run (step grading) with:

The Tyranid workbench (T-564, tools/tierbench.js over --rawdump tyranids; a report, not live; Jordan, 2 Oct: no more every-army runs until the Tyranid table is within one letter of Auspex for 85% of the 44 graded units). The method appraisal's layers, built for one army.

Round 11: the workbench's fixes made permanent, every army (T-565, o.r11 over round 10, --r11json <file>, tested, not live; Jordan, 2 Oct: a unit's context is its best legal size, turns alive capped at 5, a CP 30 pts). Round 10's run (V10C, the fieldable pool, frozen cuts) with each fix a switch in o.r11 (the code's R11F names them), all on, applied to every unit of the pool, not only the Tyranids:

Round 12: compose-only experiments (T-581, tools/round12.js over tools/tierbench.js; tested, not adopted). Three new compose knobs, all at today's values by default (--check still reproduces round 10 exactly):

Round 13: the every-army raw table, the config file and compose over every army (T-583; tested, not adopted).

Army rules (T-530, proposed).

Lenses (T-531, proposed). A lens is a weight vector over the stored targets and attackers. Letters recompute in the browser: 35 ms for 1,241 units at phone speed. The default lens is the one that best predicts what wins. The custom lens is a future supporter perk; the built-in lenses stay free.

Disposition lenses (T-537, tested, not recommended yet). tools/dispositions.js sorts each primary's VP by the job that earns it: holding an objective is Anvil; taking new ground, their half or their home is half Runner and half Anvil; an action is 70% Runner and 30% Anvil (it completes only if the unit still holds the objective); a kill is Hammer. The counts assume a five-round game: a line every round counts 5, from round 2 counts 4, rounds 2 to 4 count 3, once at the end counts 1. "Each objective" means 2 besides your home, or 3 with it; "each kill" means 1.5 a turn; "each unit that acted" means 1.5. A disposition's demand is its five primaries, weighted by how often the field plays the opposing disposition each one answers. The lens's S and A split gives each job half today's split plus half the demand, with Banner kept at today's share. The lens moves only the S and A quotas; scores don't change. The check failed (2 Oct): the lists that play each disposition don't carry what its primaries pay for (Anvil ρ −0.70 over the five), because an army can only pick the dispositions its detachments offer.

7. Banner, scored from effects (T-527, proposed)

For each character and each squad it can lead or support:

7b. The attacker × defender matrix (T-568, built, not live)

tools/matrix.js; the build spec is design/matrix.md (sections 2 to 5), the plain-English account design/tier-engine.md. Nothing here reaches the site or the live rankings; T-569's field, allocation and jobs will read it.

8. Known gaps

Fed by the calibration reports (T-533) and the public-list comparisons (T-524).

GapHow we'd model itStatus
Stratagems (each detachment's dice stratagems as a unit's added value)tools/stratfx/ catalogue (16 armies), tools/stratagems.js spend and credit as a post stepMeasured and not kept (T-742, 6 Oct): held out −0.6 [−1.8, +0.4], placebo-level; stays out of Value for the time being (Jordan); the catalogue serves the calculator
The effect vocabulary (T-541's count, Tyranids)Each army's coverage report lists what the engine lacks, by how many units need it. For Tyranids: movement 16 units, Stealth read from the datasheet 12, mortal wounds outside attacks 10, auras on other units 9, command points 8, enemy Battle-shock 7, arrival 6. Single-unit gaps: selfFnp, a Toughness mod, an attacks-minus on defence, Precision as an effect, critical on any woundOpen (T-542)
A mixed unit's Toughness (11th edition core rules: the highest T among its models, a bodyguard's when a character is attached)The rankings' Defense uses the highest T since T-546. The calculator (seedDefence) and ev.js still take the datasheet's first statline (often a sergeant's): a Decimus Kill Team with a Gravis Veteran reads T4 there, not T6. Black Spear Task Force's tMajority (T-545) lowers it back where that detachment is in playPartly (T-546: rankings done, calculator open)
Healing and returning modelsThe coverage files' heal rules with kindfx.json's numbers: To the death plays them turn by turn, ev.js's closed form lifts durability, the tier test (--kinds) uses it in place of the flat ×1.15 revive where the data has a heal. The rankings' Defense counts a unit's own Command-phase heals (T-556). Not yet: kill and fight heals and lent heals in the rankings, heals the data gives no numbers for (the Necron Resurrection Orbs and Ghost Ark, Assimilation Swarm's Feed the Swarm, Canoptek Spyders), the other armies' heals until their coveragePartly (T-540)
Returning models in the points ledgerSince T-745 a rule that brings slain models back counts × 1 (r.return) unless the Spawn line measures it (the Tervigon, the Apothecary). T-747 measured nine armies' rules (hibernated files) and nothing moved: the Spawn line is divided by each army's own median spawner (T-608's line scale), so any spawning rule adds about wSpawn's worth whatever its size, and a leader's returns land on joined forms the ranking doesn't readOpen (T-747's report: a cross-army Spawn scale or a leader's credit, each its own step)
The datasheet signals in ValueT-748's datasheet model helps averaged with the ledger (+3.9 on 11 unseen human lists) but its signals as multipliers on Value, one step each (T-751: sheetSpeed, sheetEpicPsyker, sheetInfantry, wSoak ×2/×4, rules.lone), all fail the held-out exam; speed within its kind comes closest (+1.1 [−0.6, +2.7]) and shuffled letters pick it too. Open: more human lists for the single-list armies (T-733's drafts) to narrow speed's interval; Toughness against the army's median as a flag (T-748's fallback, never run)Measured, reverted
OverwatchA fraction of a volley on enemy turns (V2b)Proposed
Melta and Rapid Fire inside half rangeA per-unit share from the delivery model (V2b)Proposed
Delivery, transportsTurns in range from Move and arrival rules (V2b); who may ride and capacity read from BSData (tools/transports.js), the bundle test for who does (V2c, round 3)Proposed
Leader and support synergyT-527's Banner; Supporting links in the live score (T-532)Proposed
Passive damage (mortal wounds from abilities, Host of Plagues)data/mortalfx.json, added to Hammer's damage on the turns it can fire (V2c, round 3); since T-540 the coverage files' numbered mortal rules take over a unit's entry (5 Tyranid units in the pool, the same numbers), mortalfx.json stays for the 101 others until their armies' coverage carries numbers; the calculator plays them in the volley. Not yet: the defender's mortal wounds in its strike-back, rules needing Battle-shock or a Fall BackPartly (T-540)
Buffs to nearby units (lords, auras)Leader-lift's method over 2 units in range; since T-540 the coverage files' auras (with kindfx.json's effects where noted in words) through the engine on the 2 co-listed squads in the tier test (--kinds), and on a joined character's squad in the calculator. Since T-547 tools/aurafx.js measures an aura with effects on every squad of its army it reaches (damage into the standard targets, hits to destroy from the standard attackers, cover against shooting only): the unit pages' aura line, and tools/banner.js in place of its proxy (its 2 best squads by multiplier vs bodies × AURA_IN_RANGE 0.5). Not yet: the Support score, auras on units that never join in the calculator (one unit a side)Partly (T-540, T-547)
Army rulesarmyfx.json for every army before letters use it (T-530)Pilot
CP economy and stratagemsA CP at V5C.CP_PTS = 15 pts in V5 (tierfx.json cp); 0 in round 6, 30 pts since round 6b (V6C.CP_PTS, Jordan, 2 Oct). Next: a CP's worth from the best stratagems each unit can use in each detachment, measured with the engine (from a Command Re-roll on one die to a re-roll-hits stratagem)Open (T-558)
Fights First timingA share of fights won by striking firstTrait only
Indirect fireIn range from turn 1 (V2c): changes nothing, since the delivery model has no line of sight; the real gap is line of sight itselfTested, no effect
Lone Operative's survivalTwice the turns alive in Runner's survival (V2c); Anvil and Hammer not yetPartly
The price of slownessDelivery's turns in range, durability per point and the bundle test (V2c)Proposed
Mission actionsRunner's action economy and LeadershipProposed
How to price sizeDurability per point (V2c) drops big centrepieces (the Defiler, Knights) and the Orks review disagrees more; a third panel list should decideOpen
Runner for big durable modelsRunner's points gate (V4): no S or A Runner over 130 pts; it costs the big warlords the review rates (Ghazghkull, Wazdakka), whose Hammer per point is middlingTested (V4)
Leaders that no one fieldsBanner credits a leader with its best squad's lift even when that squad is in no list (the Chaplain with a Tactical Squad, 0 of 84, ×2.0); count the lift only on squads worth fielding and against the other leaders a squad can takeOpen (V4)
Units that re-deployRaveners and the Red Terror return to Strategic Reserves (V5's arrival rules). The Red Terror's leaving after its fight shields it from the enemy turn; Raveners' leaving after the enemy turn buys position only. Rapid Ingress and the re-deploy stratagems aren't playedTested (V5)
Defensive auras on the enemyEnemy debuffs as durability lent and Battle-shock as OC and actions denied (V5); the worths (V5C.SHOCK, V5C.NEAR) are tunable constants Jordan kept on 2 Oct (10% and 50%), to revisit if they over- or under-countTested (V5)
Auras on very cheap unitsAn aura's credit is divided by the bearer's points, so a 30-pt unit's aura looked huge (Ripper Swarms); V5 runs Tyranid auras through the engine instead of the stand-in (Ripper Swarms A → C)Tested (V5, Tyranids)
A one-use transport's capacityV2c's capacity credit rated the Tyrannocyte S in Banner (what a ride adds to Warriors or Pyrovores per point); 0 of 23 lists take it. Round 7 credits one drop (deliver's drop): Banner 91 → 21, A → DTested (round 7, T-559)
Detachment movement rulesRead in full since round 6 (mv): their reach feeds Hammer's turns in reach, Anvil's position and Runner's reach through the delivery closed forms and the position track. Tyranids only (the only army whose coverage writes move); enhancements' movement and Synaptic Nexus's +1 to Advance and Charge not yet written as keys. Crusher Stampede's OC share (0.9) is the worth to recheck; Feed the Swarm's lend is capped at one squad's aura worth since round 7 (V7C.REGEN_UNITS), the healed squad's own Anvil not yet creditedTested (round 6, T-557; round 7, T-559)
Wargear costsbsdata.js reads a unit's size breakpoints, not its options' costs (about 70 priced options at the pinned commit); the best-loadout solver picks a paid weapon at the base price (the Tyrannofex's rupture cannon). Record each option's cost in units.json and price a squad by its kit in docs/loadout.js and the rankingsOpen (T-565)
Strategic Reserves everywhereEvery unit may arrive on turn 2 at 18", and 290 do under V4; the list-level 50% cap and the arrival restrictions aren't enforcedOpen (V4)
The panel's noise floorOne list's ρ has a standard error of about 0.15 to 0.19; more panel lists before any choice between systemsOpen
Rules that make or split unitsSpore Mines from Biovores as spawn (V5: the spawned unit's Runner at V5C.SPAWN); the Venom's split squads and Tyrannocytes' cargo still notPartly (V5)
Specialists diluted by the five-target averageStep g (V4): enemy points destroyed, the meta's target weights, peak plus breadth; Eradicators D → C, Hive Guard A → S. The tag reads "anti-tank" for 348 of 400 Hammer units, because points per wound favour vehicles: name the peak by the unit's rank within each target insteadTested (V4)
Conditions the player vouches for, in the matrixSince round three a flag on the modset, met for the round 5 shares (VOUCH); the other class (4,301 unit-conditions: the turn it charged, disembarked or arrived, staying still, a target within 12"…) is still met all game, as in the tier testOpen: T-569's reference battle can price most of them
Weapon keywords that aren't dice (T-582)Harpooned's charge bonus belongs to delivery (V2b); Reverberating Summons to returning models (heal); Linked Fire and Plasma Warhead to reach; Defensive Array and Hive Defences to Overwatch (above). Conversion is read as beyond half range, so a 48" gun inside half range but beyond 12" loses itOpen
Mixed damage in a sum of cellsEach weapon's cell is exact alone; one weapon's chip damage making another's big hits overkill needs the order of fire (killDP). 2 pairs beyond 15% on 3 OctNamed (T-568)

9. Changelog

DateChangeCardMeasuredReport
26 SepUtility and Meta ranked within the army; Meta replaces "taken anyway"T-198––
26 SepThe meta lift on letters (40 + 100 × share)T-226264 S units by 2 Octreports/tiers/2026-10-02-space-marines.md
27 SepLeader lift from leaderfx effectsT-062––
29 SepEach target's own best squadT-360––
2 OctTier system v2 tested: V1, V2, V2b against a public list and list shareT-524ρ with list share: Value 0.113, V1 0.174, V2 0.127, V2b 0.087reports/tiers/2026-10-02-space-marines.md
2 OctBanner from effects; Supporting links includedT-527ρ among characters 0.060reports/tiers/2026-10-02-banner.md
2 OctArchetype review, Lenses designT-529, T-531Recommended set: ρ 0.119 → 0.147reports/tiers/2026-10-02-archetypes.md
2 OctArmy rules pilot (Tyranids)T-530V2 ρ 0.127 → 0.146; Tyranid S 6 → 25reports/tiers/2026-10-02-armyfx.md
2 OctRound 2: within-army yardstick, V2b, a second panel list (Orks)T-524ρ with their order, Space Marines / Orks: today −0.31 / 0.24, V1 −0.27 / 0.22, V2 −0.23 / 0.12, V2b −0.24 / 0.06reports/tiers/2026-10-02-round2.md
2 OctTyranid coverage: every datasheet ability in unitfx.json (status, kind, why not yet), off effects start switched offT-54161 of 64 Tyranid datasheets; Offense and the letters unchanged (no live tool reads unitfx)reports/tiers/2026-10-02-tyranids-coverage.md
2 OctTyranid detachments: every rule's status, 41 enhancements as upgrades, stratagems by nameT-54114 detachments (10 matched play, 4 Boarding Actions); nothing live reads enhancementsreports/tiers/2026-10-02-tyranids-coverage.md
2 OctThe Tyranid coverage in the tier test: units' own abilities (--own-out) and the detachments' movement rules as a what-ifT-541Own abilities: 1 letter, ρ 0.38 → 0.38. Movement rules read as tier: 15 letters, ρ 0.38 → 0.28, so they wait under movereports/tiers/2026-10-02-tyranids-coverage.md
2 OctEngine kind heal: the coverage files' heals with numbers (kindfx.json) in To the death, ev.js's closed form, the tier test's turns alive and Anvil in place of the flat ×1.15 revive where the data has one (--kinds)T-540Tyranids, V5 → V5 + heal: ρ with Auspex 0.38 → 0.38, the same letter 16 → 16, within one 31 → 30, ρ with list share 0.24 → 0.23; Old One Eye A → Sreports/tiers/2026-10-02-tyranids.md, Engine kinds
2 OctEngine kind mortal: the coverage files' mortal-wound rules with numbers (kindfx.json) as their own bullets in the calculator's volley; the tier test's Hammer reads them in place of mortalfx.json where the data has them (--kinds)T-540Tyranids, V5 + heal → + mortal: ρ with Auspex 0.38, the same letter 16, within one 30, list share 0.23, unchanged (the same numbers, now kept with the rule)reports/tiers/2026-10-02-tyranids.md, Engine kinds
2 OctEngine kind aura: the coverage files' auras (range, to, not, effects) on a joined character's squad in the calculator, enemy-side auras with their bearer; the tier test's variable 5 reads them in place of tierfx.json's auras (--kinds)T-540Tyranids, + aura: ρ with Auspex 0.38, the same letter 16, within one 30, list share 0.23, unchanged (the same squads and lifts)reports/tiers/2026-10-02-tyranids.md, Engine kinds
2 OctNecron coverage: every datasheet ability and detachment rule, 42 enhancements, Reanimation Protocols in armyfx.jsonT-542–reports/tiers/2026-10-02-necrons-coverage.md
2 OctAdeptus Custodes coverage: every datasheet ability, 10 detachments written from Wahapedia (none in BSData's list), Martial Ka'tah in armyfx.jsonT-542–reports/tiers/2026-10-02-adeptus-custodes-coverage.md
2 OctT'au Empire coverage: every datasheet ability (wargear included), 9 detachments, For the Greater Good in armyfx.jsonT-542–reports/tiers/2026-10-02-t-au-empire-coverage.md
2 OctDark Angels coverage: their 19 datasheets and 8 detachmentsT-542–reports/tiers/2026-10-02-dark-angels-coverage.md
2 OctEmperor's Children coverage: every datasheet ability, 10 detachments, the army rules in armyfx.jsonT-542–reports/tiers/2026-10-02-emperor-s-children-coverage.md
2 OctOrk coverage: every datasheet ability, 17 detachments, Waaagh! in armyfx.jsonT-542–reports/tiers/2026-10-02-orks-coverage.md
2 OctChaos Daemons coverage: every datasheet ability, 9 detachments, The Shadow of Chaos in armyfx.jsonT-542–reports/tiers/2026-10-02-chaos-daemons-coverage.md
2 OctDeath Guard coverage: every datasheet ability, 10 detachments, Nurgle's Gift in armyfx.jsonT-542–reports/tiers/2026-10-02-death-guard-coverage.md
2 OctAdeptus Mechanicus coverage: every datasheet ability, 10 detachments, Doctrina Imperatives in armyfx.jsonT-542–reports/tiers/2026-10-02-adeptus-mechanicus-coverage.md
2 OctAstra Militarum coverage: every datasheet ability, 13 detachments, Voice of Command in armyfx.jsonT-542–reports/tiers/2026-10-02-astra-militarum-coverage.md
2 OctAeldari coverage: every datasheet ability, 15 detachments, Battle Focus and Strands of Fate in armyfx.jsonT-542–reports/tiers/2026-10-02-aeldari-coverage.md
2 OctChaos Space Marines coverage: every datasheet ability, 17 detachments, Dark Pacts in armyfx.jsonT-542–reports/tiers/2026-10-02-chaos-space-marines-coverage.md
2 OctThousand Sons coverage: every datasheet ability, 9 detachments, Cabal of Sorcerers in armyfx.jsonT-542–reports/tiers/2026-10-02-thousand-sons-coverage.md
2 OctAdepta Sororitas coverage: every datasheet ability, 8 detachments, Acts of Faith in armyfx.jsonT-542–reports/tiers/2026-10-02-adepta-sororitas-coverage.md
2 OctBlood Angels coverage: their own datasheets and 8 detachmentsT-542–reports/tiers/2026-10-02-blood-angels-coverage.md
2 OctGrey Knights coverage: every datasheet ability, 11 detachments, Gate of Infinity in armyfx.jsonT-542–reports/tiers/2026-10-02-grey-knights-coverage.md
2 OctDrukhari coverage: every datasheet ability, 9 detachments, Power from Pain in armyfx.jsonT-542–reports/tiers/2026-10-02-drukhari-coverage.md
2 OctLeagues of Votann coverage: every datasheet ability, 10 detachments, Prioritised Efficiency in armyfx.jsonT-542–reports/tiers/2026-10-02-leagues-of-votann-coverage.md
2 OctWorld Eaters coverage: every datasheet ability, 8 detachments, Blessings of Khorne in armyfx.jsonT-542–reports/tiers/2026-10-02-world-eaters-coverage.md
2 OctUltramarines coverage: their own datasheets and 2 detachmentsT-542–reports/tiers/2026-10-02-ultramarines-coverage.md
2 OctImperial Knights coverage: every datasheet ability, 8 detachments, Code Chivalric in armyfx.jsonT-542–reports/tiers/2026-10-02-imperial-knights-coverage.md
2 OctSpace Wolves coverage: their own datasheets, 7 detachments, Curse of the Wulfen in armyfx.jsonT-542–reports/tiers/2026-10-02-space-wolves-coverage.md
2 OctSpace Marines coverage: the 161 shared datasheets, 16 Codex detachments, Oath of Moment in armyfx.jsonT-542–reports/tiers/2026-10-02-space-marines-coverage.md
2 OctBlack Templars coverage: their own datasheets, 6 detachments, Templar Vows in armyfx.jsonT-542–reports/tiers/2026-10-02-black-templars-coverage.md
2 OctChaos Knights coverage: every datasheet ability, 8 detachments, Harbingers of Dread in armyfx.jsonT-542–reports/tiers/2026-10-02-chaos-knights-coverage.md
2 OctGenestealer Cults coverage: every datasheet ability, 11 detachments, Cult Ambush in armyfx.jsonT-542–reports/tiers/2026-10-02-genestealer-cults-coverage.md
2 OctDeathwatch coverage: their own datasheets, Black Spear Task Force, Mission Tactics in armyfx.jsonT-542–reports/tiers/2026-10-02-deathwatch-coverage.md
2 OctAgents of the Imperium coverage: every datasheet ability, 5 detachments, Assigned Agents in armyfx.jsonT-542–reports/tiers/2026-10-02-agents-of-the-imperium-coverage.md
2 OctSalamanders coverage: their own datasheets and Forgefather's SeekersT-542–reports/tiers/2026-10-02-salamanders-coverage.md
2 OctRaven Guard coverage: their own datasheets and Shadowmark TalonT-542–reports/tiers/2026-10-02-raven-guard-coverage.md
2 OctImperial Fists coverage: their own datasheets and Emperor's ShieldT-542–reports/tiers/2026-10-02-imperial-fists-coverage.md
2 OctIron Hands coverage: their own datasheets and Hammer of AverniiT-542–reports/tiers/2026-10-02-iron-hands-coverage.md
2 OctWhite Scars coverage: their own datasheets and Spearpoint Task ForceT-542–reports/tiers/2026-10-02-white-scars-coverage.md
2 OctAdeptus Titanicus and Titanicus Traitoris coverage: the four Titans, their army rules in armyfx.jsonT-542–reports/tiers/2026-10-02-adeptus-titanicus-coverage.md
2 OctDispositions as job demand; the lens testedT-53773 units change letter between the Take and Hold and Purge the Foe lenses; the check against the lists fails (Anvil ρ −0.70)reports/tiers/2026-10-02-dispositions.md
2 OctV3: delivery modes, the Dedicated Transport bundle, mortal wounds, joiners aren't Runners, Battle-shock below half, Indirect FireT-524, T-538ρ with list share 0.107 → 0.164; Space Marines −0.26 → −0.18; Orks 0.13 → 0.18reports/tiers/2026-10-02-round3.md
2 OctThe Context rule written, its cost measuredT-539about 25,000 detachment cells; build about 40 s; under 400 KB gzipped–
2 OctRound 3: V2c (mortal wounds, joining characters, Battle-shock damped, Banner per point, Indirect Fire, delivery fixed) and the first session's V3, against the three panel lists and list shareT-524Space Marines ρ −0.24 → −0.08 (V3 −0.18), list share 0.087 → 0.137 (V3 0.164), Orks 0.06 → 0.01 (V3 0.18); Tyranids (third panel list) 0.07 → 0.21; Mortarion C → Sreports/tiers/2026-10-02-space-marines.md, Round 3
2 OctRound 4: V4 (the strands merged with every part a switch, no charge after an advance, Runner's points gate, solo characters, step g: points destroyed with meta weights) and the Tyranid comparisonT-524Space Marines ρ 0.04 (V2c −0.08, V3 −0.18), Tyranids 0.19 (0.21), Orks −0.19 (V3 0.18), list share 0.104 (V2c 0.137, V3 0.164); Mortarion no longer a Runner; Chaplains still B or Areports/tiers/2026-10-02-space-marines.md, Round 4; reports/tiers/2026-10-02-tyranids.md
2 OctRound 5: V5 on Tyranids (survival absolute, arrival rules, a mortal-wound attacker and meta-weighted fire, enemy debuffs and Battle-shock, buff auras and Synapse through the engine, leader pairs shown, detachment context with Singular Purpose, small fixes; Banner's smooth start), each alone and stacked; data/tierfx.json, tools/colist.jsT-524Tyranids: ρ with Auspex 0.19 → 0.38, same letter 14 → 16 of 44, within one 26 → 31, ρ with Tyranid list share 0.12 → 0.24; check: Space Marines 0.04 → −0.01, Orks −0.19 → −0.12, list share 0.104 → 0.129reports/tiers/2026-10-02-tyranids.md, Round 5
2 OctDamaged X from the datasheet: the calculator's -1 to hit by the wounds left (Fight back, To the death); the tier test's kdmg (--kinds) over five turnsT-544Tyranids, V5 + damaged alone: ρ with Auspex 0.38 → 0.41, the same letter 16 → 17, within one 31 → 31, ρ with list share 0.24 → 0.25; cumulative with heal, mortal and aura 0.38 → 0.39; Toxicrene and Haruspex A → B, Trygon A → Creports/tiers/2026-10-02-tyranids.md, Engine kinds
2 OctThe effect vocabulary: tMinus, tPlus, svUp (not past 3+), one-die re-rolls, majority Toughness, S-against-T and Rapid Fire conditions; kindfx.json effects, extras and patches; army rules as calculator chips (off by default)T-545Calculator only: 24 defensive -1-to-wound rules now apply only when S beats T; Tyranid tier table unchanged (no letter or composite moves); live rankings unchangedreports/tiers/2026-10-02-tyranids.md, Engine kinds
2 OctAn aura's worth measured by the engine (tools/aurafx.js): unit pages' aura line; Banner's aura in place of its proxy where the data has the aura's effectsT-547Banner: 3 characters measured, ρ among characters 0.060 → 0.060; the Support score and the live rankings unchanged–
2 OctMarks on an enemy unit: the chosen condition and the Marked chip, Oath of Moment's Codex +1 to wound from the army's detachments and list (codex)T-548Tyranid table (--kinds): nothing moves (the tier test plays Singular Purpose from tierfx.json); live rankings unchangedreports/tiers/2026-10-02-tyranids.md
2 OctResource pools: one die a phase as a 6 (swapSix, ev.js swapGain: the expected gain of the volley's worst die of the best roll turned into a 6) for Acts of Faith and Strands of Fate; pool notes on the buff poolsT-549Tyranid table (--kinds): nothing moves (no Tyranid pool); live rankings unchangedreports/tiers/2026-10-02-tyranids.md
2 OctTests a unit takes on itself: selfTest (d6, Leadership, doubles) for Dark Pacts and the Psychic test, Hazardous through the same shapeT-550Tyranid table (--kinds): nothing moves; Hazardous's numbers and the live rankings unchangedreports/tiers/2026-10-02-tyranids.md
2 OctA friendly unit nearby: the Army part's Nearby pick (auras that reach the unit, marks lent to friends); Bondsman and War Dog auras and 23 lent marks in kindfx.jsonT-551Tyranid table (--kinds): nothing moves; live rankings unchanged; 15 Knight unit pages gain the aura line (shown, not scored)reports/tiers/2026-10-02-tyranids.md
2 OctEvery army scored in the tier test: own abilities, kinds, army rules and the best detachment for every unit, four switches (--every), --own-kinds, --v5dump, --tyr4-out keeps hand sectionsT-552Every switch on: Tyranids ρ Auspex 0.39 → 0.37 (same 17 → 13, within one 30 → 23), Tyranid list share 0.24 → 0.28; Space Marines ρ −0.01 → −0.05 (0.07 with own abilities alone); Orks −0.12 → −0.14; every unit's list share 0.129 → 0.156 (0.173 before detachments); 423 of 1,161 letters movereports/tiers/2026-10-02-tyranids.md
2 OctMarks start off in the calculator, Oath of Moment's included (Jordan); the chip works the same when tickedT-554Default matchup back to the datasheet's numbers; live rankings and the tier test unchanged (neither reads the calculator's default)–
2 OctLive Defense counts a unit's own Command-phase heals by the tier test's closed form (healLift on the turns alive without it); rankings.json keeps def bare and adds hl, hrT-556991 of 1,241 pool units' Defense moves (most by a point or two as the Necrons rise); 50 rows lift (49 Necron, Old One Eye ×1.11; 39 in the pool), lone characters that die in a turn gain nothing; 19 pool letters change: 7 Necrons up a band, 12 units elsewhere down one at a band edgereports/tiers/2026-10-02-defense-heals.md
2 OctLive Defense attacks a mixed unit at its highest Toughness (the core rule), not its first statlineT-54613 rows (6 in the pool) take a higher T: Decimus and Aquila Kill Teams 4 → 6, Traitor Enforcer 3 → 6, Talonstrike 4 → 6; 612 pool units' Defense moves (most by under a point); 7 pool letters change (Kill Teams and Traitor Enforcers up a band, the Artillery Team down at the B/C edge)reports/tiers/2026-10-02-defense-heals.md
2 OctRound 6: CP worth 0 (V6C.CP_PTS), Battle-shock 10% and debuffs 50% kept as tunable, a mixed unit's highest Toughness in the tier test, the position track (Anvil's position, Runner's reach from the delivery modes; V6C), the detachments' movement rules read in full (move), Feed the Swarm through the heal closed formT-557Tyranids ρ Auspex 0.37 → 0.34, same 13 → 12, within one 23 → 26, Tyranid list share 0.28 → 0.27; every unit's list share 0.155 → 0.169; Space Marines −0.06 → −0.03, Orks −0.14 → −0.16; position alone 0.41 / 0.36; movement in Hammer only 0.27reports/tiers/2026-10-02-tyranids-round6.md
2 OctRound 6b: a CP gained or saved is worth 30 pts (V6C.CP_PTS 0 → 30, Jordan, 2 Oct; T-558 stays the method to price it from stratagems); --r6yardT-557Tyranids ρ Auspex 0.34 → 0.39, same 12 → 12, within one 26 → 27, Tyranid list share 0.27 → 0.32; every unit's list share 0.169 → 0.171; Space Marines −0.03 (unchanged); letters: Hive Tyrant C → B, the Swarmlord B → A, the Lictor B → Areports/tiers/2026-10-02-tyranids-round6b.md
2 OctRound 7: best-only grading (best allowed job + V7C.BONUS × each other allowed job above V7C.BAR, at most 100; Jordan's rule), Feed the Swarm's lend capped at one squad's aura worth (V7C.REGEN_UNITS), the Tyrannocyte's one drop (deliver's drop); the yardsticks strict on our ruler, raw, lenient and their shuffle baselines, ρ with its SE (--r7json)T-559Tyranids ρ Auspex 0.39 → 0.50, strict on our ruler 19 → 20 (chance 10.3), raw 12 → 12, within one 27 → 29 (chance 20.4), Tyranid list share 0.32 → 0.39; every unit's list share 0.171 → 0.164; Space Marines −0.03 → −0.05, Orks −0.16 → −0.13; 291 of 1,161 letters movereports/tiers/2026-10-02-tyranids-round7.md
2 OctRound 8: step grading (best allowed job + V8C.ELITE_STEP for each other allowed job at V8C.ELITE, + V8C.STRONG_STEP at V8C.STRONG, never capped; ties by the mean of the others; Jordan's rule), letters on fixed cuts (V8C.S, V8C.A, V8C.B, V8C.C) and a within-army view by position (V8C.AS, V8C.AA, V8C.AB, V8C.AC); strict on our ruler against the within-army view; the Lab's sliders page (--r8json, --r8sliders)T-560Tyranids ρ Auspex 0.50 → 0.47, strict on our ruler 20 → 20 within army (chance 10.6), raw 12 → 19 all armies, within one 29 → 31; Tyranid list share 0.39 → 0.41; every unit's list share 0.164 → 0.162; Space Marines −0.05 → −0.18, Orks −0.13 → −0.12; 561 of 1,161 letters move, 246 S on the fixed cutsreports/tiers/2026-10-02-tyranids-round8.md
2 OctRound 9: Anvil = hits to destroy × OC ÷ points (one division, not two) × a survival gate (V9C.GATE1 0.5 removed in one typical enemy turn, V9C.GATE2 0.8 in two); V9C.PEAK, V9C.REVIVE, V9C.SETDOWN named; --sweep (each constant ×0.5 / ×1.5); the three-panel history; proposed frozen cuts S 98.79, A 94.49, B 86.13, C 71.15 (not adopted)T-562Tyranids ρ 0.47 → 0.49, Space Marines −0.18 → −0.10, Orks −0.12 → −0.12; every unit 0.162 → 0.077; 240 of 1,161 letters movereports/tiers/2026-10-02-tyranids-round9.md
2 OctRound 10: Anvil = OC × min(turns alive, V10C.TMAX) ÷ points × Battle-shock × position × revive, round 9's survival gate removed (V9C.GATE1, V9C.GATE2 gone); the pool cut to units of V10C.MAXPTS pts or less; the final score = the pool percentile of the composite; letters on frozen cuts V10C.S 92.02, V10C.A 77.02, V10C.B 49.96, V10C.C 20.03 (8/15/27/30/20%, calibrated 2 Oct); the list-share headline (per-army median ρ, AUC, hit rate, ρ among taken, the Tyranid overfit gauge); --explainT-563Tyranids ρ 0.49 → 0.51, Space Marines −0.10 → −0.07, Orks −0.12 → −0.18; pooled list share 0.077 → 0.157; per-army median 0.113 → 0.165; AUC 0.536 → 0.582; Anvil's ρ with points 0.41 → 0.19; S-share ρ with top-quarter lists −0.39 → −0.16
2 OctThe Tyranid workbench: --rawdump tyranids (the raw table per context: detachment, size, leader, way in) and tools/tierbench.js compose(raw, config) with ten switches from the residual reportsT-564Baseline reproduces round 10 exactly; within one 31 → 30 all on, best subset 36 of 44 (the line is 38)reports/tiers/2026-10-02-tyranids-bench-1.md
2 OctRound 11: the workbench's fixes made permanent as o.r11 switches on every army (bannerLendOnly, bannerModelCount, turnsHarmonic, reArriveAfterKill, reArriverGateExempt, lendOnBestSquads, stealthSurvival, bestSize, bestLeader, sameLoadout), turns capped at V10C.TMAX = 5, a CP 30 pts; bug fixes: bsdata.js rule links read in the bare state, Neurogaunts 22 models, the aura pattern widened, banner.js's case-blind squad match, tierbench's banOf, the raw dump's lock; --r11jsonT-565Tyranids ρ 0.52 → 0.66, Space Marines −0.07 → 0.14, Orks −0.19 → −0.15 (round 10 on today's data); per-army median 0.139 → 0.173; AUC 0.582 → 0.585; Tyranid within one 31 (ruler) / 36 (Auspex's shape) of 44; 537 letters movereports/tiers/2026-10-02-tyranids-round11.md
3 OctThe baseline battery: tools/tierbaseline.js scores list share alone, points alone (both signs), frozen round 11 and the shuffle on every panel (ρ with a bootstrap 95% interval, within one and same on the reviewer's shape, each as lift over 2,000 shuffles; fixed seeds), the pooled held-out ρ, round 11's per-army median and the two-reviewer ceiling; a panel with "locked": true is counted, not scored, without --final-check. No scoring changeT-570Held-out pooled ρ (Space Marines + Orks, 75 units): list share 0.21 [−0.03, 0.44], points ±0.01, round 11 −0.03 [−0.27, 0.20]; round 11 beats list share on 0 of 3 panels; the Ork shape gives 37.7 of 45 within one to a shufflereports/tiers/2026-10-03-baselines.md
3 OctStep 1 closed. Outcome yardstick added, not used in scoring: tools/outcomes.js, each unit's placing lift (its army's lists that take it minus those that don't, in mean finishing percentile; Student's t 95% interval with pooled variance), and win rate with and without the unit wherever game records exist (none today) (T-571). Panels: Auspex's Space Marines (T-575, with the reviewer's seven-step grade ord) and Hivemind Hobbies' Tyranids (T-576), both fitting; Astra Militarum the one locked panel (T-574); both Votann lists reference only, 10th edition (T-577, T-578). tools/tierbaseline.js leaves a panel's patchDrop units out (points moved more than 10% since the reviewer's date, read from BSData at both commits) and gives each ceiling a bootstrap interval. No scoring changeT-571, T-575 to T-578Held-out pooled ρ (4 panels, 166 units): list share 0.41 [0.28, 0.53], points ±0.02, round 11 0.19 [0.04, 0.34]; ceilings √ρ 0.83 (Space Marines, 15 shared) and 0.86 (Tyranids, 38); 33 of 418 units' placing lift clear of zero against about 21 by chancereports/tiers/2026-10-03-step1.md, reports/tiers/2026-10-03-outcomes.md
3 OctThe panels re-sorted and the gate written (Jordan, via the design review): Sprues & Brews' Orks retired to reports/tiers/panel/retired/ (a sanity list, --sanity, outside every pool, ceiling and gate); a third Tyranid reviewer (two creators' lists, both current); "held out" is panels of armies never tuned on (the two Space Marine panels), "same army, new reviewer" the new Tyranid lists, "unseen" both; the gate: pooled lift over shuffle on the unseen panels rising above frozen round 11's, no fitting panel more than one SE below it (tools/tierbaseline.js gates); 38 of 44 a bench sanity number; the list share these numbers use is entrants' (any placing), not top-quarter; an army with three reviewers has the ceiling √ of the mean pairwise ρT-580held out (76 units): entrants' list share 0.23 [0.00, 0.43], round 11 0.30 [0.07, 0.50]; same army, new reviewer (86): 0.72 and 0.38; unseen (162): 0.49 and 0.34; Tyranid ceiling √0.65 = 0.80 (pairs 0.73, 0.67, 0.54)reports/tiers/2026-10-03-step1.md (addendum), reports/tiers/2026-10-03-battery-t580.json
3 OctRound 12, compose-only (tested, not adopted): three compose knobs, the cost exponent α (cost.alpha), Runner's points terms (cost.runner: both, gate, cheap) and the composite (composite: best, allowed, log2), chosen on criteria that read no panel (Runner by reasoning, the composite by best-job flatness, α by cost-neutrality) and checked by the gate; list share both ways (entrants, top quarter); the Space Marines' mentioned-against-not AUC; the option premium; a compose sweep with owners; the Tyranid table in a fixed layout (tools/tyrtable.js)T-581nothing passes the gate. Chosen candidate (gate dropped): ρ(score, points) −0.16 → +0.10 pooled, unseen pooled ρ 0.27 → 0.16 (frozen round 11 0.34). Gate kept and cheapness part dropped: −0.10, 0.27 (+0.01 [−0.03, 0.04]). α 0.75 alone: +0.01, 0.23. Per army 18 to 22 of 29 outside ±0.15 in every version. Option premium +0.33 [−1.26, 1.94] per log-context. The order of rounds is the same both ways of counting list share, within one SEreports/tiers/2026-10-03-round12.md, reports/tiers/2026-10-03-tyranids-round12-table.md
3 OctThe attacker × defender matrix, rounds one to three (section 7b): profiles, the cell (u, r, e, v), contexts, the cached build, the unit table; incremental rebuilds by content keys (the cell hash); --check; a volley read from the cells (VOLLEY.FRESH = 0.5 and the taper); round two's vouched conditions now a flag met at the round 5 shares (VOUCH), not all game. Not live; no live number movesT-568Parity 1.8e-15; today's Offense ρ 0.9968 to 0.9999, medians 0.02% to 1.57%, 2 pairs beyond 15% (mixed damage); one army's edit computes 1 row and 1 column of 1.44 M cells (1.7 s against 9.5 s); the vouch fix removes 574 of 20,441 pooled wounds per 100 pts (the lift over never-met 3,409 → 2,834)reports/tiers/2026-10-03-matrix.md
3 OctRound 13, compose over every army (tested, not adopted): the every-army raw table at round 11's exact settings (--rawdump all, build/tier-raw-all/<hash>.json), tools/tierconfig.json (every knob with its provenance; profiles B0 and B1), tools/tierbench.js composeAll; tools/tyrtable.js shows the baseline when nothing is adopted, the trial in a last column, the site's job namesT-583Round 11 reproduced with 0 differences (1,153 units, 52 Tyranids); battery identical. ρ(score, points): frozen round 11 −0.414, B1 −0.30, the trial (Runner's cheapness part dropped, α 0.6) −0.01. Unseen pooled ρ: round 11 0.34, B1 0.33, trial 0.36 (rise +0.01 [−0.10, 0.13] against round 11)reports/tiers/2026-10-03-round13.md, reports/tiers/2026-10-03-tyranids-round13-table.md
3 OctThe 30 Sep balance update in the data: BSData 374f505 → 8b91e6b (the Munitorum Field Manual and 14 faction packs); detfx.json's Frenzied Host, Frantic Focus: Sustained Hits 1 for Battleline after an Advance or Fall Back, in place of +1 S (the same condition, when.unitKw BATTLELINE and the manual switch); Legion of Excess's stratagem note names Rapturous Agony for Thieves of Pain. The points ledger reads its frozen inputs (T-603) and doesn't moveT-579241 units changed (188 points, 132 profiles), 21 letters move (/meta/patch/); Frantic Focus moves no unit's score (the live scores read no detachment), only the detachment's synergy line (ds, damage against MEQ, T-058): Tormentors 18 → 25, Infractors 23 → 25, Daemonettes 21 → 20reports/dataslate/2026-10-03-refresh.md
3 OctKeywords with a condition on the target read in full (T-582): Lethal Hits, Devastating Wounds and Sustained Hits followed by keywords ("Lethal Hits: non-Monster/Vehicle") count only against a target that meets them; ev.js and the calculator read them unconditionally. Into the stand-in vehicles the Orks' shootas lose Lethal Hits; the Painboy's and Leystalker's Devastating Wounds and the Beastboss's Sustained Hits 2 stop counting where they don't applyT-582Each keyword alone, every other read: Lethal Hits 36 units' Offense moves (31 live; Blitza-bommer −15.6%, Dakkajet −15.4%, Burna-bommer −10.1%); Devastating Wounds 8 (6 live; Leystalker −9.1%, Painboy −6.0%, Warbuggies −4.6%); Sustained Hits 2: Monster/Vehicle 1 (the Beastboss −16.6%)reports/tiers/2026-10-03-keywords.md
3 OctCleave X read (T-582): X more attacks for every five models in the target, in ev.js and the calculator; "Cleave 2+" (a misprint) as Cleave 2T-58228 units' Offense moves (25 live), all Orks: Deffkilla Wartrike +31.9%, Warboss in Mega Armour +30.0%, Gunwagon +27.4%, Trukk +24.5%reports/tiers/2026-10-03-keywords.md
3 OctSustained Hits D3 read (T-582): a critical hit's extra hits rolled (ev.js mixes the kill walk over the roll; the calculator rolls it); was read as Sustained Hits 1T-58215 units' Offense moves (13 live): Trazyn the Infinite +16.3%, Knight Defender +9.0%, Doom Scythe +7.0%, Haarken Worldclaimer +4.3%reports/tiers/2026-10-03-keywords.md
3 OctBlast X read (T-582): X attacks per five models (was 1, as plain Blast)T-58218 units' Offense moves (14 live), all Orks: Mek Gunz +10.4%, Killa Kans +7.0%, Burna-bommer +3.6%reports/tiers/2026-10-03-keywords.md
3 OctConversion read (T-582): hit rolls of 4+ are critical hits beyond half range (the rankings' table is beyond half range); the calculator starts it on for the weaponT-5827 units' Offense moves (all live): Knight Defender +14.8%, the Acastus Knights Asterius +7.8% and +8.5%, Brôkhyr Thunderkyn +4.4%, the Moirax +3.2%reports/tiers/2026-10-03-keywords.md
3 OctAnti-X in every spelling read (T-582): slash lists ("Anti-Monster/Vehicle 4+"), "non-" ("Anti-non-Monster/Vehicle 2+"), no hyphen ("Anti Vehicle 3+"), no "+" ("Anti-fly 2"); the calculator now reads every weapon's Anti-X against the target's keywords (it read none, only the manual pick)T-58212 units' Offense moves (11 live): Stonesinger +57.2%, Squighog Boyz +13.7%, Ancient in Terminator Armour +10.4%, Gunwagon +7.2%reports/tiers/2026-10-03-keywords.md
3 OctRapid Fire D3 and D6+3 read (T-582): the extra attacks at half range rolled with the weapon's own (there were none)T-582No live number moves: the rankings' table is beyond half range; Army vs Army and the calculator at half range gain themreports/tiers/2026-10-03-keywords.md
3 Oct"Twin Linked" without its hyphen read as Twin-linked (T-582)T-5826 units' Offense moves (5 live): Night Spinner +22.8%, Warlock Skyrunners +9.8%, Farseer Skyrunner +5.9%reports/tiers/2026-10-03-keywords.md
3 OctPsychic Assassin read (T-582): 6 attacks against a PSYKER; no longer read as Psychic (so cover counts against it)T-582No live number moves (no stand-in target is a PSYKER, the table has no cover)reports/tiers/2026-10-03-keywords.md
3 OctOvercharge read (T-582): its hazard roll fails on 1 to 4 (was 1 to 2)T-582Arkanyst Evaluator −6.1% (its overcharge profile costs more)reports/tiers/2026-10-03-keywords.md
3 OctFour Space Marine reviewer panels (Auspex's full transcript and Brother Tobias fitting; Grimdark Breakdown and TacticalRock40K reference, partial); the Auspex summary superseded (tools/tierbaseline.js and matrix.js treat a use starting "superseded" as reference: never scored); the two fitting lists on the Space Marine ledger as comparators (auspexFull, tobias, tools/ledger-merge.js); tools/ledgerstep.js --lists. The yardstick's lists unchangedyardstick step 11Ledger at the step-6 baseline: Auspex summary ρ 0.41, pairwise 68%; full transcript ρ 0.28, 63% (0.40, 68% on the summary's 46 units); Tobias ρ 0.20, 55%. Reviewers' leave-one-out ceilings 0.73 (Auspex), 0.63 (Tobias)reports/tiers/2026-10-03-space-marine-reviewers.md
3 OctBatch 3's reviewer panels: Astrategas Wargames' Tyranid list (April 2026, 10th edition, fitting and flagged 10th like Maelstrom's) on the Tyranid ledger as a comparator (astrategas, tools/ledger-merge.js); the CSV's three 11th-edition Tyranid lists are the ones we hold (panels unchanged); 14 reference panels for 11 other armies (no ledger for them yet). The yardstick's lists unchangedbatch 3Ledger at the step-6 baseline against Astrategas: ρ 0.38, pairwise 66%, 2+ apart 70% (n 48), the weakest of the five Tyranid lists. Leave-one-out ceilings: Maelstrom 0.92, Auspex 0.86, HivemindHobbies 0.78, Astrategas 0.78, Into the Hive Mind 0.69reports/tiers/2026-10-03-batch3-reviewers.md
4 OctThe fuller transcriptions of three Tyranid lists (Auspex Tactics, HivemindHobbies, Into the Hive Mind; batch 3's CSV) as new panels, the three summaries superseded (the frozen inputs keep them, so the engine's auspex, hivemind, second keys are unchanged); the three on the Tyranid ledger as comparators (auspexFull, hivemindFull, secondFull, tools/ledger-merge.js, which now respects every comparator's patchDrop); the Auspex transcription tuned on (tools/tierbaseline.js TUNED_ON). Proposed as the yardstick's Tyranid lists; the yardstick unchanged until adoptedyardstick step 24 (T-640)Ledger at the step-6 baseline: Auspex ρ 0.662 → 0.688 (n 44 → 52), HivemindHobbies 0.622 → 0.664 (45 → 48), Into the Hive Mind 0.587 → 0.644 (41 → 48); the seven-list mean ρ 0.472 → 0.490, pairwise 70.1% → 70.8%. Tyranid leave-one-out ceilings, mean ρ 0.80 → 0.83reports/tiers/2026-10-04-tyranid-transcripts.md
4 OctStep 24 kept: the headline yardstick is the seven lists with the Tyranid transcriptions (tyr.auspexFull,tyr.hivemindFull,tyr.secondFull,tyr.maelstrom,tyr.astrategas,sm.auspexFull,sm.tobias), every tool's default (tools/ledgerstep.js, ledgerfit.js and ledgerrefit.js, diagnose.js, progress.js, roles.js; the ledger page's first columns); the step-13a lists stay selectable (--lists, diagnose.js --summaries). No setting, benchmark or frozen input changedyardstick step 24 (T-640)The new reference: step-6 baseline mean ρ 0.490, pairwise 70.8%; re-fitted base 0.486, 70.5%; diagnose held out against the new consensus (a) 74.5%, (a1) 71.8%, ceiling 90.4%reports/tiers/ledger-steps.md, reports/tiers/2026-10-04-diagnosis-tables.md
4 OctThe points ledger's secondaryVP switch, off: each form's expected secondary VP a game from the mission deck's 13 non-kill cards (reach, alive at the scoring time, OC, an action less a turn of its ranged Kill), shared over a typical list of 12 at the margin, at 2,000 ÷ 65 = 30.8 points a VP, onto Value at the median unit's Value per point, in place of the Actions line and its own bodies in Presence; per-form secvp { move, indirect } from tools/secvp.js through tools/ledger-merge.js (design/ledger.md section 19)T-641Not run: off, every number as before (the fingerprint test); step 27's prediction written firstreports/tiers/ledger-steps.md
4 OctThe points ledger's missionVP switch, off: every non-kill line of the mission deck (the 13 tactical secondaries and the 25 primaries' lines, tools/missions.js → tools/missions.json → meta.missions) scored per form: its chance at each check from reach by round (Move, Scouts, Infiltrators, arrival), survival against fire in proportion to its points (half when Hidden or Indirect), control (OC against the OC-weighted OC of its army, by the objective's depth), Leadership and an action's cost in shooting; credited at the margin of a 12-unit list spread over the five objectives; primaries weighted by the field's dispositions, each source held to what a typical player takes from it; at 2,000 ÷ 65 = 30.8 points a VP onto Value at the median unit's Value per point, in place of Score, Hold, Actions and its own bodies in Presence; secondaryVP off while on; per-form mission from tools/missionvp.js through tools/ledger-merge.js (design/ledger.md section 20)T-647Not run: off, every number as before (the fingerprint test); step 28's prediction written firstreports/tiers/ledger-steps.md
5 OctThe points ledger's active weights fitted to within-army tournament inclusion (tools/hedonic.js; tools/ledgerfit.js takes a numeric label, pairsOfScores): 11 armies with 12+ lists (grimstat-corpus, CC BY 4.0), pairs 2+ lists apart, each army weighted alike, ridge toward step 30 with λ chosen by leaving one army out on inclusion. No transfer: held-out inclusion 59.1–59.7% at every λ against step 30's 59.6%; the chosen fit (λ 0.3) barely moves a knob. A CANDIDATE benchmark only; nothing adoptedT-651seven lists 73.2% → 73.3%; held-out Tyranid units 75.3% → 75.1%; the 14 59.7% → 59.6%; list share vs reviewers 70.2% (16 armies) against the ledger's 61.1%reports/tiers/2026-10-05-hedonic.md
5 OctThe points ledger's missionBudget sub-switch, off (step 28b): with missionVP on, the mission line reaches Value at R ÷ M (R the median reference form's Score + Hold + Actions + own-bodies Presence contribution with the switch off, M the median reference form's mission line) in place of P ÷ 100, so it re-ranks within the replaced lines' budget; the fitter carries R(θ) (design/ledger.md section 20.1)T-647Not run: off, every number as before; step 28b's prediction written firstreports/tiers/ledger-steps.md
5 OctThe points ledger's shockPressure and cpRefile switches, off (step 34, T-653): every Battle-shock and command-point rule on the 16 ledgers' forms classified in our words (tools/shock-classes.json: a, no damage needed first; b, only after a hit, a fight or a hurt unit; c, not on the enemy, or for cp a cheaper reaction move); shockPressure adds each class a rule's W = 31 points a VP × tests a game × fail chance × 1.538 turns shocked × 0.65 VP a shocked turn (1.25 when the rule picks its unit or it stands on an objective) per 100 of the form's points, at the median unit's Value per point (Neurolictor 83.4, Neurotyrant 46.5); cpRefile takes the cp multiplier off the class c cp rules (the Leapers' counter-charge and ten others); constants reasoned before any run (design/ledger.md section 22)T-653Not run: off, every number as before (the fingerprint test); step 34's prediction written firstreports/tiers/ledger-steps.md
5 OctThe points ledger's preferredTargets switch, off (step 36, T-655): each solo form's Burst by target class (tanks and monsters, elite, horde, characters; tools/burst.js --prefer) against the typical army with its characters leading their squads at 0.8 (behind the bodies, alone only to Precision), spent best class first over N = 4 activations, each class capped at C = 4 × its share of the field (tools/ledger-field-classes.json, pooled; T-656 swaps it) × 100 points per 100; read back so the median ranking form keeps its Kill; in place of burstKill's Burst; constants reasoned before any run (design/ledger.md section 23)T-655Not run: off, every number as before (the fingerprint test); step 36's prediction written firstreports/tiers/ledger-steps.md
5 OctThe points ledger's attachChars switch, off (step 36b, T-655 split after step 36 wasn't kept): only the characters-attached half: burstKill's Burst (best 3 copies' worth of the whole typical army, no classes or caps) against the army with its characters leading their squads at 0.8 (behind the bodies, alone only to Precision), each solo form's prefer.attached × meta.preferKill ÷ the ranking forms' median; in place of burstKill; preferredTargets (attach and preference) wins over it, so step 36c is the preference on top; no new constant (design/ledger.md section 23.1)T-655Not run: off, every number as before; steps 36b and 36c predictions written firstreports/tiers/ledger-steps.md
5 OctThe points ledger's supportMeasured switch, off (step 37, T-657): Synapse, command points, buffs, debuffs and heals stop multiplying the form's Value and are measured instead on the friends they reach (tools/supportfx.js → supportfx through tools/ledger-merge.js): auras and marks played on the army's typical friendly unit with and without them (its Kill and Soak through the ledger's kernel), × 2/3/4 units within 6"/9"/12" × 0.5 in range, a mark 1 friend; Synapse as the list's worth (+1 Strength in melee, Battle-shock on three dice at 1 test a game, 1.538 turns, 0.65 VP, 31 points a VP) shared by its sources; a CP 30 points × the CP a game each rule yields (tools/ledger-support.json; tools/shock-classes.json's class a 2, b 0.5, c 0); heals no other line counts on Soak; rules known only in words 0. Onto Value: the friends' Kill × wKill and Soak × wSoak at the lines' scales, points a game × P ÷ 100; wins over supportCredit; constants reasoned before any run (design/ledger.md section 24)T-657Not run: off, every number as before (the fingerprint test); step 37's prediction written firstreports/tiers/ledger-steps.md
5 OctThe points ledger's vpLedger switch, off (step 38, T-658): every line in one currency, VP a game at 2,000 ÷ 65 = 30.8 points a VP, no fitted weight: Kill as the enemy VP its kills deny (0.6 of the game's scoring left × 65 ÷ 2,000 = 0.0195 VP a point) plus the kill cards (30 × 0.29 + 35 × 0.123 = 13.0 VP a game), read as the median reference form's share of the 1,200 points a typical game destroys (1.82 VP a game per 100 at the median Kill); Soak as our own VP kept at the same 0.0195 (1.17 at the median Soak); Spawn a point kept over three rounds; the mission line as missionVP built it (on with the switch, its bridges unused); Battle-shock W ÷ 31; what no rate prices (spawned bodies with the Biovore dial; Score, Hold, Actions without mission data) at its share of the median unit (× Pnew ÷ P); rates reasoned before any run (design/ledger.md section 25)T-658Not run: off, every number as before (the fingerprint test); step 38's prediction written first; median line shares with it on, Tyranids Kill 0.37, Soak 0.22, mission 0.29; Space Marines 0.36, 0.24, 0.43reports/tiers/ledger-steps.md
5 OctThe points ledger's lifeKill switch, off (step 39, T-660; Jordan's colleague, Tyranids first): each solo form's points killed over its life, characters dropped as targets: K = 0.5 × Burst (best 3 copies' worth of the field's non-character units) + 0.5 × Average (every non-character unit, by copies), × L = 1 + (1 − q) + (1 − q)² + (1 − q)³, q the chance the typical army finishes it in one enemy turn (fire in proportion to points, step 27b; an Indirect Fire form half seen; the defend walk's chances); read back so the median ranking form keeps its Kill; replaces whichever Kill is active (burstKill's, or preferredTargets' and attachChars' when on); Tyranids only (tools/life-tyranids.json), other armies unchanged; constants reasoned before any run (design/ledger.md section 26)T-660Not run: off, every number as before; step 39's prediction written firstreports/tiers/ledger-steps.md
5 OctThe points ledger's lifeKill as dials (T-660 follow-up): lifeBlend w (0..1, 0.5 as built: K = w·Burst + (1 − w)·Average where it supplies the Kill), lifeSurvive s (0..2, 1 as built: × (L ÷ the ranking forms' median L)^s on whatever Kill is active, its own rescaled), lifeMode (0 auto: with preferredTargets on, its allocation kept and only the survival factor applied; 1 replace, step 39 as built; 2 survival only); off and as built reproduce the numbers exactly (design/ledger.md section 26.1)T-660Not run: off, every number as before; Track B with lifeKill on now composes by default (lifeMode=1 is step 39's 76.4%)reports/tiers/ledger-steps.md
5 OctThe points ledger's strength dials (T-661; Jordan's colleague: "dials, not verdicts"): every switch since step 18 keeps its on/off and gains a dial in ledger.js DIALS, each scaling the switch's own effect relative to off or through its own constant: arrivalKillW (ARRIVE_W × w, the arrival reach back below 1), scarceAnswersW (Kill_off + w(Kill_on − Kill_off)), wCarry (reused for carryDedicated), scoreFloorW (line and curve blended), killClassWeightW (CLASS_TOUGH_W read as 1 + w), secondaryVPW and missionVPW (the line × w, the replaced lines × (1 − min(w, 1))), vpMissionW and vpPerUnit (the VP ledger's mission weight, and the share of mission VP counted per unit rather than per point: the screens-and-secondaries dial), threatSoakW (the exponent k), shockPressureW (W × w), supportMeasuredW (the measured credit × w), preferC, preferN (preferred targets' C and N), attachRate (attachChars' Burst between plain and attached), and T-660's lifeSurvive and lifeBlend read the same way; tools/knobsweep.js sweeps them (design/ledger.md section 27)T-661At the defaults every number as before (a fingerprint made with the pre-dial code, 17 settings); the sweep on Track B: reports/tiers/2026-10-05-dials.md; nothing adoptedreports/tiers/2026-10-05-dials.md
5 OctThe designers' price list (T-663, a report; tools/pricelist.js): log points at the minimum size of 829 datasheets of the 16 ledger armies regressed on rankings.json's capabilities (damage into the five stand-in targets, durability against the five stand-in attackers, total OC, Move, all absolute) and 73 perk variables; ridge on within-army deviations, λ by leaving one army out, 500 bootstraps; the engine's dice credit for a weapon keyword or Feel No Pain from the frozen ev.js with and without it; the ledger's credits by toggles at Track B. No live score, ledger number or setting changedT-663Left-out R² 88.4%; Tyranid residual alone 50.9% on the five lists (Track B 77.7%); weapon keywords 1.12× of their dice credit, Feel No Pain 0.23×reports/tiers/2026-10-05-pricelist.md
5 OctReviewer grades on an older game measured (T-667, tools/panelstale.js): each panel's BSData commit at its date against the frozen one, per unit points at every size (10%+), datasheet fields by name (BSData's bookkeeping evened out) and edition; the Tyranid yardstick (Track B) with and without the flagged unitsT-667No number moves (a yardstick check): dropping stale units narrows the ledger-to-reviewers gap (12.7 points) by at most ~0.7 beyond random drops; the yardstick stays as it isreports/tiers/2026-10-05-panelstale.md
5 OctThe datasheet profile as dials and the points exponent (T-662): ledger.js profileDials (a form's Value × Π (1 + m x) over its binary features, held at 0.05 or above, × exp(Σ m z) over its numbers, + Σ F x points at the median unit's rate), profileLines (the same, each feature on the parts of Value its family affects: Kill on arrival, the Kill that needs the unit alive ((L − 1) ÷ L, 0.5 without a life), the rest of Kill, Soak, Score, Actions, Hold, Spawn, Presence, the support credits, Battle-shock, secondary VP, the rest), both off, and the dial pointsExp e (Value × (points ÷ 100)^−e, 0); the reference medians are taken with all three off; the features come only from the search tool (tools/ledgerprofile.js)T-662No number moves (off; the page carries no features). The search: reports/tiers/2026-10-05-crack.md, nothing adoptedreports/tiers/2026-10-05-crack.md
5 OctIngredients from the cross-army misses (T-670): ledger.js dials aircraftBoard (an aircraft's Kill × (1 − 0.2a), its Score, Hold and Presence × (1 − a)) and smallPiece (Value × (points ÷ the army's median reference points)^e), both on the ledger page and off by default; leaderCredit (a leader ranks at its Value alone + λ × the gap to its worth at the margin leading) and loneOpSoak (Lone Operative adds σ × its shooting Soak, ungated) as code only, off. 0 is today's ledger exactlyT-670Held out on the 15 armies (chosen on 10, scored on 5, 3 seeds): aircraftBoard +0.2 ± 0.1, smallPiece +1.2 ± 1.0 (Tyranids −3.1), with attachChars +2.2 ± 1.3; leaderCredit −0.8, loneOpSoak 0.0reports/tiers/2026-10-05-ingredients.md
5 OctAn army's own quirks as dials (T-672, World Eaters the test bed): ledger.js dial modeScarcity (ranged Kill × r^−m and melee Kill × (1 − r)^−m, r the army's ranged share of Kill over its reference forms, scaled so the army's summed Kill is kept), on the ledger page and off by default; armyPick (Burst blended toward burstPick, the Burst with an army rule's own choice taken: tools/ledger.js setArmyPick, tools/burst.js --field --army-pick, merged by tools/ledger-merge.js) as code only, off. 0 is today's ledger exactlyT-672World Eaters, one list left out: modeScarcity 0.2 +2.4 held out (with smallPiece 0.15 +4.5); the other 14 armies −0.1 ± 0.4, Tyranids +0.0; armyPick chose 0 (−2.2 at 1)reports/tiers/2026-10-05-world-eaters.md
5 OctScreens and cheap scorers (T-675): ledger.js dials screenArea, screenBlock, screenTrade, screenScore, screenHide (each w × Q × P ÷ points, Q a worth in points: board denied to arrivals, frontage × speed, enemy fire to remove it with a one-activation floor, a scoring slot × OC, Infiltrators/Scouts/Stealth/Lone Operative) and the screenJob switch; screenTrade on the ledger page, off; the rest code only, off. 0 is today's ledger exactlyT-675Held out (10 armies choose, 5 score, 3 splits): screenTrade +0.15 ± 0.06 at 0.01 (exam +0.1 [−0.3, +0.7]); area −0.02, block −0.05, score −0.95, hide −1.29. World Eaters alone +4 to +6 (area, block, score), at a cost of 1 to 3 pooledreports/tiers/2026-10-05-screens.md
5 OctScreen slots (T-677): ledger.js screenSlots k (only each army's top k units by screen worth take the T-675 screen credit), screenNext x (the next ones x, x²), screenRank (per point among units able to do the job, or by worth overall); all 0 = today exactly. Battle-shock's reference Value now leaves the screen credit out. Held out across armies: no positive setting (k 1 to 3, −0.6 to +0.03); World Eaters alone +6.7 held out at a third of the unslotted cost elsewhere. Not on the page; reports/tiers/2026-10-05-screen-slots.md
5 OctTransports by their cargo on the page (T-679): ledger.js switch carryCargo (off) and dials carryRide, carryShield, carryFrag, carryFragRef, carryPer, carryDedOnly, carryCap, carryOnce, carryArrive, carryNeed, carrySquads (all 0), T-674's research line (tools/carrycargo.js) in the model: a transport worth what a ride adds to its best rider (meta.carryRiders from tools/carry.js ridersOf through tools/ledger-merge.js, all 16 armies), in place of the capacity line; on the ledger page in "Transports (T-674)". Off or at Transports 0 is today exactlyT-679Shape A (w 0.5, shield 0.4, frag 2 at 150, dedicated only, cap 1) reproduces carrycargo.js unit for unit: exam pooled +1.2 [−0.1, +2.8], Drukhari +14.0, Tyranids −1.7; not adopted (−0.0 ± 0.5 held out, T-674)reports/tiers/2026-10-05-transports.md
5 OctEvery character and its special rules as dials (T-673, phase 1): ledger.js CHAR_KEYS charLead, charMove, charArrive, charOC, charShock, charShockAmp, charCP, charPsychic, charAura, charDebuff, charEpic, charEnh, charLone, charHome, each 0 to 3: a CHARACTER carrying the kind adds w × CHAR_PTS (50) × P ÷ its points, P the army's median reference Value a hundred with the dials at 0; charHome's worth is 50 × clamp(V ÷ P − 1, −1, CHAR_HOME_CAP 2), V its best pool squad's reference Value; charShockAmp's is SHOCK_AMP (0.4) × the army's other shock rules' shockW (+ SHOCK_ARMY rules as SHOCK_ARMY_TESTS 10 tests at SHOCK_ARMY_FAIL 0.35) × shockPressureW. cpOnce (0 to 1): a Command-points rule that can't stack (same rule, or any CP gain, CP_GAIN; own-unit discounts CP_STACK stack) keeps r.cp only on the army's best carrier, the others 1 + (1 − c)(m − 1). The kinds per character are ledger.js CHARS, from tools/characters.js (tools/characters.json). On the ledger page, all 0; 0 is today's ledger exactlyT-673Not measured (phase 2, after T-680 and T-681)reports/tiers/2026-10-05-characters.md
5 OctTypical version against best version (T-683, phase 1): tools/typical.js dials typicalSize (ws) and typicalDet (wd), typicalW setting both, all 0 = today to the bit: a unit's Value B + ws(1 − wd)(S − B) + (1 − ws)wd(D − B) + ws·wd(T − B), B today's best form, S the typical squad (smallest size, datasheet wargear) in its best detachment, D the median over detachments of its best form, T the median of the typical squad; a preview over compute(), no ledger file or page changesT-683not yet (after T-673)reports/tiers/2026-10-05-typical.md
5 OctOne per job (T-682, phase 1): tools/rivals.js, a preview, the dial rivalW (0 = today): Value × (1 − rivalW × the largest likeness × gap among a unit's better same-army rivals); likeness = kill² × mode × type × speed^½ (target tilt by cosine, ranged share, body/Character/Fly, Move), gap = (V_rival − V) ÷ V capped at 1 (twice as good per point); with a scrambled-likeness placebo. Not in ledger.js, nothing adoptedT-682not yet (after T-673); Tyranids at 0.5 in sample 79.3 → 78.9reports/tiers/2026-10-05-rivals.md
5 OctJailing and the objective steal (T-684, phase 1): tools/steal.js previews two dials, jailW (turn-one reach into the enemy's zone × the width a unit holds there, coherency-capped at 9" plus engagement range, as a share of the zone, Q = 0.1 × 2,000 × that share × 0.5 for going first) and stealW (arrives anywhere, moves after shooting, takes an enemy-held objective on OC: Q = 4.5 VP × P(reach) × OC ÷ (OC + 8.26) × 2,000 ÷ 65 points a VP), each Value + w × Q × P ÷ points as the screen dials; 0 = today exactly; not in ledger.js. Steal qualifies 5 datasheets in 16 armies; Tyranid preview at jail 1, steal 0.5: lists 79.3 → 79.9 (placebo 79.0), Gargoyles 46th → 37thT-684Not measured (after T-673)reports/tiers/2026-10-05-steal.md
5 OctSpace Marines' scarcity and Soak effects (T-681): tools/scarcity-space-marines.json (scarcity.js unchanged formula, β 6: heavy infantry 2.35 … chaff 0.18), tools/soakfx-space-marines.json from tools/soakfx-rules-space-marines.json (every form exposed 1; Self Repair, Narthecium own heals; Blessing of the Omnissiah healMult only), merged by ledger-merge.js; live files, no re-freeze (snapshot eb3590a)T-681Space Marines Track A 64.5 → 60.3 (scarcity −4.2 [−9.1, +0.7], Soak 0); pooled 59.4 → 59.1; Tyranids unchangedreports/tiers/2026-10-05-refreeze-sm.md
5 OctOne exam hook for the previews (T-685): tools/exam.js takes a setting's optional post: { module, args } (or --post, --post-args): the module's post(D, run, sliders, args) rewrites unit values after compute(), and the exam re-sorts and scores them with its paired bootstraps. tools/rivals.js, tools/typical.js and tools/steal.js export post over what they had. No number moves: without post the path is unchanged, and each preview at 0 gives Track A to the bit.
5 OctThe span match, a second yardstick (T-689, Jordan's rule with partial credit): tools/spanmatch.js and tools/exam.js --span. A unit's span is every letter from the best to the worst of its squad sizes' letters (each size at its best detachment and loadout, cut by the run's own cutS..cutC; the ranked row's letter always in); a reviewer's letter inside scores 1 ÷ the span's width, outside 0; beside it the strict letter match and a same-width placebo (three seeds). Without --span the exam's output is byte-identical. No Value movesT-689Pooled 14 armies span / strict / placebo: A 25.2 / 25.2 / 18.9, B 26.5 / 26.8 / 19.2, trio 26.1 / 26.3 / 19.3; Tyranids 36.5 / 36.7 / 22.3 (A); span − strict about 0 everywherereports/tiers/2026-10-05-spanmatch.md
5 OctDetachment corrections from the T-690 audit (T-694). docs/data/detfx.json: the six choices that are really a roll, a ladder or a once-a-battle pick carry pick ("roll", "ladder", "once"), pickNote and a share per option, the part of a five-round game it holds (Pledges to the Dark Prince a fifth per step; Master of Wolves a fifth per pack, Ferocious Strike's two halves a tenth each; Mission Tactics a fifth each; Unpredictable Genius by its D6; Try Dat Button! as two dice, a third per pair, hazard not counted; Blood Tithe nothing in rounds 1–2, Enraged Abjuration round 3, Boon of Blood rounds 4–5). The calculator ignores the shares and still offers every option; tools/ledger.js mixes them: one variant per detachment whose numbers are its parts' (each option, and none for the rest) weighted (variantParts, mixNumbers; tools/burst.js mixes --field, --prefer and --life the same way). Noted rules' multiplier reaches only the units a rule names (units, notUnits in the data, else its effects' and its choice options' unit keywords, so Idols of Khorne is the Jakhals' and Goremongers'); a rule marked army (Rad-bombardment, Miasmic Bombardment, Artillery Support) acts once for the army and reaches no unit. New conditions notTargetKw and notUnitKw (docs/detfx.js check, tools/matrix.js unitLevel and cells; docs/ev.js reads no conditions, its callers settle them through DetFx.check): Born Soldiers' Regiment half, Exacting Cruelty and Contracted Harvest "not against MONSTER or VEHICLE"; Wrath of Khorne not for Epic Heroes. Dark Age Arsenal by when.weapon (plasma); Dutiful Tenacity, Stitchflesh Abominations and Darkest Artifice by sVsT: "gt"; Enraged Abjuration as fnpPsychic/fnpMortal 5+. The site's rankings.json isn't rebuilt here (no stamp; its detachment synergy line ds will move for Dark Age Arsenal, now plasma only, when it next is); the ledger takes these with the T-687 re-freeze
5 OctThe ledger re-frozen on today's engine and T-694's corrections, on the pre-dataslate data (T-687): tools/ledger-inputs.lock.json is code 8eb69bc7af with index.json and the panels kept as at eb3590a (from) and three inputs built (built: detfx.json = eb3590a's plus T-694's corrections, the 30 Sep update's Frantic Focus and Legion of Excess changes left out; detachments.json, a new input, at BSData 374f505 with today's reader; rankings.json from eb3590a's data with today's engine); inputs hash a20dbd2c3316; the old lock kept (tools/ledger-inputs.lock-eb3590a.json, LEDGER_INPUTS_LOCK). tools/ledger.js matchedOf takes an army's detachments from detachments.json (a Detachment Points cost, its only, effects found under its own key or, for one kept to it, any army's, no Boarding rule): the same lists for 15 armies, the Drukhari's nine for them. Track A: Tyranids 79.3 → 79.1, exam 59.1 → 59.0; reports/tiers/2026-10-05-refreeze-engine.md
5 OctUnavoidable burst (T-712): tools/surefire.js, a post step through the exam's hook, dial sureFire w (0 = today to the bit): Value + w × K × (d − d̃), K the best form's Kill contribution to Value (Burst under burstKill), d a unit's delivery (the share of the enemy's zone its natural mode reaches by our turn 2 by its best way: walk R + 2M, Scouts, Infiltrators, Deep Strike and other arrivals 1, strategic reserves from the 6" edge strip, a transport in its army; melee with a 9" charge in place of R), d̃ the army's median d; variant reserves: 0. A report; no ledger file or page changesT-712Held out +2.7 ± 0.6 (placebo 0; without reserves +3.5); exam at 0.5 +1.8 [−0.0, +3.6]; Tyranids +0.2; not adopted, for the next cascade at 0.25 and 0.5reports/tiers/2026-10-05-surefire.md
5 OctA character's army-wide kinds on its own share (T-715, fix 1): on a joined form a total-line kind only a character member carries (rules tagged from) is kept out of the form's total multiplier; Value = (Σ weighted lines + Σ_k (Π x_k − 1) × L_k × pts_k ÷ pts) × total, L_k the character's weighted lines alone (its solo form alone at the same size, loadout and detachment), shown as memberRulesT-715Joined forms only: T-709's g on Hellblasters + Apothecary 6,113 → 886, Hearthguard + Ûthar 2,730 → −57, Thunderkyn + Iron-master 3,111 → 409; Track A unchanged by itreports/tiers/2026-10-05-leader-fixes.md
5 OctOne Kill scale (T-715, fix 2): every joined form takes a Burst (tools/burst.js --field walks it, the joined unit with its characters' lend) and burstKill reads it like a solo form's, on the solo ranking forms' burstScaleT-715No solo number movesreports/tiers/2026-10-05-leader-fixes.md
5 OctLeaders and Supports apart (T-715, fix 3): matrix.js contextEnv leaders and supports (a Supporting link wins); forms squad + Leader, squad + Support, squad + its best Leader (Kill ranged + 0.6 melee + Soak × metaKillRate at β 6) + each Support, every character lendingT-71535 Support characters, 149 pairings, 160 three-member bases in 7 armiesreports/tiers/2026-10-05-leader-fixes.md
5 OctHealing scoped and counted once (T-715, fix 4): unitfx.json heal self / to; Narthecium inSpawn (healMultOwn leaves it out); the Dark Angels' Narthecium on the Space Marines' spawn rule; a heal the Soak effects count by the form itself is measured: "soak" (no ×heal); a spawning rule measured only on forms of a datasheet that carries itT-715Old One Eye, the Red Terror, the Rhino −45%; the Dark Angels' Apothecary 78 → 88; Tyranids 82.45 → 81.61reports/tiers/2026-10-05-leader-fixes.md
5 OctLone Operative on a joined form only when every member has it (T-715, fix 5)T-715Joined forms onlyreports/tiers/2026-10-05-leader-fixes.md
5 OctThe lend priced apart from joining (T-715, fix 6): the engine writes each joined form's Kill and Soak without each character's leaderfx effects (lend); tools/leadercomp.js g = (contrib.kill × ΔK ÷ K + contrib.soak × ΔS ÷ S) × pts ÷ 100 × 100 ÷ the character's points, K = ranged + melee × lands × r.first (β of the form), Leaders against Leaders, Supports against Supports on the squad's best led form; prices dice (default), lend (with grants and +OC), lendown, joined (T-709's)T-715Reviewers' check 25.8% of 151 → 50.9% of 172 by role (chance 38.7%); T-709's penalty half held out +0.58 ± 0.11 (placebo 0)reports/tiers/2026-10-05-leader-fixes.md
5 OctThe missing grants (T-715, fix 7): unitfx.json grants (Deep Strike, Fights First for the attached unit; leading), ocPlus/ocTo (+1 OC a model of the unit, or the bearer) into ocPer100; a granted Deep Strike is a charge-model way in (landsNoGrant beside it); a leaderfx lend needing "charged this turn" met in melee (the page scales melee by lands)T-715Command squads +8 to +25%, Company Heroes 41 → 34; the Teleport Crest moves no lands (deploying reaches as often)reports/tiers/2026-10-05-leader-fixes.md
5 Oct"Alone" at the joined form's own loadout (T-715, fix 8): partnerAlone reads alone (same size, Auto-equip squad and detachment) before the best solo formT-715Toggles only; none holds after the fixes (leaderCredit at 1 pooled −3.76 → −1.88)reports/tiers/2026-10-05-leader-fixes.md
6 OctA second yardstick behind a flag: the GEMINI AGGREGATE lists at half weight, read at scoring time (tools/yardstick.js; consensus pairs: human-agreed 1, one human plus Gemini 1, Gemini only 0.5; the exam's list mean: Gemini one more list at 0.5); scoring only, no ledger number movesT-731Track A 61.9 → 61.7 (consensus, 16), 59.3 → 58.4 (list mean, 15)reports/tiers/2026-10-06-yardstick-exam.md
6 OctHeld-out exam of Track A, C1, C5, #3 and line weights solved to Kill-share targets (30, 50, 70%)T-734held out over C1 +0.0 ± 0.8; every share target below its basereports/tiers/2026-10-06-yardstick-exam.md
6 OctThe new recipe, step 1 (T-739, step 41, kept as Track A2, candidate): Track A + charEpic 0.5 + aircraftBoard 1 + typicalSize 0.25 (mean rule) through the post hook; measured by tools/recipestep.js (held out on the 15 exam armies, leave one army out, paired unit bootstrap, Gemini at half, three shuffled letter sets; keep if the gain > 0, its interval's low end > −0.5 and 9 of 15 armies don't fall)T-739held out +1.2 [−0.4, +2.6], 11 of 15 not falling; adoption is Jordan's callreports/tiers/2026-10-06-recipe-steps-1-2.md
6 OctReach (T-739, step 2, reverted): tools/reach.js, a post step, wReach 0 = today to the bit; r a form's board share by the end of our turn 2 by its best way in (M + ADV 3.5" twice from our zone; Scouts; Infiltrators; arrivals more than 8" from the enemy's zone; reserves; a transport's two moves + OUT3 3"; surefire.js basicsOf()), on a 1" GRID; Value + wReach × (r × 100 ÷ points − the army's median), or with reachKind 1 Value + wReach × P̃ × (r − the median r of the army's units of its kind, KINDS Vehicle, Monster, Mounted, Infantry, other). tools/postchain.js chains post stepsT-739as briefed: fitted wReach 0 in every fold; by kind: held out +0.6 [−1.7, +2.7], 8 of 15 not falling; both revertedreports/tiers/2026-10-06-recipe-steps-1-2.md
6 OctThe unit-kind layer (T-740, step 43, reverted): tools/kindlayer.js, a post step chained after the stable layer, every dial 0 = today to the bit; Value × exp(kInfantry·Infantry + kMonster·Monster + kVehicle·Vehicle + kFly·Fly + kEpic·Epic Hero + kPsyker·Psyker) × (M ÷ M̃)^kSpeed, the flags and M from the unit's own datasheet, M̃ the median Move of the army's ranked units of its body kind (BODY Vehicle, Monster, Mounted, Infantry, other); fitted by tools/kindstep.js on each training fold from the grid LEVELS {−0.3, 0, +0.3} and SPEED {−0.5, 0, 0.5, 1} (2,916 candidates, the base first), recipestep.js's protocolT-740held out +0.2 [−1.6, +1.9], 7 of 15 not falling (fixed at the modal pick +2.0 in sample); revertedreports/tiers/2026-10-06-recipe-step-43.md
6 OctThe stratagem pilot (T-713, steps 44 and 44b, not adopted): tools/stratagems.js, a post step chained after the stable layer, w 0 (or an army without a credit file) = today to the bit; the catalogue tools/stratfx/<army>.json and core.json (dice stratagems as engine effects, our words); tools/stratuplift.js the uplift (Burst or Soak with one use added, minus without; a melee phase × the form's lands; points saved = pts × (min(1, E ÷ S) − min(1, E ÷ S′)), E the typical army's mean unit, S the enemy points to remove the unit); the spend: CORE_CP 2 a battle round × ROUNDS 5, the typical list by Value within LIST_PTS 2,000, uses bought by points per CP (fractional greedy); Value′ = Value + w × (Kill rate × kill credit + Soak contribution × Soak credit + the army's median Kill rate × a CP source's credit), the best detachment per unit; W_GRID {0, 0.25, 0.5, 1, 2, 4, 8} fitted on one army, scored on the otherT-713Tyranids −0.1 at w 1; Votann +9.5 (44) / +12.4 (44b) on one list, placebo credits +4.7 / +7.2; cross-test Tyranids → Votann +0.0 / +3.8, Votann → Tyranids −0.1; fails its rulereports/tiers/2026-10-06-stratagem-pilot.md
6 OctWinning-list shape as unit features (T-743, a report, nothing adopted): tools/listshape.js (his six Toughness bands with the ledger's exact dice into the typical army, one activation, shooting or fighting; 80+ points of a representative target, wound and models-destroyed readings; cost tiers at 115 and 200; anchor ratio = Soak at β 6 shooting ÷ 100; coverage credit Σ 1 ÷ (1 + other army units clearing the band)) and tools/statlearn.js's shape features; nothing in the live scores or the ledger movesT-743held out on 15 armies: bands and coverage +1.0 [−1.4, +3.4], anchor −0.7, tier −0.2, rank in tier +0.2; none declaredreports/tiers/2026-10-06-list-shape-internal.md
6 OctFire Support in the calculator (T-744, Jordan approved 6 Oct): a transport whose passengers re-roll wound rolls against the unit it hit is a lend in kindfx.json (rrWound all; ranged, but the Falcon's lasts the turn; the getting-out a manual condition, the target the Marked chip) and partly in unitfx.json, on the Death Guard Chaos Rhino and the same rule's other bearers read on the 11th-edition pages: Razorback and Relic Razorback, Coronus Grav-carrier, Skorpius Dunerider, Falcon, Manta (Aggressive Deployment), Goliath Truck, Crassus and Valkyrie Sky Talon (Astra Militarum, Genestealer Cults), Grey Knights Relic RazorbackT-744The calculator only; the rankings and the frozen ledger don't read it (their copies move at a re-freeze)reports/tiers/2026-10-06-death-guard-checks.md
6 OctThe bug-fix snapshot (T-745; a re-freeze, b3c416933e / 1b88e955b9b3): a unitfx.json heal with returns: true (a rule that brings slain models back to a unit) is the ledger kind "Returns slain models", the page's r.return (× 1 unless set; SPAWN_HEADS keeps the Spawn line's measured ones measured), no longer r.heal's ×1.805; T-723's excl pairs in build/units.json; the squad-wide rules in tools/ledger.js SQUAD_SAME (one option family per squad, as loadout.js packages: pkg group "same"); ledger-merge.js leaves panels that join no yardstick out of the comparators. Track A2 (step 41) is the ledger's benchmarkT-745Track A exam 59.3 → 59.7, consensus 60.0 → 60.2, Tyranids unchanged; step 41 held out +1.1 [−0.3, +2.7] over A, 12 of 15reports/tiers/2026-10-06-bugfix-snapshot.md
6 OctThe stratagem step (T-742, reverted, nothing adopted): tools/stratagems.js wires all 16 armies; a new shared parameter, the shoot-back share AGAIN_SHARES {0.25, 0.5, 1}: a stratagem with an again version (shooting in the enemy's phase, or once more) counts that share of its points in the spend; the grid STEP_W {0.25, 0.5, 1, 2, 4, 8} × the share after step 41 (Track A2), core re-roll in the menu, chosen on the training folds (tools/recipestep.js's protocol); the placebo hands each army's adds to random units of the army, PLACEBO_SEEDS 101 to 120, through the same fit; the keep rule adds "above the placebo's 95th percentile". tools/postchain.js keeps each step's result per input run (same numbers)T-742Held out −0.6 [−1.8, +0.4], 5 of 15 not falling, placebo 95th percentile +0.4 (beats 3 of 20); fitted w 2, share 1 in 6 of 9 folds, all from Votann (+21.9; the other 14 lose at every w); face value +0.3 [−1.0, +1.7]; Tyranids 82.6 → 82.5reports/tiers/2026-10-06-stratagem-step.md
6 OctThe ensemble's confirmation (T-748, a report, nothing adopted): tools/statlearn.js takes --bench and --out (and configure()), and applies a setting's post step before reading the feature table; tools/ensconfirm.js re-implements T-736's x_ens_sheet (the SHEET features, pairwise L2 logistic, λ by inner leave-army-group-out, percentile of the fit + percentile of Value) and scores it on the GEMINI AGGREGATE letters, the T-733 Orks candidate and leave one list out in the multi-list armies; no ledger number movesT-748over Track A2: 11 held-out human lists +3.9 [+1.3, +6.6]; Gemini +5.3 [+1.8, +9.1]; leave one army out +2.4 [−0.8, +5.6] on 15reports/tiers/2026-10-06-ensemble-confirm.md
6 OctReturning models on the Spawn line (T-747, measured and reverted; the files hibernated): tools/spawn-rules-<army>.json for nine armies (Genestealer Cults, Astra Militarum, Agents of the Imperium, Death Guard, Dark Angels, Drukhari, Thousand Sons, World Eaters, Space Wolves; our words), read by tools/spawn.js only with LEDGER_SPAWN_RETURNS=1 (or useArmy(key, { returns: true })); a returned model at the receiving unit's points per model at its smallest size, rounds [0.5, 1, 1]; new counts: objective (a better count on a held objective, its share of Command phases 0.5, the Cult Icon), big (from a squad size on: Krieg's two medi-packs at 20, D3+1), per: "modelsKilled" (Curse of the Walking Pox: the form's kill['6'].byClass ÷ classPpm(), the step-1a field's points per model by class: monster 246, heavy vehicle 259, light vehicle 90, character 95, heavy infantry 35, cavalry and beasts 30, elite infantry 14.3, chaff 8.75; MONSTER and VEHICLE classes left out; gated by lands), into: "unit" (the bearer's unit: the led squad on a joined form, its own models alone); constants in the files: Fleshcraft's Pain share 0.5, Rebind Rubricae 5/6 a Command phase; a one-model receiving squad takes nothing back; tools/recipestep.js --base-dir / --cand-dir (the same setting on two folders of ledgers)T-747Off by default: every ledger as T-745 built it, Tyranids and Space Marines unchanged to the byte. With the files on: held out +0.0 [+0.0, +0.0] over step 41, 15 of 15, no graded pair moves; returning units +15 to +37 Value, leaders 0reports/tiers/2026-10-06-spawn-returns.md
6 OctStratagems in the calculator (T-749, Jordan approved 6 Oct): tools/stratcalc.js writes docs/data/stratfx.json from the catalogue (tools/stratfx/*.json and core.json): per detachment the site knows, the stratagems that change the dice (not noted, not a version that only acts again), each { id, cp, ph, vs, one, who, whoAll, notWho, attached, label, tip, v }, a sum stratagem's main version (largest share) only, a best one's versions all; docs/detfx.js strats(), coreStrats(), stratOpts() (versions told apart by their conditions are one option, true alternatives one each, a unit's own fuller version replaces the plain one) and stratEffects() (ids `strat<id><slot><n>, its own turn's gated to ranged or melee by the phase, a defence one's by the enemy phases it covers); in play only while the player uses one (app.js S.attStrat/S.defStrat, detInPlay`), the condition the catalogue counts as a share taken as metT-749The calculator only; the rankings and the frozen ledger don't read itdesign/mockups/2026-10-06-calculator-stratagems.html
6 OctThe datasheet signals as ledger steps (T-751, steps 46 to 50, all reverted; nothing adopted): tools/sheetlayer.js, a post step chained after the stable layer, every dial 0 = today to the bit, on each ranked unit's own datasheet (tools/kindlayer.js featuresOf): sheetSpeed k, Value × (M ÷ M̃_kind)^k (M̃_kind the median Move of the army's ranked units of its body kind); sheetEpicPsyker a, × exp(a) for EPIC HERO or PSYKER, taken once, on top of charEpic; sheetInfantry b, × exp(b) for INFANTRY; and two ledger sliders, wSoak and rules.lone. tools/sheetstep.js STEPS holds each step's grid: sheetSpeed {0, 0.25, 0.5, 1}, sheetEpicPsyker and sheetInfantry {0, 0.15, 0.3}, wSoak ×1/×2/×4, rules.lone {1.93, 2.5, 3}; chosen on the training folds (tools/recipestep.js's protocol); the keep rule adds a fourth part, the real held-out gain above the mean of the three shuffled controls'T-751held out over step 41 (Track A2): speed +1.1 [−0.6, +2.7], 10 of 15 (k 1 in 9 of 9 folds; shuffles pick 1 too, mean +0.3), the floor fails; Epic Hero or Psyker −0.3 [−1.2, +0.5], 8; Infantry −0.2 [−1.0, +0.7], 8; Soak ×2/×4 −0.1 [−0.3, +0.0], 7; Lone Operative +0.0, 15 (only the Orks move); the five together at their modal picks (a diagnostic) +1.3 [−0.6, +3.1], 9. Track A2 stays the benchmarkreports/tiers/2026-10-06-datasheet-steps.md