Derive the lineup K-rate free, and fingerprint the cap fix

Two premise corrections first. Pitcher stuff features have NOT proven solo
through the gate -- every one was refused on sample (n=57 against 500). Four
exceed the effect-size bar (arm angle -0.250, whiff +0.213, k rate +0.206,
chase +0.195), which is why they are worth pursuing, but clearing one of three
thresholds is not passing. And the carrier was not blocked only on the lineup
input: that input was built and measured last session at 94.7% coverage. What
blocks it is n, and n was being throttled by the grading cap.

RUNG 1 IS DERIVED AND COSTS NOTHING. Opposing-team K-rate comes from joining
the opposing roster to the batter k_pct values already in statcast_aggregates
-- no new feed. The improvement this session is that it is PA-WEIGHTED: an
unweighted roster mean counts a 12-PA callup the same as an everyday starter,
which is not the lineup a pitcher faces.

That change alone reversed the term's sign. Unweighted, the lineup term HURT
the model (0.1738 -> 0.1285). PA-weighted, it HELPS (0.1738 -> 0.1953). Same
hypothesis, same data -- the derivation was the problem, not the signal, which
is the entire argument for deriving the best honest version before sourcing
anything. Head-to-head is now +0.2592 with a CI of [-0.0167, +0.5645], very
nearly excluding zero, at n=57.

Within archetype, the two strata come out with OPPOSITE signs -- FLAME
incremental -0.152, non-FLAME +0.145 -- and the pooled value (+0.077) sits
between them, which is the shape a conditional effect makes and is invisible
when pooled. That is what stratifying was for. But n is 20 and 24, the
standard error on a correlation there is about 0.22, and the direction
contradicts the theory that predicted a stronger effect for finesse arms. It
is recorded as a structure to re-test, not as a finding.

Rungs 2 and 3 are NOT triggered. A rung fails only once it has been fairly
tested, and Rung 1 is n-blocked rather than failed. Sourcing confirmed lineups
now would be paying for precision on top of a proxy we have not yet measured.

THE RESULT THAT DECIDES THE TIMELINE: yesterday's cap raise is fingerprinted
in production at 907 grades per snapshot, up from 334, with strikeouts going 6
to 17. That puts n>=500 for pitcher Ks about a week out instead of three
months. Operational note: the manual internal snapshot endpoint now 524s at
the Cloudflare edge because grading the full board exceeds 100s -- the run
still completes server-side (this very snapshot was written by a 524'd
request) and the cron is in-process, so a 524 there is not a failure.

Nothing proven, nothing calibrated, nothing shipped. The counter remains
anti-predictive on strikeouts at -0.064 and the skill model leads it by 0.26.

4,221 tests green (335 suites); web build exit 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W1sivYNqY2TS5ftykmHBU9
This commit is contained in:
Kev
2026-08-03 19:47:01 -04:00
parent 843c8c6d4b
commit 9538e11198
4 changed files with 263 additions and 4 deletions
+29
View File
@@ -1437,6 +1437,35 @@ phased plan in the Session-57 conversation / BUILD-STATE Next section).
is explained by whiff alone), and adding the lineup term LOWERED head-to-head
resolution (0.174 -> 0.1285). n=54, so not a verdict — but recorded, not dropped.
## Lineup K-rate (Rung 1) + the cap fingerprint (Session 85 — non-obvious)
- **THE CAP FIX LANDED: 334 -> 907 grades/snapshot, strikeouts 6 -> 17** (2.7x
across the board). n>=500 for pitcher Ks is now ~a week away, not 3 months.
- **OPERATIONAL: `POST /api/internal/snapshot/:sport` now 524s at Cloudflare** —
grading the full board exceeds the 100s edge timeout. **The run still COMPLETES
server-side** (the 907-grade snapshot was written by a 524'd request), and the
cron is in-process so it is unaffected. Never read that 524 as a failure; check
`/api/internal/snapshot/status`.
- **PA-WEIGHT the team K-rate.** Opposing-lineup K-rate is derived free by joining
the opposing roster to batter `k_pct` we already ingest (94.7% coverage, zero
new sourcing). An UNWEIGHTED roster mean counts a 12-PA callup like an everyday
starter and it HURT the model (0.174 -> 0.129); PA-weighted it HELPS
(0.174 -> 0.195). Same hypothesis, same data — the derivation was the problem.
Always weight a team aggregate by playing time.
- **A conditioner can have ~zero solo signal and still matter.** Lineup K-rate
solo r = +0.004. That is not evidence against it — it is hypothesised as a
CONDITIONER, not a standalone predictor. Judge it by its incremental partial,
stratified.
- **Within-archetype strata have OPPOSITE signs** (FLAME incremental 0.152,
non-FLAME +0.145) and the pooled value (+0.077) sits between them — the shape a
conditional effect makes, and invisible when pooled. But n=20/24 (SE≈0.22) and
the DIRECTION contradicts the theory (predicted stronger for finesse; magnitudes
are near-equal with flipped signs). Structure to re-test, NOT a finding.
- **Rungs 2 and 3 are NOT triggered.** A rung only fails once fairly tested, and
Rung 1 is n-blocked, not failed. Do not source confirmed lineups yet.
- **Pitcher features still have NOT passed the gate** — all refused at n=57.
Four exceed the |r|>=0.15 effect bar (arm_angle 0.250, whiff +0.213, k_pct
+0.206, chase +0.195) but exceeding one of three thresholds is not passing.
## Active Skills
- vyndr-voice (all user-facing output)
- prop-analysis (grading methodology)