From claude-corps
Autonomous dispatch-reconcile loop for batch task processing. Use with /auto-run --through <id> to execute tasks unattended. Requires Linear MCP or tasks to exist. Supports --resume for checkpoint recovery and --skip-milestone-review.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-corps:auto-runThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an autonomous orchestrator. You dispatch workers, handle their completions, reconcile results, and dispatch newly unblocked tasks — repeating until all work is done or limits are reached.
You are an autonomous orchestrator. You dispatch workers, handle their completions, reconcile results, and dispatch newly unblocked tasks — repeating until all work is done or limits are reached.
Workers run in isolated git worktrees via the Agent tool. Each worker gets its own filesystem — no conflicts possible.
Arguments: $ARGUMENTS
Parse the following flags:
--max-batches N — Stop after N dispatch rounds (default: unlimited)--max-hours H — Stop after H hours (default: unlimited)--max-concurrent N — Max parallel workers per batch (default: 3)--sequential — Execute tasks one at a time directly on the current branch (no worktrees, no PRs per task). Use for dependent/sequential tasks. Passes --sequential to /dispatch.--dry-run — Show what would be dispatched without acting--resume — Resume from checkpoint (skip orient)--skip-milestone-review — Skip the milestone review phase after tasks complete--milestone-review-iterations N — Max milestone review iterations (default: 5)--through <task-id> — Complete everything needed to finish this task, then stop--epic <epic-id> — Complete all tasks within this epic, then stop--only <id1> <id2> ... — Only dispatch these specific tasks (and their blockers)Read checkpoint at docs/auto-run-checkpoint.json (resolve from main repo root via git worktree list | head -1 | awk '{print $1}').
If --resume AND checkpoint exists with status "running":
ls docs/session_summaries/<task-id>*.txt 2>/dev/null
/reconcile-summary --yes via Skill toolIf fresh start (no checkpoint or no --resume):
/orient via Skill toolWrite checkpoint JSON to docs/auto-run-checkpoint.json with:
version: 2status: "running"start_time: current ISO8601 timestampconfig: parsed flags (max_batches, max_hours, max_concurrent)scope: resolved scope (see 2.1)batch_number: 0tasks: { completed: [], failed: [], in_progress: [] }stats: { total_dispatched: 0, total_completed: 0, total_failed: 0, total_batches: 0 }Determine which tasks are in-scope for this auto-run:
If --through <task-id>:
Walk the dependency graph backward from <task-id> to find all transitive blockers. Call get_issue(id=<task-id>, includeRelations=true) and recursively resolve each blockedBy entry's own blockers.
Build a set of all task IDs that must complete for <task-id> to be unblocked and completable. Include <task-id> itself. Store as scope.task_ids in checkpoint. Set scope.mode to "through" and scope.target to <task-id>.
If --epic <project-name>:
List all tasks in this project by calling list_issues(project=<project-name>).
Store all issue IDs as scope.task_ids. Set scope.mode to "epic" and scope.target to <project-name>.
If --only <id1> <id2> ...:
Use exactly those task IDs. Also resolve their transitive blockers (tasks that must complete first) and include those in scope. Store as scope.task_ids. Set scope.mode to "only".
If no scope flags:
scope.task_ids = null (all ready tasks are in scope). Set scope.mode to "all".
Log the resolved scope:
Auto-run scope: N tasks [list IDs]. Target: <task-id or epic-id or "all">
list_issues(state=Todo), then for each call get_issue(includeRelations=true) and filter to those with empty blockedBy arraysscope.task_ids (if set; if null, use all)--sequential: Call /dispatch --sequential <specific-task-ids> --no-plan --yes via Skill tool. This dispatches tasks one at a time in foreground (no worktrees). The orchestrator blocks until each task completes./dispatch <specific-task-ids> --count <count> --no-plan --yes via Skill tool, passing only in-scope task IDsin_progress, set batch_number: 1If --sequential: The loop is synchronous. Each /dispatch --sequential call blocks until all tasks in that batch complete. After completion, proceed directly to Step B (Reconcile) → Step B.5 (Pull) → Step D (Dispatch Next). No background notifications needed.
If parallel (default): The loop is driven by background agent completion notifications. When a worker finishes (you are notified of its completion), process the result:
When notified of a worker's completion, extract the task ID from the worker's name or result. Check for session summary:
ls docs/session_summaries/<task-id>*.txt 2>/dev/null
If summary exists:
Call /reconcile-summary <task-id> --yes via Skill tool.
After reconciliation, check if the completed task touched frontend files:
# Check the session summary for frontend file extensions
grep -E '\.(tsx|jsx|vue|svelte|html|css|scss)' docs/session_summaries/<task-id>*.txt 2>/dev/null
If frontend files were modified, note for milestone review:
Frontend changes detected in <task-id> — Playwright browser verification will run during milestone review.
If no summary (worker may have failed):
save_issue(
title="Investigate: <task-id> failed",
team=<team>,
priority=1,
project=<project>,
labels=["Bug"],
description="## Problem\n<what the worker was attempting and how it failed>\n\n## Approach\nInvestigate root cause: check worker logs, git state, and error output.\n\n## Acceptance Criteria\n- [ ] Root cause identified\n- [ ] Fix applied or follow-up task created\n\n## Target Files\n- <files the failed task was working on>"
)
After creation, run post-write validation: get_issue(id=<created-id>) — check for formatting artifacts and rewrite if needed.Update checkpoint: move task from in_progress to completed (or failed).
Circuit breaker: If the same task ID appears in the checkpoint's failed list with attempts >= 2, skip it and log: "Task failed twice — flagged for human attention."
After reconciliation, pull changes so subsequent dispatches see the latest code:
If --sequential: No worktree prune needed (no worktrees created). Workers already committed directly to this branch, so git pull may not be necessary — but run it to sync with any remote changes:
git pull origin $(git branch --show-current) --rebase 2>/dev/null || true
If parallel (default): Prune completed worktrees and pull the worker's merged changes:
git worktree prune
git pull origin $(git branch --show-current)
--max-batches reached → write checkpoint with status: "paused", report "Auto-run paused. N tasks remain.", exit.--max-hours elapsed (compare current time to start_time in checkpoint) → same.scope.task_ids is set in checkpoint)available_slots = max_concurrent - current_in_progress_countIf in-scope ready tasks AND available_slots > 0:
--sequential: Call /dispatch --sequential <specific-task-ids> --no-plan --yes via Skill tool. This blocks until all tasks complete./dispatch <specific-task-ids> --no-plan --yes via Skill tool (pass only in-scope IDs, limited to available_slots)batch_number in checkpointin_progress in checkpointCompletion checks:
--through target task is now closed → all done → go to Section 4 (Completion)--epic and all epic children closed → all done → go to Section 4--sequential mode this does not apply since dispatch blocks)After every 3 reconciliation cycles, assess context health. If you notice degradation (losing track of state, responses feeling truncated, difficulty recalling earlier context):
status: "running" (preserving all current state)--resumeWhen no ready tasks AND no in-progress tasks (all work done):
/reconcile-summary --yes via Skill toolAfter reconciliation, run an iterative review-fix pass on accumulated branch changes:
If --skip-milestone-review was passed: skip, log "Milestone review skipped by flag"
Detect milestone branch:
git branch -r --list 'origin/milestone/*' | sort -V | tail -1
If no milestone branch found: skip, log "No milestone branch found — skipping milestone review"
Update checkpoint: milestone_review.status: "in_progress"
Dispatch a review worker using Agent tool:
isolation: "worktree"mode: "bypassPermissions"/milestone-review --max-iterations <N> --base-branch main (use --milestone-review-iterations value or default 5)Wait for worker completion
Read the worker's report/session summary
Update checkpoint: milestone_review.status: "completed" with stats from the worker's report
Write checkpoint with status: "completed" and final stats
Final report:
═══════════════════════════════════════════
AUTO-RUN COMPLETE
═══════════════════════════════════════════
Duration: <elapsed time>
Batches: <count>
Completed: <count> tasks
Failed: <count> tasks
MILESTONE REVIEW:
- Status: <completed|skipped|N/A>
- Iterations: <count>
- Findings fixed: <count>
- Findings deferred: <count> (needs human decision)
COMPLETED:
- <task-id>: <title>
- ...
FAILED:
- <task-id>: <title> — <reason>
- ...
REMAINING (if any):
- <task-id>: <title>
- ...
═══════════════════════════════════════════
list_issues to show final board state.File: docs/auto-run-checkpoint.json
{
"version": 2,
"status": "running|completed|paused|errored",
"start_time": "ISO8601",
"last_updated": "ISO8601",
"config": {
"max_batches": null,
"max_hours": null,
"max_concurrent": 3,
"execution_mode": "parallel|sequential"
},
"scope": {
"mode": "all|through|epic|only",
"target": "INT-14",
"task_ids": ["INT-12", "INT-13", "INT-14"]
},
"batch_number": 2,
"session_count": 1,
"tasks": {
"completed": [{ "id": "INT-12", "title": "...", "completed_at": "...", "batch": 1 }],
"failed": [{ "id": "INT-14", "title": "...", "reason": "...", "attempts": 1 }],
"in_progress": [{ "id": "INT-13", "title": "...", "dispatched_at": "...", "batch": 2 }]
},
"stats": {
"total_dispatched": 4,
"total_completed": 1,
"total_failed": 0,
"total_batches": 2
},
"milestone_review": {
"status": "pending|in_progress|completed|skipped",
"iterations": 0,
"findings_fixed": 0,
"findings_deferred": 0
}
}
npx claudepluginhub josephneumann/claude-corps --plugin claude-corpsIdentifies independent tasks on the task board and spawns parallel agent workers to execute them concurrently. Used after cw-plan to maximize throughput.
Executes Plans.md tasks end-to-end in solo, parallel, or full team modes with auto-mode selection based on task count.
Automates completion of all pending tasks or a specific task_id using agent-foreman CLI workflow (next-implement-check-done) in unattended batch mode.