Retain raw weather, and record platoon severity 48 rows short
Two fixes in the weather path, and the second was hiding behind the first. The scalar weather_mod cannot express a hit-TYPE conversion at all -- wind out and warm turning fly balls into extra bases, and cold heavy air turning them into outs, collapse to the same number once multiplied -- so the raw temperature, wind speed and wind direction are now retained alongside it. And the old guard only kept the environment when the multiplier was not 1, which silently discarded the forecast for every ordinary night. That is the majority of games, and precisely the rows a hit-type model would need in order to learn what ordinary looks like. Platoon severity is built and measured at n=452, which is 48 rows short of the gate: CANDIDATE_PENDING, neither proven nor theatre. It moves less than flat platoon (0.021 against 0.026), consistent with the pattern, and its Brier point estimate is favourable but the corrected interval still spans zero. Worth naming: the refusal costs sample, and that is the design working. Flat platoon scores 741 rows because it will happily apply a boost to anyone; severity scores 452 because the other 289 are hitters whose split we cannot actually read at 60 plate appearances on the short side. Buying those rows back by shrinking instead of refusing would have produced a number indistinguishable from a measured league-average split, which is a different claim from the one the data supports. Park dimensions are ingested and verified in production across fifteen venues, joined by the venue the game is actually at rather than inferred from the home team -- neutral-site and international games break that assumption without surfacing an error. The park-and-weather-to-hit-type atom is NOT built. Its inputs landed this session and carry a single as_of date, so testing it on total_bases would be scoring games with inputs that postdate them. Building it now would produce something plausible rather than something proven. Proven factors for hits remain pitcher_contact_profile and defense_by_direction. 4,307 tests green (344 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:
@@ -1719,6 +1719,36 @@ phased plan in the Session-57 conversation / BUILD-STATE Next section).
|
||||
hit-type conversion needs both; retaining the raw weather fields is the cheap
|
||||
half, dimensions are the missing one.
|
||||
|
||||
## Causally-correct platoon + park inputs (Session 94 — non-obvious)
|
||||
- **PLATOON SEVERITY built, n=452 — 48 SHORT of the gate.** Not proven, not
|
||||
theatre. `platoonSeverity.platoonRead` uses each hitter's OWN vs-LHP/vs-RHP
|
||||
split (statsapi `sitCodes=vl,vr`, one call per hitter), shrunk toward league by
|
||||
the **SMALLER side's PA** (500-vs-40 is a 40-PA read) and **REFUSED outright
|
||||
below 60 PA** — a heavily-shrunk severity is indistinguishable from a MEASURED
|
||||
league-average one, and those are different claims. Without the refusal the
|
||||
atom would assert a league-typical split about every call-up in the league.
|
||||
- **The refusal costs sample, honestly:** severity has n=452 where flat platoon
|
||||
has 741. That gap IS the hitters whose splits we cannot read.
|
||||
- **Switch hitters are the easy case misread as hard.** He bats opposite by
|
||||
choice so DIRECTION is never in doubt; the per-side VALUE of his swing is the
|
||||
unanswerable part. UNREADABLE, never credited with an automatic edge.
|
||||
- **PARK DIMENSIONS are free from statsapi** —
|
||||
`/venues/{id}?hydrate=location,fieldInfo` returns leftLine/leftCenter/center/
|
||||
rightCenter/rightLine + roofType + turfType + elevation (Wrigley: 355/400/353,
|
||||
595ft). `parkFactors` holds RUN COEFFICIENTS, which structurally cannot express
|
||||
a park that turns outs into hits without scoring — that is why crude park failed.
|
||||
- **JOIN THE PARK BY `venue_id` FROM THE SCHEDULE, never by home team.**
|
||||
Neutral-site and international games break the home-team assumption silently.
|
||||
`lineup_context.venue_id` carries the real venue.
|
||||
- **RAW WEATHER IS NOW RETAINED** (`wx_forecast`: temp_f/wind_mph/wind_dir/
|
||||
precip_mm). Two bugs fixed at once: the scalar `weather_mod` cannot express a
|
||||
hit-TYPE conversion (wind-out-and-warm vs cold-heavy-air collapse to the same
|
||||
number), AND the old guard dropped the entire environment when the multiplier
|
||||
was 1 — discarding the forecast for every ordinary night, which is the majority
|
||||
of games and exactly the rows a hit-type model must learn the ordinary case from.
|
||||
- **Proven factors for hits remain: `pitcher_contact_profile`,
|
||||
`defense_by_direction`.** Crude `defense` and `platoon` both still NOT_PROVEN.
|
||||
|
||||
## Active Skills
|
||||
- vyndr-voice (all user-facing output)
|
||||
- prop-analysis (grading methodology)
|
||||
|
||||
Reference in New Issue
Block a user