From arcforge
Runs autonomous unattended loops for cross-session execution of DAG tasks without human intervention. Each iteration spawns a fresh Claude session with file-based state persistence.
How this skill is triggered — by the user, by Claude, or both
Slash command
/arcforge:arc-loopingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Run arcforge workflows overnight without human intervention. Each iteration spawns a fresh Claude session. DAG + git persist state across sessions.
Run arcforge workflows overnight without human intervention. Each iteration spawns a fresh Claude session. DAG + git persist state across sessions.
Core principle: Fresh session per task + file-based state = reliable cross-session execution with full auditability.
digraph when_to_use {
"Have a DAG with tasks?" [shape=diamond];
"Tasks can run unattended?" [shape=diamond];
"Need human judgment per task?" [shape=diamond];
"arc-looping" [shape=box];
"arc-agent-driven" [shape=box];
"arc-executing-tasks" [shape=box];
"Create DAG first (arc-planning)" [shape=box];
"Have a DAG with tasks?" -> "Tasks can run unattended?" [label="yes"];
"Have a DAG with tasks?" -> "Create DAG first (arc-planning)" [label="no"];
"Tasks can run unattended?" -> "Need human judgment per task?" [label="yes"];
"Tasks can run unattended?" -> "arc-executing-tasks" [label="no - need human"];
"Need human judgment per task?" -> "arc-agent-driven" [label="yes - within session"];
"Need human judgment per task?" -> "arc-looping" [label="no - fully autonomous"];
}
vs. arc-agent-driven:
node "${ARCFORGE_ROOT}/scripts/cli.js" loop --pattern sequential --max-runs 20
node "${ARCFORGE_ROOT}/scripts/cli.js" loop --pattern dag --max-runs 20
parallelTasks() to find independent epicsarc-planning first to create specs/<spec-id>/dag.yaml. In multi-spec repos, pass --spec-id <id> to the loop; cross-spec loops are not supported.npm test to confirm clean state--max-runs and --max-cost to bound executionRun loops from the project root, not from inside a worktree.
If you are in a worktree (.arcforge-epic exists), the loop auto-detects both the epic and the spec from the marker (spec_id field) and scopes to that spec's dag.yaml. But running from project root with --pattern dag is the correct approach for multi-epic execution — it handles parallelism internally via parallelTasks().
Never run separate loops in separate worktrees. Each worktree's marker points back to its base spec's dag.yaml, so multiple loops against the same spec will pick up the same tasks and do duplicate work.
For scoped single-epic execution, use --epic:
node "${ARCFORGE_ROOT}/scripts/cli.js" loop --epic epic-001 --pattern sequential --max-runs 20
Each iteration:
1. Read specs/<spec-id>/dag.yaml → find next task (via coordinator)
2. Build prompt with task context
3. Spawn: claude -p < prompt
4. On success: coordinator.completeTask(taskId)
5. On failure: log error, retry once, then block task
6. Repeat until: all done, max-runs hit, or stop condition
| Condition | What Happens |
|---|---|
| All tasks complete | Loop ends with status "complete" |
| Max runs reached | Loop ends with status "max_runs" |
| Cost limit hit | Loop ends with status "cost_limit" |
| Stall detected | No progress in 2+ iterations → stops |
| Retry storm | Same error 3+ times → stops |
| Sequential failure | Task fails after retry → stops (sequential only) |
Spawn the loop-operator agent to check a running loop:
Use the loop-operator agent to check loop health
It reads .arcforge-loop.json and reports:
.arcforge-loop.json tracks loop state across iterations:
{
"iteration": 12,
"pattern": "sequential",
"started_at": "2026-03-17T22:00:00Z",
"max_runs": 20,
"max_cost": 10,
"run_id": "a1b2c3d4-...",
"completed_tasks": ["feat-001-01", "feat-001-02"],
"failed_tasks": ["feat-002-03"],
"errors": [{"task_id": "...", "error": "...", "timestamp": "...", "run_id": "..."}],
"total_cost": 0,
"last_progress_at": "2026-03-17T23:15:00Z",
"status": "running"
}
pattern, max_runs, max_cost, and a fresh run_id are stamped at the
start of each run. Stall and retry-storm detection count only the current
run's errors, so resuming a loop is not penalized by a previous run's
failures. --reset archives the prior state to
.arcforge-loop.archive/<started_at>.json and starts fresh.
# Sequential — safest
node "${ARCFORGE_ROOT}/scripts/cli.js" loop --pattern sequential --max-runs 20
# DAG — parallel-aware
node "${ARCFORGE_ROOT}/scripts/cli.js" loop --pattern dag --max-runs 50
# With cost limit
node "${ARCFORGE_ROOT}/scripts/cli.js" loop --max-cost 10 --max-runs 100
# Scoped to one epic (safe for parallel execution)
node "${ARCFORGE_ROOT}/scripts/cli.js" loop --epic epic-001 --pattern sequential --max-runs 20
Never:
--max-runs on unfamiliar projectsIf loop is failing:
.arcforge-loop.json errors — are they the same error repeating?specs/<spec-id>/dag.yaml — are blocked tasks preventing progress?npm test — is the project in a broken state?Required before:
Works with:
After loop completes (in order):
.arcforge-epic) — wrap up and decide merge/PRnpx claudepluginhub gregoryho/arcforge --plugin arcforgeGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.