1eb771e2ff
drainRelayOutboxes drained one gateway's outbox and delivered its envelopes before draining the next gateway, and delivered every envelope one after another. One long turn — bot_relay.deliver may take up to RELAY_DELIVER_TIMEOUT_MS, 25 minutes — therefore held every other bot's mail: a sibling gateway's envelope sat unclaimed in its outbox, and since the gateway checks the envelope's age against bot_mode.envelope_ttl_seconds (15 minutes) at the claim, the sender's waiter received queued_expired for a message nothing was wrong with; envelopes that did get claimed still waited their turn behind unrelated deliveries, against a finite waiter. Claim every gateway's outbox first, then deliver in lanes keyed by target connection and profile: a lane runs its envelopes in order, one turn at a time (the target gateway serialises that profile's turns behind its turn lock anyway), and lanes run concurrently.