From be6b4a2849d1e3fc3b188787b55f7b4a143604a9 Mon Sep 17 00:00:00 2001 From: Kev Date: Mon, 27 Jul 2026 05:12:59 -0400 Subject: [PATCH] inventory: VYNDR-COMPLETION-MATRIX (5-part DONE map of every surface + model) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Read-only inventory order — no code built/wired/fixed/deployed. Maps every user-facing surface and model component against DESIGNED·BUILT·WIRED·LIVE·HONEST, re-derived from repo b0a51c8 + prod + design bundle (not STATE.md narrative). 15/26 surfaces fully done. Names the graveyard (BookComparison, ShareCard, proj_ladder, arch-v1/contact-v1 ledger-only, /intelligence orphan) and the live honesty gaps (/compare hardcoded, FAQ NexaPay/Brier, MobileEdgeBoard placeholder, EV fields NULL on served grades). STATE.md now points to the matrix as canonical. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01VsztNChZ7vEvSR61AuMhD1 --- outputs/VYNDR-COMPLETION-MATRIX.md | 112 +++++++++++++++++++++++++++++ specs/STATE.md | 6 ++ 2 files changed, 118 insertions(+) create mode 100644 outputs/VYNDR-COMPLETION-MATRIX.md diff --git a/outputs/VYNDR-COMPLETION-MATRIX.md b/outputs/VYNDR-COMPLETION-MATRIX.md new file mode 100644 index 0000000..eac7af1 --- /dev/null +++ b/outputs/VYNDR-COMPLETION-MATRIX.md @@ -0,0 +1,112 @@ +# 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. + +## 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 | PARTIAL | ❌ | `Price Triplet.dc.html`; `PriceTriplet.tsx` in card; book·fair present in prod but **model_odds NULL** on live grades → model leg absent | +| 20 | **Compare (H2H)** | PARTIAL | YES | YES | YES | **NO** | ❌ | `compare/page.tsx:10` hardcoded `SAMPLE` Jokić/Wembanyama A+/A + fake "VERDICT"; **nav-linked + public**; no API call. Live fabrication | +| 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 | YES | YES | **NO** | ❌ | `Intelligence.dc.html` calibration; `MobileEdgeBoard.tsx:44` **miscalibrated placeholder edge%**, masks >40%→"—" ("backend fix pending"). Live on mobile Slate | +| 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 +1. **`/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.** +2. **FAQ — phantom processor.** "We use NexaPay" (`FAQ.tsx:28`); every legal/pricing page says Stripe. Also founder price inconsistency ($24.99 vs $19.99). +3. **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 DETERMINE` a live Brier surface — because none exists. +4. **Mobile edge board — placeholder edge%.** `MobileEdgeBoard.tsx:44` renders a miscalibrated edge feed, masking >40% to "—". The numbers ≤40% still come from a placeholder pipeline. Live on mobile Slate. +5. **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) +1. **`BookComparison.tsx`** — 0 importers. Backend `/api/books` is live + honest; nothing renders it. (S2 headliner.) +2. **`ShareCard.tsx`** — 0 real importers (S3 share cards). +3. **`components/GameCard.tsx` (legacy)** — type-only import; superseded by `vyndr/GameCard`. +4. **proj-v1 `proj_ladder`** — the above-line probability ladder; computed, ledger-only, never served. +5. **arch-v1 + contact-v1** — challengers, ledger-only, never served ("measured, never served"). +6. **`TerminalTemplates.tsx`** — all SAMPLE data; `/terminal` redirects → effectively unrouted. +7. **`DemoScan.tsx`** — defined, never rendered. +8. **`/intelligence`** — REAL signals feed, but 0 nav links (orphan; reachable only by typing the URL). +9. **`/soccer`, `/marketplace`** — REAL pages, 0 nav links (orphans). +10. **`/notifications`** — `RouteStub`, unreachable. +11. **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.* diff --git a/specs/STATE.md b/specs/STATE.md index 59b2b3d..a43fe92 100644 --- a/specs/STATE.md +++ b/specs/STATE.md @@ -1,6 +1,12 @@ # VYNDR — STATE OF THE WORLD ### As of `4f3f433` (main, DEPLOYED + fingerprinted live), 2026-07-22. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.** +> ## 📊 CANONICAL BOARD → `outputs/VYNDR-COMPLETION-MATRIX.md` +> The scannable five-part (DESIGNED·BUILT·WIRED·LIVE·HONEST) matrix of every surface + +> model component **supersedes this file's narrative board** for "what's done" (built +> 2026-07-27 from repo `b0a51c8` + prod, not from this file's claims). 15/26 surfaces +> fully done. Read the matrix first; this narrative is the history behind it. + --- # 🎯 CLV REDIRECT — investigated 2026-07-26. FINDING: it was ALREADY BUILT. *The premise "CLV is dead, redirect it to closing_captures" is STALE. Nothing needed building.*