id: 9b600217e7b14a19b909bd43c541cac3
parent_id: 42c9f004d93b4191811e20ee99f0509d
item_type: 1
item_id: 6c0dcb2a567348fd9796f50c790082e4
item_updated_time: 1780649207945
title_diff: "[]"
body_diff: "[{\"diffs\":[[0,\"anager, \"],[-1,\"auto-start session\"],[1,\"Session Analysi\"],[0,\"s** |\\\n\\\n#\"]],\"start1\":539,\"start2\":539,\"length1\":34,\"length2\":31},{\"diffs\":[[0,\"`8080` |\"],[1,\"\\\n| `RUSTY_TELEMETRY_API_HOST` | REST API server bind address | `127.0.0.1` |\"],[0,\"\\\n\\\n**Same\"]],\"start1\":1004,\"start2\":1004,\"length1\":16,\"length2\":92},{\"diffs\":[[0,\"g CRUD, \"],[-1,\"live telemetry\"],[1,\"session CRUD, analysis\"],[0,\")\\\n│   ├─\"]],\"start1\":1914,\"start2\":1914,\"length1\":30,\"length2\":38},{\"diffs\":[[0,\" (recording \"],[-1,\"session \"],[0,\"manager — ma\"]],\"start1\":1980,\"start2\":1980,\"length1\":32,\"length2\":24},{\"diffs\":[[0,\"anager —\"],[1,\" ring buffers,\"],[0,\" manifes\"]],\"start1\":1993,\"start2\":1993,\"length1\":16,\"length2\":30},{\"diffs\":[[0,\", CRUD)\\\n\"],[1,\"│   ├── session.rs                 (session manager — use-case sessions, runs, frame extraction)\\\n│   ├── analysis.rs                (analysis algorithms — shift points, track mapping)\\\n\"],[0,\"│   ├── \"]],\"start1\":2035,\"start2\":2035,\"length1\":16,\"length2\":200},{\"diffs\":[[0,\"ta model\"],[1,\" + gear_display\"],[0,\")\\\n│   ├─\"]],\"start1\":2429,\"start2\":2429,\"length1\":16,\"length2\":31},{\"diffs\":[[0,\"6_ksudp.\"],[-1,\"bin\"],[1,\"jsonl\"],[0,\"\\\n       \"]],\"start1\":2838,\"start2\":2838,\"length1\":19,\"length2\":21},{\"diffs\":[[0,\"ry_tool.\"],[-1,\"bin\"],[1,\"jsonl\"],[0,\"\\\n       \"]],\"start1\":2882,\"start2\":2882,\"length1\":19,\"length2\":21},{\"diffs\":[[0,\"6_pcars.\"],[-1,\"bin\"],[1,\"jsonl\"],[0,\"\\\n```\\\n\\\n--\"]],\"start1\":2916,\"start2\":2916,\"length1\":19,\"length2\":21},{\"diffs\":[[0,\"points\\\n\\\n\"],[1,\"- **1.8 Session Management + Analysis — IMPLEMENTED IN v0.5.0**\\\n  - [x] `session.rs` — SessionManager with use-case sessions, runs, frame extraction from ring buffers\\\n  - [x] `analysis.rs` — Shift point analysis (gear RPM ranges, upshift detection, recommended shift RPM)\\\n  - [x] `analysis.rs` — Track map analysis (spline-aligned interpolation for center line)\\\n  - [x] `session.rs` — `data_truncated` flag for ring buffer wrap detection\\\n  - [x] `api.rs` — 9 new session endpoints (CRUD, run management, analysis triggers)\\\n  - [x] `recording.rs` — Ring buffer mutex held only during frame clone, not JSON serialization\\\n  - [x] `recording.rs` — Flush failure propagation (errors prevent Stopped status)\\\n  - [x] `recording.rs` — `stop_recording` holds active lock across flush (prevents race)\\\n  - [x] Mutex poisoning recovery on session API handlers\\\n  - [x] `gear_display` deduplicated into shared free function\\\n  - [ ] Add session/analysis unit tests\\\n  - [ ] Add ring buffer unit tests\\\n\\\n\"],[0,\"---\\\n\\\n## \"]],\"start1\":6649,\"start2\":6649,\"length1\":16,\"length2\":1002},{\"diffs\":[[0,\"`8080` |\"],[1,\"\\\n| `RUSTY_TELEMETRY_API_HOST` | REST API server bind address | `127.0.0.1` |\"],[0,\"\\\n\\\n### Po\"]],\"start1\":8297,\"start2\":8297,\"length1\":16,\"length2\":92},{\"diffs\":[[0,\"_cars_2)\"],[1,\"\\\n- `GET /api/sessions` — list all sessions\\\n- `POST /api/sessions` — create analysis session (JSON: use_case, label)\\\n- `GET /api/sessions/{id}` — get session details\\\n- `DELETE /api/sessions/{id}` — delete session\\\n- `POST /api/sessions/{id}/runs` — start a run (JSON: feed_name, label)\\\n- `POST /api/sessions/{id}/runs/{run_id}/stop` — stop a run\\\n- `POST /api/sessions/{id}/complete` — complete session and auto-analyze\\\n- `GET /api/sessions/{id}/analysis` — get analysis results\\\n- `POST /api/sessions/{id}/analyze` — re-run analysis on completed session\"],[0,\"\\\n\\\n### Po\"]],\"start1\":10334,\"start2\":10334,\"length1\":16,\"length2\":566},{\"diffs\":[[0,\"0 (2026-06-0\"],[-1,\"4\"],[1,\"5\"],[0,\") — REST API\"]],\"start1\":11684,\"start2\":11684,\"length1\":25,\"length2\":25},{\"diffs\":[[0,\"6-05) — REST API\"],[-1,\" +\"],[1,\",\"],[0,\" Recording Manag\"]],\"start1\":11693,\"start2\":11693,\"length1\":34,\"length2\":33},{\"diffs\":[[0,\"ding Manager\"],[1,\", Session Analysis\"],[0,\"\\\n\\\n**New Feat\"]],\"start1\":11716,\"start2\":11716,\"length1\":24,\"length2\":42},{\"diffs\":[[0,\"8080\"],[-1,\") for recording management and live telemetry\"],[1,\", default host 127.0.0.1)\"],[0,\"\\\n- R\"]],\"start1\":11821,\"start2\":11821,\"length1\":53,\"length2\":33},{\"diffs\":[[0,\"ectories\"],[-1,\" and\"],[1,\",\"],[0,\" JSON ma\"]],\"start1\":11898,\"start2\":11898,\"length1\":20,\"length2\":17},{\"diffs\":[[0,\"anifests\"],[-1,\"\\\n- A\"],[1,\", a\"],[0,\"uto-star\"]],\"start1\":11914,\"start2\":11914,\"length1\":20,\"length2\":19},{\"diffs\":[[0,\" auto-start \"],[-1,\"recording \"],[0,\"on launch\\\n- \"]],\"start1\":11923,\"start2\":11923,\"length1\":34,\"length2\":24},{\"diffs\":[[0,\"I\\\n- \"],[-1,\"Raw feed binary download endpoint\"],[1,\"Feed data endpoint: read frames from active ring buffer or stopped JSONL on disk\"],[0,\"\\\n- U\"]],\"start1\":12112,\"start2\":12112,\"length1\":41,\"length2\":88},{\"diffs\":[[0,\"al)\\\n\"],[-1,\"- CORS enabled for frontend integration\"],[1,\"\\\n**Session Management & Analysis:**\\\n- Use-case sessions: create, start runs, stop runs, complete with auto-analysis\\\n- Shift point analysis: gear RPM ranges, upshift event detection, recommended shift RPM\\\n- Track map analysis: boundary extraction with spline-aligned interpolation for center line\\\n- `data_truncated` flag detects ring buffer wrap on runs\\\n- 9 session API endpoints (CRUD, run management, analysis triggers, re-analysis)\\\n\\\n**Architecture:**\\\n- Always-on ring buffers (5 min, 18k frames per feed) replacing raw binary dumps\\\n- Ring buffer flush to JSONL on recording stop/shutdown\\\n- Mutex poisoning recovery on all session API handlers\\\n- Flush: ring buffer lock held only during frame clone, JSON serialization outside lock\\\n- Flush failures propagated (manifest not saved as Stopped on failure)\\\n- `stop_recording` holds active lock across flush (prevents race with `start_recording`)\"],[0,\"\\\n\\\n**\"]],\"start1\":12307,\"start2\":12307,\"length1\":47,\"length2\":900},{\"diffs\":[[0,\"src/\"],[-1,\"api\"],[1,\"session\"],[0,\".rs` (\"],[-1,\"321\"],[1,\"256\"],[0,\" lin\"]],\"start1\":13225,\"start2\":13225,\"length1\":20,\"length2\":24},{\"diffs\":[[0,\") — \"],[-1,\"REST API server with axum\\\n- `src/recording\"],[1,\"SessionManager with use-case sessions, runs, frame extraction\\\n- `src/analysis.rs` (300 lines) — Shift point analysis, track map analysis, dispatch\\\n- `src/api\"],[0,\".rs` (\"],[-1,\"298\"],[1,\"526\"],[0,\" lin\"]],\"start1\":13251,\"start2\":13251,\"length1\":59,\"length2\":174},{\"diffs\":[[0,\"nes) — R\"],[1,\"EST API with r\"],[0,\"ecording\"],[1,\" +\"],[0,\" session\"]],\"start1\":13424,\"start2\":13424,\"length1\":24,\"length2\":40},{\"diffs\":[[0,\"session \"],[-1,\"manager\"],[1,\"endpoints\\\n- `src/recording.rs` (501 lines) — RecordingManager with ring buffers, manifest CRUD, flush\"],[0,\"\\\n\\\n**New \"]],\"start1\":13457,\"start2\":13457,\"length1\":23,\"length2\":117},{\"diffs\":[[0,\"xum 0.8,\"],[-1,\" axum-extra 0.10,\"],[0,\" serde 1\"]],\"start1\":13593,\"start2\":13593,\"length1\":33,\"length2\":16},{\"diffs\":[[0,\" README.md with \"],[-1,\"REST\"],[1,\"session\"],[0,\" API docs, recor\"]],\"start1\":13705,\"start2\":13705,\"length1\":36,\"length2\":39},{\"diffs\":[[0,\"cs, \"],[-1,\"recording docs, updated architecture, TUI example at v0.5.0\"],[1,\"analysis response examples, ring buffer architecture\"],[0,\"\\\n\\\n##\"]],\"start1\":13735,\"start2\":13735,\"length1\":67,\"length2\":60},{\"diffs\":[[0,\"026-06-0\"],[-1,\"4\"],[1,\"5\"],[0,\" — v0.5.\"]],\"start1\":15941,\"start2\":15941,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\"er, \"],[-1,\"auto-start sessions*\\\n*Next: add API/recording tests, verify KSUDP streaming\"],[1,\"session analysis, shift points, track mapping*\\\n*Next: add session/analysis/ring-buffer tests, verify\"],[0,\" wit\"]],\"start1\":15986,\"start2\":15986,\"length1\":83,\"length2\":108}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-06-05T08:48:08.393Z
created_time: 2026-06-05T08:48:08.393Z
type_: 13