# Polisher-Control Roadmap

## Phase 0 — Repository foundation

- [x] Create repository structure.
- [x] Add ecosystem boundary docs.
- [x] Add v1 scope and acceptance checklist.
- [x] Add host/firmware scaffolds.
- [x] Mirror current shared schemas.

## Phase 1 — Contracts first

- [ ] Lock protocol frame format: message IDs, payload layout, CRC, ACK/NACK.
- [ ] Lock telemetry channel list, units, rates, validity encoding.
- [ ] Lock event/alarm code table.
- [ ] Validate `controller-job.v1` and `run-log.v1` fixtures.
- [ ] Implement host-side state machine tests before hardware logic grows.

## Phase 2 — Teensy bench bring-up

- [ ] Teensy boot/status heartbeat.
- [ ] Host↔Teensy serial link with ACK/NACK and CRC.
- [ ] KWR75B-CAN receive path with measured sample rate and stale-frame watchdog.
- [ ] Encoder acquisition for table and arm.
- [ ] AK60 command/telemetry interface selected and documented, including direction mapping for `cw`/`ccw` physical tool rotation.
- [ ] Force actuator command path selected and documented.

## Phase 3 — Manual mode MVP

- [ ] Host UI/manual-mode workflow with geometric gate.
- [ ] Manual setpoints: force, table RPM, spindle RPM, spindle direction (`cw`/`ccw`), optional modulation.
- [ ] Teensy inner loop: setpoint ramping, force PID, telemetry, fast interlocks.
- [ ] Manual-session log and telemetry CSV written to `/data/manual/{session_id}/`.
- [ ] Status file updated at `/data/status.json`.

## Phase 4 — Safety and commissioning

- [ ] E-stop behavior verified independently of software state.
- [ ] Force over-limit, encoder loss, drive fault, F/T invalid/stale faults verified.
- [ ] Host watchdog and firmware heartbeat verified.
- [ ] FAULTED exits only by explicit operator reset.
- [ ] Tool-weight compensation offset commissioned and logged.

## Phase 5 — Controller-job dry run

- [ ] `controller-job.v1` 4-gate intake implemented.
- [ ] Segment lifecycle exercised on bench/simulator.
- [ ] `run-log.v1` emitted with commanded-vs-actual structure.
- [ ] Program execution remains disabled for production until Antoine explicitly accepts readiness.
