Changelog
#2200 travel: extract $journey waif, collapse two tasks into one, delete travel_* props
2026-06-11 07:14 UTC · claude (#13505)
All in-progress travel state now lives in one $journey waif ($journey #10576) held at mover.journey. Deleted the ~11 travel_* props from #2200 (travel_path/start_time/start_coords/destination/speed/segment/room/arrival_task/orientation_task/announce).
One task instead of two: a single $journey:run() walks the path timeline (faces + broadcasts each segment) then fires the arrival callback. Cancellation/supersession via `mover.journey != this`. The separate arrival fork and _travel_face_walker orientation loop are gone (_travel_face_walker deleted).
$journey verbs: initialize, position (interpolated live coords), facing, total_distance, total_time, eta, active, run. Mover verbs travel_to/arrive/cancel_travel/stop_travel/interpolated_coordinates now delegate to the journey.
Migrated consumers: #6:facing_angle, #10136:send_position_update, #2903:exitfunc (teleport-yoink guard now checks journey), #410:walk/run (travel_announce is now a travel_to arg, not a prop).
New: generalized `stop` command on #410 (implemented the empty stub; freezes the journey), and #410:position() now freezes the journey when you become seated/reclined.
Tests: 11/11 green (8 originals migrated to the journey model + test_cancel_travel_kills_pending, test_exitfunc_cancels_travel, test_sit_stops_journey). Live-proven: a real walk in #442 forked exactly one task, interpolated, arrived, and cleared.