id: 10affd0409ff4aab9022f20a3e14879f
parent_id: 6f1c99569c55487ea92d5f9239395e3f
item_type: 1
item_id: 50a09627d5d347009197b94bcee90411
item_updated_time: 1782289436553
title_diff: "[]"
body_diff: "[{\"diffs\":[[0,\"** v0.1.\"],[-1,\"5\"],[1,\"6\"],[0,\"\\\n\\\n---\\\n\\\n#\"]],\"start1\":319,\"start2\":319,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\"config (\"],[-1,\"8\"],[1,\"9\"],[0,\" routes)\"]],\"start1\":934,\"start2\":934,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\" charts\\\n\"],[1,\"│   ├── GripAnalysisView.vue   — Car grip envelope visualization (v0.1.6)\\\n\"],[0,\"│   ├── \"]],\"start1\":1687,\"start2\":1687,\"length1\":16,\"length2\":90},{\"diffs\":[[0,\"ncluding\"],[1,\" Car Grip,\"],[0,\" Track M\"]],\"start1\":2481,\"start2\":2481,\"length1\":16,\"length2\":26},{\"diffs\":[[0,\" Mapping\"],[-1,\", label\"],[0,\")\\\n- Dele\"]],\"start1\":2505,\"start2\":2505,\"length1\":23,\"length2\":16},{\"diffs\":[[0,\"t:**\"],[-1,\"\\\n  - Start run with feed selector and optional label\\\n  - Merge feeds toggle (select additional feeds to merge into the run) — v0.1.3\\\n  - Stop active runs\\\n  - Delete runs with confirmation dialog — v0.1.3\"],[1,\" start/stop/delete runs, merge feeds toggle\"],[0,\"\\\n- *\"]],\"start1\":2647,\"start2\":2647,\"length1\":211,\"length2\":51},{\"diffs\":[[0,\"e:**\"],[-1,\"\\\n  - C\"],[1,\" c\"],[0,\"omplete\"],[-1,\" session → triggers auto-analysis\\\n  - Reopen completed session (to add more runs) — v0.1.3\\\n  - Re-analyze button\\\n  - View full analysis (navigates to analysis-specific page)\"],[1,\", reopen, re-analyze\"],[0,\"\\\n- *\"]],\"start1\":2715,\"start2\":2715,\"length1\":194,\"length2\":37},{\"diffs\":[[0,\"s analyzed)\\\n\"],[1,\"- **Quick stats** for car grip (max lateral/accel/brake/combined G)\\\n\"],[0,\"- **Quick st\"]],\"start1\":2822,\"start2\":2822,\"length1\":24,\"length2\":92},{\"diffs\":[[0,\"** —\"],[-1,\" v0.1.4\\\n  -\"],[0,\" Bui\"]],\"start1\":2987,\"start2\":2987,\"length1\":19,\"length2\":8},{\"diffs\":[[0,\"ton \"],[-1,\"on completed track_mapping sessions\\\n  - Validates left + right boundary runs before allowing build\\\n  - Auto-runs `reAnalyze()` before `buildTrackModel()` — v0.1.5\\\n  - POST `/api/tracks/build` with session_id\\\n  - Success message with link to Tracks view\\\n\\\n### Shift Points Analysis (`/analysis/shift-points/:id`)\\\n- Summary stats (recommended shift RPM, crossover points, runs analyzed, frames analyzed)\\\n- **Charts (in order):**\\\n  1. \"],[1,\"with validation\\\n\\\n### Shift Points Analysis (`/analysis/shift-points/:id`)\\\n- Summary stats + 4 charts (\"],[0,\"RPM vs\"],[-1,\".\"],[0,\" Force\"],[-1,\" — x: RPM, y: acceleration_g (v0.1.2)\\\n  2.\"],[1,\",\"],[0,\" Spe\"]],\"start1\":3013,\"start2\":3013,\"length1\":494,\"length2\":123},{\"diffs\":[[0,\"d vs\"],[-1,\".\"],[0,\" Force\"],[-1,\" — x: speed_kmh, y: acceleration_g (v0.1.2)\\\n  3.\"],[1,\",\"],[0,\" Spe\"]],\"start1\":3137,\"start2\":3137,\"length1\":63,\"length2\":15},{\"diffs\":[[0,\"d vs\"],[-1,\".\"],[0,\" RPM\"],[-1,\" (Gear Ratios) — x: speed_kmh, y: rpm (v0.1.2)\\\n  4. Crossover Points — grouped bar chart (RPM + speed per gear change\"],[1,\", Crossover Points\"],[0,\")\\\n- \"]],\"start1\":3153,\"start2\":3153,\"length1\":130,\"length2\":30},{\"diffs\":[[0,\"Car \"],[-1,\"Characteristics (`/characteristics\"],[1,\"Grip Analysis (`/analysis/grip/:id\"],[0,\"`) —\"]],\"start1\":3211,\"start2\":3211,\"length1\":42,\"length2\":42},{\"diffs\":[[0,\"0.1.\"],[-1,\"5\\\n- Lists all cars with aggregated shift-point profiles from `GET /api/characteristics/cars`\\\n- Expandable car cards showing:\\\n  - Session count, recommended shift RPM\\\n  - Per-gear RPM ranges (min/max) and speed ranges\\\n  - Individual gear rows with gear number, RPM range, speed range\\\n\\\n### Tracks (`/tracks`) — v0.1.4\\\n- List all stored track models from `GET /api/tracks`\\\n- Game label, track name, corner count, creation date\\\n- View and delete actions\\\n\\\n### Track Detail (`/tracks/:game/:trackName`) — v0.1.4\\\n- Full track model geometry rendered on Canvas 2D:\\\n  - Left boundary (red) and right boundary (blue)\\\n  - Center line with curvature heat map (green → red gradient)\\\n  - Corner markers with numbered labels\\\n  - Sector shading (3-color overlay)\\\n- Toggle controls for curvature, corners, sectors visibility\\\n- Stats cards: corners, sectors, center line points, source\\\n- Corners table (entry/apex/exit spline positions, peak curvature)\\\n- Sectors table\\\n- Metadata card (game, track name, created date, boundary point counts)\\\n\\\n---\\\n\\\n## API Client Functions\\\n\\\nDefined in `src/api/client.ts`:\\\n\\\n| Function | Endpoint | Added |\\\n|----------|----------|-------|\\\n| `getLiveTelemetry()` | GET `/api/live` | v0.1.0 |\\\n| `listRecordings()` | GET `/api/recordings` | v0.1.0 |\\\n| `getRecording(id)` | GET `/api/recordings/{id}` | v0.1.0 |\\\n| `startRecording(req?)` | POST `/api/recordings` | v0.1.0 |\\\n| `stopActiveRecording()` | POST `/api/recordings/stop` | v0.1.0 |\\\n| `stopRecording(id)` | POST `/api/recordings/{id}/stop` | v0.1.0 |\\\n| `deleteRecording(id)` | DELETE `/api/recordings/{id}` | v0.1.0 |\\\n| `listSessions()` | GET `/api/sessions` | v0.1.0 |\\\n| `getSession(id)` | GET `/api/sessions/{id}` | v0.1.0 |\\\n| `createSession(req)` | POST `/api/sessions` | v0.1.0 |\\\n| `deleteSession(id)` | DELETE `/api/sessions/{id}` | v0.1.0 |\\\n| `startRun(sessionId, req)` | POST `/api/sessions/{id}/runs` | v0.1.0 |\\\n| `stopRun(sessionId, runId)` | POST `/api/sessions/{id}/runs/{runId}/stop` | v0.1.0 |\\\n| `completeSession(id)` | POST `/api/sessions/{id}/complete` | v0.1.0 |\\\n| `getAnalysis(id)` | GET `/api/sessions/{id}/analysis` | v0.1.0 |\\\n| `reAnalyze(id)` | POST `/api/sessions/{id}/analyze` | v0.1.0 |\\\n| `deleteRun(sessionId, runId)` | DELETE `/api/sessions/{id}/runs/{run_id}` | v0.1.3 |\\\n| `reopenSession(id)` | POST `/api/sessions/{id}/reopen` | v0.1.3 |\\\n| `listTracks()` | GET `/api/tracks` | v0.1.4 |\\\n| `getTrack(game, trackName)` | GET `/api\"],[1,\"6\\\n- Summary stats: max lateral G, max accel G, max brake G, max combined G, peak lateral speed\\\n- **4 charts:**\\\n  1. **Grip Envelope** — peak G (lateral/accel/brake) vs speed (line chart, envelope extraction)\\\n  2. **Grip Circle** — longitudinal G vs lateral G scatter (friction circle)\\\n  3. **Cornering Grip vs Speed** — peak lateral G vs speed\\\n  4. **Steering Response** — steer angle vs lateral G scatter\\\n- Accessed from SessionDetailView \\\"View Full Analysis\\\" button for `car_grip` sessions\\\n\\\n### Car Characteristics (`/characteristics`) — v0.1.5\\\n- Expandable car cards with aggregated shift-point profiles\\\n\\\n### Tracks (`/tracks`) and Track Detail (`\"],[0,\"/tracks/\"],[-1,\"{\"],[1,\":\"],[0,\"game\"],[-1,\"}/{\"],[1,\"/:\"],[0,\"track\"],[-1,\"_name}` |\"],[1,\"Name`) —\"],[0,\" v0.1.4\"],[-1,\" |\\\n| `deleteTrack(game, trackName)` | DELETE `/api/tracks/{game}/{track_name}` | v0.1.4 |\\\n| `buildTrackModel(req)` | POST `/api/tracks/build` | v0.1.4 |\\\n| `listCarProfiles()` | GET `/api/characteristics/cars` | v0.1.5 |\"],[1,\"\\\n- Track model listing and Canvas 2D geometry rendering\"],[0,\"\\\n\\\n--\"]],\"start1\":3255,\"start2\":3255,\"length1\":2684,\"length2\":748},{\"diffs\":[[0,\"e` —\"],[-1,\" includes\"],[0,\" `sh\"]],\"start1\":4086,\"start2\":4086,\"length1\":17,\"length2\":8},{\"diffs\":[[0,\"ints`, `\"],[-1,\"track_mapping\"],[1,\"car_grip\"],[0,\"`, `raci\"]],\"start1\":4100,\"start2\":4100,\"length1\":29,\"length2\":24},{\"diffs\":[[0,\"`, `\"],[-1,\"general` (track_map removed in v0.1.5)\\\n- `Game` — `assetto_corsa`, `assetto_corsa_competizione`, `project_cars_1`, `project_cars_2`\\\n- `StartRunRequest` — `{ feed_name, label?, merge_feeds?: string[] }` (merge_feeds added v0.1.3)\\\n- `SessionRun` — `{ id, label, feed_name, status, start_marker, end_marker, frame_count, data_truncated }`\\\n- `UseCaseSession` — `{ id, use_case, label, status, runs, analysis, guidance, recording_id }`\\\n- `ShiftPointAnalysis` — `{ gear_curves, crossover_points, recommended_shift_rpm\"],[1,\"track_mapping`, `general`\\\n- **Car grip types (v0.1.6):**\\\n  - `CarGripAnalysis` — `{ summary, grip_envelope, grip_circle, steering_response\"],[0,\", ru\"]],\"start1\":4183,\"start2\":4183,\"length1\":519,\"length2\":146},{\"diffs\":[[0,\" }`\\\n\"],[1,\"  \"],[0,\"- `G\"],[-1,\"earCurve` — `{ gear, gear_display, run_label, data_points, min/max rpm, min/max speed\"],[1,\"ripEnvelopePoint` — `{ speed_kmh, max_lateral_g, max_accel_g, max_brake_g\"],[0,\", sa\"]],\"start1\":4363,\"start2\":4363,\"length1\":97,\"length2\":87},{\"diffs\":[[0,\" }`\\\n\"],[1,\"  \"],[0,\"- `G\"],[-1,\"earData\"],[1,\"ripCircle\"],[0,\"Poin\"]],\"start1\":4460,\"start2\":4460,\"length1\":19,\"length2\":23},{\"diffs\":[[0,\" `{ \"],[-1,\"speed_kmh, rpm, acceleration_g }`\\\n- **Car characteristics types (v0.1.5):**\\\n  - `CarProfile` — `{ car_name, session_count, recommended_shift_rpm }`\\\n  - `CarGearProfile` — `{ gear, min_rpm, max_rpm, min_speed_kmh, max_speed_kmh }`\\\n  - `CarProfileDetail` — `{ car_name, gears: CarGearProfile[], recommended_shift_rpm, session_count }`\\\n- **Track model\"],[1,\"longitudinal_g, lateral_g }`\\\n  - `SteeringResponsePoint` — `{ steer, lateral_g, speed_kmh }`\\\n  - `GripSummary` — `{ max_lateral_g, max_accel_g, max_brake_g, max_combined_g, peak_lateral_speed_kmh }`\\\n- Shift point types: `ShiftPointAnalysis`, `GearCurve`, `GearDataPoint`, `CrossoverPoint`\\\n- Car characteristics\"],[0,\" typ\"]],\"start1\":4487,\"start2\":4487,\"length1\":356,\"length2\":318},{\"diffs\":[[0,\"0.1.\"],[-1,\"4):**\\\n  - `TrackModel` — `{ game, track_name, center_line, left_boundary, right_boundary, track_width, heading, curvature, corners, sectors, source, created_at }`\\\n  - `TrackSummary` — `{ game, track_name, source, created_at, corner_count }`\\\n  - `Corner` — `{ index, number, entry_s, apex_s, exit_s, curvature_peak }`\\\n  - `Sector` — `{ index, start_s, end_s }`\\\n  - `BuildTrackModelRequest` — `{ session_id, game?, track_name? }`\\\n  - `TrackMappingAnalysis` — type alias for `TrackMapAnalysis`\\\n\\\n---\\\n\\\n## Pinia Store Actions\\\n\\\n### Sessions Store (`src/stores/sessions.ts`)\\\n\\\n| Action | Added |\\\n|--------|-------|\\\n| `fetchSessions()` | v0.1.0 |\\\n| `fetchSession(id)` | v0.1.0 |\\\n| `createSession(req)` | v0.1.0 |\\\n| `deleteSession(id)` | v0.1.0 |\\\n| `startRun(sessionId, req)` | v0.1.0 |\\\n| `stopRun(sessionId, runId)` | v0.1.0 |\\\n| `completeSession(id)` | v0.1.0 |\\\n| `reAnalyze(id)` | v0.1.0 |\\\n| `deleteRun(sessionId, runId)` | v0.1.3 |\\\n| `reopenSession(id)` | v0.1.3 |\\\n\\\n### Tracks Store (`src/stores/tracks.ts`) — v0.1.4\\\n\\\n| Action | Description |\\\n|--------|-------------|\\\n| `fetchTracks()` | List all stored track summaries |\\\n| `fetchTrack(game, trackName)` | Load full track model |\\\n| `deleteTrack(game, trackName)` | Delete track model |\"],[1,\"5): `CarProfile`, `CarGearProfile`, `CarProfileDetail`\\\n- Track model types (v0.1.4): `TrackModel`, `TrackSummary`, `Corner`, `Sector`, `BuildTrackModelRequest`\\\n\\\n### Type Guards (`src/utils/analysis.ts`)\\\n- `isShiftPointAnalysis(data)` — checks for `gear_curves`\\\n- `isCarGripAnalysis(data)` — checks for `grip_envelope` (v0.1.6)\\\n- `isTrackMapAnalysis(data)` — checks for `boundaries`\\\n- `isNotImplemented(data)` — checks for `status: 'not_implemented'`\"],[0,\"\\\n\\\n--\"]],\"start1\":4810,\"start2\":4810,\"length1\":1235,\"length2\":457},{\"diffs\":[[0,\"## v0.1.\"],[-1,\"5\"],[1,\"6\"],[0,\" (2026-0\"]],\"start1\":5286,\"start2\":5286,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\" — C\"],[-1,\"h\"],[0,\"ar\"],[-1,\"acteristics Views, track_map Removal, Auto-\"],[1,\" Grip \"],[0,\"Analy\"],[-1,\"ze\"],[1,\"sis\"],[0,\"\\\n\\\n**\"]],\"start1\":5308,\"start2\":5308,\"length1\":61,\"length2\":24},{\"diffs\":[[0,\"ew: \"],[-1,\"CharacteristicsView (`/characteristics`) — expandable car\"],[1,\"GripAnalysisView (`/analysis/grip/:id`) with 4 scatter/line\"],[0,\" c\"],[1,\"h\"],[0,\"ar\"],[-1,\"ds showing aggregated shift-point profiles\\\n  - `listCarProfiles()` API client function (`GET /api/characteristics/cars`)\\\n  - `CarProfile`, `CarGearProfile`, `CarProfileDetail` TypeScript types\\\n  - Characteristics nav item + route\\\n- Tracks views committed (TracksView, TrackDetailView, tracks store — were uncommitted from v0.1.4)\\\n\\\n**Removed:**\\\n- `track_map` use case from types, views, and router\\\n- `TrackMapView.vue` deleted (superseded by TrackDetailView)\\\n- `TrackProfile` type, `getCarProfile()` and `listTrackProfiles()` API functions (dead code)\\\n\\\n**UX Fix:**\\\n- `handleBuildTrack` in SessionDetailView now auto-runs `reAnalyze()` before `buildTrackModel()` — ensures analysis is current\\\n\\\n**Other:**\\\n- `Game` type values updated to snake_case (`project_cars_1` / `project_cars_2`)\\\n\\\n### v0.1.4 (2026-06-08) — Track Mapping Web Client\\\n\\\n**New Features:**\\\n- Track model types: `TrackModel`, `TrackSummary`, `Corner`, `Sector`, `BuildTrackModelRequest`\\\n- New use case: `track_mapping\"],[1,\"ts:\\\n  1. Grip Envelope (peak lateral/accel/brake G vs speed — envelope extraction)\\\n  2. Grip Circle (longitudinal G vs lateral G scatter — friction circle)\\\n  3. Cornering Grip vs Speed (peak lateral G vs speed)\\\n  4. Steering Response (steer angle vs lateral G scatter)\\\n- Summary stats: max lateral/accel/brake/combined G, peak lateral speed, frames analyzed\\\n- Grip analysis types: `CarGripAnalysis`, `GripEnvelopePoint`, `GripCirclePoint`, `SteeringResponsePoint`, `GripSummary`\\\n- `isCarGripAnalysis` type guard in utils/analysis.ts\\\n- `car_grip\"],[0,\"` ad\"]],\"start1\":5356,\"start2\":5356,\"length1\":1050,\"length2\":616},{\"diffs\":[[0,\" to \"],[1,\"`\"],[0,\"UseCase\"],[1,\"`\"],[0,\" type\\\n- \"],[-1,\"Game type values updated to match API: `project_cars_1` / `project_cars_2` (was `project_cars1` / `project_cars2`)\\\n- New API client functions: `listTracks()`, `getTrack()`, `deleteTrack()`, `buildTrackModel()`\\\n- New Pinia store: `tracks` store for track model CRUD\\\n- New view: TracksView — list all stored track models with game labels, corner counts\\\n- New view: TrackDetailView — full geometry rendering with Canvas 2D:\\\n  - Left/right boundaries, center line with curvature heat map\\\n  - Corner markers with numbered labels\\\n  - Sector shading (3-color overlay)\\\n  - Toggle controls for curvature, corners, sectors\\\n  - Corners table, sectors table, metadata card\\\n- SessionDetailView: \\\"Build Track Model\\\" section for track_mapping sessions\\\n  - Validates left + right boundary runs\\\n  - POST `/api/tracks/build` button\\\n  - Success message with link to \"],[1,\"SessionDetailView: grip analysis quick stats (4 stat cards) + \\\"View Full Analysis\\\" button for `car_grip`\\\n- Route: `/analysis/grip/:id`\\\n- Global `.grid-4` CSS utility added to main.css\\\n\\\n### v0.1.5 (2026-06-24) — Characteristics Views, track_map Removal, Auto-Analyze\\\n\\\n- CharacteristicsView (`/characteristics`) — expandable car cards with aggregated shift-point profiles\\\n- Tracks views committed (\"],[0,\"Tracks\"],[-1,\" view\\\n- Dashboard: added \\\"Tracks\\\" quick action button\"],[1,\"View, TrackDetailView\"],[0,\", \"],[-1,\"`\"],[0,\"track\"],[-1,\"_mapping` use case label\\\n- SessionsView: added\"],[1,\"s store)\\\n-\"],[0,\" `tr\"]],\"start1\":5975,\"start2\":5975,\"length1\":983,\"length2\":465},{\"diffs\":[[0,\"_map\"],[-1,\"ping` to\"],[1,\"`\"],[0,\" use\"]],\"start1\":6443,\"start2\":6443,\"length1\":16,\"length2\":9},{\"diffs\":[[0,\"ase \"],[-1,\"selector\\\n- App.vue: added \\\"Tracks\\\" nav item\\\n- Router: added `/tracks` and `/tracks/:game/:trackName` routes\\\n\\\n**Code Quality:**\\\n- `encodeURIComponent()` applied consistently to both `game` and `trackName` in track API URLs\\\n- Curvature heat map batched into 16 color groups (reduced from ~2000 individual draw calls)\\\n- `Math.max(...spread)` replaced with `reduce()` to avoid stack overflow on 2000+ elements\\\n- `TrackMappingAnalysis` defined as\"],[1,\"removed, `TrackMapView.vue` deleted\\\n- `handleBuildTrack` auto-runs `reAnalyze()` before `buildTrackModel()`\\\n- `Game`\"],[0,\" type \"],[1,\"v\"],[0,\"al\"],[-1,\"ias for `TrackMapAnalysis` (no structural duplication)\"],[1,\"ues updated to snake_case\"],[0,\"\\\n\\\n##\"]],\"start1\":6454,\"start2\":6454,\"length1\":511,\"length2\":158},{\"diffs\":[[0,\"## v0.1.\"],[-1,\"3\"],[1,\"4\"],[0,\" (2026-0\"]],\"start1\":6611,\"start2\":6611,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\"06-0\"],[-1,\"6\"],[1,\"8\"],[0,\") — \"],[-1,\"Run Management & Feed Merging\\\n\\\n**New Features:**\\\n- Feed merging: toggle + checkbox selector when starting a run (sends `merge_feeds` to API)\\\n- Run deletion: delete button per run with confirmation dialog (`DELETE /api/sessions/{id}/runs/{run_id}`)\\\n- Session reopen: \\\"Reopen Session\\\" button on completed sessions (`POST /api/sessions/{id}/reopen`)\\\n- New API client functions: `deleteRun()`, `reopenSession()`\\\n- New store actions: `deleteRun()`, `reopenSession()`\\\n- `StartRunRequest` type extended with optional `merge_feeds: string[]`\"],[1,\"Track Mapping Web Client\\\n\\\n- Track model types, API client functions, tracks Pinia store\\\n- TracksView, TrackDetailView (Canvas 2D geometry rendering)\\\n- Build Track Model workflow in SessionDetailView\"],[0,\"\\\n\\\n##\"]],\"start1\":6627,\"start2\":6627,\"length1\":546,\"length2\":211},{\"diffs\":[[0,\"## v0.1.\"],[-1,\"2\"],[1,\"3\"],[0,\" (2026-0\"]],\"start1\":6837,\"start2\":6837,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\") — \"],[-1,\"Shifting Analysis Charts\\\n\\\n- Added RPM vs. Force scatter chart (x: RPM, y: acceleration_g)\\\n- Added Speed vs. RPM scatter chart (x: speed_kmh, y: rpm)\\\n- Renamed \\\"RPM vs. Acceleration (Tractive Force)\\\" → \\\"RPM vs. Force\\\"\\\n- Renamed \\\"Gear Acceleration Curves\\\" → \\\"Speed vs. Force\\\"\\\n- Chart order: RPM vs. Force → Speed vs. Force → Speed vs. RPM → Crossover Poin\"],[1,\"Run Management & Feed Merging\\\n### v0.1.2 (2026-06-06) — Shifting Analysis Char\"],[0,\"ts\\\n\"],[-1,\"\\\n\"],[0,\"### \"]],\"start1\":6858,\"start2\":6858,\"length1\":365,\"length2\":89},{\"diffs\":[[0,\"out\\\n\"],[-1,\"\\\n- Refactored System Status to 3 individual cards in a row (3-column grid)\\\n- Responsive: collapses to single column below 768px\\\n\\\n### v0.1.0 (2026-06-05) — Initial Release\\\n\\\n- Dashboard with live feeds and recording status\\\n- Session management (create, list, detail, delete)\\\n- Run management (start, stop)\\\n- Shift point analysis with charts\\\n- Track map visualization\\\n- API client with proxy to localhost:8080\"],[1,\"### v0.1.0 (2026-06-05) — Initial Release\"],[0,\"\\\n\\\n--\"]],\"start1\":6994,\"start2\":6994,\"length1\":414,\"length2\":49},{\"diffs\":[[0,\"-06-24 —\"],[1,\" v0.1.6: car grip analysis view (grip envelope, grip circle, steering response, cornering grip vs speed).\"],[0,\" v0.1.5:\"]],\"start1\":7419,\"start2\":7419,\"length1\":16,\"length2\":121},{\"diffs\":[[0,\"eristics\"],[-1,\" view\"],[0,\", track_\"]],\"start1\":7552,\"start2\":7552,\"length1\":21,\"length2\":16},{\"diffs\":[[0,\"lyze\"],[-1,\" before build track model, tracks views committed, API endpoint count updated (28)\"],[1,\", tracks views committed.\"],[0,\"*\"]],\"start1\":7589,\"start2\":7589,\"length1\":87,\"length2\":30}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-06-24T08:27:23.432Z
created_time: 2026-06-24T08:27:23.432Z
type_: 13