subagent-worktree-parallel · git:20260707.506838e · 2026-07-07 · sha256 44f78684437c88dd

subagent-worktree-parallel git:20260707.506838eA

Immutable. This exact content is served forever at /api/v1/blob/44f78684437c88dd.

---
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 — and so is the rest of the
  PR-CI gate list.** 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`). Beyond the test tiers, DoD must also mirror
  the repo's non-test PR-CI gates — read the gate list off the CI workflow itself, not
  from memory: typically the formatter *check*, linter, typecheck, and build/packaging —
  invoked exactly as CI invokes them. A green test run with a red format check still
  bounces the PR (every slice of one real wave tripped this). (REFERENCE §3, §6)
- **The orchestrator (the "lead") 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.
- **Stacked PRs are live dependencies until merged.** When a base PR receives review fixes
  or is squash-merged, every dependent PR must be re-evaluated: rebase/retarget it, update
  stale PR body text and close-vs-reference keywords, then rerun the real gates on the new
  head. Old green CI on the stacked base is not merge evidence.
- **Public docs and agent-facing docs are integration surfaces.** If a slice changes a
  user/agent-visible behavior or public shape, verify the whole surface chain for that
  slice and its dependents — CLI/help, schemas, user docs, generated or translated docs,
  and bundled skills/agent guidance. Code tests alone can miss a documentation contract
  gap or a stale generated marker.
- **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) → verify + open PRs (per slice) → merge serially (dependency order)
```

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 —
   and give each hotspot exactly **one owner slice** for the wave; the others flag needed
   changes instead of editing. (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. **Verify, open PRs, take over.** As each implementer finishes — and before anything
   merges — re-run the integration tier yourself; run shared-global-resource tests
   serially; audit any public docs/agent docs surface; 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)
5. **Merge serially in dependency order.** Tracer first → rebase followers onto the new
   base → independent groups can merge in any order; a *clean* rebase still gets the
   integration gate. Re-poll mergeability after each merge. For stacked PRs, retarget
   followers after the base lands and update any stale `Refs`/`Closes` or recorded
   verification text before merging. Watch for the two marker-free conflict traps.
   (REFERENCE §4, §5)

This path is **not one-shot**: independent review sends merged-ready slices back, and
remediation reshapes the plan. A review/fix round is a **re-dispatch** — resume the
original implementer with its context where possible, restate the full dispatch
discipline (worktree pinning, commit-early, the full DoD gates — integration tier plus
the PR-CI gate list), and require **one commit
per finding** so a mid-round kill is cheap to take over. The lead then re-verifies and
closes the loop on the review channel — e.g. a reply mapping each finding → resolution —
keeping the PR/change description current where the host supports it.
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, §7)

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.