2026-10-04-tyranid-features.csv: one row per Tyranid unit (52) per form: best (its best solo form at the step-6 baseline, the ledger's ranking row) and cheapest (the best of its solo forms at the fewest models). Our own numbers from the frozen datasheets (BSData 374f505, through tools/ledger-inputs.lock.json) and the effects files; numbers and flags only, never rules text. Written by tools/diagnose.js.
The first columns: unit, form (best or cheapest), formLabel (the ledger's form label: size, loadout name, detachment), detachment, consensus (mean letter over the five headline lists that grade it, S 5 … F 0), graded (how many lists grade it), letter_<list> (each list's letter).
mono: the sign the boosted trees are held to (+1 more is never worse, −1 less is never worse, 0 free). The models read the best row plus the cheapest size's valueCheap, ptsCheap and modelsCheap.
| Column | Family | mono | What it is |
|---|---|---|---|
M | datasheet | +1 | Move, inches |
T | datasheet | +1 | Toughness |
Sv | datasheet | −1 | armour save (the number to roll; lower is better) |
inv | datasheet | −1 | invulnerable save (7 = none) |
W | datasheet | +1 | wounds per model |
Ld | datasheet | −1 | Leadership (the number to roll; lower is better) |
OC | datasheet | +1 | Objective Control per model |
models | datasheet | 0 | models in the form |
pts | datasheet | −1 | points of the form |
ptsPerModel | datasheet | 0 | points per model |
ptsPerWound | datasheet | −1 | points per wound (models × W) |
woundsPer100 | datasheet | +1 | wounds per 100 points |
ocPer100 | datasheet | +1 | OC per 100 points (models × OC) |
fnp | datasheet | −1 | Feel No Pain (the number to roll; 7 = none) |
damagedBracket | datasheet | −1 | wounds left at which the unit fights damaged (0 = none) |
bestR_A | weapons | +1 | best ranged profile: attacks (dice averaged) |
bestR_S | weapons | +1 | best ranged profile: Strength |
bestR_AP | weapons | +1 | best ranged profile: AP as a positive number |
bestR_D | weapons | +1 | best ranged profile: Damage (dice averaged) |
bestR_skill | weapons | +1 | best ranged profile: chance to hit (1 for Torrent) |
bestR_range | weapons | +1 | best ranged profile: range, inches |
rangedMeq100 | weapons | +1 | ranged: expected damage per 100 points against a power-armoured trooper (T4 3+ W2), every weapon carried, one volley |
rangedVeh100 | weapons | +1 | ranged: the same against a heavy vehicle (T10 3+ W12) |
rangedChaff100 | weapons | +1 | ranged: the same against a chaff trooper (T3 5+ W1) |
rangedAttacks100 | weapons | +1 | ranged: attacks per 100 points |
bestM_A | weapons | +1 | best melee profile: attacks (dice averaged) |
bestM_S | weapons | +1 | best melee profile: Strength |
bestM_AP | weapons | +1 | best melee profile: AP as a positive number |
bestM_D | weapons | +1 | best melee profile: Damage (dice averaged) |
bestM_skill | weapons | +1 | best melee profile: chance to hit (1 for Torrent) |
meleeMeq100 | weapons | +1 | melee: expected damage per 100 points against a power-armoured trooper (T4 3+ W2), every weapon carried, one volley |
meleeVeh100 | weapons | +1 | melee: the same against a heavy vehicle (T10 3+ W12) |
meleeChaff100 | weapons | +1 | melee: the same against a chaff trooper (T3 5+ W1) |
meleeAttacks100 | weapons | +1 | melee: attacks per 100 points |
maxRange | weapons | +1 | longest ranged weapon, inches (0 = none) |
kw_anti | weapons | 0 | weapons carried with the anti keyword (count of distinct weapons) |
kw_devastating | weapons | 0 | weapons carried with the devastating keyword (count of distinct weapons) |
kw_lethal | weapons | 0 | weapons carried with the lethal keyword (count of distinct weapons) |
kw_sustained | weapons | 0 | weapons carried with the sustained keyword (count of distinct weapons) |
kw_precision | weapons | 0 | weapons carried with the precision keyword (count of distinct weapons) |
kw_indirect | weapons | 0 | weapons carried with the indirect keyword (count of distinct weapons) |
kw_torrent | weapons | 0 | weapons carried with the torrent keyword (count of distinct weapons) |
kw_blast | weapons | 0 | weapons carried with the blast keyword (count of distinct weapons) |
kw_melta | weapons | 0 | weapons carried with the melta keyword (count of distinct weapons) |
kw_twinLinked | weapons | 0 | weapons carried with the twinLinked keyword (count of distinct weapons) |
kw_ignoresCover | weapons | 0 | weapons carried with the ignoresCover keyword (count of distinct weapons) |
kw_psychic | weapons | 0 | weapons carried with the psychic keyword (count of distinct weapons) |
kw_heavy | weapons | 0 | weapons carried with the heavy keyword (count of distinct weapons) |
kw_assault | weapons | 0 | weapons carried with the assault keyword (count of distinct weapons) |
kw_pistol | weapons | 0 | weapons carried with the pistol keyword (count of distinct weapons) |
kw_extraAttacks | weapons | 0 | weapons carried with the extraAttacks keyword (count of distinct weapons) |
has_deepStrike | flags | +1 | carries the core rule Deep Strike (1/0) |
has_scouts | flags | +1 | carries the core rule Scouts (1/0) |
has_infiltrators | flags | +1 | carries the core rule Infiltrators (1/0) |
has_loneOperative | flags | +1 | carries the core rule Lone Operative (1/0) |
has_stealth | flags | +1 | carries the core rule Stealth (1/0) |
has_fightsFirst | flags | +1 | carries the core rule Fights First (1/0) |
has_synapse | flags | +1 | carries the core rule Synapse (1/0) |
has_leader | flags | +1 | carries the core rule Leader (1/0) |
has_deadlyDemise | flags | +1 | carries the core rule Deadly Demise (1/0) |
has_shadowInWarp | flags | +1 | carries the core rule Shadow in the Warp (the army-wide Battle-shock test) (1/0) |
has_hover | flags | +1 | carries the core rule Hover (1/0) |
kw_is_fly | flags | 0 | keyword Fly (1/0) |
kw_is_monster | flags | 0 | keyword Monster (1/0) |
kw_is_infantry | flags | 0 | keyword Infantry (1/0) |
kw_is_character | flags | 0 | keyword Character (1/0) |
kw_is_psyker | flags | 0 | keyword Psyker (1/0) |
kw_is_epicHero | flags | 0 | keyword Epic Hero (1/0) |
kw_is_battleline | flags | 0 | keyword Battleline (1/0) |
kw_is_transport | flags | 0 | keyword Transport or Dedicated Transport (1/0) |
kw_is_towering | flags | 0 | keyword Towering (1/0) |
kw_is_titanic | flags | 0 | keyword Titanic (1/0) |
kw_is_beast | flags | 0 | keyword Beast (1/0) |
kw_is_swarm | flags | 0 | keyword Swarm (1/0) |
kw_is_burrowers | flags | 0 | keyword Burrowers (1/0) |
kw_is_vanguard | flags | 0 | keyword Vanguard Invader (1/0) |
leadsCount | flags | +1 | how many datasheets it can lead |
fx_arrival | flags | +1 | its own abilities (unitfx.json) include a rule of kind "arrival" (1/0) |
fx_move | flags | +1 | its own abilities (unitfx.json) include a rule of kind "move" (1/0) |
fx_enemy | flags | +1 | its own abilities (unitfx.json) include a rule of kind "enemy" (1/0) |
fx_shock | flags | +1 | its own abilities (unitfx.json) include a rule of kind "shock" (1/0) |
fx_mortal | flags | +1 | its own abilities (unitfx.json) include a rule of kind "mortal" (1/0) |
fx_spawn | flags | +1 | its own abilities (unitfx.json) include a rule of kind "spawn" (1/0) |
fx_heal | flags | +1 | its own abilities (unitfx.json) include a rule of kind "heal" (1/0) |
fx_cp | flags | +1 | its own abilities (unitfx.json) include a rule of kind "cp" (1/0) |
fx_aura | flags | +1 | its own abilities (unitfx.json) include a rule of kind "aura" (1/0) |
fx_mark | flags | +1 | its own abilities (unitfx.json) include a rule of kind "mark" (1/0) |
fx_synapse | flags | +1 | its own abilities (unitfx.json) include a rule of kind "synapse" (1/0) |
fx_overwatch | flags | +1 | its own abilities (unitfx.json) include a rule of kind "overwatch" (1/0) |
fx_chosen | flags | +1 | its own abilities (unitfx.json) include a rule of kind "chosen" (1/0) |
fx_once | flags | +1 | its own abilities (unitfx.json) include a rule of kind "once" (1/0) |
fx_oc | flags | +1 | its own abilities (unitfx.json) include a rule of kind "oc" (1/0) |
fx_lead | flags | +1 | its own abilities (unitfx.json) include a rule of kind "lead" (1/0) |
fx_list | flags | +1 | its own abilities (unitfx.json) include a rule of kind "list" (1/0) |
fx_attMods | flags | +1 | unitfx.json: dice effects on its own attacks, always on (count) |
fx_defMods | flags | +1 | unitfx.json: dice effects on attacks against it, always on (count) |
lfx_effects | flags | +1 | leaderfx.json: dice effects it gives the unit it leads (count) |
buffsOthers | flags | +1 | gives other units something: an aura, a leader effect or a lead rule (1/0) |
arrives | flags | +1 | can be placed away from its own zone (the ledger's arrival: deep strike, tunnels, scouts, infiltrators…) (1/0) |
spawns | flags | +1 | adds units or models during the game (1/0) |
lr_synapse | flags | +1 | the ledger counts a "synapse" rule multiplier on this form (1/0) |
lr_cp | flags | +1 | the ledger counts a "cp" rule multiplier on this form (1/0) |
lr_first | flags | +1 | the ledger counts a "first" rule multiplier on this form (1/0) |
lr_lone | flags | +1 | the ledger counts a "lone" rule multiplier on this form (1/0) |
lr_buff | flags | +1 | the ledger counts a "buff" rule multiplier on this form (1/0) |
lr_mortal | flags | +1 | the ledger counts a "mortal" rule multiplier on this form (1/0) |
lr_movement | flags | +1 | the ledger counts a "movement" rule multiplier on this form (1/0) |
lr_debuff | flags | +1 | the ledger counts a "debuff" rule multiplier on this form (1/0) |
lr_heal | flags | +1 | the ledger counts a "heal" rule multiplier on this form (1/0) |
lr_overwatch | flags | +1 | the ledger counts a "overwatch" rule multiplier on this form (1/0) |
value | ledger | +1 | the ledger's Value at the step-6 baseline (per 100 points) |
c_kill | ledger | +1 | the ledger's kill line: its contribution to Value at step 6 |
c_soak | ledger | +1 | the ledger's soak line: its contribution to Value at step 6 |
c_score | ledger | +1 | the ledger's score line: its contribution to Value at step 6 |
c_actions | ledger | +1 | the ledger's actions line: its contribution to Value at step 6 |
c_hold | ledger | +1 | the ledger's hold line: its contribution to Value at step 6 |
c_spawn | ledger | +1 | the ledger's spawn line: its contribution to Value at step 6 |
c_presence | ledger | +1 | the ledger's presence line: its contribution to Value at step 6 |
line_killRanged | ledger | +1 | the ledger's ranged Kill (points removed per 100, as measured, before weights) |
line_killMelee | ledger | +1 | the ledger's melee Kill after the charge's lands (per 100) |
soakShoot | ledger | +1 | enemy shooting points per 100 needed to remove it (Soak, shooting) |
soakFight | ledger | +1 | the same in melee |
lands | ledger | +1 | the charge model's share of its melee that lands |
multTotal | ledger | +1 | the ledger's rule multiplier on the whole Value |
scarcity | ledger | +1 | the ledger's role-scarcity factor on Kill |
k6_monster | killclass | +1 | the ledger's Kill into monster at β 6 (per 100 points) |
k6_heavy_vehicle | killclass | +1 | the ledger's Kill into heavy vehicle at β 6 (per 100 points) |
k6_light_vehicle | killclass | +1 | the ledger's Kill into light vehicle at β 6 (per 100 points) |
k6_heavy_infantry | killclass | +1 | the ledger's Kill into heavy infantry at β 6 (per 100 points) |
k6_elite_infantry | killclass | +1 | the ledger's Kill into elite infantry at β 6 (per 100 points) |
k6_chaff | killclass | +1 | the ledger's Kill into chaff at β 6 (per 100 points) |
k6_character | killclass | +1 | the ledger's Kill into character at β 6 (per 100 points) |
k6_cavalry_and_beasts | killclass | +1 | the ledger's Kill into cavalry and beasts at β 6 (per 100 points) |
valueCheap | ledger | +1 | the ledger's Value at the cheapest legal size (best such solo form) |
ptsCheap | datasheet | −1 | points at the cheapest legal size |
modelsCheap | datasheet | 0 | models at the cheapest legal size |
ix_durLight100 | interaction | +1 | models × W ÷ (wound chance × failed-save chance) against S5 AP−1 D1, per 100 points: hits to kill it with small arms |
ix_durHeavy100 | interaction | +1 | models × ⌈W ÷ 3⌉ ÷ (wound chance × failed-save chance) against S9 AP−3 D3, per 100 points: hits to kill it with anti-tank |
ix_WxSave | interaction | +1 | W × (7 − Sv): wounds times save quality |
ix_invxT | interaction | +1 | (7 − inv) × T: invulnerable save quality times Toughness |
ix_killxSoak | interaction | +1 | √(Kill line × Soak line): damage times staying power |
ix_MxMelee | interaction | +1 | Move × melee share of Kill |
ix_arrivexMelee | interaction | +1 | arrives × melee Kill |
ix_bodiesxOC | interaction | +1 | models per 100 points × OC per model (the same as ocPer100 at one OC) × Move ÷ 6: bodies that reach objectives |