60b6269142
The gateway now creates a local control socket at startup (Unix domain socket at $HERMES_HOME/gateway.sock with a pointer-file fallback for long paths; named pipe on Windows) and answers versioned JSON verbs: - identify: pid, profile, hermes_home, code_sha/code_version (#91283 stamps, now queryable live), self-declared supervisor kind, start_time - status: the live runtime-status payload, answered by the process itself Bound immediately after the PID-file O_EXCL claim (the moment the process becomes the authoritative gateway for its HERMES_HOME), removed on clean shutdown; a successor clears any stale socket on bind. Strictly non-fatal: bind failure only means consumers use the old path. Consumers migrated (observability only, scan layer demoted to fallback, never deleted): - collect_fleet_versions() (post-update fleet matrix): prefers a live identify answer over gateway_state.json; entries carry source=socket - collect_runtime_inventory() (hermes update --plan): prefers the socket, and takes the gateway's own supervisor declaration instead of inferring it from PID scans Old gateways mid-upgrade, crashed processes, and bind failures behave exactly as before. Never a TCP port; filesystem/pipe ACLs are the auth boundary (0600 socket). Part of #91277 (fleet-update reliability). Design: #92091.