734d3f2eb0
Two latent bugs in `service/gateway/io.rs::spawn_gateway_bot`, exposed today after a long-overdue gateway rebuild: 1. The permission channel sender was bound as `_perm_tx` (the underscore prefix signalling "unused") and dropped at function return. The matrix bot's permission_listener task — which holds `perm_rx` for its lifetime per story 884 — then saw the channel close immediately and exited with "perm_rx channel closed" 1s after starting. Net effect: the listener was effectively absent on every gateway boot, so non-MCP tool permission requests had no destination at all (separate from the architectural mismatch that 898 will fix; this was a strictly worse "listener never even ran" version of the same problem). Bind as `perm_tx` and `mem::forget` it to keep the channel open for the gateway's lifetime, mirroring the existing `shutdown_tx` pattern two lines below. 2. `bot_name` was hardcoded to `"Assistant"`, ignoring `bot.toml::display_name`. So the gateway's matrix bot announced itself as "Assistant" and treated user messages addressed to "Timmy" (the actual configured display_name) as unaddressed, silently dropping them. `ambient_rooms` and `permission_timeout_secs` were similarly ignored. Load `BotConfig::load(config_dir)` and apply the same field plumbing the standard-mode initialisation in `main.rs:211-232` already uses. Symptoms seen in production today: - gateway.log: `Sending startup announcement: Assistant is online.` followed by repeated `Ignoring unaddressed message from @yossarian:crashlabs.io` lines. - gateway.log: `permission listener started` immediately followed (same timestamp) by `permission listener exiting (perm_rx channel closed)`. After this lands, rebuild the gateway binary and restart so it picks up `bot.toml` correctly and the listener stays alive for the bot's lifetime. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>