v0.7.0
Everything since 0.3.2, the last release. Four tags landed in between without notes, so this collects them. Pre-1.0, so breaking changes bump the minor.
Breaking changes
RobotErrorcomes from waldoctl rather than being defined here. A frontend represents a refusal the same way whichever backend raised it. It is an exception now, not a frozen dataclass, so a client can raise it as-is; anything that built one positionally or calleddataclasses.replaceon it needs updating. Tool-error attribution rebuilds the error from its wire form for exactly that reason.stop,estopandresetreplacehaltandresume, and a stop cancels the whole motion pipeline rather than just the active command.home(calibrate=)replaces the separate CALIBRATE command. Unhomed, or withcalibrate=True, the arm runs the full end-stop referencing sequence; already homed, it takes a planned collision-checked move back to standby.- Planned motion is refused while unhomed. Jogging stays available.
- The waldoctl pin moves v0.7.0 → v0.12.0, which removes the
Planekeep-out shape. Persisted worlds containing a plane now raise on load.
Status surface
- The control loop broadcasts its own health. The p99 period and the deadline-miss count ride every STATUS frame in a
loop_healthmapping, so a display no longer polls the loop-statistics query for them.drive_healthsits beside it and stays empty on this backend: the drives report per-joint error flags, not analog registers, and empty distinguishes "no such sensor" from "all zero". StatusBuffer, homing progress and loop statistics conform to waldoctl, and homing progress now survives a cancel.- A hardware e-stop disables the controller, rather than only halting motion.
Motion
- Trajectory settling is gated on progress, not elapsed ticks.
- Fast-path home: an already-referenced arm takes a planned return move instead of re-running the firmware seek.
- Command indices stay monotonic across a reset.
- The dry-run snapshot carries the pending blend chain, so a preview mid-blend matches what the runtime will execute.
Fixes and hygiene
- A system command's
Command_outwas clobbered in the same tick by the executor fallback. - The MSG gripper is seated on the flange rather than inside the wrist, and its built-in camera mount is declared.
- Test fixes surfaced by loaded runners: the unreachable-client test takes a free port instead of adding to the live one, which overflowed past 65535; the loop-health comparison waits for a frame that has caught up instead of demanding two samples of a climbing counter be equal.
- Typing: scipy stubs pinned per Python version, stale suppressions dropped, sync tool wrappers typed as
SyncTool.