fb7a38ad21
Reworks @valenteff's #53277 fix per review (Teknium's 3 findings): - Route refresh_launchd_plist_if_needed's bootstrap through the existing _launchctl_bootstrap() EIO-recovery helper (canonical since #56256), wrapped in a wall-clock retry loop, instead of an ad-hoc 5x2s loop. - Window sized to agent.restart_drain_timeout (default 180s), not a fixed ~10s: the failure happens while the old gateway is still draining (finding 1). - Retry on subprocess.TimeoutExpired too, not just CalledProcessError — a bootstrap timeout after bootout otherwise escapes and leaves the service unloaded (finding 2). - Confirm success with launchctl list, not a bare bootstrap exit 0 (finding 3); mirror verify+drain-window in the detached-helper bash path. - Shared helpers _launchd_reload_log_path / _append_launchd_reload_log / _launchctl_label_registered / _retry_launchctl_bootstrap_until_registered. 3 new tests cover retry-until-listed, TimeoutExpired-retried, deadline-exhaust. E2E: real reload log + mocked launchctl — retries CalledProcessError+TimeoutExpired, verifies via launchctl list, logs failures.