--- name: pool description: "Run N tasks under a concurrency cap K via a sliding-window worker pool. Use when many subagent invocations would otherwise hit provider rate limits." --- # Pool Pattern Many tasks (say 20) to run via subagents, but provider RPM/TPM (or memory) caps how many can run at once (say 6). Maintain a sliding window of K active subagents. ## Usage ``` tasks = [task_1, task_2, ..., task_N] K = 6 # concurrency cap active = {} # sid -> task_id done = {} # task_id -> final result text while tasks or active: # Fill the pool up to K while tasks and len(active) < K: t = tasks.pop(0) r = call_subagent(agent_name="worker", request=t.prompt, mode="async") active[r.session_id] = t.id # Short-poll for any one to finish, then drain for sid in list(active.keys()): r = wait_for_subagent(sid, timeout=1.0) if r.success and r.state in ("sleeping", "unloaded"): done[active[sid]] = read_inbox_for(sid) del active[sid] break # restart fill loop ``` Key points: - **No first-completed multi-wait primitive yet.** `wait_for_subagent` with a small timeout polls; loop until one finishes. - **K depends on the provider.** Hosted Anthropic / OpenAI vs local LiteLLM proxy → very different limits. Start with 4-6. - **Order of completion is unpredictable.** Don't assume done-order matches submission order. - **Failed tasks free their slot like any other completion.** Retry failed ones in a separate pass, or feed them into the multi-model pattern. ## Common Use Cases - Batch evaluation: N CTF / SWE-bench tasks on one orchestrator - Bulk code review on many files - Fan-out exploration when each branch is independent ## Requires Sandbox None — pure orchestration.