The receipts · published verbatim from the working file
The expectation model can't see legs — results (PASS)
Sprint speed predicts next-season value on contact beyond value, EV95 and the luck gap: train +0.137, holdout +0.136. Carries a public correction appended the same day.
H-SP confirmatory results — the engine can't see legs, and it costs us
One run against the reserved seasons, executed 2026-07-13 under the
protocol frozen the same day in sp-preregistration-2026-07-13.md
(commit 7eefb68, cut before this script was run).
Unlike the bat-speed null we filed this morning, this one lands.
PRIMARY — PASS
aval_next ~ z(aval) + z(ev95) + z(luck_gap_adj) + z(sprint)
pooled predictor seasons 2022, 2023, 2024 n = 912
aval beta +0.399 p < 0.0001
ev95 beta +0.254 p < 0.0001
luck_gap_adj beta -0.262 p < 0.0001
sprint_speed beta +0.136 p < 0.0001 R2 0.387
Criterion (beta > 0 AND p < 0.05): PASS
TRAIN said +0.137. The reserved seasons said +0.136. A twice-computed effect that lands on the third decimal of its own out-of-sample prediction is not a fluke of a lucky split.
Read it plainly: take two hitters our engine ranks identically — same current value on contact, same EV95, same luck gap — and the faster one will produce measurably more on contact next season. The speed coefficient is 52% the magnitude of the luck gap's. Ignoring legs is like ignoring half a fade signal.
SECONDARY — PASS
Within-season correlation of sprint speed with the luck gap:
2022 r = +0.316 (n = 409)
2023 r = +0.312 (n = 402)
2024 r = +0.275 (n = 404)
Criterion (r >= +0.20 in all three): PASS
Seven seasons now, train and test, every one between +0.275 and +0.390. Fast men beat the expectation model. They beat it every year. That is not luck — luck does not repeat seven years running. It is a variable we never gave the model.
TERTIARY — null, as pre-declared
gap x sprint interaction: beta +0.019, p = 0.466
The hypothesis I walked in with — that a fast man's gap would persist where a slow man's regressed — is dead in both train and test. The fade signal works on fast men exactly as well as on slow ones. The defect was never that the gap lies about burners. It is that the engine, having measured the gap, then ranks two men as equals when one of them can run.
ROBUSTNESS
hp_to_1b (home to first, SECONDS): beta -0.134, p < 0.0001
Home-to-first is sprint speed's mirror — lower is faster — and the coefficient flips to almost exactly the same magnitude (-0.134 against +0.136). Two independently measured expressions of the same trait, same answer.
Orthogonality: r(sprint, ev95) = -0.025
Speed is not contact quality wearing a hat. The primary is not smuggling in an EV95 effect.
What this does to the live board
The Fade board ranks luck_gap_adj descending. Tonight, that board is
mostly a speed detector:
fade board mean sprint speed 28.49 ft/s (76th percentile)
breakout board mean 26.84 ft/s (below league)
league mean 27.30 ft/s
Ten of the fifteen names we are flagging for regression sit above the 60th percentile in sprint speed; six are above the 87th. Jake McCarthy is the 98th percentile. Chandler Simpson is the 95th. Blake Dunn is the 96th. The one genuinely slow man on the board is Eugenio Suárez, at the 15th.
We are not flagging fifteen hitters who got lucky. We are flagging ten who can run and five who got lucky, and we are calling them the same thing in public.
Verdict and the gate
PRIMARY passed, so under the frozen gate sprint speed earns candidate status as a board input — and nothing more today. The pre-registration authorizes no product change, and none has been made.
The candidate design, to be built and validated on its own terms and ratified by the founder before it touches a live board:
- rank the Fade board on the speed-adjusted gap —
gap − E[gap | sprint]— so it flags results that outran the physics after the physics have been told about legs; and - carry the adjustment into the breakout overlay, whose gap term (−0.2781) inherits the same bias.
That change needs its own validation: "the speed-adjusted gap out-predicts the raw gap" is a NEW claim, and it does not inherit this one's receipt. It gets its own pre-registration, filed before its own test data is examined.
An honest note on what this means for open calls
Fade calls already filed on fast men were filed under a signal we now know is biased against them. They stand as filed — no extensions, no voids, nothing edited after filing; that rule is the whole product. If they miss, they miss in public, and this document is why.
Execution disclosures
- Season isolation is imperfect and was declared imperfect in advance. 2022–2023 were H2's confirmatory holdout (a different model, no speed term); 2024–2025 were H-BT's train years (bat tracking, no speed term). Sprint speed entered this repo for the first time on 2026-07-13 and was examined only on 2015–2019 before the freeze.
- Sprint speed ingested from Baseball Savant's public leaderboard
(free, 2015–2026, 6,605 player-seasons, raw CSVs archived at
data/raw/sprintspeed/). - One evaluation. The confirmatory script was committed in
7eefb68before it was executed, and has not been edited since.
Filed next to the clutch null and the bat-speed null — except this one found something, which is the only reason those two are worth anything.
CORRECTION appended 2026-07-13 (see H-SPG)
The closing line of "What this does to the live board" — "We are flagging ten who can run and five who got lucky, and we are calling them the same thing in public" — implies our fade calls on fast men are wrong. That implication has now been tested and refuted.
H-SPG (spg-confirmatory-results-2026-07-13.md) built the corrected
board — ranked on the speed-adjusted gap — and it performed slightly
WORSE than the raw gap, in both test pairs, at the board's real size.
The fast men on the Fade board decline about as much as the slow ones.
The selection bias documented above is real and stands: r(sprint, gap) ≈ +0.3 in every one of seven seasons, and the Fade board averages the 76th percentile in sprint speed. But a biased selection is not the same as a bad call, and the sentence blurred them. Speed predicts a hitter's future LEVEL; the Fade board predicts his CHANGE. The null interaction reported above (gap × sprint, p=0.466) said so, and the write-up did not take it seriously enough.
The original text is left exactly as filed.