__init__, no None guards, no _cancelled flags, no result tuples, no cancel() methods. Everything the skill consumes is one annotation, and cancellation is the framework’s job.
ScanAndWave
Rotate to find a person, then wave.mobility.rotate() and the arm motions are all blocking, so they double as cancel points — a Stop raises out of whichever one is running and the framework brakes the base, halts the arm, and reports CANCELLED.
PickupRoutine
Position the robot and the arm for a pickup.send_cmd_vel + self.sleep pair is deliberate: the command carries a deadman duration, so the base halts on its own if the skill dies, and the sleep is what makes the wait interruptible.
PatrolAndMonitor
Rotate between headings, sweeping the head and capturing frames at each one.FetchFromRoom
Drive somewhere, run a trained policy, and come back — a routine assembled entirely from sub-skills.pose is the map-frame position, which is the right frame to remember and drive back to. Use odom for relative moves instead — see Robot state.

