--- title: Polisher-Control Feature Request Intake status: draft requested_by: Antoine Letarte generated_by: Nick / Hermes project: P11-Polisher-Fullum repo: polisher-control source_truth: false created: 2026-06-02 privacy: technical-only --- # Feature Request Intake — Polisher-Control ## Purpose Use this note when Antoine or Cédric proposes a new feature for `polisher-control`. The goal is to avoid coding a feature into the wrong layer. Some requests belong in the machine controller, some belong in `polisher-post`, and some belong in `polisher-sim`. ## Fast classification Before implementation, classify the request. | Class | Belongs where | Examples | |---|---|---| | Execution feature | `polisher-control` | manual UI behavior, host state machine, Teensy loop, drive/sensor integration, telemetry logging, alarms, `/data/` artifacts | | Contract feature | `polisher-control` + `shared/schemas` + usually `polisher-post` | new telemetry channel, new protocol field, new log field, new machine-capability property | | Planning/intelligence feature | `polisher-sim` / `polisher-post` | choosing pass strategy, metrology interpretation, calibration updates, optimization, dwell planning | | Safety/scope feature | approval-gated | interlock behavior, E-stop response, force limits, fault reset policy, remote operation, powered manipulation modes | Rule: if the feature decides **what polishing should be done**, it is probably not a `polisher-control` feature. If it executes/logs/enforces what was already approved, it probably is. ## Intake template Copy this block into an issue, PR, or `docs/nick-generated/YYYY-MM-DD-feature-name.md` when scoping a feature. ```markdown --- title: Feature Intake — status: draft requested_by: Antoine / Cédric generated_by: Nick / Hermes project: P11-Polisher-Fullum repo: polisher-control source_truth: false created: YYYY-MM-DD privacy: technical-only --- # Feature Intake — ## 1. Requested behavior - What should the operator/system be able to do? - What problem does this solve? - Who requested it? ## 2. Classification - [ ] Execution feature in `polisher-control` - [ ] Contract feature touching schemas/protocol/telemetry/logs - [ ] Planning/intelligence feature that belongs upstream - [ ] Safety/scope feature requiring Antoine approval Rationale: ## 3. Operator-visible behavior - UI controls / screens / prompts: - Normal workflow: - Fault/warning workflow: - What is logged as operator action: ## 4. Affected layers - Host controller: - Teensy firmware: - Host ↔ Teensy protocol: - Telemetry channels: - Run/manual-session logs: - Machine capability profile: - Shared schemas: - Tests: - Docs/checklists: ## 5. Safety implications - Does it affect force, motion, brakes, interlocks, E-stop, watchdog, or reset behavior? - Does it allow motion in a new condition? - Does it change any limit or threshold? - Does it require a new refusal/NACK reason? - Does it need a hardware interlock or physical confirmation? Safety decision: - [ ] No safety behavior change - [ ] Safety behavior change; Antoine approval required before implementation ## 6. Contract implications - New/changed protocol messages: - New/changed telemetry channels: - New/changed log fields: - New/changed machine capability fields: - Backward compatibility / schema version impact: Contract decision: - [ ] No schema/protocol contract change - [ ] Contract change; update schemas/examples/docs/tests together ## 7. Acceptance checks - [ ] Host-side unit test: - [ ] Firmware compile/build check: - [ ] Protocol encode/decode test: - [ ] Schema/example validation: - [ ] State-machine transition test: - [ ] Telemetry channel consistency check: - [ ] Safety refusal/fault test: - [ ] Commissioning checklist update: - [ ] Manual/operator workflow check: ## 8. Open questions - For Antoine: - For Cédric: - For source-spec update: ## 9. Implementation notes - Suggested branch: - Suggested first PR chunk: - Suggested follow-up chunk: ``` ## Approval gates Ask Antoine before implementing when a request changes any of these: - v1 scope boundary; - safety/interlock behavior; - force limits, braking, fault/reset policy; - host ↔ Teensy protocol semantics; - telemetry channel names, units, rates, or meanings; - schema versions or required fields; - boundary between `polisher-control`, `polisher-post`, and `polisher-sim`; - any powered manipulation / Zero-G / remote-control behavior. ## Implementation chunking recommendation For most features, keep PRs small: 1. **Spec/doc PR:** feature intake, acceptance checks, schema/protocol sketch. 2. **Host PR:** state machine / UI workflow / logs / tests. 3. **Firmware PR:** message handling / loop behavior / telemetry / compile check. 4. **Integration PR:** end-to-end dry-run, examples, commissioning checklist. Do not mix a safety contract change with broad unrelated refactors.