Tactical Reroll
⋯

Every datasheet variable in the diagnosis (T-636, 4 Oct)

From reports/tiers/2026-10-04-variables.md , rendered when the site is built.

Asked by Jordan's colleague: "any variable we haven't added to be added to the list. Can you confirm that all unit profile items, weapons, etc." This card audits every field the unit records carry (build/units.json at BSData 374f505, the 16 armies with a ledger), adds what the diagnosis didn't read, and re-runs T-632's Tyranid diagnosis and T-635's pooled one on the full list. A report: no ledger number, page default, data file, benchmark or frozen input changed. Our own numbers; unit and keyword names only, never rules text.

Commands: node tools/diagnose.js (Tyranids, 10 × 5 folds, about 14 minutes now), node tools/diagnose.js --pooled (16 armies, about 32 minutes on 4 threads), and --base-vars on either for the first 144 columns alone. Files: 2026-10-04-variables-tyranid-features.csv with its dictionary -tyranid-features.md (341 columns, the old five lists' letters; -variables-headline-tyranid-features.csv the same with the headline lists' letters); 2026-10-04-variables-diagnosis-tables.md and .json (Tyranids, the old five lists); 2026-10-04-variables-headline-diagnosis-tables.md and .json (Tyranids, the step-24 headline lists); 2026-10-04-variables-pooled-diagnosis-tables.md and .json (16 armies). The 10-03 and the other 10-04 files are kept.

The short answer

1. The coverage table

Every field of a unit record in build/units.json (docs/bsdata.js makes them), over the 1,076 datasheets of the 16 armies and the 618 graded units. "Graded" is a unit some list of its army grades. A variable that is the same on every graded unit of every army can't order two units of one army, so it is left out with that reason.

The record's fields

FieldWhat it holdsCovered byLeft out, and why
stats.MMoveM, ix_MxMelee, ix_bodiesxOC
stats.TToughnessT, T_max, ix_invxT, ix_durLight100, ix_durHeavy100
stats.Svarmour saveSv, ix_WxSave, durability
stats.WwoundsW, W_max, ptsPerWound, woundsPer100
stats.LDLeadershipLd, Ld_best
stats.OCObjective ControlOC, OC_max, ocPer100
stats.InSvinvulnerable saveinv, ix_invxT
modelseach model's statline (195 datasheets)modelProfiles, statsMixed, W_max, T_max, Ld_best, OC_maxmodel names
sizefewest and most modelssizeMin, sizeMax, sizeRatio, formShare, models, modelsCheap
pointspoints at each size steppts, ptsPerModel, ptsCheap, ptsAtMin, ptsAtMax, ppmAtMin, ppmAtMax, ppmDiscount, sizeSteps, ptsNonLinearmiddle steps: 8 graded units have more than two steps, 4 of them off a straight line (ptsNonLinear flags those)
pointsApproxpoints marked approximateon 2 datasheets, neither graded
weaponsevery profile: Range, A, BS/WS, S, AP, D, Keywordsthe next tableweapon names
loadoutthe default wargeardefaultWeapons; the ledger forms' own loadouts feed every weapon variable
choiceswargear options per model entrychoiceEntries, choicePicks, choiceOptionsoption names
limitswargear with a cap (1 per N models)limitsCount
keywordsunit keywordskw_is_* (14), has_synapse, kwu_* (93)see the keywords table
rulescore and army rule nameshas_* (11), has_firingDeck, has_support, has_superHeavyWalker, has_damagedRule, has_fnpRule, rulesWeaponLike, ar_* (13), rulesCountsee the rules table
abilitiesability namesabilitiesCount, abilitiesOwn; what they do through the effects files (fx_* 17 kinds, fx_attMods, fx_defMods, fx_rules, fx_modelled, fx_partly, fx_noted, fx_condEffects, lfx_effects, lfx_rules)the names and the text
fnpFeel No Painfnp, has_fnpRule
damagedthe Damaged bracketdamagedBracket, has_damagedRule
fightsFirstFights Firsthas_fightsFirst
leadsthe datasheets it can leadleadsCount, has_leader, buffsOthers, ledByCount (the reverse: who can lead it)
supportsthe datasheets it can supportsupportsCount, supportedByCount
tagsLegends, Crucibleno graded unit carries either
id, linkIdBSData identifiersidentifiers
(BSData, not in the record) transport capacitytransportCapacity, capacityPer100 (tools/carry.json)
(BSData, not in the record) rule valuesdd_value, scouts_inches, firingDeck_n (new tools/rulevals.json)Lone Operative's distance: one datasheet

Weapon profile fields and keywords

