The receipts · published verbatim from the working file
The speed-adjusted gap — results (MISS)
Correcting the Fade board for speed made it worse. The board stands on the raw luck gap, and the previous receipt gets a correction.
Last changed
H-SPG confirmatory results — don't fuse. And the board was right.
One run against the reserved pairs, executed 2026-07-13 under the
protocol frozen the same day in spg-preregistration-2026-07-13.md
(commit 1f68a50, cut before this script was run).
The speed-adjusted gap does not make a better Fade board. It makes a slightly worse one. The pre-registration named this outcome as near even money before the run, and here it is.
The adjustment
gap = −0.2243 + 0.00855 · sprint (fit 2015–2019, n=1,888,
R² 0.133, never refit)
gap_sa = luck_gap_adj − that
PRIMARY — MISS
Top quintile by each signal; outcome is mean change in value on
contact, aval_next − aval. A fade signal is good if the men it flags
actually fall.
raw gap flagged men: mean Δaval = −0.0427
gap_sa flagged men: mean Δaval = −0.0447
difference (sa − raw) = −0.0020
bootstrap 95% CI (2,000 reps, seed 20260713): [−0.0088, +0.0046]
Criterion (difference < 0 AND CI excludes zero): MISS
The fused signal's quintile falls a hair further, and the interval sits squarely on top of zero. There is no effect here to ship.
SECONDARY — MISS, and it is the raw gap that wins
The 15-man board that actually ships, each pair on its own:
2021 -> 2022 raw −0.0870 gap_sa −0.0746 raw wins
2025 -> 2026 raw −0.0512 gap_sa −0.0379 raw wins
Criterion (gap_sa < raw in both pairs): MISS
At the board's real size, in both pairs, the men the RAW gap flags fall
harder than the men gap_sa flags. Not by much, and n=15 per pair is
thin — the pre-registration declared that in advance. But the sign is
consistent, and it points the same way in both.
TERTIARY — two columns beat one, exactly as pre-committed
R aval + ev95 + gap adjR² 0.3655 gap b=−0.120 p=0.0035
S aval + ev95 + gap_sa adjR² 0.3748 gap b=−0.167 p<0.0001
T aval + ev95 + gap + sprint adjR² 0.3775 gap b=−0.163 p=0.0001
Speed adds real predictive value as a MODEL (S and T both beat today's R), and T ≥ S — the two-column model is the best of the three, as the pre-registration predicted it might be. The frozen instruction was: if T beats S materially, recommend against the fused signal even if the primary passes. The primary didn't pass, so the instruction is moot, but the ranking held.
Why the board was right and I was wrong
Reconcile the two studies, because at first glance they fight:
- H-SP: sprint speed predicts higher next-season value on contact (+0.136), independent of the gap. True, and it replicated.
- H-SPG: removing speed from the gap does not improve the board. Also true.
Both are true because they are about different quantities. Speed predicts a higher level of future value on contact. The Fade board predicts a change — who falls. Speed shifts where a hitter lands, not how far he drops from where he is. A fast man with a fat luck gap still gives back about what a slow man with a fat luck gap gives back; he simply gives it back from, and to, a higher perch. That is precisely what H-SP's null interaction said (gap × sprint: p=0.466), and I did not take my own null seriously enough when I wrote it up.
Correction to the H-SP results (appended in public, per the rule)
sp-confirmatory-results-2026-07-13.md ends its board section:
"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."
The rhetoric outran the evidence. The selection is speed-biased — that stands, seven seasons of it, r ≈ +0.3 every year. But the sentence implies our calls on fast men are wrong, and that implication is now tested and refuted: the fast men on the Fade board decline about as much as the slow ones, and a board built to correct the bias performs slightly worse. The Fade board's calls on burners are not bad calls.
I wrote that line eleven minutes before this run. It is corrected here rather than edited there, because that is the rule we hold everyone else to.
Verdict and the gate
PRIMARY failed. Under the frozen gate: the Fade board stands exactly as it is, ranked on the raw luck gap. No board change, no engine change, no overlay change.
The one thing the gate authorizes in every branch, including this one: sprint speed is displayed as a column on the Fade board. It is validated information about a fade candidate — a reader looking at Chandler Simpson should see the 95th-percentile wheels that explain why his gap is fat, even though the engine is right not to rank on them. That is a display change, not a signal change, and it ships with the H-SP receipt behind it.
Banked, not promised
The two-column model (T) beats the engine's current model at predicting next-season value on contact. That is a projection improvement, not a board improvement, and this repo has no projection product to put it in. If one is ever built, sprint speed belongs in it, and H-SP is the receipt. It would need its own pre-registration.
Execution disclosures
- Pairs 2021→2022 (n=309) and 2025→2026 (n=260); pooled n=569. Pair B's outcome is season-to-date, declared noisier in advance.
- The adjustment was fit on 2015–2019 only. Neither test pair's predictor nor outcome season touched the fit.
- One evaluation. The script was committed in
1f68a50before it was run and has not been edited since.
Filed next to the clutch null and the bat-speed null. Three of the four experiments this repo has run came back no. That is the ratio an honest one should have.
Correction (appended 2026-07-14, per the rule)
This document closes:
"Three of the four experiments this repo has run came back no. That is the ratio an honest one should have."
That sentence was carried onto /methodology and /ethos, where it
was printed as a claim about the pre-registered studies. As that
claim it is false. Four studies have gone through the pre-registration
ritual, and here is every one of them:
| Study | ## PRIMARY |
|---|---|
| H2 — the luck gap and EV95, out of sample | PASS |
| H-BT — bat speed as an early signal | MISS |
| H-SP — the expectation model can't see legs | PASS |
| H-SPG — the speed-adjusted gap (this one) | MISS |
Two came back no. Not three.
The count this sentence reaches is three because it counts the list in its own first line — the clutch null, the bat-speed null, and this one. But the clutch result is a secondary finding inside H5, the component-stability gating test, which carries no pre-registration and appears in no list of the four. Setting it beside the pre-registered studies put two different kinds of thing on one scale, and the number that fell out was wrong in the direction that flatters us: it claimed a worse research record than we have.
That is the only direction this shop cannot afford to be wrong in. A
paper that overstates its own failures has not been humble. It has
printed a number you cannot check, on the page that exists to prove its
numbers can be checked, and it has done so because the mistake felt
good. /methodology carried the sentence twenty lines above a list that
labels one of the three a pass, and linked that receipt with the
word pass in the anchor text. Nothing compared them. Nothing raised.
The sentence stays where it is. What changed is that no human types the
count any more: site/src/lib/research.ts derives it from the studies,
and tests/test_research.py parses the ## PRIMARY heading out of each
of these four documents and fails the build if the table disagrees with
them. The receipts were always the primary source. Now the site is
forced to read them.