--- name: parallel-agents description: Dispatch multiple agents to work on independent problems concurrently. Use when facing 3+ independent failures or tasks. --- # Dispatching Parallel Agents Assign separate agents to independent problem domains simultaneously for faster resolution. ## When to Use - 3+ test failures across different files/subsystems - Multiple independent tasks that don't share state - Investigations that won't interfere with each other - Failures from unrelated root causes ## When NOT to Use - Failures are interconnected - Tasks share state or create conflicts - Agents would modify the same files - You lack context to properly scope tasks ## Implementation Steps ### 1. Group by Domain Organize failures/tasks into independent categories: ```markdown Group A: Authentication tests (3 failures) Group B: API endpoint tests (2 failures) Group C: UI component tests (4 failures) ``` ### 2. Define Focused Tasks Each agent receives: | Field | Description | | ----------- | -------------------------------- | | Scope | Specific files/tests to focus on | | Goal | Clear success criteria | | Constraints | What NOT to change | | Output | Expected deliverable | ### 3. Dispatch Concurrently **IMPORTANT**: Launch all tasks in a **single message** (no `run_in_background`). Multiple Task calls in the same message automatically run in parallel, and Claude waits for all to complete. ``` # All three tasks run in parallel automatically when in the same message Task(test-engineer, prompt="Fix auth test failures in src/auth/*.test.ts") Task(test-engineer, prompt="Fix API test failures in src/api/*.test.ts") Task(frontend-developer, prompt="Fix UI test failures in src/components/*.test.tsx") # Claude waits for all to complete, then continues ``` **Avoid `run_in_background: true`** unless you need to do other work while waiting. Task IDs must be captured and used within the same response. ### 4. Integrate Results 1. Review all agent outputs (available after parallel completion) 2. Verify no conflicts between changes 3. Run full test suite 4. Merge changes ## Effective Agent Prompts **Good prompt:** ``` Fix the 3 failing tests in src/auth/login.test.ts: - "should reject invalid email format" - "should require password min length" - "should handle network errors" Error messages attached. Identify root causes - don't just increase timeouts. Constraints: Don't modify src/api/* files. Output: Summary of fixes with test results. ``` **Bad prompt:** ``` Fix all the tests ``` ## Prompt Template ```markdown ## Task: [Specific description] **Scope:** [Files/tests to focus on] **Failures:** - [Test name]: [Error message] - [Test name]: [Error message] **Goal:** [What success looks like] **Constraints:** - Don't modify [files] - Preserve [behavior] **Output:** - Summary of root causes found - Changes made - Verification results ``` ## Common Pitfalls | Mistake | Problem | Solution | | --------------- | ------------------------- | ---------------------- | | Vague scope | Agent changes wrong files | Specify exact paths | | Missing context | Agent can't diagnose | Include error messages | | No constraints | Conflicting changes | Define boundaries | | Unclear output | Can't verify success | Specify deliverables | ## Benefits - Reduces investigation time through parallelization - Each agent maintains narrow focus - Minimizes cross-agent interference - Solves multiple problems concurrently ## Background Execution For long-running tasks where you need to continue working, use `run_in_background: true`. ### Pattern: Background + Foreground ``` # Long-running audit in background audit_task = Task(security-auditor, prompt="Full security audit", run_in_background: true) # Continue with implementation work Task(frontend-developer, prompt="Build login form") # Later, get audit results TaskOutput(audit_task.id, block: true) ``` ### Pattern: Multiple Background Tasks ``` # Launch multiple background tasks task1 = Task(test-engineer, prompt="...", run_in_background: true) task2 = Task(code-reviewer, prompt="...", run_in_background: true) # Do other work... # Collect all results result1 = TaskOutput(task1.id, block: true) result2 = TaskOutput(task2.id, block: true) ``` ### When to Use Background vs Foreground | Scenario | Mode | Why | | -------------------------- | ------------------------- | ---------------------------- | | Quick tasks (< 1 min) | Foreground | Simpler, immediate results | | Long audit/analysis | Background | Continue working | | Multiple independent tasks | Foreground (parallel) | Auto-waits for all | | Security + Implementation | Background + Foreground | Overlap work | ### Important Notes - Task IDs are only valid within the same response - Always use `block: true` when retrieving results with TaskOutput - Prefer foreground parallel (single message, multiple Tasks) when possible - Background tasks should be collected before the response ends