docs: hero ranking fix verified (new code serving — max-p_win takeable, chalk excluded)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VsztNChZ7vEvSR61AuMhD1
This commit is contained in:
Kev
2026-07-29 04:53:15 -04:00
parent 41b86e3874
commit 9b5235cf99
2 changed files with 24 additions and 0 deletions
+6
View File
@@ -185,3 +185,9 @@ Gates the champion's over-CLV signal (partial r=0.375, p≈0.003, n=62 takeable
**What would strengthen it:** retain multi-book at lock (enables the sharp/consensus lock-staleness check), and accrue more settled takeable MLB-over rows. Held: no promotion, no served p_win/ev, no capture fix — diagnosis only. **What would strengthen it:** retain multi-book at lock (enables the sharp/consensus lock-staleness check), and accrue more settled takeable MLB-over rows. Held: no promotion, no served p_win/ev, no capture fix — diagnosis only.
**UPDATE 2026-07-29 (commit c7067c8): the lock-multi-book gap is now CLOSED.** New `lock_lines` table (migration 033, applied+tracked) persists each graded prop's per-book lines at the lock moment (`lockLineCapture` in `snapshotService`, fenced RLS-service-role-only, grade byte-identical proven). This unblocks the staleness audit for FUTURE rows — it does NOT retroactively fix the existing 62. Confirmation still needs weeks of accrued lock+close+outcome. Populates from the next snapshot tick. **UPDATE 2026-07-29 (commit c7067c8): the lock-multi-book gap is now CLOSED.** New `lock_lines` table (migration 033, applied+tracked) persists each graded prop's per-book lines at the lock moment (`lockLineCapture` in `snapshotService`, fenced RLS-service-role-only, grade byte-identical proven). This unblocks the staleness audit for FUTURE rows — it does NOT retroactively fix the existing 62. Confirmation still needs weeks of accrued lock+close+outcome. Populates from the next snapshot tick.
---
# HERO RANKING FIX — 2026-07-29 (commit 41b86e3, deployed)
The landing/hero (matrix row 1) selection was silently broken: it ranked on `ev_pct`, which is NULL on served grades, and **`Number(null) === 0`** made every prop tie at EV 0 → the "top read" was the FIRST takeable A/B prop in cache order — **arbitrary, dressed as ranked** (prod served Kelsey Mitchell, the #6 read by p_win). FIXED: rank by the **champion's p_win** (the only promising edge signal) among A/B **takeable-priced** reads (`isTakeable` 160..+200, same band as the proof/audit); strict-null guard; takeable filter excludes chalk; **no backfill** → honest empty state when nothing qualifies. p_win is ranking-only (never exposed; the route strips it). Display-only — reads caches, writes to nothing. No proven-edge/+EV/best-bet claim, no CLV/ROI/edge number. This makes the champion's p_win a real (display) consumer for the first time. Fingerprint VERIFIED: hero is the max-p_win read across sports (WNBA A), not old code's first-in-order MLB pick (Schanuel 135); untakeable chalk excluded. Visual auth-gated → data fingerprint.
+18
View File
@@ -92,6 +92,24 @@
> multi-book, honest-absent (`books:null`→NULL), crown OFF (`bestLines:0`) — plus the > multi-book, honest-absent (`books:null`→NULL), crown OFF (`bestLines:0`) — plus the
> component/panel/wiring unit tests + the type-checked build. Fingerprint: no unauthenticated > component/panel/wiring unit tests + the type-checked build. Fingerprint: no unauthenticated
> card surface (frontend-behind-auth); the consumed feed is live + unchanged. > card surface (frontend-behind-auth); the consumed feed is live + unchanged.
> ## 🎯 HERO RANKING FIX 2026-07-29 (commit 41b86e3): p_win among takeable, no arbitrary pick
> Review Zero found the hero's REAL behavior was worse than "unknown": it ranked on ev_pct
> (v2), but ev_pct is NULL on served grades and **`Number(null) === 0`** made every prop tie
> at EV 0 → the "top read" was the FIRST takeable A/B prop in cache order (ARBITRARY, dressed
> as ranked; prod was serving Kelsey Mitchell A p_win 0.755 = the #6 read). 0.2/0.3 PASS:
> champion p_win is on 100% of recent ledger rows (same graded source as the snapshot cache;
> `/api/snapshot` null is just the `stripModelPrice` tier strip), book_odds present. v3:
> rank by champion **p_win** among A/B TAKEABLE reads (`isTakeable` 160..+200, same as the
> proof/audit), strict-null guard kills `Number(null)=0`, takeable filter excludes chalk, NO
> backfill → honest empty state (`available:false, reason:'no_qualifying_read'`). p_win is
> RANKING-ONLY (never exposed; route strips it). Display-only: reads caches, writes nothing.
> Framing = model-vs-book number + grade (no proven-edge/+EV/best-bet/CLV/ROI claim).
> FINGERPRINT (VERIFIED): the current MLB snapshot has 1 takeable A/B grade (Schanuel 135)
> which OLD code (mlb-first iteration + `Number(null)=0` first-wins) would pick — but the live
> hero is Kelsey Mitchell (WNBA A), the max-p_win read ACROSS sports, and untakeable chalk
> (Yainer Diaz 200, Altuve C) is excluded → new code confirmed serving. Visual is auth-gated
> (landing hero public, dashboard not) — data fingerprint used, `cf-cache-status: DYNAMIC`.
- **Redirect EXISTS + WIRED:** `closingCapture.buildCaptureRows``closing_captures` (append-only, - **Redirect EXISTS + WIRED:** `closingCapture.buildCaptureRows``closing_captures` (append-only,
provenance: captured_at/book/line_type/both-prices/missed_reason) via `intradayRefreshService:221` provenance: captured_at/book/line_type/both-prices/missed_reason) via `intradayRefreshService:221`
+ internal endpoint; `ledgerService.attachClosingProb``closing_prob` (de-vigs both raw sides, + internal endpoint; `ledgerService.attachClosingProb``closing_prob` (de-vigs both raw sides,