← All findingssource · memory/project_autopsy_premortem_pair.md
Built 2026-07-30, the "explain the slip" pair — same grounded-LLM evidence discipline pointed at both ends of a bet:
grading-service branch feat/parlay-autopsy (2 commits, NOT pushed):
GET /api/v1/parlays/autopsy/{id}— post-mortem for a SETTLED slip (409 if unsettled): leg facts from bet_clv (miss_tag taxonomy), SDS boxscore evidence (minutes/fouls/usage/+-), DH snapshot baselines, usage-shift table ("who absorbed the shots"), availability/foul/blowout flags, sibling-slip overlap disclosure (parlay2 ⊂ parlay3 correlation), grounded LLM narrative on AutopsyModel (haiku). Near-miss band fixed with absolute floor max(0.5, 0.1*line) — one-assist miss on a 2.5 line reads as near.POST /api/v1/verdict/premortem— same body as /verdict/slip; per leg: price verdict + cushion test (line-vs-mean), projection-vs-line noise band, line_edges ladder, L10 hit count at the exact line, vs_opponent fade, streak-into-wall trap flag, market steering (sibling markets priced sharper, other-books-only consensus), LLM call of bet|pass|better_number|needs_info with "bettable_at" counterfactual. Hard rule: negative de-vig edge can never be "bet". Test fixture reproduces the real Bueckers U20.5 2026-07-29 read.- ?llm=0 on both = deterministic-only. LLM failure degrades to narrative_skip.
data-hydrator branch feat/wnba-vs-opponent (1 commit, NOT pushed):
- fanOutPlayerStats now fetches /{league}/history/player/:id/vs/:opp once per player → fills BOTH bundle.VsOpponent and VsOpponentGames; diagnostic.go's buildMatchupH2H lights up automatically. This closes the WNBA snapshot depth gap for opponent history (Bueckers career 14.0 PPG vs ATL was knowable and absent). Opponent resolved from snap.Lineups team IDs; skip-never-guess.
Why: price is the only validated signal (CLV t=-3.44); the pre-mortem's job is surfacing every KNOWABLE red flag while price stays the verdict. Opponent-history is explicitly labeled small-sample (position-DvP + matchup features measured null in this stack) — a dossier flag, not a model input.
How to apply:
- Deploy order: data-hydrator first (vs_opponent block), then grading-service (premortem reads it; degrades to a named unknown meanwhile).
- Parlay autopsy is NOT live-verified (needs prod DB) — after deploy, hit slip 48 (parlay3_pinn 2026-07-28) as the E2E check.
- No cache on either LLM call yet — add a table before linking from the public site. Cost per call ≈ pennies (haiku, 2k max_tokens).
- WNBA PBP is deliberately absent (pbp-service WNBA route = 0 events); foul timing slots in when ingestion lands.