S4.4 — Motion validator trait and discrete validator

Intent

Motion validation is today four private check_motion copies with a hidden ×0.1 oversampling factor (each step is longest_valid_segment_length × 0.1). Replace them with a public, pluggable MotionValidator and a default DiscreteMotionValidator, modelled on OMPL. Planners build the default internally in this story; how users attach their own validator is S4.5. Supersedes the rest of S2.2 (cancelled).

Decisions (ADR-0003)

Acceptance criteria

Tasks

Risks

Source

Agreed in the senior-engineer grilling 2026-10-08 (decisions: repo docs/planning/adr/0003-motion-validation.md; glossary: CONTEXT.md). Regeneration spec: oxmpl - sprint-004. Line references are as of origin/main c558556 (2026-10-08), before E3. E3 renames things (rand Rng→RngExt, PyO3 with_gil→attach, edition 2024), so re-grep before trusting a line number.