Commit Graph

62 Commits

Author SHA1 Message Date
AmanTahiliani
3c6115e815 Make Playwright runs hermetic and fix stale race-hub specs
Six suite failures had rotted in: three race-hub specs targeted the
sub-tabbed Race Story UI deleted in the Phase 22 redesign, and the
command-center specs depended on the real OpenF1 calendar, whose focus
weekend drifted away from the seeded Monaco session as time passed.

The e2e/visual configs now point BOXBOX_OPENF1_BASE_URL (new override)
at an unreachable address so runs are hermetic and date-stable; the
race-hub specs were rewritten against the current RaceStoryCanvas UI,
and the one drifted mobile snapshot regenerated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 00:48:07 -04:00
AmanTahiliani
7f0c338a57 Add OpenF1 request pacing, 429 retry, and hub completeness guard
Concurrent fan-outs could burst past the free-tier rate limit; callers
swallowed the 429s as missing data, and the championship hub cached the
resulting partial season for its full TTL (observed live: 8 of 22
rounds, zero wins/podiums/form).

- requestPacer spaces live requests (350ms anonymous, 100ms with key);
  cache hits never wait
- get() retries 429s up to 3 times honouring Retry-After (capped 10s)
- hub tracks per-meeting fetch failures and caches incomplete
  aggregates for only 2 minutes instead of 15min/24h

Verified against the live API: 2026 hub now reports all 22 rounds with
wins/podiums/form populated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 00:47:52 -04:00
AmanTahiliani
5cfaed30ba Add championship what-if simulator
Fourth view on the championship page: assign P1-P10 per remaining
round and see projected standings update live, with position deltas
and mathematically alive/eliminated title states. Pure projection
logic in lib/simulator.ts (2025 points system, standard GPs only);
scenarios persist to localStorage per season. 169 frontend tests
passing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 00:31:09 -04:00
AmanTahiliani
e5cb4e4ed2 Add e2e coverage for the live timing page
Mocks /api/v1/live/state with a race snapshot to exercise the tower,
flag banner, weather strip, battle detection, stint history, and
driver pinning; also covers the no-session empty state.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 00:25:07 -04:00
AmanTahiliani
c708b6697d Upgrade live timing page for race weekends
- Track status flag banner (green/yellow/SC/VSC/red, defensive mapping)
- Weather strip: air/track temp, humidity, wind with compass, rain badge
- Gap trend sparklines from a per-driver interval ring buffer
- Battle detection: consecutive cars within 1.0s chained and highlighted
- Stint history column with compound sequence per driver
- Pinnable drivers (max 3) with focus cards, persisted to localStorage

