Six half-second agent steps took 3.26 seconds in a Laravel chain and 0.76 seconds in a Redis batch with six workers.
A cancelled batch still runs jobs already queued, so every job must check batch()->cancelled() or the run keeps spending after a failure.
Sub-agents called in one orchestrator step run one after another in laravel/ai v1.2.0; Concurrency::run cut three 0.5-second agents from 1.57 to 0.69 seconds.