diff --git a/BUILD-STATE.md b/BUILD-STATE.md index 11eb1e7..0d3e49a 100755 --- a/BUILD-STATE.md +++ b/BUILD-STATE.md @@ -5133,3 +5133,40 @@ Complete frontend overhaul. 18 pages, 22 API routes. `npm run build` passes with - Timestamped records in evolution_detections table, Evolution Watch content formatter - **Migration 008:** coaching_tendencies, player_out_history, evolution_detections, unconventional_validations (all with indexes + RLS) - **Integration:** 3 new blueprints registered in app.py (coaching_bp, redistribution_bp, unconventional_bp), evolution + odds_scanner extended with new endpoints + + +--- + +## Session — Under-querying vs out of data (2026-08-05) + +**Shipped** +- `scripts/backfill-context.js` — platoon splits backfilled to all 380 settled + hitters (was 298; ingest had only ever seen tonight's lineups). +- `scripts/reconstruct-game-environment.js` — joins the ledger's game slug to + statsapi, writes `game_context` on the LEDGER's key, pulls actual archived + Open-Meteo weather. 96/101 settled games now carry real weather; park + dimensions 15 -> 30 venues. +- `src/services/model/parkWeather.js` (+ tests) — park geometry + air read onto + HIT TYPE, not P(hit). Wind refused (no park orientation). +- `factorGate` — cluster-aware bootstrap + `effective_n`. Unclustered rows keep + the original path byte-for-byte. +- `specs/under-querying-vs-out-of-data.md` — the full record. + +**Decided** +- `pitcher_contact_profile` DEMOTED: point estimate halved on 2x sample, interval + now spans zero. +- `platoon` / `platoon_severity` clear the bar but are NOT promoted — 4.5% median + contamination (season-to-date splits contain the games they predict) on a + -0.0001 bound. +- Park+weather on total_bases: 47 clusters < 500, point estimate WORSE (+0.0011). + +**Next** +- Weather is reachable: ~57 days at 7 games/settled-day. +- Park geometry is NOT — 30 ballparks exist, so a venue-constant factor can never + reach 500 independent units. Needs a hierarchical fixed-effect treatment or it + stays unvalidatable. +- Point-in-time platoon splits would settle the two held passes. +- Park orientation is the one column that would unlock wind. + +**Blocker** +- `git push` has no credentials in this environment; commit `7b85934` is local.