--- title: "Parallel orchestration" description: "Run multiple milestones simultaneously in isolated git worktrees." --- Run multiple milestones simultaneously. Each gets its own worker process, branch, and context window — while a coordinator tracks progress, enforces budgets, and keeps everything in sync. Parallel mode is behind `parallel.enabled: false` by default. Opt-in only. ## Quick start 1. Enable in preferences: ```yaml parallel: enabled: true max_workers: 2 ``` 2. Start parallel execution: ``` /sf parallel start ``` 3. Monitor progress: ``` /sf parallel status ``` ## Architecture ``` ┌─────────────────────────────────────────────────────┐ │ Coordinator (your SF session) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Worker 1 │ │ Worker 2 │ │ Worker 3 │ ... │ │ │ M001 │ │ M003 │ │ M005 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ .sf/worktrees/ .sf/worktrees/ .sf/worktrees/ │ └─────────────────────────────────────────────────────┘ ``` ### Worker isolation | Resource | Isolation method | |----------|-----------------| | Filesystem | Git worktree — separate checkout | | Git branch | `milestone/` per milestone | | State | `SF_MILESTONE_LOCK` — each worker sees only its milestone | | Context | Separate process with its own agent sessions | | Metrics | Each worktree has its own `metrics.json` | ## Eligibility analysis Before starting, SF checks which milestones can run concurrently: 1. **Not complete** — finished milestones are skipped 2. **Dependencies satisfied** — all `dependsOn` entries must be complete 3. **File overlap check** — shared files get a warning (not a blocker) ## Configuration ```yaml parallel: enabled: false max_workers: 2 budget_ceiling: 50.00 merge_strategy: "per-milestone" # or "per-slice" auto_merge: "confirm" # "auto", "confirm", or "manual" ``` | Key | Default | Description | |-----|---------|-------------| | `enabled` | `false` | Master toggle | | `max_workers` | `2` | Concurrent workers (1-4) | | `budget_ceiling` | none | Aggregate cost limit across all workers | | `merge_strategy` | `"per-milestone"` | When to merge back to main | | `auto_merge` | `"confirm"` | How merge-back is handled | ## Commands | Command | Description | |---------|-------------| | `/sf parallel start` | Analyze, confirm, and start workers | | `/sf parallel status` | Show workers with state, progress, cost | | `/sf parallel stop [MID]` | Stop all or a specific worker | | `/sf parallel pause [MID]` | Pause all or a specific worker | | `/sf parallel resume [MID]` | Resume paused workers | | `/sf parallel merge [MID]` | Merge completed milestones to main | ## Merge reconciliation - `.sf/` state files — auto-resolved (accept milestone branch version) - Code conflicts — merge halts, shows conflicting files. Resolve manually and retry. ## Budget management When `budget_ceiling` is set, aggregate cost is tracked across all workers. Ceiling reached → coordinator signals workers to stop. ## Troubleshooting ### "No milestones are eligible" All milestones are complete or blocked by dependencies. Check `/sf queue`. ### Worker crashed Workers persist state to disk. On restart, the coordinator detects dead PIDs. Run `/sf doctor --fix` to clean up, then `/sf parallel start` to spawn new workers. ### Merge conflicts ``` /sf parallel merge # see which milestones conflict # resolve in .sf/worktrees// /sf parallel merge MID # retry ```