T-598 (Jordan, 3 Oct: the Tyrannofex matters because Tyranids have few good anti-tank guns). Command: node tools/scarcity.js --write (under a second), which writes tools/scarcity-tyranids.json and this report. Tests: tests/unit/scarcity.test.js. Reads docs/lab/ledger/tyranids.json only (BSData 374f505, engine b22f9d8b1efe). Our own numbers; nothing on the site or the page changes until T-602 wires it in.
The formula, and why
- Reach of a datasheet into class c: its best solo form's kill per 100 points into c (kill[β].byClass), scaled by the form's realised share (ranged + melee × lands) ÷ (ranged + melee), since byClass counts every charge landing and the page's Kill doesn't.
- Depth into c: the reach of the army's 3rd-best datasheet into c. One good gun is a single point of failure; the third is the bench.
- Scarcity = share_c ÷ (depth_c ÷ the median depth over classes), normalised so the mean over the typical army's mix is 1 (Σ share × scarcity = 1).
- Why share over depth: depth is in kill per 100 into c, which already grows with how much of c there is to shoot (the kernel's fire follows the wounds on the table), so the ratio is demand over supply with the target's size cancelled. Monotone: a weaker bench or a commoner target raises it; nothing else enters. Thin classes (aircraft, other: no share) take 1.
- Per form: weighted Kill = Σ byClass_c × scarcity_c; factor = weighted ÷ Σ byClass. The page can use Kill × (1 − s + s × factor) behind a "role scarcity" slider s (0 raw, 1 weighted), so its own melee lands still apply.
- Good killers (a count beside it, not in the formula): datasheets whose reach into c is at least share_c × the median datasheet's best total Kill per 100 (93.576 at β 6), i.e. as good into c as the median datasheet is overall, pro rata.
Scarcity by class (β 6)
| Class | Share of the typical army | Good killers (of 52) | Depth (3rd best, per 100) | Best three | Scarcity |
|---|---|---|---|---|---|
| cavalry and beasts | 6.9% | 0 | 4.9 | Exocrine 6.3; Trygon 5.2; Tyranid Warriors with Ranged Bio-Weapons 4.9 | 2.18 |
| monster | 11.9% | 2 | 11.0 | Psychophage 22.4; Ripper Swarms 21.0; Hyperadapted Raveners 11.0 | 1.68 |
| light vehicle | 14.4% | 9 | 16.7 | Tyrannofex 20.8; Lictor 17.1; Carnifexes 16.7 | 1.33 |
| heavy infantry | 19.1% | 5 | 22.3 | Exocrine 28.8; Trygon 23.9; Screamer-killer 22.3 | 1.33 |
| heavy vehicle | 13.3% | 10 | 27.2 | Hive Guard 63.1; Tyrannofex 35.3; Hyperadapted Raveners 27.2 | 0.76 |
| elite infantry | 13.5% | 24 | 52.4 | Genestealers 62.0; Barbgaunts 55.3; Tyranid Warriors with Ranged Bio-Weapons 52.4 | 0.40 |
| character | 16.1% | 50 | 102.2 | Lictor 130.8; Von Ryan's Leapers 109.1; Toxicrene 102.2 | 0.24 |
| chaff | 4.8% | 29 | 37.4 | Barbgaunts 87.1; Von Ryan's Leapers 37.6; Tyranid Warriors with Ranged Bio-Weapons 37.4 | 0.20 |
| aircraft | 0% (thin) | 1 | |||
| other | 0% (thin) | 1 |
Median depth 24.735. Across β (3, 6, 12, ∞):
| Class | β 3 | β 6 | β 12 | β ∞ |
|---|---|---|---|---|
| cavalry and beasts | 1.88 | 2.18 | 2.30 | 2.23 |
| monster | 1.70 | 1.68 | 1.55 | 1.13 |
| light vehicle | 1.46 | 1.33 | 1.32 | 1.36 |
| heavy infantry | 1.16 | 1.33 | 1.50 | 1.70 |
| heavy vehicle | 0.95 | 0.76 | 0.58 | 0.59 |
| elite infantry | 0.39 | 0.40 | 0.41 | 0.45 |
| character | 0.29 | 0.24 | 0.23 | 0.24 |
| chaff | 0.19 | 0.20 | 0.22 | 0.24 |
The ten whose Kill moves most, up (β 6, scarcity 1)
Each unit's best solo form by the page's Kill (ranged + melee × the form's lands), its factor at full role scarcity, and its rank by Kill among the 50 datasheets that kill anything, before and after.
| Unit | Best solo form by Kill | Kill | Factor | Weighted | Kill rank (of 50) | Auspex |
|---|---|---|---|---|---|---|
| Harridan | ×1, datasheet wargear (no choices), Invasion Fleet (Swarming Instincts) | 65.4 | 0.76 | 49.9 | 43 → 18 | D |
| Old One Eye | ×1, datasheet wargear (no choices), Subterranean Assault | 66.2 | 0.76 | 50.4 | 41 → 17 | B |
| Hierophant | ×1, datasheet wargear (no choices), Invasion Fleet (Swarming Instincts) | 65.8 | 0.75 | 49.5 | 42 → 19 | D |
| Tyrannofex | ×1, Auto-equip, Subterranean Assault | 115.2 | 0.74 | 85.7 | 17 → 2 | S |
| Norn Assimilator | ×1, datasheet wargear (no choices), Subterranean Assault | 83.1 | 0.71 | 58.7 | 32 → 9 | S |
| Trygon | ×1, datasheet wargear (no choices), Subterranean Assault | 122.9 | 0.64 | 78.1 | 13 → 4 | B |
| Exocrine | ×1, datasheet wargear (no choices), Invasion Fleet (Swarming Instincts) | 120.8 | 0.64 | 76.7 | 14 → 5 | A |
| The Swarmlord | ×1, datasheet wargear (no choices), Invasion Fleet (Swarming Instincts) | 92.6 | 0.63 | 58.4 | 29 → 10 | S |
| Hyperadapted Raveners | ×5, datasheet wargear (no choices), Subterranean Assault | 136.0 | 0.60 | 81.1 | 9 → 3 | S |
| Hive Guard | ×3, datasheet wargear, Subterranean Assault | 146.8 | 0.60 | 87.6 | 7 → 1 | A |
And down
| Unit | Best solo form by Kill | Kill | Factor | Weighted | Kill rank (of 50) | Auspex |
|---|---|---|---|---|---|---|
| Neurogaunts | ×11, datasheet wargear (no choices), Invasion Fleet (Swarming Instincts) | 40.4 | 0.27 | 10.9 | 50 → 50 | B |
| Gargoyles | ×10, datasheet wargear (no choices), Invasion Fleet (Swarming Instincts) | 82.9 | 0.27 | 22.4 | 33 → 44 | – |
| Termagants | ×10, datasheet wargear, Invasion Fleet (Swarming Instincts) | 100.1 | 0.27 | 27.0 | 23 → 37 | – |
| Barbgaunts | ×5, datasheet wargear (no choices), Invasion Fleet (Swarming Instincts) | 206.2 | 0.27 | 56.2 | 1 → 13 | – |
| Parasite of Mortrex | ×1, datasheet wargear (no choices), Invasion Fleet (Swarming Instincts) | 67.8 | 0.28 | 18.9 | 40 → 47 | B |
| Venomthropes | ×3, datasheet wargear (no choices), Subterranean Assault | 86.3 | 0.28 | 24.5 | 31 → 41 | B |
| Tyrant Guard | ×3, datasheet wargear, Invasion Fleet (Swarming Instincts) | 58.5 | 0.29 | 16.8 | 48 → 49 | B |
| Von Ryan's Leapers | ×3, datasheet wargear (no choices), Invasion Fleet (Swarming Instincts) | 197.7 | 0.29 | 58.0 | 2 → 11 | S |
| Ripper Swarms | ×3, Auto-equip, Invasion Fleet (Swarming Instincts) | 82.6 | 0.30 | 24.5 | 34 → 40 | B |
| Winged Tyranid Prime | ×1, datasheet wargear (no choices), Invasion Fleet (Swarming Instincts) | 96.1 | 0.30 | 28.8 | 25 → 36 | – |
Does the idea work?
- Tyrannofex: factor 0.74, Kill rank 17 → 2 (in the top ten up).
- Hive Guard: factor 0.60, Kill rank 7 → 1 (in the top ten up).
- Exocrine: factor 0.64, Kill rank 14 → 5 (in the top ten up).
The three rise, but not for the reason the card expected. Heavy vehicles' scarcity is 0.76 at β 6 (0.95, 0.76, 0.58, 0.59 across β): 10 datasheets clear the bar into them and the 3rd best (Hyperadapted Raveners) still removes 27.2 per 100, above the median depth. What lifts the Tyrannofex, Hive Guard and Exocrine is that their kill isn't spent on the classes every Tyranid datasheet kills well: characters (50 of 52 clear the bar, scarcity 0.24), chaff and elite infantry. The classes the army is short of are cavalry and beasts, monster, light vehicle, heavy infantry. So the slider rewards the big guns and penalises the swarm (Barbgaunts, Von Ryan's Leapers, the gaunts), which is Jordan's direction, by way of the over-supplied classes rather than an anti-tank gap.
Doubts
- Characters as targets. The engine's byClass sends a large share of every unit's kill into characters (the Lictor 131 per 100), as if the typical army's characters stood alone; in play most are joined to a squad and can't be picked out without Precision. That inflates the character supply and so pushes its scarcity down; the ledger engine's matter, not this card's.
- Scale. Every killing form's factor is below 1 for Tyranids (median over each datasheet's best form 0.3607 at β 6): their kill leans to the over-supplied classes, so at full scarcity Kill shrinks against Soak. The page may divide by
meta.medianFactorto keep Kill's scale, or let the Kill weight absorb it; the order is the same either way. - byClass is where a form's fire went in the mixed army (the kernel at β), not what it could do into each class alone; a unit's reach into c is its allocation, so depth reads the army's targeting as well as its guns. Melee is scaled by each form's own lands; the page's lands slider doesn't move scarcity.
- Depth at the 3rd best is a choice (the bench behind one or two specialists); the good-killer count is printed beside it to show the spread.