From e257474cc80f2a37bfc9e1dab188219fc11eb320 Mon Sep 17 00:00:00 2001 From: Kev Date: Fri, 31 Jul 2026 05:45:56 -0400 Subject: [PATCH] =?UTF-8?q?report:=20design-vs-build=20gap=20audit=20?= =?UTF-8?q?=E2=80=94=2061=20items=20enumerated,=2018=20absent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Package specs/design-reference (Jul 22) audited against the CURRENT repo (bf7c0a3, ~9 days later). No ~/vyndr_design exists; the in-repo copy is the package. Every claim is a direct file/grep/count check, not the harness that returned a silent false in Wave 3. 61 implementable items enumerated: BUILT-TO-SPEC 20, BUILT-BUT-DRIFTED 7, PARTIAL 16, ABSENT 18 (+1 CANNOT DETERMINE: 19-screen mobile parity needs a visual pass). Largest single gap: the glyph library — 38 of 83 designed SVGs are wired (46%), and the design implies 74 display archetypes against a 41-entry backend registry, so the archetype system is roughly half the designed scope. Drift found on surfaces built recently: the book comparison wired 07-29 renders per-book lines but has NO crown, NO disagreement axis, NO SPLIT chip and NO movement strip — a simpler version than the S2 design. The mobile tab bar has 5 tabs but not the designed READ-FAB. Calibration gating disagrees with the design (our n>=20 vs designed N30). Wave-2 reclassification: Newsletter DESIGN EXISTS (S5 The Report is fully designed) — the earlier status pull was wrong to call it a design gap. Live tracking and Slip reader remain genuinely design-missing. Model linkages named: Price Triplet waits on the EV layer producing p_win/ev_pct/model_odds; the S4 calibration curve waits on the n-threshold decision plus accrued buckets, while the CLV chips can build on the repaired instrument now. Ordered build list in six dependency waves: self-contained first (glyphs, primitives, boundary-channel blue), then scanner-nudge-gated, model-gated, resolution-pipeline-gated (share-card masters cannot ship — the tail has no generation step and no trigger), licensing-gated (book logos, push-to-book), then the large surface builds. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc --- specs/design-vs-build-gap-audit.md | 158 +++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 specs/design-vs-build-gap-audit.md diff --git a/specs/design-vs-build-gap-audit.md b/specs/design-vs-build-gap-audit.md new file mode 100644 index 0000000..fa51277 --- /dev/null +++ b/specs/design-vs-build-gap-audit.md @@ -0,0 +1,158 @@ +# VYNDR — DESIGN-vs-BUILD GAP AUDIT (report-only, 2026-07-31) +Package: `specs/design-reference/` (Jul 22 — the in-repo copy; **there is no `~/vyndr_design`**, +CANNOT DETERMINE if a separate extract exists outside the repo). Audited against the CURRENT repo +(`bf7c0a3`), which is ~9 days AFTER the package. Nothing built, wired, or fixed. + +**Harness note:** every "built" claim below is a direct file/grep/count check, not the +`{found:False}`-on-except harness that produced a silent false in Wave 3. Live probes used curl. + +--- + +## ENUMERATION — **61 IMPLEMENTABLE ITEMS** +(Excluded as explicitly NOT product code by the handoff: `image-slot.js`, `.image-slots.state.json`, +`ios-frame.jsx`. Excluded as design-time only: dashed safe zones.) + +### A. TOKEN SYSTEM — 6 items +| # | item | state | +|---|---|---| +| A1 | Surfaces `#06060B` void / `#0E0E14` card / `#14141E` elevated / `#101018` hairline / `#0A0A10` deep | **BUILT-BUT-DRIFTED** — void in 18 files, elevated in 7, but **`#0E0E14` card in only 1 file** | +| A2 | Signal green `#00D4A0`, ONE meaning | **BUILT-TO-SPEC** (34 files) | +| A3 | Amber `#FFB347` caution-only / Red `#FF4757` miss-only | **BUILT-TO-SPEC** (24 / 4 files) | +| A4 | Text ramp `#F0F0F0`/`#B8BCC8`/`#707080`/`#4a4a58` + borders | **BUILT-TO-SPEC** (15 / 7 files) | +| A5 | Inter + JetBrains Mono, tabular-nums | **BUILT-TO-SPEC** (self-hosted via `next/font`, S41) | +| A6 | Grade colors + **glow-A-tier-ONLY** law | **BUILT-TO-SPEC** (`gradeGlows`, locked by `colorContract` tests) | + +### B. BOUNDARY CHANNEL — 1 item +| B1 | Blue `#8FB2DE` boundary channel (edge-priced-out / no-market / line-not-priced), distinct from red REFUSAL + amber QUARANTINE | **PARTIAL** — the hex appears in only **2 files**; `NO MARKET` (8) and `PRICED OUT` (4) copy exists, but the channel is not applied as a system-wide third colour law | + +### C. BRAND — 2 items +| C1 | Wordmark VYND + green R + **`vy-glitch`** keyframes + cursor | **BUILT-BUT-DRIFTED** — Wordmark exists; **`vy-glitch` = 0 files** (our glitch keyframes are named differently) | +| C2 | Logo mark, 32-grid signal V | **BUILT-TO-SPEC** | + +### D. GLYPH LIBRARY — 1 item (the largest single gap) +| D1 | **83 archetype SVGs (74 display + 9 classifier-legacy) + MANIFEST → `archetypes.js`** | **PARTIAL — 38 of 83 wired (46%).** 45 designed glyphs are unwired. Compounding: the design implies **74 display archetypes**; the backend registry has **41**. So the archetype system is ~half the designed scope. MANIFEST.md present and unused. | + +### E. NAMED PRIMITIVES — 28 items +| # | item | state | +|---|---|---| +| E1 | Movement strip (steps-not-curves, green-only-when-favouring, FLAT hairline) | **ABSENT** | +| E2 | BookChips — 7 books, brand-colour mono wordmarks | **BUILT-BUT-DRIFTED** — `BookChip.tsx` + `lib/books.js` exist; **not verified as the 7-book brand-colour tile set** | +| E3 | Best-number crown (green inset bar + BEST NUMBER chip + row tint) | **ABSENT** — `CrownBadge` not found; `BOOK_CROWN_ENABLED=false` and measured flat | +| E4 | Disagreement axis (dots around the VYNDR reference line) | **ABSENT** | +| E5 | SPLIT chip (amber when spread wide) | **ABSENT** | +| E6 | Push-to-book (geo-gated, buttons never render disabled, affiliate microcopy verbatim) | **PARTIAL** — `bookLinks.js`/`affiliateConfig.js` exist, all books `enabled:false`; the designed geo-gating + microcopy not built. **TEASER only today** | +| E7 | CLV chip `BEAT CLOSE +2.0` — colour by SIGN, never result | **PARTIAL** — `lib/clvBadge.js` exists, "BEAT CLOSE" in 3 files | +| E8 | CLV aggregate on the record line (`BEAT CLOSE 61%` + AVG CLV) | **PARTIAL** — `beat_close_pct` computed behind the n≥20 gate | +| E9 | Calibration curve (dots vs dashed perfect line, dot size = sample) | **ABSENT** — no `CalibrationCurve` component | +| E10 | The Report email — dark billboard header + light paper body | **PARTIAL** — `newsletterService` builds an email; the designed hybrid dark/light template not built | +| E11 | Report signup module | **BUILT** (`NewsletterCapture`) | +| E12 | `/report` archive (每 issue shows its own day record) | **ABSENT** — `/report` redirects to `/blog`, no archive | +| E13 | Scanner **S6** marketless (blue void box, `NO MARKET` chip, priced-count CTA) | **PARTIAL** — `NoMarketState` ships; the designed blue-channel void box + player-specific CTA not verified | +| E14 | Scanner **S7** priced-line nudge (3 cases + typed-line mismatch) | **BUILT** (S79/S80 — `pricedLines`, per-selection + freshness) | +| E15 | Price Triplet | **BUILT-BUT-DRIFTED** — renders, but the MODEL leg is `NO_MODEL` (see Phase 2) | +| E16 | Share-card masters ×5 (settle 1080×1350, story, square, X 1200×675, record 1080×1350, article OG) | **ABSENT as product** — PNG masters exist in `exports/`; `ShareCard.tsx` has **0 importers** | +| E17 | `nudge(cell, up)` reaction primitive (`rx-up`/`rx-down` flash, data-events only) | **ABSENT** — `rx-up` = 0 files | +| E18 | Boot stagger `vy-rowin` 60ms + `vy-arrive` hero-last | **ABSENT** — 0 files | +| E19 | THE WIRE (timestamped entry, ~6s hold, tag coloured by meaning) | **BUILT** (`vyndr/Ticker`, real `/api/ticker` exhaust) | +| E20 | ⌘K palette | **BUILT** (`SearchModal` + `GlobalHosts`) | +| E21 | Parlay math (decimal→American, same-game amber, grade −1 tier, stake 1.0/0.75/0.4u) | **BUILT-BUT-DRIFTED** — `parlayMath.js`/`parlayService` exist; **stake-sizing ladder not verified** | +| E22 | Correlation builder | **BUILT** (`/parlay`, wired Wave 1) | +| E23 | Streaks | **BUILT** (`/api/streaks`, lens-applied) | +| E24 | Combat | **PARTIAL** (15 files reference it; no `/combat` route) | +| E25 | Pitcher | **BUILT** (62 files; probable-pitcher pipeline live) | +| E26 | Team-gradient matchup chips (10-12px, inside rows so the opacity ramp dims them) | **PARTIAL** — `linear-gradient(135deg` in 4 files, not the row-chip pattern | +| E27 | Row-hover rationale | **ABSENT** — 0 files | +| E28 | IntersectionObserver reveal + rail highlight | **ABSENT** — 0 files | + +### F. ARTBOARD SURFACES — 13 items +| F1 Landing | **BUILT** | F2 System terminal (desktop) | **ABSENT as a route** (`/system` 404; its INTELLIGENCE section = live `/intelligence`) | +|---|---|---|---| +| F3 Mobile 19 screens | **PARTIAL** — most screens exist; not audited screen-by-screen (**CANNOT DETERMINE** without a 19-way visual pass → Chrome audit) | +| F4 S2 line shopping | **PARTIAL** — `BookComparisonPanel` wired 07-29 but **DRIFTED**: renders per-book lines with **no crown, no disagreement axis, no SPLIT chip, no movement strip** — a simpler version than designed | +| F5 S3 article media (hero template + 4 archetypes + inline figures + article card + OG) | **ABSENT** except live `opengraph-image.tsx` | +| F6 S4 CLV / calibration | **PARTIAL** — CLV instrument repaired + `clv_distribution` behind n≥20; the **curve visual is ABSENT** | +| F7 S5 The Report | **PARTIAL** (see E10-E12) | +| F8 M2 crops ×5 | **ABSENT as product** (masters exist in `exports/`) | +| F9 Offseason hub | **ABSENT** (`/offseason` 404) | +| F10 Season board (open→NOW→VYNDR triplet, ladder grouping) | **ABSENT** | +| F11 Kickoff countdown (computed live, ambient) | **ABSENT** (2 files mention "kickoff", no countdown) | +| F12 News / outlook feed + quiet-wire empty state | **PARTIAL** (`NewsWire` on Explore) | +| F13 Mobile tab bar SLATE·EXPLORE·**READ-FAB**·LEDGER·MORE | **BUILT-BUT-DRIFTED** — `BottomTabBar` has 5 tabs, but **`READ-FAB` = 0 files**: the raised 50px green circle with void V + 6px ring is not the designed FAB | + +### G. HONESTY BEHAVIOURS (first-class items) — 10 +| G1 Boundary-channel blue states | **PARTIAL** (B1) | +| G2 Honest empty states | **BUILT** (`emptyState.js`, month-aware, unit-tested) | +| G3 Visible timestamps | **BUILT** (`gradedAt`, "UPDATED Xs ago") | +| G4 No "tonight" off-slate | **BUILT** (S57 date-pinned ESPN + `isRelevantGame`) | +| G5 CLV colour by SIGN, never result | **BUILT** (`clvBadge`, ROW-GRAMMAR colour law) | +| G6 Calibration hollow under N30 | **DRIFTED** — we gate at **n≥20**, the design says **N 30 hollow**. Two different thresholds; neither wrong, but they disagree | +| G7 C-tier honestly under .500 | **BUILT** (`TierRecord` renders real per-tier rates) | +| G8 Geo-empty honest state | **ABSENT** (push-to-book unbuilt) | +| G9 No trial — free tier IS the trial | **BUILT** (pricing) | +| G10 "Premium is produced, never claimed" | **BUILT** (honesty passes; A-RATED hold) | + +### COUNT +**61 items — BUILT-TO-SPEC 20 · BUILT-BUT-DRIFTED 7 · PARTIAL 16 · ABSENT 18.** +(Plus 1 CANNOT DETERMINE: F3's 19-screen parity needs a visual pass.) + +--- + +## PHASE 2 — WAVE-2 RECLASSIFICATION + MODEL LINKAGES + +**The Wave-2 "design gap" three, corrected:** +1. **Newsletter → DESIGN EXISTS.** S5 "The Report" is fully designed (hybrid email, signup, archive). + Reclassify **design-missing → design-exists-needs-build**. My earlier status pull was wrong on this. +2. **Live tracking → DESIGN STILL MISSING.** No artboard in the package. **design-missing-needs-design** stands. +3. **Slip reader → DESIGN STILL MISSING.** Not in the package. **design-missing-needs-design** stands. + +**Model linkages (connect, don't isolate):** +- **Price Triplet (E15/F-Price-Triplet artboard)** waits on **the EV layer producing `p_win`/`ev_pct`/ + `model_odds` on served grades**. We retired `edge_pct` from it 07-31; it renders honest `NO_MODEL` + until the model fills the MODEL leg. **Gated on model work, not design.** +- **S4 CLV chip + calibration curve (E7/E8/E9/F6)** are the designed home for the **CLV instrument + repaired 07-28** (`closing_prob` 59→406). The chips can build on today's data; **the calibration + curve needs the n-threshold decision resolved (G6: our n≥20 vs designed N30)** and enough settled + buckets to render non-hollow. + +--- + +## PHASE 3 — DEPENDENCIES + ORDERED BUILD LIST + +**WAVE D1 — self-contained, no dependency (build first):** +1. **D1 glyph library** — lift the remaining **45 SVGs** into `archetypes.js` (+ decide the 41-vs-74 + archetype scope question). Pure asset work, MANIFEST provided. +2. **A1 card token** `#0E0E14` (1 file → system-wide) · **C1 `vy-glitch`** naming reconciliation. +3. **E17 `nudge()` · E18 boot stagger · E27 row-hover · E28 IntersectionObserver** — pure CSS/JS + primitives, all four ABSENT, all self-contained. +4. **B1 boundary-channel blue** as a real third colour law (touches S6/S7/PriceTriplet copy). +5. **E26 team-gradient chips** · **F13 READ-FAB**. + +**WAVE D2 — gated on ANOTHER BUILD ORDER (the scanner-nudge order the package references):** +6. **E13 Scanner S6** full treatment (blue void box + priced-count CTA + player-specific path). + +**WAVE D3 — gated on MODEL work:** +7. **E15 Price Triplet MODEL leg** ← EV layer producing p_win/ev_pct/model_odds. +8. **E9 calibration curve** ← resolve n≥20 vs N30, accrue buckets. **E7/E8 CLV chips** can go earlier + (instrument is repaired). + +**WAVE D4 — gated on the RESOLUTION PIPELINE (Wave 3 found it unreachable):** +9. **E16 share-card masters ×5 + F8 M2 crops** ← the resolve fanout has **no share-card generation + step and no trigger**. Masters exist in `exports/`; they cannot ship as product until the tail fires. + +**WAVE D5 — gated on ASSETS / LICENSING:** +10. **E2 BookChip brand tiles** (licensed book logos — `image-slot` overlay designed for exactly this) + · headshot slots · **E6 push-to-book** (also gated on affiliate approval — every book `enabled:false`). + +**WAVE D6 — large surface builds (design complete, no blocker but big):** +11. **F9/F10/F11 Offseason hub + season board + kickoff countdown** (also sport-boundary adjacent). +12. **F5 S3 article media** · **E10/E12 The Report email + archive** · **E1/E3/E4/E5 the S2 line-shopping + primitive set** (movement strip, crown, disagreement axis, SPLIT) — note E3 crown is additionally + **held by measurement** (crown OFF, measured flat). + +--- + +## TAGS +VERIFIED: all counts (83 SVGs vs 38 wired; 41 registry archetypes; token file counts; every +ABSENT confirmed by 0-file grep). **CANNOT DETERMINE: F3 (19-screen mobile parity) — needs the Chrome +visual pass; whether a separate `~/vyndr_design` extract exists.** BLOCKED: E16/F8 (resolution tail), +E15 (model), E2/E6 (licensing/affiliate).