Files
vyndr/specs/phase-0-kill-the-lies.md
T
builtbykev c8790fde55 Session 57: Phase 0 — Kill the Lies (2309 tests)
Work-order Phase 0 (Jul 10 live audit): every fabricated UI element deleted
or rewired to real data. Deletion sprint — no new product features.

0.1 Fake NBA game: root cause was scheduleService fetching the ESPN
    scoreboard with no ?dates= param or date filter — off-season ESPN
    returns the NEAREST slate (Jun 13 NYK@SA Finals rendered as tonight).
    Now pinned to the requested ET date + defensive filter; undated events
    dropped. Honest month-aware per-sport empty states (lib/emptyState.js).
0.2 Fake header counters: liveTick stripped to a bare 1s pulse (the
    auto-incrementing "247 graded", sin-driven brain-%, aPlus/cascades are
    dead). New GET /api/snapshot/summary (cache-only, before /:sport) +
    Next proxy; HeartbeatBar shows the real graded count and SYNC =
    elapsed since the last pipeline run (amber past 5 min).
0.3 Ticker: hardcoded fallback items deleted (real snapshot exhaust only);
    MOVE kept — computeLineDeltas is real movement. <4 real items → no
    ticker; bar publishes --ticker-h so the fixed header collapses cleanly.
0.4 /terminal retired: route redirects to /dashboard; VVI/injury-wire/
    leaders layouts preserved unrouted as §12 content-engine templates.
    Nav PRIMARY = Slate/Scan/Ledger; BottomTabBar Terminal→Explore; PWA
    shortcut Terminal→Ledger; #terminal alias → /dashboard.
0.5 ›Query nav pill deleted (duplicate /scan link).

Backend 2289 → 2309 tests (199 suites), web build exit 0.
Spec: specs/phase-0-kill-the-lies.md. Next: work-order Phase 1 (ledger
persistence + settlement).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 20:17:49 -04:00

3.7 KiB
Raw Blame History

Phase 0 — Kill the Lies (Session 57)

Source: VYNDR work order (Jul 10 2026 live audit × VYNDR-OVERHAUL-SPEC). Every task is a P0 credibility fix — deletion or rewiring of fake elements. No new product features.

0.1 — Delete the fake NBA game

Root cause (found): scheduleService.fetchScheduleFromEspn hits the ESPN scoreboard with NO ?dates= param and NO date filter. In the off-season ESPN returns the nearest slate (the Jun 13 NYK@SA Finals game), which every consumer (dashboard legacy section, Slate merge, hasOdds flags) then renders as tonight's game.

Fix (backend, at the source):

  • fetchScheduleFromEspn(sport, date) appends ?dates=YYYYMMDD to the ESPN scoreboard URL.
  • Normalized events are filtered to the requested ET date (gameTime converted to America/New_York must equal date). Events with no parseable date are dropped — live-feed-only, no exceptions.
  • getSchedule passes its date through.

Fix (frontend): sport-specific empty-state copy on the dashboard when a sport has zero games (NBA off-season: "NBA returns in October. The model is watching the MLB + WNBA boards tonight.").

Acceptance: /api/schedule/nba?date=D never returns an event whose ET date ≠ D. Regression test uses the old NYK@SA fixture (event dated D+1) and asserts it is filtered out.

0.2 — Delete the fake header counters

  • lib/liveTick.js state trimmed to { tick } — the fake graded: 247 auto-increment, sin-driven neural %, and aPlus/cascades counters are deleted. The tick remains solely as the 1s re-render pulse for the clock.
  • HeartbeatBar now fetches real data from a new endpoint GET /api/snapshot/summary (public, cache-only Redis reads, registered BEFORE /:sport): { graded, updated_at, sports: {nba,wnba,mlb,soccer} }.
    • graded = Σ grades in each snapshot:{sport}:latest (fallback grades:{sport}). Real and small beats fake and big.
    • "neural XX%" — deleted entirely, no replacement.
    • SYNC = elapsed since updated_at (counts up; amber past 5 min). No snapshot data → "SYNC —", no graded count invented.
  • Next proxy web/src/app/api/snapshot/summary/route.ts (S25 rule).

Acceptance: header numbers change only when the snapshot changes; refresh does not reset them to 247/96%.

0.3 — Ticker: real items only

  • The MOVE pipeline is already real (computeLineDeltas: locked line vs current line keyed nameKey|stat|side) — kept.
  • Nav's hardcoded TICKER_ITEMS fallback (fake Wembanyama A+ / "NYK vs SA Q3" / fake Tatum MOVE) — deleted. Ticker fallback is now an empty list.
  • Spec §3 rule: fewer than 4 real items → the ticker bar does not render. The bar sets --ticker-h (32px/0px) on <html>; layout main paddingTop and Slate sticky top become calc(Xpx + var(--ticker-h)) so the header collapses cleanly.

0.4 — Pull /terminal from nav

  • Entire surface is fabricated (Finals-era sample data) → route now redirect('/dashboard').
  • Sample layouts preserved (unrouted) at web/src/components/intel/TerminalTemplates.tsx for the §12 content engine.
  • Nav PRIMARY = Slate / Scan / Ledger. BottomTabBar: Terminal tab → Explore. PWA manifest Terminal shortcut → Ledger. routes.js: /terminal out of OPEN_ROUTES; #terminal alias → /dashboard.

0.5 — Kill Query

Duplicate link to /scan (data-search-trigger) deleted from Nav.

Test plan

  • Updated: scheduleRoute (date filter + regression), vyndrSystems (liveTick), vyndrMobile (tabs/manifest), vyndrAppShell (routes/nav), vyndrCoreScreens (terminal redirect), vyndrParityQA (tab list).
  • New: snapshot summary route integration test; schedule off-date filter test.
  • Full suite green before ship.