From 36014c7c3080f52908822fd4a8f1e475e1e7022f Mon Sep 17 00:00:00 2001 From: Kev Date: Wed, 29 Jul 2026 04:10:58 -0400 Subject: [PATCH] docs: Book Comparison wired to the prop card (matrix row 18 DONE, 16/26) Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01VsztNChZ7vEvSR61AuMhD1 --- outputs/VYNDR-COMPLETION-MATRIX.md | 4 ++-- specs/STATE.md | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/outputs/VYNDR-COMPLETION-MATRIX.md b/outputs/VYNDR-COMPLETION-MATRIX.md index ee4ec0b..2685462 100644 --- a/outputs/VYNDR-COMPLETION-MATRIX.md +++ b/outputs/VYNDR-COMPLETION-MATRIX.md @@ -11,7 +11,7 @@ placeholder). A built-but-unrouted component is **WIRED: NO** regardless of code > **HONESTY PASS applied 2026-07-27 (6bc18d8):** every KNOWN live fabrication removed/hidden > — see the "HONESTY PASS" section at the end. HONEST cells for rows 19/20/24 updated (✓). -## SURFACE MATRIX — 15 of ~26 fully done +## SURFACE MATRIX — 16 of ~26 fully done (Book Comparison wired 2026-07-29) | # | Surface | DESIGNED | BUILT | WIRED | LIVE | HONEST | DONE | Evidence / what's missing | |---|---|---|---|---|---|---|---|---| @@ -32,7 +32,7 @@ placeholder). A built-but-unrouted component is **WIRED: NO** regardless of code | 15 | Live tracking | PARTIAL | YES | YES | YES | YES | ⚠️ | `liveTrackingService`+`StatStrip.LiveTracker`; Slate polls `/api/live`; prod hasLive:false now (valid empty). DESIGNED: no dedicated bundle artboard | | 16 | Parlay lab | PARTIAL | YES | YES | YES | YES | ⚠️ | `System.dc.html` PARLAY BUILDER (not named "Lab"); `parlay/page.tsx`+`ParlayPanel`; `#parlay` drawer; prod `/api/parlay/grade`→real A- | | 17 | Alt-line ladder | PARTIAL | YES | PARTIAL | YES | YES | ❌ | Champion `alt_lines` real (prod: 5 rungs w/ edge_pct) but **Desk-tier only** (`tierGating.js:55`); proj-v1 `proj_ladder` ledger-only. DESIGNED: only Offseason grouping, no prop alt-stack | -| 18 | **Book comparison (S2)** | YES | YES | **NO** | PARTIAL | YES | ❌ | `Intelligence.dc.html` line-shopping; `BookComparison.tsx` **0 importers = DEAD**; `/api/books` LIVE+honest (crown gated off) but **no UI renders it** | +| 18 | **Book comparison (S2)** | YES | YES | **YES✓** | YES | YES | ✅ | ✓WIRED 2026-07-29: `BookComparisonPanel` (self-fetches `/api/books`) on the GradeResultCard; renders per-book lines (books differ), single-book honest state, crown OFF (`BOOK_CROWN_ENABLED=false`, no best claim). Push-to-book + movement strip deliberately HELD | | 19 | Price triplet | YES | YES | YES | YES | YES✓ | ❌ | ✓HONESTY PASS: null model/EV now NO_MODEL (honest-absent), no false "poisoned" copy. Still ❌: EV layer doesn't *produce* model_odds/ev (separate build) | | 20 | **Compare (H2H)** | PARTIAL | in-dev | NO | YES | YES✓ | ❌ | ✓HONESTY PASS: fabrication removed → honest in-development state, pulled from Nav+BottomTabBar. Real two-player build pending (awaiting real build) | | 21 | Newsletter | YES | YES | YES | PARTIAL | YES | ❌ | `NewsletterCapture.tsx` on `/`,`/welcome`; subscribe validates live; send internal-only. LIVE: Listmonk env config `CANNOT DETERMINE` from prod | diff --git a/specs/STATE.md b/specs/STATE.md index 2cb50be..60f5322 100644 --- a/specs/STATE.md +++ b/specs/STATE.md @@ -74,6 +74,17 @@ > confirming audit still needs weeks of settled lock+close+outcome rows.** Volume ~1.5-3k > rows/day. Populates on the next snapshot tick (14:00 UTC); no promotion, no served edge, > no capture-of-close change. Next: let it accrue, then re-run the staleness audit. + +> ## 📚 BOOK COMPARISON WIRED 2026-07-29 (commit 2ab2eea): matrix row 18 → DONE (16/26) +> The dead `BookComparison.tsx` is routed to the GradeResultCard via a new self-fetching +> `BookComparisonPanel` (reads live `/api/books` = fenced `bookprices`). Contract fix: books +> frequently sit at DIFFERENT lines (WNBA DK 21.5/FD 18.5), so it renders EACH book's own +> line per-row (no false shared-line comparison). Honest states: single-book → one book + +> "One book posting this prop.", no crown; multi-book → all books, none crowned +> (`BOOK_CROWN_ENABLED=false`); no books → NULL (self-hide). Display-only: only the +> always-empty inline `d.books` section was replaced — grade/projection/line/PriceTriplet +> untouched (web-only, grade byte-identical trivially). Freshness equal (same snapshot as +> the lock; intraday touches neither). HELD: push-to-book, movement strip, crown enable. - **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,