XQ#NEWPAR dispatches asynchronously on controller thread 0 and returns as soon as it starts, not once it finishes; the dispatch time varies with controller load. drive_axis_to_limit/find_reference followed it with a fixed sleep before starting XQ#FES/XQ#FRM (also thread 0), which has already needed bumping twice (0.1->0.3, 0.3->0.2) and still raced on lgalil: sending XQ#FES while thread 0 was still busy got a '?' reply (Galil error 19, thread already running). Replace the fixed sleep with _wait_for_thread_idle(0), reusing the existing is_thread_active() primitive (already used the same way in hard_abort_and_restore_positioning_mode) to poll until thread 0 is actually free before dispatching the next routine. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>