Session 35: Design system Phase D — core screens: Grade Result, Slate card, Scan, Terminal, Landing (1839 tests)

VYNDR 2.0 conversion, Phase D (the screens users touch). Frontend-only; zero
backend changes.

- GradeResultCard + ProcessingGrade (the core product moment): intel-surface
  grade hero, signal breakdown, kill conditions, best-book strip, alt ladder;
  sections self-hide when empty.
- lib/gradeAdapter.js maps engine output -> §7 contract and tier-gates content
  (free teaser / analyst kill-conditions / desk alt ladder) so the new card
  doesn't give paid content away.
- Scan result wired to ProcessingGrade->GradeResultCard, preserving scan limits,
  parlay add, reads tracking, and noopener sportsbook deep-links.
- GameCard (Bloomberg best/worst line cells) built + tested.
- Terminal page replaces its stub with a real league-intelligence screen.
- Landing gets the founder-seat ClaimMeter.

Honest scope: live dashboard/Slate swap onto GameCard, scan input -> TerminalInput,
full landing rebuild, and the blurred-paywall polish (Phase G) are deferred to
keep working flows stable.

22 new tests. Backend 1818 -> 1839, 143 suites, zero regressions. Web build clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kev
2026-06-16 00:20:45 -04:00
parent 907c7b17c1
commit 1d83682cdb
13 changed files with 1205 additions and 33 deletions
+88 -3
View File
@@ -1,11 +1,96 @@
# VYNDR — Build State
## Last Updated
2026-06-15
2026-06-16
## Current Phase
SHIP BUILD v34.0 — VYNDR 2.0 design system, Phase C: app shell — nav, routing,
auth gate, footer, 404 (Session 34)
SHIP BUILD v35.0 — VYNDR 2.0 design system, Phase D: core screens — Grade Result
Card, Slate GameCard, Scan, Terminal, Landing claim meter (Session 35)
## Session 35 (2026-06-16) — SHIPPED
Phase D of the VYNDR 2.0 conversion: the screens users touch. Frontend-only;
ZERO backend changes. Backend 1818 → **1839 tests** (+21), 143 suites, zero
regressions. Web build clean (exit 0, 36 routes).
### Strategy (5 screens, time-boxed → prioritized + honest scoping)
Built the high-value NEW components fully + wired the core moment, with
deliberate restraint where ripping out a working flow would regress
monetization or features (paywall polish is Phase G, Session 38).
### D.1 — Grade Result Card (the product's core moment) ✅ full + wired
- `components/vyndr/GradeResultCard.tsx` — faithful port: header, intel-surface
grade hero (92116px grade letter, grade-reveal + crt-sweep-local), confidence
strip, phosphor-confirmed pill, MODEL/LINE/EDGE row, signal breakdown, amber
kill-conditions, best-book strip (green tint + green left border), Desk alt
ladder, action row. **Every section self-hides when its data is empty.**
Callback props (onShare/onAddToParlay/onReadAnother) instead of window.__.
- `components/vyndr/ProcessingGrade.tsx` — the "weighing factors" reveal:
factor-ignite sequence + proc-scan bar + % rail + minimal inline neural SVG
(brain-node/brain-link), then reveals the card. Full NeuralBrain = Session 38.
- `lib/gradeAdapter.js` (CommonJS, unit-tested) — maps our engine output
(`/api/scan` ScanResponse + GradeCard props) → the §7 GradeResultCard contract:
direction→side, humanized stat, computed % edge (projection vs line),
phosphor-confirmed heuristic, factor→signal bullets. **Tier-gates content so
the new card doesn't give paid content away**: free = 3-signal teaser + no
kill conditions + no alt ladder; analyst = full signals + kill conditions;
desk = + alt ladder.
- **Scan page wired**: result render swapped from the legacy `GradeCard` to
`ProcessingGrade → GradeResultCard` via the adapter, keeping ALL existing scan
logic (fetch, scan-limit gating, parlay add). Preserved reads tracking
(`markReadComplete`, sessionStorage-deduped) and the sportsbook deep-links
(`target=_blank` + `rel=noopener noreferrer`). Added a free-tier upgrade nudge.
### D.2 — Slate GameCard (Bloomberg pattern) ✅ component, ⏳ live-swap deferred
- `components/vyndr/GameCard.tsx` — faithful: sport badge + team abbrs (18px/800
mono), live-dot + score/clock, grade-summary chip, 4-col book-lines grid with
**best = green tint + green left border, worst = subtle red**, graded PropRow
(GradeBadge + add-to-parlay), inline 🔥 streaks. Deterministic (no random
live-flash — that's the living layer, Session 38).
- HONEST SCOPE: did NOT rewire the live `dashboard`/`Slate.tsx` data flow onto
this card this session — that mapping (schedule+gamelines+streaks → GameCard
contract) is involved and the working slate shouldn't be destabilized inside a
5-screen session. The component + contract are ready for that swap next.
### D.3 — Scan ✅ result converted (input surface left intact)
Result/grade moment now uses the new design. The rich existing search (player
suggestions, tonight's-players chips, validation) was left as-is — swapping the
wired `<input>` for `TerminalInput` risked the suggestion flow for low visual
gain. Input-surface polish can follow.
### D.4 — Landing ✅ ClaimMeter added (additive)
- `components/vyndr/ClaimMeter.tsx` — amber "47 / 100 CLAIMED" founder-seat
scarcity bar; mounted under the Hero. Existing Hero/Pricing/Features kept (they
already use tokens). Full hero/grade-preview rebuild deferred — additive only
to avoid destabilizing the working conversion page.
### D.5 — Terminal ✅ full new page (replaced the stub)
- `app/terminal/page.tsx` — real league-intelligence screen (server component):
VVI most-impacted games on intel-surface cards, injury-wire cascade analysis,
factor pulse, gradeable leaders, matchup exploits. Uses §7 data shapes with
sample data (real wiring to scheduleService.getGameSummary/schedule/odds is a
later session, per the prompt). SectionHead/GradeBadge/SportBadge throughout.
### Files created
- `web/src/lib/gradeAdapter.js`
- `web/src/components/vyndr/{GradeResultCard,ProcessingGrade,GameCard,ClaimMeter}.tsx`
- `tests/unit/vyndrCoreScreens.test.js` (22 tests: adapter logic + tier gating,
card/processing/gamecard/claimmeter/terminal contracts, scan+landing wiring)
### Files modified
- `web/src/app/scan/page.tsx` (new card + adapter + reads + deep-links + nudge)
- `web/src/app/terminal/page.tsx` (stub → real), `web/src/app/page.tsx` (ClaimMeter)
- `web/src/components/vyndr/index.ts` (barrel exports)
- `tests/unit/vyndrAppShell.test.js` (terminal no longer a stub)
### Deferred (Sessions 36+)
- Live dashboard/Slate swap onto the new GameCard; scan input → TerminalInput;
full landing hero/grade-preview rebuild; Terminal real-data wiring; the
richer blurred-paywall treatment (Phase G). Remaining screens = Session 36.
---
## Session 34 (2026-06-15) — SHIPPED
## Session 34 (2026-06-15) — SHIPPED