subagent-worktree-parallel · git:20260702.d38e935 · 2026-07-02 · sha256 3c2e0048ef1ec7ee

subagent-worktree-parallel git:20260702.d38e935A

Immutable. This exact content is served forever at /api/v1/blob/3c2e0048ef1ec7ee.

---
name: subagent-worktree-parallel
description: Orchestrates parallel development by fanning out independent feature slices to subagents in isolated git worktrees, then merging them serially under an orchestrating agent — covers dependency decomposition, wave sizing, dispatch prompts, merge-conflict hazards, and the integration-test gate. Use when planning to parallelize implementation across multiple subagents/worktrees, split a task for concurrent agents, fan out feature slices, or merge several feature branches back together; or invoked as /subagent-worktree-parallel.
---

# Subagent + Worktree Parallel Development

**Parallelize the *doing*; serialize the *merging*.** Worktree isolation removes
write conflicts *during implementation* but only *defers* integration conflicts to
shared "hotspot" files. Whether the model pays off depends almost entirely on how
much your slices touch shared code — so fan out independent work, but treat merging
as an ordered, serial, verified step.

See **[REFERENCE.md](REFERENCE.md)** for the full recipes (dispatch prompt template,
merge configurations, the silent-merge-hazard catalog, the pre-launch checklist, and
the cost/benefit table).

## When to use

- **Fan out** across genuinely independent modules/subsystems whose code is disjoint.
- **Serialize instead** when slices are tightly coupled — two slices that both extend
  the same component, or both append to the same shared file, will collide at merge.
  Coupled work is sequenced, not parallelized.

## Core principles (non-negotiable)

- **Group-external parallel, group-internal serial.** Only independent modules run in
  parallel. Within one module, land the foundational "tracer" first and merge it, then
  fan out its round-outs — parallel siblings duplicate-scaffold and collide.
- **Small batches (≤ ~5), merge before the next wave.** Each rebase then lands on a
  stable base; large waves create a merge *treadmill* (every merge re-conflicts the
  rest) and raise the odds a subagent is truncated at a run limit.
- **The integration-tier test is the Definition of Done.** A fast tier that stubs the
  integration boundary passes even on a broken merge. DoD must run the tier that really
  exercises the boundary (integration / e2e / compile or a parse `--check-only`).
- **The orchestrator independently re-verifies before merging.** Subagent implements and
  **commits** (its own branch, in its worktree); the lead re-runs tests and spot-checks the
  diff. "Done but no artifact" = needs takeover.
- **PR creation and its body are the orchestrator's, not the subagent's.** A PR is a
  *merging* artifact, not a *doing* one: the subagent commits **and pushes** its branch but
  does **not** open the PR — the lead opens every PR and owns its body, base, labels, and the
  close-vs-reference keyword. That applies PR conventions in one place and lets the lead
  re-verify a slice against its spec *before* the PR exists. Subagent-authored PRs reliably
  omit or misplace the close keyword even when the brief demands it, so owning PR creation
  closes that gap by construction rather than by a fragile after-the-fact check.
- **`Closes #N` is a per-PR decision the lead makes after verifying — not a default.** Tag a
  PR `Closes #N` only when it *fully* satisfies the linked issue (all acceptance criteria,
  verified). A tracer, a round-out, or a stacked/multi-wave slice that only *advances* an
  issue must use a non-closing `Refs #N`, or the first partial merge closes the issue
  prematurely. The subagent reports whether its slice fully satisfies the issue; the lead
  decides the keyword.
- **Disjointness is a merge-cost heuristic, not an architecture goal.** Never let "keep
  slices disjoint / avoid the append hotspot" suppress a sound design decision — a
  legitimate shared-module edit, deep-module *reuse*, or a single source for a public
  shape. When they conflict, **serialize that slice's merge** rather than degrade the
  architecture; and make "did this slice *reuse* the existing deep module (not
  re-implement it in isolation)?" part of each subagent's DoD — wired into the
  dispatch-prompt DoD and the pre-launch checklist, not just prose. (REFERENCE §1, §3, §9)

## Workflow

```
decompose + dependency analysis → plan waves → fan out (implement) → merge serially (dependency order) → verify
```

1. **Decompose + analyze dependencies.** Split the work into vertical slices. Mark which
   are independent (parallel-safe) vs. coupled (must serialize). Up front, identify the
   **append hotspots** — central registries, enums, dispatch tables, render/plugin maps,
   shared test files that *every* slice edits — that is where merge cost concentrates.
   (REFERENCE §1)
2. **Plan waves.** Group independent slices into waves of ≤ ~5; sequence coupled slices
   tracer-first. Decide the merge order now. (REFERENCE §2)
3. **Fan out to implement.** Launch one subagent per slice in its own git worktree, each
   with a dispatch prompt that pins it to its worktree, tells it to commit early and push its
   branch but not open the PR (the orchestrator does), and bakes the integration-tier test
   into its DoD. (REFERENCE §3)
4. **Merge serially in dependency order.** Tracer first → rebase followers onto the new
   base → independent groups can merge in any order. Re-poll mergeability after each
   merge. Watch for the two marker-free conflict traps. (REFERENCE §4, §5)
5. **Verify, open PRs, take over.** Re-run the integration tier yourself (a *clean* rebase
   still needs it); run shared-global-resource tests serially; treat any "completed but no
   commit/push" report as needs-takeover, not success. **You** (not the subagent) open each
   PR, choosing `Closes #N` only when the slice fully satisfies its issue (else `Refs #N`).
   (REFERENCE §6, §7)

This path is **not one-shot**: independent review sends merged-ready slices back, and
remediation reshapes the plan. Re-derive the overlap map and merge order as fixes land,
verify each slice against its *originating spec* (not just its own green tests), and fix a
finding at the altitude of its true cause, not where it surfaced. (REFERENCE §1, §6)

When append hotspots keep dominating merge cost, the durable fix is architectural —
split them into per-module fragments that auto-aggregate (REFERENCE §8). Run the
**pre-launch checklist** (REFERENCE §9) before every wave.