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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user