4d47891b4a
_spawn_hermes_action copied the dashboard's os.environ verbatim into every detached `hermes ...` action. The dashboard runs inside the gateway and has loaded its own profile's .env into the process environment, so `hermes -p <other> gateway restart` (and every other dashboard-driven profile action) started with the DEFAULT profile's platform credentials and ports already present. load_hermes_dotenv does not override keys that are already set, so the named profile's own .env could not displace them: an A2A-only profile ended up claiming the default Discord bot token and binding the default API server / BlueBubbles ports. For actions carrying a profile selector (`-p X`, `--profile X`, `--profile=X`), build the child env from the standard scrubbed subprocess environment, drop _PROFILE_MANAGED_ENV_KEYS plus every key defined by the dashboard/default profile's .env and its hydrated secret sources, and pin HERMES_HOME to the target profile so the child's normal startup loads that profile's .env. Only the leading selector is inspected: argv after the subcommand may legitimately contain -p for a nested process. Actions without a selector keep the historical environment byte-for-byte. Test: the new case asserts the leaked keys are gone, benign keys survive, and (by running the real dotenv loader in a fresh interpreter with the captured env) that the target profile's values load without reviving any default-profile value. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>