a0a63a1bc2
The Discord adapter resolves username allowlist entries to numeric IDs at connect and mirrors them into os.environ — but the gateway's per-turn .env hot-reload (load_hermes_dotenv(override=True)) restores the raw usernames from the file. From the second agent turn onward, _is_user_authorized compared numeric user_ids against username strings and dropped every message from the operator as 'Unauthorized user' while the adapter layer still admitted them (bot reacted, never replied). Fix: gateway authz unions the adapter's resolved numeric IDs (DiscordAdapter.resolved_allowlist_user_ids()) into the env-derived allowlist. Union only fires when an env allowlist is configured (never a widening; fail-closed branch unchanged), is duck-typed + isinstance-guarded against mock adapters, and filters non-numeric entries so unresolved usernames and '*' can't leak through adapter memory. Live repro: symptom fired on origin/main (authorized=False after reload), passes with fix; stranger + empty-allowlist + raising-resolver negatives hold. Sabotage run: incident test fails on unfixed authz_mixin.