52dbe0a7cd
`live_default_gateway_pid()` (hermes_cli/gateway_multiplex_served.py) read only the pid record, so it returned None for a gateway that is alive but has no gateway.pid. Consumers of the helper then reported the gateway as down: - `hermes -p <profile> cron list` printed "Gateway is not running" with "jobs won't fire automatically" while the multiplexer was firing that profile's jobs - `hermes -p <profile> status` dropped its "running (via the default-profile multiplexer)" line - `named_profile_served_by_running_multiplexer()` returned False for a profile the live gateway serves The rest of the liveness surface already handles a missing pid file: the `runtime_pid_probe` seam of `resolve_gateway_liveness()` exists for "launch-service gateways with no live PID file" (hermes_cli/profiles.py, hermes_cli/web_routers/), and `hermes_cli/gateway_migrate._live_gateway_pid()` reads "pid file, then runtime status". This probe was the one call site that never got either. Read the pid record first, then the PID in `gateway_state.json` validated against the process table, matching `_live_gateway_pid()`. A record naming a dead pid still resolves to None, so a stopped gateway keeps reporting stopped and cron keeps warning. Related to #99631.