← All findingssource · memory/project_matchup_page_perfection.md
Highest-leverage confirmed bugs (frontend src/lib/services/picks.ts unless noted):
- Snapshot enrichment structurally DEAD for WNBA:
picks.ts:159fetches bare/snapshot/{id}with canonId-prefixedwnba_…id → 502/404 always. Same bug class as gradingfanout.go:390(see project_wnba_snapshot_players_regression). AND preview picks carry noplayer_id, so even a fixed fetch joins nothing without a name→preview.players[]._player_idfallback (picks.ts:353). - No pick ever shows a price: debate preview payload has zero odds fields;
best_price ?? 0+showPrice = best_price !== 0silently hides the column. Meanwhile grading list rows WITH real odds are mapped intocard.list(picks.ts:606) and never rendered. narrative(the debate read) is fetched+mapped+never rendered;preview.players[](86% of payload, 16 player deep-dives) dropped by the mapper.- Parlay "Confidence NaN%":
parlay_of_day.confidenceis the STRING "MEDIUM" passed throughpicks.ts:487; legs coerceconfidence_pct ?? 0→ "0" rings; legplayer_name === "TOTAL"renders as fake player row. - [internal detail removed]
- Mapper overwrites short best-bet
whywith the 200-word essay (picks.ts:463) → walls of text. - SEO killer:
matchup.tscatch-all returns null → transient debate-v2 blip 404s+deindexes every matchup URL; titles use abbrs ("GSV vs CON") nobody searches.
Why: page reuses the slate card verbatim; every enrichment seam (snapshot, odds, grading, live) was wired but silently broken or unrendered. How to apply: read the plan doc before touching the page; P0 items 3+4 must ship together (fetch fix alone shows zero change). Tip time must come from live-service (SDS start_time is a midnight placeholder — do NOT use).
UPDATE 2026-07-10 (same day): P0 all-9 + P1 1-8 IMPLEMENTED, verified locally vs prod upstreams (WNBA GSV@CON: 60% parlay conf, inherited leg rings 64/63/62, mispriced+Proj pills alive, The read, System board, deep-dives, Update-tab labels; NBA NYK@SAS regression OK incl. Consensus MAJORITY). 8 files in nightly-hoops frontend/src/{lib/services,components/picks}, build+lint green, UNCOMMITTED. Next: commit/deploy, then SEO-1 (matchup.ts re-throw on transient errors) and P2-1 (live-service tip time).