← All findingssource · memory/project_wnba_launch_state.md
Code shipped (committed + pushed + deployed):
- sports-scout-service: re-vendored sportlib registry (added
wnba.teams); WNBA odds fetch scoped withleague=wnba. - [internal detail removed]
- sport-data-service: fixed
nba/stats_recalc.goSprintf bug (was breaking whole test build).
projections-engine WNBA (the Sweat /projections page) — DONE & verified 2026-05-16:
- [internal detail removed]
daily.pyWNBA opening-week lookback bridge:lookback_from=(slate_year-1)-05-01so season-open slates score off prior-season form (raw/wnba jumps 2025-10 → 2026-05; NBA-tuned 2-week lookback excluded everyone).- [internal detail removed]
- Fast-follow: sport-data-service lacks 2026 expansion Toronto Tempo tricode → 3 slugs show raw id
1611661332. Cosmetic.
Remaining (non-blocking for projections; gate debate/live legs):
sport-data-service WNBARESOLVED in code 2026-05-17 (pushed to main, deploy triggered; commits: sport-data-servicelineups/injuriesare stubs006bb69, data-hydratorb39e643, debate-v2471c13d, projections-engine0b31ad9). WNBA injuries now port the officialak-static.cms.nba.com/referee/wnba_injury/PDF (same parser as NBA);FetchInjuries/FetchLineupimplemented; worker cron injuries :10/:40, lineups :12/:27/:42/:57;/trigger/wnba/{injuries,lineups}/refresh. data-hydrator now runsfilterInjuredFromPropson the multi-sport path too (was NBA-only). Verify post-deploy: runPOST /trigger/wnba/injuries/refreshonce and confirm the official WNBA PDF actually parses with the NBAparseText(asserted-similar, unverified until first real run) — this is the one open risk. Until verified, still sanity-check WNBA prop edges against live injuries. The inverted-edge consequence that motivated this (Allisha Gray Under 19.5 ranked #2 while Howard+Jones OUT; true lean Over) is the regression this fixes.- [internal detail removed]
- NEW confirmed caveat — two model artifacts survive the injury fix: (1) NO WNBA usage-redistribution/beneficiary pass (NBA-only) → injured stars removed but their minutes NOT reallocated, so the players who inherit them are under-projected, yielding spurious high-confidence (mp>0.9) UNDER edges on beneficiaries (e.g. Malonga w/ Magbegor out, Reese vs depleted MIN). Treat extreme model Unders on a beneficiary as INVERTED. (2) Stale roster in
features_df(tail(1) keeps departed players on old team — e.g. Sykes/Wheeler/Howard still on SEA though they left FA; Sykes now Toronto Tempo). Always reconcile WNBA model edges vs beneficiary logic + current rosters before trusting; the 4x/day roster sync only fixes forward, not historical feature rows. ThePE_WNBA_COLD_STARTflag (still off) is the partial mitigation; a proper WNBA beneficiary pass is the real fix (not yet built). - [internal detail removed]
916e6c9(full game-log + WNBA Advanced/Prop/Defense parity) — VERIFIED live, partial: game-log route ✅ (NBA+WNBA,/{lg}/stats/player/:id/games), WNBA advanced ✅, NBA regression clean. BUT WNBA/defense/team/:id/position/:posand/props/player/:id/metricsreturn HTTP 500 in prod. Root cause proven (not guessed):wnba.players.positionis empty league-wide — bio source (leaguedashplayerbiostats) returns POSITION but WNBAplayers_refreshupsert doesn't store it, so the G/F/C family bucketing has nothing to map; handler 500s on empty data instead of degrading like NBA'spgx.ErrNoRowspath. Two fixes needed: (1) populatewnba.players.positionfrom the bio fetch + repopulate, (2) graceful 404/empty instead of 500. Until (1), WNBA defense-vs-position (the Wemby-class matchup signal — the session's #1 recurring miss) is non-functional regardless of code.- Early-season WNBA prop analysis is structurally blocked (verified 2026-05-19, CON@POR): (1)
wnba.playersrosters are STALE beyond positions — Connecticut returned only 1 of 5 confirmed starters (Griner/Van Lith/Burke/Miller absent); sameplayers_refreshstaleness class. (2) Season ~3 games in → no L5 game-log sample exists for anyone (game-log endpoint works — Edwards returned n=1 — but there's no history yet). (3) odds-service serves props butplayer_idis null for these games. (4) Portland Fire still unregistered (no roster/logs/defense). Net: model scores on stale rosters AND ground-truth lookups can't substitute because the underlying data isn't ingested/accumulated. Don't re-run this dead end early-season; the fix is roster-refresh freshness + expansion-team registration + odds player_id linkage, not analysis. - New flag-gated capabilities shipped dark (default OFF, NBA byte-unchanged):
PE_EMIT_PARLAYS(correlation-aware parlays via shared game-script factor →parlays.parquet; calibrate first withpython -m scripts.build_slate_factor --league wnba),PE_WNBA_COLD_START(synthetic feature rows for just-signed players — lowest-confidence, backtest before enabling). WNBA roster sync bumped daily→4x/day. wnba_<id>prefix vs raw-id: data-hydrator games-by-date returns prefixed ids but the snapshot resolver needs raw (prefixed 404s vs sds). User has uncommittedinternal/fetcher/client.go(isSoftNotFound) +internal/handlers/handlers.gowork addressing ref resolution — NOT to be committed by Claude; preserve it.- [internal detail removed]
- A future
sports-scout-serviceCDK redeploy is now safe for data-hydrator (tolerant parser absorbs the new contract); was previously an NBA-regression risk.
How to apply: Treat the projections path as launched. Before declaring full launch, confirm the debate + live legs (prefix resolution, ACTIVE_LEAGUES). This file decays fast — verify against live state before relying on it.