python-asyncio-gather-for-concurrent-task-dispatch

The mc-dispatcher daemon originally dispatched tasks sequentially (one task per polling cycle), meaning only one task could start per 30-second window. Replacing sequential dispatch with asyncio.gather(*[dispatch(task) for task in ready_tasks]) allows all ready tasks to be dispatched concurrently within a single polling cycle. This is essential when multiple agents have queued tasks and avoids artificial serialization bottlenecks.