Weapon variables read the weapons the unit's best form carries (its loadout in the ledger), as T-632 did; the datasheet's other options count through dsWeapons, dsProfiles, dsRanged, dsMelee, dsMultiProfile and the choices.

Field or keywordCovered by
RangebestR_range, maxRange, minRange, shortRanged (12" or less)
AbestR_A, bestM_A, maxA_any, rangedAttacks100, meleeAttacks100
BS / WSbestR_skill, bestM_skill, bestBS, bestWS
SbestR_S, bestM_S, maxS_any
APbestR_AP, bestM_AP, maxAP_any
DbestR_D, bestM_D, maxD_any
all six togetherexpected damage per 100 points into three reference targets, ranged and melee (6), and the ledger's Kill lines
how manycarriedDistinct, carriedTotal, carriedRanged, carriedMelee
Pistol, Torrent, Heavy, Assault, Precision, Indirect Fire, Ignores Cover, Psychic, Extra Attackskw_* (one each, T-632)
Blastkw_blast; Blast N (15 graded units) wk_blastN
Twin-linkedkw_twinLinked; wk_twinLinkedAny also takes the "Twin Linked" spelling (it differs on one graded unit, the Hellions)
Lethal Hitskw_lethal; limited to some targets wk_lethalLimited
Devastating Woundskw_devastating; limited wk_devastatingLimited
Sustained Hits Nkw_sustained, wk_sustainedN; limited wk_sustainedLimited
Melta Nkw_melta, wk_meltaN
Rapid Fire Nwk_rapidFire, wk_rapidFireN
Anti-X N+kw_anti; per class, 7 − the best threshold: anti_infantry, anti_vehicle, anti_monster, anti_fly, anti_psyker, anti_character, anti_walker, anti_chaos ("Anti-Monster/Vehicle" counts for both); Anti-Daemon on no graded unit
Lance, Hazardous, One Shot, Close-Quarters, Cleave Nwk_lance, wk_hazardous, wk_oneShot, wk_closeQuarters, wk_cleave and wk_cleaveN
Harpooned, Hive Defenceswk_harpooned, wk_hiveDefences (one Tyranid unit each)
Overcharge, Plasma Warhead, Defensive Array, Psychic Assassinwk_overcharge, wk_plasmaWarhead, wk_defensiveArray, wk_psychicAssassin (one graded unit each)
Conversion, Reverberating Summons, Impaledleft out: in no graded unit's best loadout
"-"an empty keyword, nothing to read

Rules on the datasheet

RuleCovered by
Deadly Demisehas_deadlyDemise, dd_value (1, D3, D6, D6+2, 2D6 as 1 to 7)
Scoutshas_scouts, scouts_inches (6 to 9)
Deep Strike, Infiltrators, Lone Operative, Stealth, Fights First, Leader, Hover, Shadow in the Warphas_* (T-632)
Synapsehas_synapse (the keyword); the rule is on every graded Tyranid unit
Feel No Pain (with or without its number)fnp, has_fnpRule
Firing Deckhas_firingDeck, firingDeck_n (2 to 12)
Support, Super-Heavy Walker, Damagedhas_support, has_superHeavyWalker, has_damagedRule
weapon abilities named as unit rules (Sustained Hits, Lethal Hits, Devastating Wounds, Ignores Cover, Assault, Psychic, Lance, Precision, Hazardous)rulesWeaponLike (count)
army rules some graded units lack: Oath of Moment, Templar Vows, Assigned Agents, Voice Of Command, Nurgle's Gift, Power from Pain, Battle Focus, Thrill Seekers, Cult Ambush, Da Boss, Curse of the Wulfen, Cabal of Sorcerers, Blessings of Khornear_* (one each)
army rules on every graded unit of their army: Synapse, Doctrina Imperatives, Prioritised Efficiency, Waaagh!left out: no unit of the army differs
Crucible, Kill Team, Unstable Energies, The Shadow of Chaos, Warp Rifts, Disparate Pathsleft out: on no graded unit
all of themrulesCount

Keywords

KeywordsCovered by
Fly, Monster, Infantry, Character, Psyker, Epic Hero, Battleline, Towering, Titanic, Beast, Swarm, Burrowers, Vanguard Invader, Synapsekw_is_* and has_synapse (T-632)
Transport or Dedicated Transportkw_is_transport (T-632); now also each on its own, kwu_Transport and kwu_Dedicated_Transport
the other 91 unit keywords on 2+ datasheets that vary among some army's graded units (Vehicle, Walker, Mounted, Aircraft, Leader, Grenades, Smoke, Daemon, Terminator, Jump Pack, Gravis, Phobos, Tacticus, Artillery, Fortification, Harvester, Endless Multitude and the army sub-groups: Skitarii, Deathwing, Kabal, Wych Cult…; the full list is the dictionary's kwu_ rows)kwu_*
keywords that name a datasheet or model, shared by 5 or more datasheets (Terminator, Captain, Chaplain, Ancient, Lieutenant, Librarian, Dreadnought, Warboss, Inquisitor, Command Squad, Mutant)kwu_*: a role shared by several datasheets, not a name
keywords that name one datasheet or a few (Hive Tyrant, Land Raider, Rhino, Carnifex…)left out: a name
Faction: …, Imperium-wide and allegiance keywords: Chaos, Nurgle, Khorne, Tzeentch, Slaanesh, Aeldari, Great Devourerleft out: the same on every graded unit of each army (Imperium is kept: two Astra Militarum datasheets lack it, one of them graded)
on 2+ datasheets but no graded unit: Crucible, Reference, Krieg, Loyal Protector, Tauros, Palanquin of Nurgle, Shadow Legion, Non-Monster Character, Corsairs and Travelling Players, Ynnari, Harlequin Allies, Pack Leader, Horrorsleft out: no graded unit
on one datasheet onlyleft out: in effect a name

