The receipts · published verbatim from the working file
The EV95 of pitching — results (primary PASS, secondary MISS)
CSW% adds real information about next year's ERA beyond current ERA (primary, passed) — but out of sample it did not out-predict ERA the way EV95 beats results for hitters (secondary, missed). A complement, not a replacement.
Last changed
H-ARM confirmatory results — the whiff rate is real signal, and it did not beat ERA
One run against the reserved seasons, executed 2026-07-15 under the
protocol frozen the same day in arm-preregistration-2026-07-15.md
(commit bda8ba1, cut and pushed before this script was run).
The verdict is a split, and the split is the finding. CSW% — called strikes plus whiffs per pitch — carries real, independent information about a pitcher's next-year ERA, out of sample, controlling for the ERA he already has (PRIMARY, PASS). But the claim that it out-predicts ERA — true in every training year — did not survive the reserved seasons (SECONDARY, MISS). In 2022–2025, a pitcher's ERA was a better raw guide to his next ERA than his whiff rate was. CSW% is a genuine complement to ERA here, not the replacement for it that training promised.
PRIMARY — PASS
z(ra9_next) ~ z(ra9) + z(csw_pct)
pooled predictor seasons 2022, 2023, 2024 n = 1,004
ra9 beta +0.190 p < 0.0001
csw_pct beta -0.114 p = 0.0004 R2 0.062
Criterion (csw beta < 0 AND p < 0.05): PASS
Take two pitchers with the same ERA this year. The one who missed more bats — higher CSW% — gives up fewer runs next year. The effect is real and it is not an artifact of good pitchers staying good, because current ERA is already in the model. Training said the CSW coefficient was −0.245; the reserved seasons said −0.114. Same sign, still significant at p=0.0004, but half the magnitude. The process edge is real and it is smaller than training hoped.
SECONDARY — MISS
|corr(csw_pct, next-year ERA)| = 0.172
|corr(ERA, next-year ERA)| = 0.225
Criterion (|r(CSW)| > |r(ERA)|): MISS
This is the headline that died. In every training pair CSW% out-predicted ERA (0.271 vs 0.164). In the reserved seasons the inequality flipped: ERA predicted next-year ERA better than CSW% did.
The stability table says why:
year-over-year self-correlation TRAIN HOLDOUT
fb_velo +0.923 +0.930
swstr_pct +0.709 +0.701
csw_pct +0.643 +0.586
ra9 (ERA) +0.164 +0.225
ERA became more self-predictive in 2022–2025 (0.164 → 0.225) and CSW% became slightly less (0.643 → 0.586). Both moved against the hypothesis at once. The gap in persistence that trained the whole idea — ERA is noise, process is a fingerprint — narrowed enough on the reserved data to reverse the raw head-to-head. The fingerprint is still a fingerprint; the ERA it is being raced against just ran faster here than it ever did in training.
The pre-committed reading of the counter-test — honoured
The pre-registration wrote this down before the numbers existed:
If ERA's own coefficient in the primary model is itself large and significant — specifically if |beta_ra9| ≥ |beta_csw| — I will NOT write "ERA barely matters."
It is. In the holdout beta_ra9 = +0.190 and beta_csw = −0.114, so |0.190| ≥ |0.114|. Current ERA carries more of the load than CSW% does in these seasons, and this document does not claim otherwise. The claim it is entitled to is the narrow one the PRIMARY licenses: CSW% adds independent predictive power on top of ERA. Not that ERA is worthless — here, it is the stronger of the two.
TERTIARY (reported, no criterion)
Head-to-head R² predicting next-year ERA:
ERA alone 0.0504
CSW% alone 0.0296
SwStr% alone 0.0253
ERA + CSW% 0.0623
ERA alone beats CSW% alone (that is the SECONDARY miss in R² form). But adding CSW% to ERA lifts R² from 0.050 to 0.062 — a 24% gain — which is the PRIMARY pass in R² form. The two numbers are complementary; the whiff rate knows something ERA doesn't, it just knows less of the whole than training implied.
Role split (raw correlation with next-year ERA, within role):
SP n=487 |r(CSW)| 0.303 |r(ERA)| 0.255 CSW wins
RP n=517 |r(CSW)| 0.191 |r(ERA)| 0.180 CSW wins
Within starters and within relievers, CSW% edges ERA — but pooled, ERA wins (0.225 vs 0.172). Pooling two populations with different ERA and CSW levels lifts ERA's pooled correlation; the SECONDARY was frozen as a pooled test and it is scored pooled. The within-role result is reported, not swapped in. Re-specifying the criterion to the split that rescues it is exactly the threshold-shopping the protocol forbids.
The arm gap (process-expected ERA vs actual; PARTLY MECHANICAL, as pre-declared):
r(arm_gap, next-year ERA change) = -0.551 n=1,004
next-year ERA change by gap quintile (0=lucky .. 4=unlucky):
Q0 +1.348 Q1 +0.941 Q2 +0.350 Q3 -0.115 Q4 -1.098
Monotonic and large — pitchers whose ERA ran ahead of their stuff give back ~1.3 runs; those whose ERA lagged their stuff gain back ~1.1. But the gap shares an ERA term with the change it predicts, so some of this is regression to the mean by construction. It is reported as the shape of the process-vs-results story, not as a validated ranking signal — and, per the pre-registration, a board ranked on the gap is a new hypothesis that would need its own reserved data, exactly as H-SPG needed one after H-SP.
Verdict and the gate
PRIMARY passed, so under the frozen gate CSW% earns the right to become a declared, published pitcher number and the basis of a watch surface — and nothing more. It does not authorize ranking pitchers, filing arm calls, or a board ranked on the gap.
But the SECONDARY miss changes what the surface is allowed to say. The EV95-for-pitchers pitch was "his whiff rate knows more than his ERA." Out of sample, it doesn't. Any surface built on this finding has to make the honest, narrower claim: CSW% is a stable process fingerprint that adds to ERA, not one that beats it. Whether that narrower hook is worth a product surface is a founder call, made with this split verdict in hand — not a decision this run gets to make by having passed its primary.
An honest note on why this is not H2
H2 — the study the hitter engine rests on — passed cleanly: the process signal (EV95) out-predicted results out of sample, and the boards were built on it. This is not that. The pitcher process signal is real (PRIMARY) but it did not clear the higher bar its hitter analogue did (SECONDARY). The mirror is imperfect, and the reserved seasons are where we found out — which is the entire reason the reserved seasons exist.
Execution disclosures
- Season isolation was declared imperfect in advance. 2022–2023 were H2's confirmatory holdout (contact quality → WAR, no pitch-level or CSW term); 2024–2025 were H-BT's train years (hitter bat-tracking). No pitcher process → run-prevention relationship had touched any reserved season in this repo before the freeze.
- CSW% = (Called Strike + Swinging Strike + Swinging Strike (Blocked)) /
total pitches, foul tips excluded — the standard definition, frozen in
the pre-registration. RA9 = 9 × runs_allowed / IP from
components_pit. Qualification: ≥500 pitches in the predictor season, ≥100 batters faced in the outcome season. - 2026 excluded — the season is in progress with no
components_pit_2026. - One evaluation. The confirmatory script was committed and pushed in
bda8ba1before it was executed, and has not been edited since.
Filed next to the bat-speed null and the speed-adjusted-gap null — a partial yes this time: a real signal that did not clear the bar its hitter twin cleared. The bar is the point.