Pure logic lives in lib/gapHistory.ts and lib/battles.ts with unit
tests; 137 frontend tests passing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 00:21:23 -04:00
AmanTahiliani
7a5e0a323d Update CLAUDE.md and plan.md to document the web layer
CLAUDE.md previously described only the TUI; it now covers the web
server (internal/web), React frontend, ingestion CLI, and the vitest/
playwright test commands. plan.md Phase 3 framing updated and the
championship hub recorded.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 00:15:01 -04:00
AmanTahiliani
282b5a8c24 Parallelize championship hub fetches and cache aggregated response
Cold-cache hub loads previously issued ~70 sequential OpenF1 calls.
Per-meeting fetches now fan out 5-wide (order preserved), and the
aggregated response is cached in memory: 15min TTL for the current
season, 24h for past seasons.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 00:14:07 -04:00
AmanTahiliani
2220d5d30a Add championship hub with derived stats and progression views
New /api/v1/championship/hub endpoint aggregates official standings with
wins, podiums, poles, recent form, teammate head-to-head, and per-round
cumulative points. ChampionshipPage renders drivers, constructors, and
progression views.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 00:09:47 -04:00
AmanTahiliani
91e2d13ab7 Implement SignalR Core support and add session fetching for live timing 2026-06-21 19:53:42 -07:00
AmanTahiliani
024accfb3d Add season calendar to command center 2026-05-25 18:14:55 -04:00
AmanTahiliani
a2aa772838 Add race control visuals and driver names in laps view 2026-05-25 15:55:36 -04:00
AmanTahiliani
3eb74a9083 Paginate briefing cards and add video previews 2026-05-25 15:27:34 -04:00
AmanTahiliani
e3453de788 feat(paddock): initial paddock briefing pages and store changes 2026-05-25 15:16:00 -04:00
AmanTahiliani
e060bcba24 fix(web): resolve practice/qualifying partial session bug by flagging starting_grid as N/A 2026-05-25 14:33:14 -04:00
AmanTahiliani
937674f808 feat(backend): implement session coverage, resumable ingestion, deep year backfill, backoff rate-limit, and dynamic cache TTLs 2026-05-25 13:52:43 -04:00
AmanTahiliani
bc1c551a82 feat(ui): interactive race story canvas and layout refinements 2026-05-25 13:44:51 -04:00
AmanTahiliani
c25822dee0 Phase 22b: Interactive Race Story Canvas 2026-05-25 13:20:55 -04:00
AmanTahiliani
c172bb59b1 Phase 22: Race Story Deepening 2026-05-25 13:10:47 -04:00
AmanTahiliani
7ce2b1ace4 Add Paddock Briefing UI (Phase 21) 2026-05-25 13:04:29 -04:00
AmanTahiliani
3bd169c55c Rework Race Hub as weekend workspace 2026-05-25 12:35:59 -04:00
AmanTahiliani
ee88a07aa1 Add paddock briefing feed ingestion 2026-05-25 12:30:21 -04:00
AmanTahiliani
84a8827244 Add paddock briefing RSS backend spike 2026-05-25 12:02:18 -04:00
AmanTahiliani
79b0b9f469 Rework command center for race weekends 2026-05-25 11:51:16 -04:00
AmanTahiliani
a0f135aac1 Update operator documentation 2026-05-25 11:26:52 -04:00
AmanTahiliani
9532206522 Polish live timing UI 2026-05-25 10:45:35 -04:00
AmanTahiliani
e539abcc5f Add command center screen 2026-05-25 10:29:31 -04:00
AmanTahiliani
571edb9b5a Add visual regression coverage 2026-05-25 10:17:07 -04:00
AmanTahiliani
10729a906c Add production web smoke coverage 2026-05-25 10:04:11 -04:00
AmanTahiliani
17c94d83ad Tighten race result ingestion ordering 2026-05-25 10:03:57 -04:00
AmanTahiliani
404029ff24 Add MVP completion checklist 2026-05-25 02:58:36 -04:00
AmanTahiliani
e410a01db1 Complete React live and Race Hub views 2026-05-25 02:56:06 -04:00
AmanTahiliani
5eb0983ffb Preserve optional analytics partial ingestion 2026-05-25 02:51:50 -04:00
AmanTahiliani
95060b07a5 Serve built React app from web mode 2026-05-25 02:49:31 -04:00
AmanTahiliani
0992fc03e8 Add data library UI 2026-05-25 02:45:02 -04:00
AmanTahiliani
f2339a00a9 Add weekend ingestion orchestration 2026-05-25 02:38:27 -04:00
AmanTahiliani
2c9db0213c Add local data navigation UI 2026-05-25 02:31:35 -04:00
AmanTahiliani
1661f8dec3 Add local navigation API 2026-05-25 02:25:06 -04:00
AmanTahiliani
b5d87775a6 Add Race Hub analytics visuals 2026-05-25 02:19:53 -04:00
AmanTahiliani
dfd0cf7c12 Tighten Phase 8 handoff prompt 2026-05-25 02:06:08 -04:00
AmanTahiliani
c7438f0ed8 Add analytics data foundation 2026-05-25 02:04:16 -04:00
AmanTahiliani
5470b0df38 Expand React race hub analytics 2026-05-25 01:20:04 -04:00
AmanTahiliani
32d500f5af Add React race hub frontend 2026-05-25 01:10:44 -04:00
AmanTahiliani
e08255db70 Add local-first race hub API 2026-05-25 00:49:13 -04:00
AmanTahiliani
517c6b987b Add local-first refactor foundation 2026-05-25 00:45:46 -04:00
AmanTahiliani
161e871c53 UI Updates and Web App 2026-05-24 20:56:00 -04:00
AmanTahiliani
b61f9f0685 Cleanup 2026-03-27 21:40:18 -04:00
AmanTahiliani
ce2bc41a7f UI Updates 2026-03-27 21:02:16 -04:00
AmanTahiliani
7d46b94c42 Updated Web UI 2026-03-27 20:53:06 -04:00
AmanTahiliani
1027dd6f8e Updated UI default next session detail 2026-03-27 20:30:07 -04:00
AmanTahiliani
7e93e427f9 Updated plan 2026-03-27 20:16:33 -04:00