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:
+88
-3
@@ -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 (92–116px 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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user