ca16cafee4
Tests that exercise the dashboard's gateway-restart path can end up spawning a REAL `python -m hermes_cli.main gateway restart` child when the spawn seam is not intercepted. `_spawn_hermes_action` launches it with start_new_session=True, so it outlives the pytest worker; the child inherits the pytest-tmp HERMES_HOME, which is not a profile and hashes to no service suffix, so `get_service_name()` resolves the DEVELOPER's `hermes-gateway` unit, `systemd_restart` restarts the live gateway, and without systemd the fallback runs `run_gateway()` in-process forever and squats the webhook port. Live repro on this machine (origin/main): an unintercepted spawn of ["gateway", "restart"] from a test restarted the production gateway (MainPID 136820 -> 1689090, NRestarts=1). On 2026-09-03 a sibling refactor moved `_spawn_hermes_action` from the `hermes_cli.web_server` facade to `hermes_cli.web_server_gateway` ~10 minutes before the tests were repointed; runs in that window patched a name production never read and left 39 orphans alive for six days. The live-system guard now rejects any subprocess primitive whose command line the canonical matcher (`gateway.status. _gateway_command_subcommand`) classifies as `gateway run|start|restart`. Argv substrings are never consulted, so `gateway status`, `gateway --help`, `hermes_cli.main serve`, etc. pass through. Three files that deliberately spawn and reap a stub child with a gateway-shaped argv (flock holders, sleep sleepers with an argv tail) opt out with the new `spawns_gateway_lookalike` marker, which lifts only this check and keeps os.kill guarded. Two canary tests pin the block and the pass-through.