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
12 KiB
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:
- 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.
- Live tracking → DESIGN STILL MISSING. No artboard in the package. design-missing-needs-design stands.
- 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_oddson served grades. We retirededge_pctfrom it 07-31; it renders honestNO_MODELuntil 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_prob59→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):
- D1 glyph library — lift the remaining 45 SVGs into
archetypes.js(+ decide the 41-vs-74 archetype scope question). Pure asset work, MANIFEST provided. - A1 card token
#0E0E14(1 file → system-wide) · C1vy-glitchnaming reconciliation. - E17
nudge()· E18 boot stagger · E27 row-hover · E28 IntersectionObserver — pure CSS/JS primitives, all four ABSENT, all self-contained. - B1 boundary-channel blue as a real third colour law (touches S6/S7/PriceTriplet copy).
- 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).