The universe, the point-in-time discipline, the metric definitions, and the defects I found along the way.
It is a reconstruction, not the licensed index. Constituents are the top 3,000 US-listed companies by market capitalisation on the price date, rebuilt from SEC filings using Russell's own published rule. It is not a membership list, and where FTSE Russell's actual reconstitution differs, mine will differ with it.
Of 3,000 candidates, 2,544 carry enough filed data to compute a trailing twelve month figure. The remaining 456 are absent, not zero. That distinction matters: dropping them silently would bias every cross-sectional statistic on the page.
Every figure is as filed, not as later restated. A company that revised its June quarter in October shows what it originally reported.
ROCE uses equity plus debt. Subtracting cash to reach invested capital collapses the denominator on cash-rich balance sheets and produces returns in the thousands of percent, which is arithmetic rather than insight. Capital employed is guarded at a floor so a near-zero denominator cannot manufacture a ranking.
171 banks carry no revenue tag at all. They use net interest income plus non-interest income instead. Anyone screening the full market on a revenue multiple without handling this is quietly excluding an entire sector, and will not notice.
Raw cross-sectional ranges are unusable. Percentiles are computed within sector so a utility is compared with utilities, and extreme values are clipped rather than dropped, so the company stays in the ranking without dominating it.
Twelve categorical hues on three thousand overlapping points is not a design preference, it is a measurable failure. Run through a colourblind separation check, twelve hues score a worst all-pairs OKLab distance of 2.0 against a threshold of 8. Even four hues only pass with a carefully chosen set.
So the main chart is a neutral density cloud and one sector highlights at a time, which is always a two-category comparison and always separable. Comparing sectors is done with small multiples, which is the prescribed route when all-pairs separation fails.
Every one of these was caught by checking output against reality, not by reading code. None of them raised an error. That is the point worth taking from this section: a pipeline that runs cleanly and reports success can still be wrong in ways only a sanity check will surface.
One company appeared at a $555bn market capitalisation. The share count was ordinary shares; the price was per ADS. Fixed by cross-checking counts against an independent source and excluding on an ADR signature.
545 names carried pre-split counts against post-split prices. Fixed by applying a cumulative split factor from the period end forward.
Several of the largest companies in the market never became candidates, because their share counts are dimensioned by class and do not appear in the undimensioned cover-page data. Fixed by broadening the candidate pool to every tickered filer rather than trusting one tag.
The stored form list holds only the most recent filings. Testing "does this company file a 10-K" against it excluded frequent filers whose annual report had scrolled off the end. Fixed by removing the positive form test entirely.
A utility resolved to its preferred note rather than its common line, valuing it at $3.3bn instead of $29.1bn. Fixed by preferring the ticker that carries a reported share count, which only common equity does.
Operating cash flow resolved for 18 quarters where a different accessor found 71. Free cash flow coverage rose from 0.8% to 81.7% once corrected.
A revenue standard change mid-history produced negative implied quarters when differencing cumulative figures. Now guarded: a negative quarter inside a TTM window invalidates the window rather than propagating.
A second-percentile value near 1e-9 stretched an axis across nine decades and compressed every real observation into a line. Found only by rendering the page and looking at it.
A pandas grouped apply returned results in a different order than the frame it was assigned to, so a large-cap growth name scored 85.9 on a cheapness screen. Caught by a sanity anchor; fixed by ranking within group directly.
The first extraction scored 93% on a structural check while returning accounting footnotes for roughly a third of companies. Measured against a second version on identical companies, the rate of passages leading with results went from 42.8% to 65.0%.
A 171,000 character section reduced to 5,598 characters of front matter across that filer's entire history, because the heading anchor matched too early. Fixed with tiered anchors and a minimum-length test before accepting a narrower slice.
A polling loop hit a timeout, and the resulting signal took the whole process group with it, losing thousands of in-memory results. Fixed by detaching the session and checkpointing to disk.
A priority filter read tiering written by an earlier run and queued 5,874 items instead of 25,548. It completed successfully, which is what made it dangerous.