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
This commit is contained in:
Kev
2026-07-31 05:45:56 -04:00
parent 91911cfb1c
commit e257474cc8
+158
View File
@@ -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).