Files
vyndr/specs/design-vs-build-gap-audit.md
builtbykev e257474cc8 report: design-vs-build gap audit — 61 items enumerated, 18 absent
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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc
2026-07-31 05:45:56 -04:00

159 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).