← All findingssource · memory/project_wnba_injury_join.md
Shipped to branch wnba-injury-join commit 3f31812 off main, 2026-08-06 — 664 tests pass.
The WNBA prop stage consulted no availability source at all. Its only filter was p.is_active, which is CONTRACT status from the SDS roster payload, not game-day availability (wnba_types.py:219-221). The module docstring pre-accepted the loss ("v0 accepts that ~5-10% of generated predictions may be for OUT players").
The stub premise was false: GET /api/v1/wnba/injuries/date/{date} serves real typed player_id-keyed data (26 rows for 8/05) while three files still claimed 501. The lineups route is ALSO live and serves role + projected_minutes — still unconsumed, and per project_wnba_lineups_gap minutes is the only feature with measured lift, so that's the next candidate.
Measured, not assumed (9 slates 07-28..08-05, 284 bundles / 1,711 props vs SDS final boxscores): 4.4% of props were DNP, of which only 2.6% were Out/Doubtful at generation time and thus catchable. The rest were Questionable/Probable/absent — a join cannot catch those. The backlog's 7.9% is NOT reproducible; per-date ranges 0.0%–12.6%, so any single-date figure is noise. Replay on the real 7/28 slate drops exactly Griner + Plum (13 props, 4.4% of that board) and keeps Harrison/Malonga/Clark/Edwards with status attached.
Design: joins on player_id (SDS injuries and rosters share one numeric namespace — no name matching); fetched once per slate (report is date-keyed); fails open so a dead feed can't cost a board; Questionable/Probable ride along on the bundle rather than being dropped. Control flow mirrors plugins/nba/batch.py, but NOT its client — NBA's injury_collector points at the NBA-only injury-service; WNBA sources from SDS.
Do not oversell: DNP props VOID at the book, so this is not recovered ROI — it's wasted board slots, polluted top-N ranking, and user trust. It never poisoned the model either (DNP rows drop before the accuracy report).
Timing note: the prop cron is cron(0 21 * * ? *) and tips are 23:00Z, so the join lands ~2h pre-tip when the report is near-final. No downstream safety net exists — the TS API does no status filtering and there is no WNBA equivalent of NBA's apply_lockdown_filter.