closing_prob 59 -> 406 (MLB 248, WNBA 158). Root cause was attachClosingProb's truncated read + write-once market_unavailable, not capture or the join. CLV measured: MLB unders lag the close (mean -9.1 prob-pts, 74% lose), MLB overs +2.0, WNBA flat -> the +4.57% MLB-C and over/under asymmetry are substantially stale-line artifacts. Unblocks the proj-v1.1 proof order. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VsztNChZ7vEvSR61AuMhD1
16 KiB
VYNDR — PRODUCT COMPLETION MATRIX
Canonical board. Supersedes STATE.md's narrative. Re-derived from repo (b0a51c8),
prod (api.vyndr.app / vyndr.app, checked 2026-07-27), and the design bundle
(specs/design-reference/*). Every cell cites a file, a route, or a prod check.
DONE = all five YES: DESIGNED (spec exists) · BUILT (code exists) · WIRED (a user can reach it) · LIVE (serving in prod now) · HONEST (real data, not fabricated/inflated/ placeholder). A built-but-unrouted component is WIRED: NO regardless of code quality.
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 | DESIGNED | BUILT | WIRED | LIVE | HONEST | DONE | Evidence / what's missing |
|---|---|---|---|---|---|---|---|---|
| 1 | Landing / hero | YES | YES | YES | YES | YES | ✅ | Landing.dc.html; app/page.tsx; nav logo; prod /→200; Hero/TopSignals/ClaimMeter/ModelRecord all fetch real + self-hide |
| 2 | Dashboard / Slate | YES | YES | YES | YES | YES | ✅ | Mobile.dc.html; Slate.tsx+vyndr/GameCard; Nav "Slate"; prod /dashboard→200; snapshot grades real (wnba 25/mlb 5 today) |
| 3 | Scan flow (S6/S7) | YES | YES | YES | YES | YES | ✅ | Scanner States.dc.html; scan/page.tsx+ProcessingGrade; Nav "Read"; prod 200; real grade, honest NoMarketState |
| 4 | Grade result card | YES | YES | YES | YES | YES | ✅ | System.dc.html reveal; GradeResultCard.tsx (3 importers); /scan; real grade. Sub-sections (alt ladder, books) gated/absent — see #17/#18 |
| 5 | Grade display / badge | YES | YES | YES | YES | YES | ✅ | HANDOFF.md:41; GradeBadge.tsx; dashboard/scan/many; prod grades B/C real, no fake A |
| 6 | Ledger | YES | YES | YES | YES | YES | ✅ | Intelligence.dc.html S4; ledger/page.tsx+ClvBadge; Nav "Ledger"; prod 200; n≥20 gate honored |
| 7 | Tier-record | YES | YES | YES | YES | YES* | ✅ | HANDOFF.md:33; TierRecord.tsx (6 routes); n≥20 gate. *A-tier "edge glow" is ranking-as-credibility, not proven ROI (honest-but-thin) |
| 8 | Pricing | YES | YES | YES | YES | YES | ✅ | Mobile.dc.html; Pricing.tsx+ClaimMeter+DeskShowcase; Nav/Footer; prod 200; Stripe real, mocks removed |
| 9 | Public profile /u |
YES | YES | YES | YES | YES | ✅ | System.dc.html /u; PublicProfile.tsx; OPEN_ROUTE share link; prod /api/profiles/test→404 (privacy honest) |
| 10 | Player profile | YES | YES | YES | YES | YES | ✅ | Mobile.dc.html PLAYER; player/[name]; reachable via playerHref links; prod /api/stats/player→found:true (archetype/propDNA/season) |
| 11 | Team hub | YES | YES | YES | YES | YES* | ✅ | Mobile.dc.html TEAM HUB; TeamHub.tsx; TeamLink on cards; prod /api/team/NYY→26 roster. *MLB real; NBA/WNBA partial roster |
| 12 | Explore | YES | YES | YES | YES | YES | ✅ | Intelligence.dc.html; ExploreHub.tsx+FuturesBoard/NewsWire; Nav; prod 200; real leaders/futures, "TRACKED·NOT GRADED" label |
| 13 | WIRE / ticker | YES | YES | YES | YES | YES | ✅ | System.dc.html WIRE; vyndr/Ticker.tsx; root layout; prod /api/ticker→30 real items |
| 14 | Streaks / hot list | YES | YES | YES | YES | YES | ✅ | System.dc.html; landing panels + Explore; prod /api/streaks/mlb→240 (computed), self-hide honest |
| 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 |
| 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 |
| 22 | Slip reader | PARTIAL | YES | PARTIAL | YES | YES | ❌ | slip/page.tsx; prod 200; 0 nav links → orphan (deep-link only). DESIGNED: a1-s9 spec, not the design bundle |
| 23 | Article media / share (S3) | YES | PARTIAL | NO | PARTIAL | YES | ❌ | Intelligence.dc.html ARTICLE MEDIA; ShareCard.tsx 0 real importers = DEAD; OG opengraph-image.tsx IS live. In-article archetype figures not built |
| 24 | Calibration / edge board | YES | YES | NO | NO | YES✓ | ❌ | ✓HONESTY PASS: placeholder-edge% MobileEdgeBoard REMOVED from the Slate (phones show real cards). Component kept as dead code until a real edge feed exists |
| 25 | System / Intelligence terminal | YES | YES | NO | PARTIAL | YES | ❌ | System.dc.html/Intelligence.dc.html; /terminal→redirect to /dashboard; /intelligence REAL but orphan (0 nav links); /system no page (prod 404) |
| 26 | Offseason hub (S-2) | YES | PARTIAL | NO | NO | — | ❌ | Offseason.dc.html full spec; no /offseason page (prod 404); logic only inline in FuturesBoard/NewsWire on Explore |
Prod endpoints confirmed LIVE + real: /api/snapshot/{mlb,wnba}, /api/accuracy (n=763),
/api/ledger/accuracy, /api/ticker, /api/books/mlb, /api/streaks, /api/hotlist,
/api/live, /api/schedule, /api/stats/{player,leaders}, /api/team, /api/parlay/grade.
MODEL MATRIX — champion serves; every challenger is ledger-only
| Component | EXISTS | PROVEN | PROMOTED (serving) | USED (a surface reads it) | Evidence |
|---|---|---|---|---|---|
| Champion (engine1) | YES | PARTIAL | YES | YES | analyzeViaEngine1.js; enriched→snapshot/grades (snapshotService.js:674,680). Measured tiny-n only (~18 MLB/~5 WNBA, "within noise"; WNBA loses) |
| arch-v1 | YES | NO | NO | NO | challengerProjection.js; rides withChallenger→ledger only (:693). "measured, never served" (ledgerService.js:251) |
| contact-v1 | YES | NO | NO | NO | contactChallenger.js; ledger col p_win_contact only |
| proj-v1 / v1.1 | YES | NO | NO | NO | projectionChallenger.js+projection/distribution.js; ledger cols proj_* only; nothing outside ledger reads them |
| Champion alt-ladder | YES | NO | YES | Desk-only | analyzeViaEngine1.js:486; real re-grades ±1 line; gradeAdapter.js:100 maps to card Desk-gated |
proj-v1 proj_ladder |
YES | NO | NO | NO | distribution.js:100; ledger-only, reaches no card |
| Price gate / EV | YES | PARTIAL | PARTIAL | PARTIAL | fields on enriched; hero gates on isTakeable+ev_pct (heroPropService.js:78). But prod grades show ev_pct/p_win/model_odds/value/takeable = NULL — built, served-schema, not producing |
Ladder question (Phase 2.6) — VERIFIED: proj-v1.1 DOES compute rungs above the line
projection/distribution.js:100 ladder() computes P(stat ≥ k) for a fixed rung set
k = 1..LADDER_MAX (default 4), independent of the listed line — so for a line of 1.5
(tradedRung=2) it emits rungs 1 (below), 2 (at), 3 and 4 (ABOVE), each a real
negative-binomial survival prob (projectionChallenger.js:183,200). "Ladder-up works"
— sole cap is LADDER_MAX=4. BUT proj_ladder is ledger-only and reaches no user
surface. So "ladder up from the listed line to find value" is computed and never wired.
HONEST-STATE SUMMARY
3.7 — What a PAYING USER sees right now that is not true
/compare— fabricated grades, nav-linked + public. Hardcoded Jokić A+ / Wembanyama A + fake "VYNDR VERDICT" (compare/page.tsx:10-62). No data behind it. The single worst live lie.- FAQ — phantom processor. "We use NexaPay" (
FAQ.tsx:28); every legal/pricing page says Stripe. Also founder price inconsistency ($24.99 vs $19.99). - FAQ + Features — Brier/CLV over-claim. "Brier score and CLV… published / from day one · Public accuracy by tier" (
FAQ.tsx:498,Features.tsx:323). No Brier surfaced anywhere; CLV held.CANNOT DETERMINEa live Brier surface — because none exists. - Mobile edge board — placeholder edge%.
MobileEdgeBoard.tsx:44renders a miscalibrated edge feed, masking >40% to "—". The numbers ≤40% still come from a placeholder pipeline. Live on mobile Slate. - Price triplet / EV markers advertised-and-absent. Grade schema carries
ev_pct/p_win/model_odds/value/takeable; all NULL on live grades — the "model price" leg and VALUE marker don't render though the design promises them.
Not inflated (verified honest): grades are B/C only with A/D/F below n≥20 → pct:null everywhere; AccuracyBadge/ModelRecord/TierRecord/ledger all honor the n≥20 gate and self-hide. Hit-rate (59%, n=763) shows without ROI/CLV (CLV frequently null) — thin, not false.
3.8 — The graveyard (built, no user can reach it)
BookComparison.tsx— 0 importers. Backend/api/booksis live + honest; nothing renders it. (S2 headliner.)ShareCard.tsx— 0 real importers (S3 share cards).components/GameCard.tsx(legacy) — type-only import; superseded byvyndr/GameCard.- proj-v1
proj_ladder— the above-line probability ladder; computed, ledger-only, never served. - arch-v1 + contact-v1 — challengers, ledger-only, never served ("measured, never served").
TerminalTemplates.tsx— all SAMPLE data;/terminalredirects → effectively unrouted.DemoScan.tsx— defined, never rendered./intelligence— REAL signals feed, but 0 nav links (orphan; reachable only by typing the URL)./soccer,/marketplace— REAL pages, 0 nav links (orphans)./notifications—RouteStub, unreachable.- Offseason hub — full design spec, no page built (prod
/offseason→404).
FULLY DONE (all five YES) — 15
Landing · Dashboard/Slate · Scan flow · Grade result card · Grade badge · Ledger ·
Tier-record · Pricing · Public profile /u · Player profile · Team hub · Explore ·
WIRE/Ticker · Streaks/Hot list · Live tracking.
NEAREST TO DONE (one column from YES) — the shortlist a single order could finish
| Surface | The one gap | Finish move |
|---|---|---|
| Book comparison (S2) | WIRED: NO | Route BookComparison.tsx onto the card from the live /api/books store (crown stays off — measured flat). Backend already shipped. |
| Parlay lab | DESIGNED: PARTIAL | Accept the System "PARLAY BUILDER" spec as the lab spec (functionally live) — a doc call, not a build. |
| Compare (H2H) | HONEST: NO | Replace the hardcoded SAMPLE with a real two-player fetch, or pull it from nav until real. |
| Price triplet | HONEST: PARTIAL | Make the price-aware EV layer actually produce p_win/ev_pct/model_odds on served grades (built, not firing). |
| Newsletter | LIVE: PARTIAL | Confirm/enable Listmonk env (config CANNOT DETERMINE from outside). |
| Slip reader | WIRED: PARTIAL | Add one nav/More-sheet link (page is live + honest). |
| Calibration / edge board | HONEST: NO | Fix the placeholder edge% feed (backend), or hide the board until real. |
Two-plus columns out (bigger builds): Alt-line ladder (design + wire the served
probability ladder), System/Intelligence terminal (wire the orphan /intelligence),
Article media/S3 (build in-article figures; ShareCard dead), Offseason hub
(no page at all).
Tags: all cells VERIFIED against repo/prod/bundle except — Newsletter LIVE (Listmonk env) and a live Brier surface = CANNOT DETERMINE (none found). Nothing BLOCKED.
HONESTY PASS — applied 2026-07-27 (commit 6bc18d8, deployed)
Removed/hid every KNOWN live fabrication. REMOVE/HIDE only — no grade, snapshot, scorer, pipeline, or real feature touched. Updated HONEST cells:
| Item | Was | Now |
|---|---|---|
| /compare (row 20) | HONEST: NO — hardcoded Jokić A+/Wembanyama A + fake VERDICT, nav-linked | Honest in-development state; removed from Nav + BottomTabBar. Real two-player build pulled, awaiting real build. |
| Pricing (founder copy) | $34.99 desk / struck $19.99 / FAQ $24.99 — wrong | Founder Desk $44.99 (matches lib/checkout.js), Analyst $14.99; struck "regular" numbers removed; DeskShowcase $34.99→$44.99. First-100 counter is REAL (ClaimMeter→Stripe). No "first 50" desk claim (no such counter). |
| FAQ processor | "NexaPay" | Stripe (verified live: Next→Express→checkout.stripe.com). nexapay.ts + its webhook route were PURGED 2026-07-27 (NexaPay Purge order) — cross-project contamination, never a real VYNDR path. Provider-side env/keys + the orphaned user_profiles.nexapay_customer_id column flagged for Kev. |
| FAQ + Features "Brier/CLV published from day one" | INFLATED (not surfaced) | Removed. Returns when Brier/CLV are actually surfaced. Backend Brier compute untouched. |
| Calibration / edge board (row 24) | HONEST: NO — MobileEdgeBoard placeholder edge% (masked >40%) | Removed from the Slate; phones show the real game cards. Component kept as dead code (hidden, not deleted) until a real edge feed exists. |
| Price triplet (row 19) | HONEST: PARTIAL — null model/EV rendered "MODEL READ WITHHELD · poisoned" (false quarantine) | New NO_MODEL honest-absent state: MODEL "—" / "NOT PRICED", no verdict. Fixes grade card + LiveHeroProp. EV layer still doesn't produce values (separate build). |
KEPT ON THE BOARD (real work to finish — NOT cut)
- Article media / S3 (row 23) — real feature + free SEO/distribution. Finish, don't delete. Only the false "Brier/CLV" claim about it was corrected.
- Newsletter / THE WIRE (row 21, 13) — real. Capture live, honest.
FUTURE MODEL INPUT (logged only — not built this order)
- News / line-movement signal — injuries, scratches, lineups, weather move props before books reprice. Wire later as a model input. This is ADDITIVE to the media surfaces, not a replacement for them.
KNOWN HONESTY GAPS (not fixed this order — logged, not fabrication)
- Hit rate 59% (n=763) shown without ROI/CLV — thin, not false. ROI/CLV surfacing is a later build.
- CLV instrument REPAIRED 2026-07-28 (commit
6552281). Was: 59 usable closing_prob. Now: 406 (MLB 248, WNBA 158) — the collapse wasattachClosingProb's.limit(50000)/no-ORDER-BY read + write-oncemarket_unavailable, NOT capture (95% per-prop coverage) or the join (0 key mismatches). CLV finding, straight: MLB unders lag the close (mean −9.1 prob-pts, 74% lose); MLB overs +2.0; WNBA flat. → the +4.57% MLB-C and over/under asymmetry are substantially stale-line artifacts. This UNBLOCKS the proof order (proj-v1.1), which gates promoting p_win/ev to served grades.
Honest state after this order: "no KNOWN live fabrications" — not "provably none." The audit was thorough (repo + prod), but absence of a claim of falsehood is not a proof of universal truth.