Methodology
Everything below is computed from public MLB play-by-play — ~30,000 MLB + AAA games, 2.1M+ plays, 9.5M+ pitches across 2015-2026 — by an engine we built from scratch. No proprietary feeds, no black boxes. The full research write-ups (including the ones where we were wrong) are public — the receipts are linked at the bottom of this page, verbatim from the working files.
The pipeline, validated
We compute our own run expectancy, win probability, and leverage from raw play-by-play. Cross-checked against FanGraphs for 2024 qualified batters: RE24 correlation 0.975, WPA correlation 0.905. When our numbers differ from the field’s, we say so and say why.
The two validated signals
From 1.23M balls in play with launch data, two quantities matter most:
- EV95— a hitter’s 95th-percentile exit velocity. The most stable metric in our engine (year-over-year r = 0.88).
- The luck gap — actual results on contact minus what the launch physics say they should be, park- adjusted. Mostly transient, which is exactly what a regression signal should be.
We tested whether these predict future value beyond current performance — and we froze the entire protocol before looking at the test data: models, coefficients, scaling, success criteria, and what we would publish if it failed. One evaluation, published regardless.
On the held-out seasons (n = 721 qualified batter-seasons): the luck gap predicted -0.6234 WAR per SD (p <0.0001), EV95 predicted +0.2746 (p = 0.0165), and the combined signal separated top from bottom quintiles by +1.151 annualized WAR. All pre-registered criteria passed. One metric computation bug was found and disclosed in the results document — because a pre-registration you only cite when convenient is not a pre-registration.
Bonus finding
Along the way we re-derived a classic on our own pipeline: clutch performance is not a repeatable skill (year-over-year r = 0.043 across 2377 qualified batter pairs). We publish results like this even when they are not flattering to the idea of prediction, because that is the point of the site.
What the signals cannot do
- Batters only. Our pitcher metrics (a stuff model with year-over-year r = 0.87) are stability- validated but NOT outcome-validated — pitcher rows are watchlist, never calls.
- MLB only. The AAA pre-consensus board runs the same machinery on Triple-A Statcast, but that application is the frontier, not the proven core.
- Residual, not level. The signals rank who is likely to out- or under-perform their current value — they do not rank who is best.
- Means, not certainties. Effects are quintile averages. Individual calls will miss. The ledger counts them.
Sprint calls — a forward test, labeled as one
Season-long calls resolve slowly, so the ledger also carries sprint calls: 28–56 day windows filed on the boards’ largest dislocations (a luck gap of at least 0.05 on 100+ balls in play). The bet is the engine’s core thesis on a clock — results converge toward contact quality. Sprints are filed algorithmicallyby this rule on Mondays and Thursdays — no cherry-picking — with a 24-hour founder veto for what the engine can’t see (injury news, trades). Vetoes stay on the public ledger. Season-long calls remain human-filed.
Thresholds are set by a published rule, not by feel. A season-to-date number is diluted — six weeks adds only about a third more sample — so the bar is 70% of the gap closing in-window, scaled by that dilution, floored at the noise floor (0.015). That puts a sprint threshold at roughly 1–1.5 standard deviations of six-week noise: winnable when the thesis is right, missable when it isn’t. Honest boundary: the season-scale effect is holdout-validated; the sprint window is a live forward test, and the sprint record — misses included — is how we’ll judge the calibration.
One hard rule: if a player stops playing mid-window, his number freezes and the call resolves against it at the close. No voids, no do-overs.
The rules we operate under
- Every call filed with metric, threshold, window, and timestamp before it counts.
- Resolution computed, never argued.
- The ledger is append-only; corrections are appended in public, never edited in.
- We take positions in a player’s cards only after the call is published, and disclose when we do.
The receipts
The write-ups this page keeps referring to, published verbatim from the working files:
- The pre-registration — frozen 2026-07-11, before the holdout was touched.
- The confirmatory results — the single holdout run, disclosed bug included.
- The exploratory work — train years only, labeled as such.
- The stability gate — including the clutch null result and why pitchers stay uncalled.