Groups plan phases/tasks into dependency-ordered waves for parallel subagent execution via git worktrees. Analyses task dependencies, builds a DAG, assigns tasks to waves, and emits a living wave document that tracks status as work lands. Also updates an existing wave plan when tasks complete.
94
94%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Passed
No known issues
How to build a task dependency DAG and assign tasks to waves.
List every task with:
T1.1, P0, phase-3, etc.)If dependencies are not stated in the source document, infer them:
| Signal in source | Inferred dependency |
|---|---|
| "after X is done" / "once X lands" | task depends on X |
| "requires X to exist" | task depends on X |
| Test task for feature F | depends on F implementation |
| Merge / cleanup task | depends on all tasks being merged |
| Validation task | depends on all implementation tasks |
| Deployment task | depends on validation task |
| Tasks touching the same file | sequential dependency on earlier task |
| Tasks touching independent files | no dependency (can be parallel) |
Represent the graph as an adjacency list:
T1.1 → [] (no dependencies)
T1.2 → []
T2.1 → [T1.1] (depends on T1.1)
T2.2 → [T1.2]
T3.1 → [T2.1, T2.2]Check for cycles — a cycle means the requirements are contradictory. Surface this to the user before proceeding.
Wave(task) = 1 if task has no dependencies
Wave(task) = 1 + max(Wave(dep) for dep in dependencies)All tasks with the same wave number can execute concurrently.
Example:
T1.1 deps=[] → Wave 1
T1.2 deps=[] → Wave 1
T1.3 deps=[] → Wave 1
T2.1 deps=[T1.1] → Wave 2 (1 + max(1) = 2)
T2.2 deps=[T1.1, T1.2] → Wave 2
T3.1 deps=[T2.1] → Wave 3
T3.2 deps=[T2.1, T2.2] → Wave 3
T4.1 deps=[T3.1, T3.2] → Wave 4Give each wave a short descriptive label:
| Pattern | Example label |
|---|---|
| Diagnostics / audits | "Diagnostics & Design" |
| Setup / scaffolding | "Bootstrap & Extract" |
| Core implementation | "Fix & Build" |
| Tests / coverage | "Coverage & Validation" |
| Integration / merge | "Integration & Wrap-up" |
| Pre-requisites | "Pre-work" |
| Final checks / PR | "Wrap-up" |
A wave is parallel when:
A wave is sequential when:
A wave is must land together when:
For parallel waves, assign one branch per workstream:
<type>/<scope>-<slug>Examples:
refactor/scripts-lib-httpfeat/phase-3-clean-lambdatest/baselineci/deployment-automationFor sequential waves, one branch covers the whole wave:
<type>/<wave-label-slug>Emit in the Dependency Graph section of the wave document:
Wave 1 (parallel)
T1.1 <description> ─┐
T1.2 <description> ─┤─► Wave 2
T1.3 <description> ─┘
Wave 2 (parallel, unblocked after Wave 1)
T2.1 <description> (← T1.1) ─┐
T2.2 <description> (← T1.2) ─┤─► Wave 3
T2.3 <description> (← T1.3) ─┘
Wave 3 (sequential)
T3.1 <description> (← all Wave 2)Rules:
─┐, ─┤, ─┘ for parallel merges.(← X) to annotate the specific dependency.─► to show the wave that unblocks.If T1.1 is a prerequisite for 10 tasks, those 10 tasks are still all Wave 2 — they just all depend on T1.1. Do not create an intermediate wave just to "stage" them.
Surface to user:
ERROR: Circular dependency detected: T2.1 → T3.1 → T2.1
Cannot assign wave numbers until this is resolved.
Suggested fix: [description of how to break the cycle]When a task says "depends on the above" without specifying, treat it as depending on all tasks earlier in the same phase/section.
Split large parallel waves into sub-groups by semantic domain, keeping them in the same wave number. Use phase rows in the table to separate the groups visually.