Written by node tools/field.js (seed 569). A report for the tier work; nothing here reaches the site. The states and their fields are in build/field/states.json, with a tracked copy beside this report.
Credit. Tournament lists from grimstat-corpus, CC BY 4.0, published by their players and organisers on MiniHeadQuarters (miniheadquarters.com). The corpus's listhammer/ folder is not read. Corpus commit 570b8c6, datasheets at BSData 374f505, both from before the 1 Oct dataslate. Everything below is our own counts and averages; no list text, player or event names.
In one paragraph
From the corpus's last three months (2026-07, 2026-08, 2026-09) we read 512 lists; 45 were games under 1,500 points and left out. Of the rest, 99.7% of unit lines matched a datasheet (6997 of 7018), 99.9% in the top quarter (1799 of 1800); roster.js alone matches 86.3%. The field is built from the 115 top-quarter lists that pass the points check. The top quarter holds one stable state ("the meta") under section 6.4's rule. Its best split, 4 states at a mean silhouette of 0.225, misses the stability bar: its weakest state's bootstrap Jaccard is 0.595 against 0.6. At four other seeds the split passes 4 times of 4, its weakest state between 0.612 and 0.621: the split is on the edge of the bar, not clearly in or out. Every list at the events (447) is the sensitivity row: there the rule keeps 4 stable states (silhouette 0.219). The silhouettes are low everywhere (0.12 to 0.23): lists vary more along a continuum than they fall into separate kinds.
Step 1: lists to unit counts
- Read: 513 lists in the window, 512 parsed (0 with an army we couldn't name, 1 unreadable). Status: ok 447, points 18, small 45, unmatched 2. Top quarter (placed in the first quarter of its event, the event's size as T-571 counts it): ok 115, points 4, small 14.
- Matched to a datasheet (unit lines, lists of 1,500 points or more): all 99.70% (6997 / 7018); top quarter 99.94% (1799 / 1800); the field's lists 99.94%. The spec's bar is 95%: met.
- French exports recovered: 208 lists are in French (the GW app's French export or the French builder's numbered sections). roster.js alone matched 74.2% of their lines; with the clean-up (sections, tags, counts in names, the list's size line) and our table of 277 French and variant names (tools/field-names.json, names only), 99.4%. Units of another army in a list (allies, Agents of the Imperium, a Daemon beside Death Guard) are matched in their own army.
- Points: each list's units against its size: the stated total where a header gives one, else 2,000. Within 5%: 159 of 164 lists that state a total, 290 of 303 that don't. The 18 outside 5% are left out of the field (most are lists missing units or with a unit twice).
- Still unmatched (21 lines): Orks | Chokboyz (3); Death Guard | Véroleux (2); Necrons | Mécanoptères (2); Orks | Pillards (2); World Eaters | Occilié (2); Adeptus Custodes | Caladius, Twin arachnus blaze canon (1); Aeldari | Corsaires Neantari (1); Aeldari | Corsaires Neanti (1); Aeldari | Guerriers Fantômes (1); Aeldari | Traqueur Tellurien (1); Blood Angels | Avec des vrais armes c'est mieux (1); Chaos Space Marines | Techmancien (1). Names we couldn't place with confidence are left unmatched rather than guessed.
- Window: July to September, as Jordan chose (matrix.md section 12, question 1). Section 6.4 also asks for "the current points update": only 36 top-quarter lists come from events after the 5 Sep points update, too few to cluster, so the three months stand and the gap is named here.
Step 2: the states
Features per list: the ten class shares of its points (section 6.2) and the three weapon shares of its expected attacks a turn (light, medium, heavy; its weapons as listed, else the datasheet's default loadout). Distance: Hellinger per block, weighted 2/3 and 1/3. k-medoids (PAM's swap) for k = 2 to 6, 20 random starts, the best mean silhouette after merging states under 8% of lists; kept only if every state's mean Jaccard over a 200-sample bootstrap is 0.6 or more, else one state.
The field: the top quarter (115 lists)
Silhouette by k: k 2: 0.122; k 3: 0.182; k 4: 0.225; k 5: 0.215; k 6 (5 after merging): 0.207.
Result: one state, "the meta", prevalence 100%: heavy infantry 19%, character 16%, light vehicle 14%, elite infantry 13%, heavy vehicle 13%, monster 12%, cavalry and beasts 7%.
The split the rule turned down (k = 4), shown for Jordan's reading; names are section 6.4's provisional ones:
| State | Lists | Prevalence | Jaccard | Class mix (points) | Weapons (light / medium / heavy) | Top armies |
|---|---|---|---|---|---|---|
| heavy infantry | 34 | 29.6% | 0.627 | heavy infantry 43%, character 19%, light vehicle 12%, elite infantry 12%, cavalry and beasts 8% | 44 / 52 / 4 | Adeptus Custodes 10, Space Wolves 4, Imperial Fists 2 |
| armour | 29 | 25.2% | 0.595 | heavy vehicle 45%, elite infantry 14%, light vehicle 12%, character 11%, heavy infantry 9%, monster 6% | 54 / 38 / 7 | Emperor's Children 5, Astra Militarum 4, Chaos Knights 3 |
| mixed | 27 | 23.5% | 0.665 | light vehicle 30%, elite infantry 24%, character 16%, chaff 13%, cavalry and beasts 6%, monster 5% | 69 / 25 / 6 | T'au Empire 6, Adeptus Mechanicus 5, Aeldari 5 |
| monsters | 25 | 21.7% | 0.698 | monster 39%, character 19%, heavy infantry 15%, cavalry and beasts 13% | 39 / 54 / 7 | Necrons 11, Tyranids 5, Chaos Daemons 4 |
Seeds: seed 1 gives 4 states (weakest Jaccard 0.612); seed 2 gives 4 states (weakest Jaccard 0.616); seed 3 gives 4 states (weakest Jaccard 0.621); seed 4 gives 4 states (weakest Jaccard 0.613); seed 569 gives one.
Sensitivity: every list (447 lists)
Silhouette by k: k 2: 0.180; k 3: 0.179; k 4: 0.219; k 5: 0.210; k 6 (5 after merging): 0.203.
| State | Lists | Prevalence | Jaccard | Class mix (points) | Weapons (light / medium / heavy) | Top armies |
|---|---|---|---|---|---|---|
| mixed | 183 | 40.9% | 0.766 | heavy infantry 34%, character 19%, elite infantry 16%, heavy vehicle 12%, light vehicle 10% | 51 / 45 / 5 | Adeptus Custodes 28, Emperor's Children 18, Grey Knights 14 |
| mixed 2 | 116 | 25.9% | 0.845 | light vehicle 28%, elite infantry 22%, character 18%, chaff 11%, cavalry and beasts 8%, monster 5% | 65 / 30 / 5 | T'au Empire 27, Aeldari 15, Drukhari 14 |
| monsters | 108 | 24.2% | 0.758 | monster 36%, character 17%, heavy infantry 16%, cavalry and beasts 14%, light vehicle 5% | 45 / 49 / 6 | Necrons 28, Chaos Daemons 20, Tyranids 20 |
| armour | 40 | 8.9% | 0.769 | heavy vehicle 89% | 38 / 54 / 9 | Imperial Knights 20, Chaos Knights 14, Astra Militarum 4 |
Lenses: the split as compositions (3 Oct)
v1 runs on one meta state, the whole top-quarter field: the clustering found one stable state, and lists form a continuum (silhouettes 0.12 to 0.23), not separate kinds. The 4 states of the split become lenses defined by composition, not membership: each state's class shares (its centroid) re-weight the whole field, every unit of a class multiplied alike, so a lens holds the field's points and exactly that class mix. A synthetic skew, stable across refreshes; the names are provisional (Jordan names them).
| Lens | Composition (points; field share, multiplier) |
|---|---|
| heavy infantry | heavy infantry 43% (field 19%, ×2.23), character 19% (field 16%, ×1.16), light vehicle 12% (field 14%, ×0.86), elite infantry 12% (field 13%, ×0.92), cavalry and beasts 8% (field 7%, ×1.11) |
| armour | heavy vehicle 45% (field 13%, ×3.37), elite infantry 14% (field 13%, ×1.03), light vehicle 12% (field 14%, ×0.82), character 11% (field 16%, ×0.67), heavy infantry 9% (field 19%, ×0.47), monster 6% (field 12%, ×0.54) |
| mixed | light vehicle 30% (field 14%, ×2.07), elite infantry 24% (field 13%, ×1.75), character 16% (field 16%, ×0.99), chaff 13% (field 5%, ×2.77), cavalry and beasts 6% (field 7%, ×0.87), monster 5% (field 12%, ×0.45) |
| monsters | monster 39% (field 12%, ×3.30), character 19% (field 16%, ×1.18), heavy infantry 15% (field 19%, ×0.76), cavalry and beasts 13% (field 7%, ×1.92) |
What a state holds
Per state in states.json: prevalence, member list ids, the medoid list's id (Jordan's names are stored against it), each class's z-score against all the set's lists, the armies, and the field: each army, datasheet and size with its expected points in a 2,000-point list (f) and copies, the class composition, the weapon shares and expected attacks a turn by band at 2,000 points. The clustering sees every unit (a second-order door for popularity, section 6.7); a unit's own score will be computed against the field without its own datasheet (step 4).
Doubts
- The stability rule reads "mean Jaccard" per state (Hennig's reading: every state must reach 0.6). Read as the mean over states, the top quarter's split would pass (0.646 at seed 569).
- Low silhouettes: the states are regions of a continuum, not separate kinds. A 3-month corpus of 115 placed lists is small; the result can move as lists arrive.
- Weapon bands use profiles as listed; French exports name weapons in French, so those lists use the default loadout. Pistols count only for units with nothing else to shoot; melee is counted up to one weapon a model.
- An event's size is the larger of its published lists and its lowest placing (as T-571), so the top quarter is approximate where only some lists were published.