We don’t collapse these to a single number. Theory, Performance, Practice, and Attention measure different things — what an army can do on paper, what it has done at tournaments, what top players think of it, and what the community is talking about. The disagreement between signals is the editorial product. Read across the row.
Every “Theory Z” number on this page is a comparison to all matched-play units across all factions in the current dataset. Zero is the population average. A unit at +1.0 is one standard deviation above average — roughly the top 16% of all units in the game on paper. +2.0 is the top 2–3%; exceptional. The scale works the same way going down: −1.0 is the bottom 16%, −2.0 the bottom 2–3%. These numbers measure what units should do against fixed reference targets — they do not predict tournament outcomes. A faction’s score is the average of its units’ z-scores; small-roster factions have less smoothing.
Each per-faction dossier shows two radar charts with five axes radiating out from the centre. The faction’s average performance against each target type (left chart) or against each threat type (right chart) is plotted as a point on each axis, and the points are connected to form a polygon. The inner pentagon marks the population average (0σ); rings move outward by one standard deviation each. A point past the +1σ ring means the faction performs meaningfully above average against that target or threat. The polygon’s SHAPE shows specialisation — pointy means strong in one direction and weak in others; broad and even means the faction has comparable capability across the board. A polygon that’s far from the centre overall (whether pointy or even) means a strong faction in that dimension; a polygon clustered near the centre means roughly average.
| FACTION | THEORY | PERFORMANCE | PRACTICE | ATTENTION |
|---|
The Strength Index used to publish a single tier-list ranking. It doesn’t any more. We argue against false-precision composites in the methodology library — Big Soup, Six Bins, and the upcoming Player or Army? and ELO Under Uncertainty articles each spell out a different reason a single number across these signals doesn’t survive scrutiny. So we don’t produce one. Each of the four columns measures a different thing with a different methodology.
Theory is theoretical ceiling computed from datasheet math: expected damage and durability per point, aggregated over a faction’s roster. Predictive but rollup-sensitive. Performance is what actually happens at tournaments — the closest we get to ground truth, with the well-known caveats (Big Soup, Six Bins, Player or Army?). While the structured Performance ingest is still pending, current per-faction win rates live on the three aggregators linked in the Performance column legend above. Practice is curated top-player impression, which captures expertise the data can’t but is biased by what each practitioner sees. Attention is community discourse signal — volume of conversation, which correlates loosely with strength and absolutely is not the same thing.
The forest plot above keeps an alphabetical row order on purpose so a single faction’s range bar can be tracked at a fixed Y position across weight changes; the breakdown table below picks up the composite-sorted ranking with STRONGER / AVERAGE / WEAKER zone headers and reshuffles live as the sliders move. The split is itself part of the methodology: the plot answers "where is this faction?", the table answers "who’s where under these weights?".
The Performance column shows observed tournament outcomes from three primary sources sharing a 5-round inclusion threshold — Stat Check (≥24 players), Warpfriends (≥20 players), and the Archive’s own BCP pull (no player floor). 40kstats provides long-window reference context. Sources are weighted by sample size within the primary set; the composite z-score scales factions against the primary cohort only. When the three primary sources agree tightly, the consensus is informative. When they spread, the spread IS the editorial product: it reflects how different methodological choices produce different answers, and “Faction X is at 52%” is shorthand for a choice the source has made. See the Big Soup methodology article for the full argument about pooled rates and what they hide.
When a faction-source cell has fewer than 80 games in the snapshot, a “READ WITH CARE” chip fires on the cell. Small samples produce wide Wilson CIs; the displayed number is the point estimate, but the underlying uncertainty may be substantial.
The Theory column shows real data computed from BSData’s CC-licensed compilation of 10th-edition datasheet stats, points, and weapon profiles. For each unit, we calculate expected damage-per-point against five target archetypes and expected wounds-absorbed-per-point against five threat archetypes. We filter out units with [Crucible] and [Legends] suffixes (narrative-only and discontinued units, not legal in matched-play tournaments) and re-z-score against the matched-play population. The column reads as how strong each faction looks on paper, with caveats listed below:
For units with choose-one weapon options (battlesuits, character wargear, certain vehicles), the pipeline picks the loadout that maximises mean damage-per-point across the target panel — the unit’s competitive ceiling. Each unit’s chosen loadout appears in the dossier’s expanded detail view so the math is auditable per-unit.
Currently 2 units removed via the manual-exclusions list. See _data/theory_unit_exclusions.json for the current exclusion list with provenance (faction, unit name, audit round, and reasoning).
BSData parser was updated 2026-05-18 to correctly surface library-catalogue content into consuming factions and to deduplicate cross-allegiance entries. Imperial Knights and Chaos Knights now carry their actual datasheets; 202 cross-faction duplicates were resolved. See recent data refreshes for the precise revision event.
Source provenance for the Theory column: see the Recent data refreshes drawer below for the BSData snapshot version and capture date.
The Practice column aggregates editorial verdicts from five named expert tier-list publications (Art of War, Fireside 40k, Stat Check, Breaking Heads, Veizla). Per-publication tiers map to a numeric scale, then we recency-weight across in-window publications with a 60-day half-life and drop anything older than 180 days. Expert tier lists are practitioner-impression-shaped: top players see top matchups disproportionately, and “Faction X is bad” is often shorthand for “Faction X is bad against the current top two”. The per-faction tooltip surfaces the per-source breakdown so readers can audit the inputs; the small “n=N publications” caption under each cell shows how many publications contributed. Stat Check appears in both Performance (their published win rates) and Practice (their editor verdicts) — those are real but partially-overlapping signals from the same editorial team; readers may want to weight Practice down slightly to reflect that overlap.
The Attention column aggregates community discourse volume from two sources: Google Trends search interest and YouTube videos uploaded in the past seven days. Per-faction queries appear in the attention_faction_queries.json audit table so readers can inspect what was actually searched. Raw values are log-transformed before z-scoring because the loudest factions would otherwise dominate the composite at multi-sigma positions. Attention measures community focus, not faction strength — a faction loud on Trends could be dominant, recently nerfed, newly released, or the subject of a meme. Reddit was part of the original column design but is not currently in scope: Reddit’s self-serve API access was wound down in 2026 and the project is not pursuing paid alternatives at this time. Week-over-week change is often more informative than absolute level; a faction trending sharply up is a meaningful signal even at mid-pack volume.
All four columns carry real data. The most editorially valuable output on the page is the disagreement between columns. When columns agree, that’s confirming. When they disagree, that disagreement is the point — not a bug.
What gets populated when: