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>
3.7 KiB
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=YYYYMMDDto the ESPN scoreboard URL.- Normalized events are filtered to the requested ET date (
gameTimeconverted to America/New_York must equaldate). Events with no parseable date are dropped — live-feed-only, no exceptions. getSchedulepasses itsdatethrough.
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.jsstate trimmed to{ tick }— the fakegraded: 247auto-increment, sin-drivenneural %, andaPlus/cascadescounters are deleted. The tick remains solely as the 1s re-render pulse for the clock.HeartbeatBarnow fetches real data from a new endpointGET /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(fallbackgrades:{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.
- graded = Σ grades in each
- 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 keyednameKey|stat|side) — kept. - Nav's hardcoded
TICKER_ITEMSfallback (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>; layoutmainpaddingTop and Slate sticky top becomecalc(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.tsxfor the §12 content engine. - Nav PRIMARY = Slate / Scan / Ledger. BottomTabBar: Terminal tab → Explore.
PWA manifest Terminal shortcut → Ledger.
routes.js:/terminalout of OPEN_ROUTES;#terminalalias →/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.