docs: Book Comparison wired to the prop card (matrix row 18 DONE, 16/26)

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:10:58 -04:00
parent 2ab2eeaa7d
commit 36014c7c30
2 changed files with 13 additions and 2 deletions
+2 -2
View File
@@ -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 > **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 (✓). > — 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 | | # | 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 | | 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- | | 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 | | 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) | | 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) | | 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 | | 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 |
+11
View File
@@ -74,6 +74,17 @@
> confirming audit still needs weeks of settled lock+close+outcome rows.** Volume ~1.5-3k > 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, > 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. > 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, - **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,