← All findingssource · memory/project_wnba_sds_empty.md
STATUS: REACHABILITY SHIPPED + VERIFIED IN PROD 2026-05-21.
The actual root cause was narrower than the "narrow root cause" I wrote in the earlier correction. SDS had tonight's 2026 WNBA game rows the whole time. Lookups were 404ing because of a format mismatch:
data-hydrator(via games-service) queries/wnba/games/wnba_1022600035- SDS WNBA lookup did
WHERE wnba_game_id = $1with $1 =wnba_1022600035 - SDS stores the raw upstream ID
1022600035(no prefix) inwnba_game_id - Match fails → 404 "wnba game wnba_1022600035 not found"
Verified by hitting SDS directly with /wnba/games/1022600035 (raw, no
prefix) — returned full game object. The data was always there.
End-to-end verification:
GET /api/v1/wnba/snapshot/wnba_1022600035?refresh=true (data-hydrator)
→ 0 errors (was: lineups/game 500/404)
→ raw_sections fully populated (boxscore, game, injuries, lineups, odds, stats)
→ fetched_at fresh
Remaining follow-up
WNBA snapshot reachable, but PropDiagnostic (lockdown FIX 1-5) doesn't run
for WNBA because assembleMultiSport doesn't call attachDiagnostic. That's
RESILIENCE #5 — now bounded to pure code work (no infra unknowns).
Also: WNBA lineup arrays empty (players: []) even though endpoint works —
separate lineups-refresh ingest gap.
Earlier version of this memory (kept for context) — CORRECTED 2026-05-21:
earlier version claimed "SDS has zero
WNBA data for 2025+2026." That claim was wrong: I tested with player_id
1641706 thinking it was Caitlin Clark, but it's actually Brandon Miller
(Charlotte Hornets, NBA). The 404/empty results came from looking up an NBA
player in the WNBA endpoint — useless test.
GET /wnba/stats/player/204319/games?season=2025&limit=3
→ count: 3, real game data from 2025-10-10 ✅ SDS WNBA pipeline works
GET /wnba/games/wnba_1022600035
→ 404 "wnba game wnba_1022600035 not found" ❌ tonight's 2026 ID not ingested
GET /wnba/lineups/wnba_1022600035
→ 500 (wraps the same "not found" error)
So the narrow root cause: sport-data-service wnba.games table is missing
the 2026 regular-season game records that games-service already has. The
existing internal/adapters/wnba/games_refresh.go job (pulls from
stats.wnba.com leaguegamefinder, mirrors NBA pattern) either (a) hasn't run for
2026 season, (b) ran but with wrong season parameter, or (c) ran but the WNBA
game_id format from stats.wnba.com doesn't match the wnba_ prefix that
games-service emits.
Architecture note for "does SDS replace players-service?": No. SDS replaced stats-service (per project_hydrator_stats_to_sds). players-service is the roster directory (id/name/team/position metadata) and is still alive and still independently called by data-hydrator. The two services own different domains — SDS = stats, players-service = metadata. data-hydrator needs both. Whether players-service supports WNBA roster lookup is still unverified — search for "Clark" returned only NBA results, but that test isn't conclusive (might just be NBA results ranking higher).
RESILIENCE #2 investigation: pre-work for next session
-
Verify what's actually in
wnba.gamesfor 2026:SELECT game_date, COUNT(*) FROM wnba.games WHERE game_date >= '2026-05-01' GROUP BY game_date ORDER BY game_date;If 2026-05-17/18/19 have rows but 2026-05-20/21 are missing → cron stopped recently. If ALL 2026 missing → cron has been broken the whole season.
-
[internal detail removed]
-
Cron schedule is correct on paper (cmd/worker/main.go:235):
5,20,35,50 * * * * UTC— runs every 15 min. If logs show it firing but with errors, the bug is infetchScoreboardForDateor the upstream stats.wnba.com response shape. If logs show it NOT firing, the issue is the scheduler itself. -
Smoking-gun test: directly hit stats.wnba.com scoreboardv3 for today and compare game_id format to what games-service emits:
curl 'https://stats.wnba.com/stats/scoreboardv3?GameDate=2026-05-21&LeagueID=10'If upstream returns
gameId: "1022600035"but games-service useswnba_1022600035→ SDS's upsertGame is dropping the prefix and DB key-mismatch makes lookups fail. (Confirm by inspecting upsertGame.)
Resilience plan (refined 2026-05-21):
- Fix data-hydrator cache TTL — independent, highest-leverage smallest
scope. Working
?refresh=trueor ≤5min TTL when game.date within 6h. See feedback_cache_ttl_bug. - Reconcile SDS WNBA games table for 2026 season — diagnose why games_refresh isn't producing the IDs games-service has. Hours, not days. Probably one bug, not a rewrite.
- Verify + extend players-service for WNBA roster — first verify scope (it may already work, my tests weren't conclusive). If NBA-only, add WNBA roster ingest mirroring NBA pattern.
- Per-league pipeline health daemon — daily 10am ET cron asserting: game block present, ≥1 player has season_avg AND ≥5 recent_games, projections present, odds present. Posts pass/fail. Needs #1-3 to land first or it cry-wolves daily.
- Port PropDiagnostic compute to WNBA — extract basketball-agnostic
core of
internal/snapshot/diagnostic.go. Depends on #2 + #3.
Lesson from getting here: I stacked three unverified premises (wrong URL, wrong player ID, sweeping conclusion from one bad test) and gave the user a worse diagnosis than no diagnosis. Same anti-pattern the methodology lockdown was built to prevent on the betting side. Verify EACH claim before extending it. The user caught both verification errors directly ("sports-data-service, not sport-data-service" and "wait are you saying players-service needs to know wnba?").
See also: project_methodology_lockdown, feedback_active_tonight_gate, feedback_cache_ttl_bug, project_wnba_launch_state, project_hydrator_stats_to_sds.