The idea (Jordan's Tyranid notes). A list takes one unit per job. When another unit of the same army does that job better per point, reviewers mark the weaker one down: the Winged Hive Tyrant against the Hive Tyrant, ranged Warriors against melee Warriors, Von Ryan's Leapers against the Lictor and Neurolictor, Carnifexes and the Toxicrene against the Haruspex. Our ledger values each unit alone, so it can't see this.
What was built. tools/rivals.js, a preview. It changes no ledger file, setting or page.
- Likeness of every pair of units in an army, 0 to 1, with no hand labels. It multiplies four parts:
- What they kill, squared because it names the job. Each unit's Kill by target class, less the army's average mix (every unit's Kill follows the typical enemy army, about half of it on characters), then compared by cosine.
- How they kill: the realised share that is shooting rather than fighting (melee counted at its charge odds).
- Body: Monster, Vehicle, Mounted or Infantry (×0.25 if different), Character (×0.75 if one is and one isn't) and Fly (×0.75 likewise), from the datasheet keywords.
- Speed, at its square root, so it counts least: the slower Move over the faster.
A product, so a pure shooter and a pure fighter are never rivals. An average was tried first. It left almost every Tyranid pair 0.8 to 0.95 alike, so the dial only shrank the weak units. Under the product, Tyranid pairs at Track A have a median likeness of 0.02 and a 90th percentile of 0.29. Same-job pairs land between 0.3 and 0.75.
- How much better a rival is: its extra Value per point over the unit's own, capped at twice as good. Above twice as good there is no reason left to take the weaker one for that job, and a capped gap stops one superstar flattening the army.
- The dial
rivalW(0 = today exactly): Value × (1 − rivalW × the largest likeness × gap among its better rivals). The best unit in a job loses nothing, and every rival is judged at its own Value before the cut. - A placebo: the same with the likeness matrix scrambled among the army's units (fixed seeds), so the spread of likenesses stays and the jobs are forgotten.
- A scoring hook:
scoreArmy(army, sliders, rivalW, { seed })andscorePool(sliders, rivalW, { seed })score pairwise accuracy the way tools/exam.js does (its lists, its pair table, the 14-army pool). At rivalW 0 they give the exam's numbers to the bit: Track A 59.4 pooled, Tyranids 79.3.
Sanity print: Tyranids, Track A, rivalW 0.5 (node tools/rivals.js --w 0.5 --all; ranks of 52)
| Unit | Letters | Rank | Value per 100 | Top rival (likeness, gap) |
|---|---|---|---|---|
| Lictor | ASSSSAS | 1 → 1 | 4047 → 4047 | none: best in its job |
| Hive Tyrant | SASAASAS | 2 → 2 | 3536 → 3505 | Lictor (0.12, 0.14) |
| Winged Hive Tyrant | ABBBBABB | 3 → 3 | 3273 → 3192 | Hive Tyrant (0.62, 0.08) |
| Von Ryan's Leapers | SBABCSBA | 11 → 9 | 2062 → 1884 | Lictor (0.18, 0.96) |
| Neurolictor | SSBSSSS | 12 → 14 | 1981 → 1572 | Lictor (0.41, 1.00) |
| Warriors, melee | BBABBBBB | 14 → 11 | 1792 → 1653 | Lictor (0.16, 1.00) |
| Warriors, ranged | CCBDCCCC | 17 → 21 | 1327 → 946 | Biovores (0.57, 1.00) |
| Haruspex | BBAABBBA | 24 → 25 | 1065 → 857 | Old One Eye (0.55, 0.71) |
| Screamer-killer | BBCCBBBB | 26 → 28 | 992 → 699 | The Swarmlord (0.59, 1.00) |
| Carnifexes | CCCCCCCC | 32 → 33 | 840 → 588 | Norn Assimilator (0.60, 1.00) |
| Toxicrene | DDC | 41 → 40 | 554 → 415 | Maleceptor (0.50, 1.00) |
The other big movers: Parasite of Mortrex (37th to 42nd, behind the Winged Tyranid Prime at 0.91), Termagants (38th to 43rd, behind ranged Warriors), Raveners (28th to 32nd), Tyranid Prime (7th to 10th) and Broodlord (10th to 13th), all three behind the Lictor. Rising, because their neighbours fall: Neurotyrant (30th to 23rd), Psychophage (35th to 29th), Tervigon (22nd to 18th) and Mawloc (42nd to 38th).
Against the predictions.
- Hold: the Hive Tyrant and Lictor hold. The Haruspex holds (one place).
- Ranged Warriors fall (four places, Value −29%).
- Carnifexes and Toxicrene lose 30% and 25% of Value but barely move in rank, because their neighbours lose as much.
- The Winged Hive Tyrant doesn't move. Our own Value already has it within 8% of the Hive Tyrant per point, so the gap is small. The dial can only act on gaps the ledger already sees. T-673's
cpOnceis the card aimed at it. - The Leapers rise. Their Kill leans to elite infantry and chaff and the Lictor's to characters, so they are only 0.18 alike. The Neurolictor, which is alike (0.74), is worse per point than the Leapers.
Read. The rival structure is plausible: the Lictor, the Swarmlord and the Biovores are the units others give way to. It is not yet a measurement. In sample, the five Tyranid lists go 79.3 to 78.9 at 0.5 against 78.0 for one placebo seed. Measuring is phase 2, after T-673: a sweep of rivalW through tools/exam.js, held out by army, with the placebo seeds beside it. Nothing is adopted.