- New GripAnalysisView with 4 scatter charts:
1. Grip Envelope (peak G vs speed: lateral/accel/brake)
2. Grip Circle (longitudinal vs lateral G scatter)
3. Cornering Grip vs Speed
4. Steering Response (steer angle vs lateral G)
- Summary stats: max lateral/accel/brake/combined G, peak lateral speed
- GripAnalysis types + type guard
- car_grip use case in SessionDetailView (quick stats + view button)
- Route /analysis/grip/:id
- Global .grid-4 CSS utility
- Add Car Characteristics and Track Mapping feature sections
- Update project structure (8 routes, tracks store, new views)
- Update API contract (23 endpoints, add characteristics/tracks/build-track-model)
- Add Features and State Management sections to AGENTS.md
- Remove obsolete track_map use case from types, views, and router
- Delete TrackMapView.vue (superseded by persistent TrackDetailView)
- Auto-analyze in handleBuildTrack before building track model
- Add CharacteristicsView: expandable car cards with aggregated shift-point
profiles (gear RPM/speed ranges, recommended shift RPM)
- Add TracksView + TrackDetailView + tracks Pinia store (Canvas 2D geometry)
- Add characteristics API client functions (listCarProfiles)
- Add tracks and characteristics nav items and routes
- Update Game type values to match backend snake_case (project_cars_1/2)
- Update use_case types and labels (remove track_map, keep track_mapping)
- Update ShiftPointAnalysis types: gear_ranges → gear_curves (with
acceleration data points), shift_events → crossover_points, add
runs_analyzed field
- Add UseCaseInfo type for GET /api/use-cases (now returns objects
with id, name, guidance instead of plain strings)
- Add guidance and recording_id fields to UseCaseSession
- Rewrite ShiftPointsView: scatter chart for gear acceleration curves,
dual y-axis bar chart for crossover RPM/speed, 4-column summary
- Update SessionDetailView: show session guidance, crossover points
and runs analyzed in analysis stats
- Extract shared type guard functions into src/utils/analysis.ts
- Type getAnalysis/reAnalyze as AnalysisResult instead of
Record<string, unknown>
- Type getGames return as string[] to match backend
Vue 3 + TypeScript + Vite web client for rusty-telemetry.
- Dashboard with system status, live feeds, quick actions
- Live telemetry view with real-time gauges (speed/RPM/gear)
- Session management (create, run, complete, analyze)
- Shift point analysis with Chart.js visualizations
- Track map with Canvas 2D boundary rendering
- Typed API client for all 19 REST endpoints
- Dark theme, network-accessible via Vite 0.0.0.0 bind