# Acceptance Checklist

This checklist condenses the current P11 firmware/control spec for implementation tracking.

## Input contract

- [ ] Accepts `controller-job.v1` only.
- [ ] Rejects `job.v1` and malformed input.
- [ ] Runs 4-gate intake validation.
- [ ] Rejects wrong `machine_id`.
- [ ] Rejects incompatible `controller_version` or unsupported capability.

## Execution

- [ ] Sequential segment execution exists for future job mode.
- [ ] Force PID tracks setpoint within agreed commissioning tolerance.
- [ ] Force modulation uses live table encoder angle.
- [ ] Table and spindle RPM follow commands.
- [ ] Toolhead spindle direction follows clockwise/counter-clockwise operator/job selection and is logged explicitly.
- [ ] Pause time excluded from segment polishing time.

## Telemetry

- [ ] Core channels logged at >=100 Hz.
- [ ] Single monotonic timestamp source.
- [ ] Commanded and actual values both present.
- [ ] Sensor faults are detectable.
- [ ] CSV parseable by standard tools.

## State machine and safety

- [ ] All accepted states/transitions implemented.
- [ ] Illegal transitions logged.
- [ ] Operator acknowledge cannot be bypassed.
- [ ] E-stop all-stop independent of software state.
- [ ] Interlocks implemented with documented thresholds.
- [ ] Watchdog timeout causes pause, then abort.
- [ ] `FAULTED` exits only through explicit reset.

## Manual mode

- [ ] `MANUAL` reachable from `IDLE`.
- [ ] Live setpoint adjustment works for force, table RPM, spindle RPM, spindle direction, and optional modulation.
- [ ] Geometric gate blocks stale geometry.
- [ ] Setpoint changes are timestamped events.
- [ ] Manual-session log emitted on exit.
- [ ] Safety behavior identical to job mode.

## Data

- [ ] `/data/manual/{session_id}/` and `/data/runs/{run_id}/` layouts respected.
- [ ] `status.json` maintained.
- [ ] Hashes/manifests emitted.
- [ ] Raw telemetry preserved during commissioning.