2. Tyranids, the old five lists (before and after on the same code)

The T-632 setting: the consensus over auspex, hivemind, second, maelstrom and astrategas (step-24's --summaries), 10 repeats × 5 folds, units held out, pairs within a fold. "Before" is --base-vars on this code; it gives T-632's numbers exactly (the ledger 72.9%, interactions 73.3%).

ModelHeld out vs consensus, 144 → 341Held out vs the lists, 144 → 341In sample vs consensus, 144 → 341
(a) the ledger as it is72.9% → 72.9%74.1% → 74.1%73.3% → 73.3%
(a1) the ledger re-fitted69.7% → 69.7%70.1% → 70.1%73.3% → 73.3%
(b) linear, every variable69.7% → 70.0%68.6% → 68.6%89.1% → 99.1%
(b2) linear, core 2566.0% → 66.0%64.2% → 64.2%72.2% → 72.2%
(c) interactions73.3% → 72.6%71.4% → 70.6%97.2% → 96.5%
(d) boosted trees68.3% → 67.2%67.6% → 66.7%95.3% → 96.0%
(e) neighbours71.9% → 64.6%70.1% → 62.0%100% → 100%

The SE of a held-out figure is 0.4 to 1.4 points; the scrambled spread of a paired gain is 7 to 11. The ceiling (each list against the other four) is 88.5%. Interactions against the ledger: −0.4 ± 0.4 (it was +0.4). In sample, the linear model now fits 99% of pairs: more columns, more memorising, no more held out.

Permutation importance, held out, the interactions model (c): all 197 additions shuffled together cost 2.1 ± 0.5 points; by family: rules 1.0, keywords 0.4, size 0.4, weapon keywords 0.0, loadout −0.5. The T-632 families still lead: rule flags 4.4, weapons 3.0, the ledger 2.7. Top new variables: modelProfiles 0.42, OC_max 0.38, scouts_inches 0.32, anti_infantry 0.28, fx_partly 0.27, kwu_Aircraft 0.23, transportCapacity 0.21.

The trees (d): the additions together −0.3 (none helps on balance); ppmDiscount 0.66 is the one new variable among their top five, ptsAtMax 0.22 and abilitiesOwn 0.17 after it.

Missed by every model the same way (held out, mean predicted letter minus consensus): Biovores −3.2, Toxicrene +1.9, Tyrannofex −1.6, Tervigon +1.6, Hierophant +1.6, Lictor −1.4, Exocrine −1.4, Ranged Warriors +1.3, Neurolictor −1.3, Deathleaper +1.2, Neurogaunts +1.1, Hormagaunts −1.1. The same handful as T-632 (Tyrannocyte drops just off the list, Neurogaunts comes on).

3. Tyranids, the step-24 headline lists

Since step 24 (T-640) the default Tyranid lists are the fuller transcripts: auspexFull, hivemindFull, secondFull, maelstrom and astrategas. Run after rebasing onto it, the same way, both sides on these lists (ceiling 90.4%):

ModelHeld out vs consensus, 144 → 341Held out vs the lists, 144 → 341
(a) the ledger as it is74.5% → 74.5%75.0% → 75.0%
(a1) the ledger re-fitted71.8% → 71.8%71.9% → 71.9%
(b) linear, every variable70.1% → 70.4%69.2% → 69.5%
(b2) linear, core 2567.4% → 67.4%65.7% → 65.7%
(c) interactions73.1% → 72.4%72.0% → 71.4%
(d) boosted trees68.6% → 69.2%68.0% → 68.4%
(e) neighbours72.5% → 66.2%71.6% → 64.9%

The same picture: every move is inside the noise (SE 0.6 to 1.7) except the neighbours' fall, and the ledger stays the best held-out model. Importance for the interactions model: all additions together 1.9 ± 0.6; top new ones rulesWeaponLike 0.31, bestWS 0.21, lfx_rules 0.18, scouts_inches 0.18, anti_infantry 0.17, transportCapacity 0.17. The trees: the additions together −0.7; abilitiesOwn 0.34 the one clear one. Missed by every model: Biovores −3.2, Neurolictor −1.8, Tervigon +1.7, Toxicrene +1.6, Tyrannofex −1.6, Ranged Warriors +1.5, Hierophant +1.4, Exocrine −1.3, Lictor −1.3, Parasite of Mortrex +1.2, Hormagaunts −1.2, Deathleaper +1.2.

4. All 16 armies (T-635's pooled run, before and after)

T-635's setting exactly (Tyranids on the old five lists, as T-635 had them; the pooled run wasn't repeated after step 24). "Before" is --pooled --base-vars on this code and gives T-635's numbers exactly.

ModelLeave one army out, pooled: 144 → 341Army meanTyranidsSpace MarinesMarine family out together (the four pooled)Units held out within armiesScrambled
(a) the ledger60.0% → 60.0%57.8% → 57.8%73.3%60.4%57.1% → 57.1%60.3% → 60.3%49.1%
(a1) re-fitted59.9% → 59.9%57.8% → 57.8%73.2%60.4%57.1% → 57.1%60.1% → 60.1%49.4%
(b) linear59.1% → 62.3%59.8% → 61.7%64.8% → 66.0%62.1% → 65.6%51.1% → 53.8%62.2% → 64.7%47.8%
(b2) core 2558.6% → 58.6%57.7% → 57.7%69.5%58.6%49.9% → 49.9%60.9% → 60.9%48.1%
(c) interactions59.1% → 66.3%59.7% → 62.7%57.7% → 64.8%63.7% → 69.4%51.8% → 53.9%67.4% → 68.0%49.3%
(d) trees61.8% → 64.8%60.0% → 61.8%62.0% → 64.8%62.3% → 66.5%53.2% → 53.8%65.9% → 67.1%48.8%
(e) neighbours63.4% → 65.4%56.3% → 58.6%57.9% → 57.7%69.6% → 71.2%54.0% → 57.7%65.4% → 68.4%50.0%

Taking the Marine twins out of the reading:

ModelThe 12 other armies, pooled by pairs: 144 → 341Their army meanAll 16, the Marine family scored left out together
(a) the ledger63.3% → 63.3%59.1% → 59.1%60.0% → 60.0%
(b) linear61.0% → 61.1%59.2% → 61.2%55.6% → 57.2%
(c) interactions60.1% → 62.8%59.5% → 62.1%55.6% → 58.0%
(d) trees64.1% → 63.7%60.9% → 62.3%58.2% → 58.3%
(e) neighbours57.7% → 58.7%55.0% → 58.0%55.7% → 58.2%

So the headline rise (interactions +7.2 points pooled) is mostly the four Marine armies recognising each other's datasheets through the new keywords; with them scored fairly, no model passes the ledger's 60.0%. On the other 12 armies the flexible models gain 1.4 to 3 points of army mean, the largest in Thousand Sons (interactions 77% against the ledger's 46%), Drukhari and the Agents, and lose in the Adeptus Mechanicus and Genestealer Cults. Against (a1): interactions +4.9 ± 2.9 per army (10 of 16 better), trees +4.0 ± 2.2 (10 of 16); the scrambled spread of that gain is 0.7 to 1.8, but the SE over armies (2 to 3) is the honest yardstick, and the Marine family carries much of it.

Which new variables matter across armies (importance in the left-out army, drop in pooled pairwise, points; armies where it drops by more than 0.5):

Missed by every model the same way (leaving the army out): rated higher than any model gives, the Miasmic Malignifier, Suppressor Squad, the Stormraven, the Venom, Biovores, Librarian in Phobos Armour, Skitarii Marshal, the Chaos Rhino, the Navigator; rated lower, Pteraxii Skystalkers, Company Heroes, Tzaangor Enlightened, Heavy Intercessors, Serberys Sulphurhounds, an Iron Priest, the Maulerfiend, the Primaris Psyker, the Hierophant. The under-rated 30 are low on Kill, Value and points (cheap utility: leaders, transports, support); the over-rated 30 are psykers and hard hitters. T-635's pattern, unchanged.

5. Method notes