efc2b8e28d
Adopted from the sibling PRs in this cluster, with thanks: - #99807 (@Chevron7Locked) and #101541 (@ivcdigital26): a kickstart that returns 0 is only "restart requested" — success now requires launchd to report a live PID other than the one that was stopped (the gateway's _wait_for_launchd_service_pid, 15 s), and a job that never comes back is reported with the manual `launchctl kickstart -k` command instead of a tick. - #89793 (@mettamyron) and #101541: a plist may wrap the backend in `/bin/sh -c …` without exec, so launchd's live PID is the shell and the stale backend is its child — ownership now follows the parent chain (bounded, cycle-safe). - #89793: `hermes dashboard --stop` on a launchd-owned backend now says a KeepAlive job restarts itself and gives the `launchctl bootout` command, instead of the misleading "restart it yourself" hint. The job scan runs for --stop too, on macOS only.