Files
vyndr/specs/phase-0-kill-the-lies.md
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

81 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.