# Vehicle Profile Seat Calibration Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Add vehicle-selectable Denza N7 seat calibration so natural-language physical deltas can be deterministically converted to absolute seat `position_pct` before CAN compilation. **Architecture:** Add a small vehicle profile layer under `src/cognitive_agent/application/` that loads YAML profiles from `config/vehicles/`. `SeatDemoService` passes the selected profile into model-plan adaptation and returns available profiles via `/api/runtime`; the frontend stores a selected vehicle id and includes it in `/api/requests`. CAN compilers remain unchanged and continue receiving absolute `position_pct`. **Tech Stack:** Python 3.11 stdlib + PyYAML, existing unittest suite, existing static HTML/JS frontend. --- ### Task 1: Vehicle Profile Loader **Files:** - Create: `config/vehicles/denza_n7.yaml` - Create: `src/cognitive_agent/application/vehicle_profile.py` - Test: `tests/unit/test_vehicle_profile.py` - [ ] **Step 1: Write failing tests** Create `tests/unit/test_vehicle_profile.py` with tests that load the Denza N7 profile, expose all four motors, convert relative physical deltas into target percentages, and expose angle ranges for frontend display. - [ ] **Step 2: Run tests and verify RED** Run: `PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=src:domains/seat/src .omx/python311-venv/bin/python -m unittest tests.unit.test_vehicle_profile -v` Expected: fails because `cognitive_agent.application.vehicle_profile` does not exist. - [ ] **Step 3: Implement loader** Create the Denza N7 YAML profile with `longitudinal`, `cushion_tilt`, `backrest_recline`, and `legrest_height` motors. Implement `VehicleProfileRegistry`, `VehicleProfile`, and `SeatMotorProfile` with methods to compute clamped absolute targets from relative deltas. - [ ] **Step 4: Run tests and verify GREEN** Run the same unittest command and expect PASS. ### Task 2: Apply Vehicle Profile During Intent Adaptation **Files:** - Modify: `src/cognitive_agent/application/model_plan_adapter.py` - Test: `tests/unit/test_vehicle_profile.py` - [ ] **Step 1: Write failing tests** Add tests showing a request with `distance_mm=50` and `operation=increase` for `seat.set_longitudinal_position` converts from current 50% to 73% using Denza N7's 215mm range. Add a test showing `angle_delta_deg=10` for `seat.set_backrest_recline` converts from 20% to 38% using the 55 degree range and preserves `motion_intent`. - [ ] **Step 2: Run tests and verify RED** Run the vehicle profile unittest and expect failure because `ModelPlanAdapter.adapt()` does not accept a vehicle profile and rejects unknown `distance_mm` / `angle_delta_deg` parameters. - [ ] **Step 3: Implement adaptation** Allow vehicle-profile-backed physical delta parameters for seat motion requests. Translate them to absolute `position_pct`, preserve relative motion metadata, and keep the compiler-facing `FunctionConfig` unchanged. - [ ] **Step 4: Run tests and verify GREEN** Run the vehicle profile unittest and expect PASS. ### Task 3: Thread Vehicle Selection Through API and Runtime **Files:** - Modify: `src/cognitive_agent/application/seat_service.py` - Modify: `src/cognitive_agent/server.py` - Test: `tests/e2e/test_seat_web_api.py` - [ ] **Step 1: Write failing tests** Add e2e coverage that `/api/runtime` includes `vehicles` and `default_vehicle_id`, and that a POST containing `vehicle_id: "denza_n7"` records the selected profile in the result and uses it for conversion. - [ ] **Step 2: Run tests and verify RED** Run: `PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=src:domains/seat/src .omx/python311-venv/bin/python -m unittest tests.e2e.test_seat_web_api -v` Expected: fails because runtime has no vehicles and POST ignores `vehicle_id`. - [ ] **Step 3: Implement API threading** Instantiate `VehicleProfileRegistry` in `SeatDemoService`, return public profiles from `runtime_info()`, accept `vehicle_id` in `process()`, pass the selected profile to `ModelPlanAdapter`, and include `vehicle_id` / `vehicle_name` in the API result. Update `server.py` to read `vehicle_id` from JSON. - [ ] **Step 4: Run tests and verify GREEN** Run the e2e unittest and expect PASS. ### Task 4: Add Frontend Vehicle Selector **Files:** - Modify: `apps/web-console/index.html` - Modify: `apps/web-console/app.js` - Modify: `apps/web-console/styles.css` - Test: `tests/e2e/test_seat_web_api.py` - [ ] **Step 1: Write failing tests** Extend the static HTML/runtime e2e test to assert that the page has a vehicle selector and that runtime-provided vehicles are expected by the frontend. - [ ] **Step 2: Run tests and verify RED** Run the e2e unittest and expect failure because the selector does not exist. - [ ] **Step 3: Implement UI** Add a compact selector in the top bar or command panel, populate it from `/api/runtime.vehicles`, keep `denza_n7` selected by default, store the selected id in `state.vehicleId`, and include `vehicle_id` in POST `/api/requests`. - [ ] **Step 4: Run tests and verify GREEN** Run the e2e unittest and expect PASS. ### Task 5: Verification **Files:** - No new production files beyond Tasks 1-4. - [ ] **Step 1: Run targeted tests** Run: `PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=src:domains/seat/src .omx/python311-venv/bin/python -m unittest tests.unit.test_vehicle_profile domains.seat.tests.unit.test_t2g_hardware tests.e2e.test_seat_web_api -v` - [ ] **Step 2: Smoke running service** Use the existing Python 3.11 venv to GET `/api/runtime` and verify Denza N7 appears. POST a local/direct request with `vehicle_id=denza_n7` and confirm a successful dry-run still returns a `CommandPlan`. - [ ] **Step 3: Review diff** Run `git diff --stat` and inspect changed files. Do not revert the pre-existing `README.md` change unless explicitly requested.