From 9b5235cf99b4b13d0ac0649269208017f6dca0de Mon Sep 17 00:00:00 2001 From: Kev Date: Wed, 29 Jul 2026 04:53:15 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20hero=20ranking=20fix=20verified=20(new?= =?UTF-8?q?=20code=20serving=20=E2=80=94=20max-p=5Fwin=20takeable,=20chalk?= =?UTF-8?q?=20excluded)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01VsztNChZ7vEvSR61AuMhD1 --- outputs/VYNDR-COMPLETION-MATRIX.md | 6 ++++++ specs/STATE.md | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/outputs/VYNDR-COMPLETION-MATRIX.md b/outputs/VYNDR-COMPLETION-MATRIX.md index 2685462..e9baa3d 100644 --- a/outputs/VYNDR-COMPLETION-MATRIX.md +++ b/outputs/VYNDR-COMPLETION-MATRIX.md @@ -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. **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. diff --git a/specs/STATE.md b/specs/STATE.md index 9bac230..b4974e0 100644 --- a/specs/STATE.md +++ b/specs/STATE.md @@ -92,6 +92,24 @@ > 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 > 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, provenance: captured_at/book/line_type/both-prices/missed_reason) via `intradayRefreshService:221` + internal endpoint; `ledgerService.attachClosingProb`→`closing_prob` (de-vigs both raw sides,