199c66f70f
Under gateway.multiplex_profiles a served secondary profile's adapter is built and connected inside _profile_runtime_scope while os.environ still holds the DEFAULT profile's .env. Credentials and allowlists were already read through the profile scope (get_scoped_secret / _platform_gate_env), but the non-credential SETTINGS the adapters read with bare os.getenv were not, so a served profile silently ran with the default profile's values: webhook listener host/port/URL (SMS, Teams, LINE, Feishu, BlueBubbles), Signal's connect URL/account gate, mention gating and reactions (Slack, Matrix, Signal, Feishu, BlueBubbles, Discord), Matrix thread/session/E2EE policy and message-length limits, Discord backfill/command-sync/attachment caps, Buzz reply mode and env enablement seed, A2A agent name/port/description/toolsets, and the api_server model alias. Every such read now goes through the existing scoped reader (get_scoped_secret, or the adapter's own scope-aware helper): under a secondary's scope the profile's own .env is authoritative and a miss yields the default -- never another profile's value; the default profile and single-profile gateways keep reading os.environ exactly as before. Buzz and A2A previously short-circuited to "extra only / built-in default" under a scope, which also dropped the profile's OWN .env; they now read the scope so a served profile matches its standalone gateway. The parity harness (temp HERMES_HOME, default + 2 secondaries with distinct values for every env var each adapter reads, real load_gateway_config + adapter factory in both topologies) went from 70 raw process-env bypass sites across 14 adapters to only the HERMES_<PLATFORM>_* perf knobs and the api_server listener vars, which are process- global by design (agent.secret_scope._GLOBAL_ENV_*).