feat: analysis hall + on-track HUD + no-fake-fallback sweep + docs - #37
Merged
Conversation
PWA — Analysis Hall (new):
- AnalysisHub.vue rewritten as 6-tab UI (Overview/Telemetry/Systems/IMU/
Signals/Modules), under pages/analysis-hub/tabs/
- DuckDB-wasm + Leaflet + Chart.js (lazy-loaded, worker bundled
same-origin to avoid jsdelivr CORS)
- analysisStore (Pinia) with sessionId/laps/selectedLapIndex/
filterOutliers/activeTab + lapFilterSql getter
- New shared lib: telemetry/outliers.ts (SANITY_RANGES + clipOutliers)
and telemetry/queries.ts (decimation + signal helpers)
- New shared/ui/charts/CyberLineChart.vue Chart.js wrapper
- Track JSON fetched from src/pwa/public/data/
PWA — On-Track HUD (redesigned):
- Reactive sid via computed: explicit > replay source > /health
active_session_id (fixes "REPLAY ACTIVE but no data" bug — SSE was
opened with empty sid and never resubscribed)
- useLapDerivation composable derives lap_number from cumulative
distance / track_length_m (bridge doesn't emit lap_number)
- New AgentTraceDrawer (T key, polls /coach/traces only while open)
- New CoachVoiceButton FAB (M key) + Shift+D debug overlay
- New HudCornerTile widget; cockpit-minimal layout, Pixel 10 landscape
PWA — 8 pages newly tabbed: Settings, CarSetup, Calibration,
HardwareDetail, PitStall, QuestLog, EndOfDay, PreBrief, LivePitWall
(via CyberTabs)
Bridge — new endpoints:
- /session/<sid>/laps (GPS+distance+stint lap detection)
- /coach/traces (agent_traces table polling)
- /leaderboard (best-lap aggregation)
- /cars (data/cars/*.yaml scan + currently-loaded flag)
- /session/<sid>/export.parquet: SQLite path via streaming pyarrow
batches; telemetry_signals + signal_registry now include session_id
column
No-fake-fallback sweep:
- entities/quest/medalStore: honest empty state
- entities/session/telemetryStore: removed startSimulation() fakes
- coaching/litert_coach: dropped _templated_pre_brief
- coaching/bp_coaching: /coach/brief response exposes error from
llm_friction row
- Pages wired to real endpoints: CarSetup -> /cars, TrackAtlas ->
/track/{markers,danger_zones,elevation,weather}, LapTimesHall type-
drift fix, StageClear -> /session/<sid>/scorecard + /coach/debrief,
DriverEvolution drops fake median, TrainerCard -> /driver/<id>/
profile, PreBrief preflight bound to /health, LiveCarState coaches
from /coach/agents + /capabilities, GarageHub counts from real
stores
- Removed: SponsorContractsBody hardcoded sponsors, OnboardingFlow
default car, CoachCodexMode fake emotion, ModulesTab literal tile
counts, HardwareDetail hardcoded modal fields, OnTrackHud
session.totalLaps reference
Docs (refreshed/rewritten):
- README.md, docs/api.md, docs/architecture.md, docs/stack.md,
docs/hardware.md, data/README.md
- docs/pitwall-web-design.md, docs/ux.md
- docs/coaching-engine.md, docs/adk-agent-architecture.md,
docs/litert_termux_validation.md, deploy/phone/README.md
- NEW: docs/analysis-hall.md, docs/on-track-hud.md
Tests:
- tests/features/coaching/test_coach_traces.py (5/5)
- tests/features/test_api_cars.py (2/2)
- tests/features/test_api_leaderboard.py (3/3)
- src/pwa/tests/{analysisStore,outliers}.test.ts (11/11)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Big sprint bundle. Three top-level themes:
PWA — Analysis Hall (new tabbed UI)
pages/analysis-hub/AnalysisHub.vuerewritten as 6-tab UI (Overview/Telemetry/Systems/IMU/Signals/Modules) underpages/analysis-hub/tabs/analysisStore(Pinia) withsessionId/laps/selectedLapIndex/filterOutliers/activeTab+lapFilterSqlgettershared/lib/telemetry/outliers.ts(SANITY_RANGES + clipOutliers) andshared/lib/telemetry/queries.ts(decimation + signal helpers)shared/ui/charts/CyberLineChart.vuewrapperdistance_m(mirrors the standalone HTML viewer)PWA — On-Track HUD (cockpit-minimal redesign)
sidvia computed (explicit > replay source > /health active_session_id) + watcher. Previouslyconst sid = activeSessionId ?? ''was captured statically and the SSE was opened with emptysid→ REPLAY ACTIVE pill showed but no frames flowed.useLapDerivationcomposable deriveslap_numberfrom cumulativedistance / track_length_m(bridge doesn't emit lap_number)AgentTraceDrawer(Tkey, polls/coach/tracesonly while open — battery-aware on Pixel 10)CoachVoiceButtonFAB (Mkey) +Shift+Ddebug overlayHudCornerTilewidget; Pixel 10 landscape (2424×1080)firstFrameAtis set (no—scrambled grid)PWA — 8 pages newly tabbed
Settings, CarSetup, Calibration, HardwareDetail, PitStall, QuestLog, EndOfDay, PreBrief, LivePitWall (via
CyberTabs)Bridge — new endpoints
GET /session/<sid>/laps— GPS+distance+stint lap detectionGET /coach/traces?session_id=&limit=&since_ts=—agent_tracestable pollingGET /leaderboard?track=&limit=— best-lap aggregationGET /cars—data/cars/*.yamlscan + currently-loaded flagGET /session/<sid>/export.parquet: SQLite path via streaming pyarrow batches;telemetry_signals+signal_registrynow includesession_idcolumn (fixes DuckDB-wasm binder errors in Analysis Hall queries)No-fake-fallback sweep
Stores:
medalStorehonest empty state;telemetryStore.startSimulation()Math.sin/cos fakes removed;litert_coach._templated_pre_briefdropped;/coach/briefresponse exposes error fromllm_frictionrow.Pages wired to real endpoints: CarSetup→
/cars, TrackAtlas→/track/{markers,danger_zones,elevation,weather}, LapTimesHall type-drift fix, StageClear→/session/<sid>/scorecard+/coach/debrief, DriverEvolution drops fake median, TrainerCard→/driver/<id>/profile, PreBrief preflight bound to/health, LiveCarState coaches from/coach/agents+/capabilities, GarageHub counts from real stores.Removed: SponsorContractsBody hardcoded sponsors, OnboardingFlow default car, CoachCodexMode fake emotion, ModulesTab literal tile counts, HardwareDetail hardcoded modal fields, OnTrackHud
session.totalLapsreference.Docs (refreshed/rewritten)
README.md,docs/api.md,docs/architecture.md,docs/stack.md,docs/hardware.md,data/README.md,docs/pitwall-web-design.md,docs/ux.md,docs/coaching-engine.md,docs/adk-agent-architecture.md,docs/litert_termux_validation.md,deploy/phone/README.md. NEW:docs/analysis-hall.md,docs/on-track-hud.md.Tests
tests/features/coaching/test_coach_traces.py(5/5)tests/features/test_api_cars.py(2/2)tests/features/test_api_leaderboard.py(3/3)src/pwa/tests/{analysisStore,outliers}.test.ts(11/11)cd src/pwa && npm run build→ 125 entries, 3700 KiB, 0 errorsTest plan
/garage/analysis— session picker populated, no DuckDB worker errors in console←/→, toggle outliers withO, switch tabs1–6/hud— WAITING overlay appears (3s grace), click START REPLAY, picker starts replay, REPLAY ACTIVE pill, telemetry flows, lap number derives from distance, GPS dot traces minimapT— AgentTraceDrawer opens (will show "AGENT TRACE UNAVAILABLE — google-adk not installed" until ADK is installed on phone)M— voice FAB activates (Web Speech API;/coach/askreturns 503 until ADK is installed)Shift+D— debug overlay shows live sid/frames/age/lap