The five lanes
openspec
Spec-driven work following the proposal → design → tasks → Gate 1 → apply → Gate 2 → archive workflow. Stories live in
openspec/changes/<id>/tasks.md checkboxes. Two gate reviews are mechanically required before archiving.superpowers
Execution-focused work driven by a Superpowers plan (brainstorming, TDD, subagent-driven development). Stories live in the plan file referenced by the epic’s
planPath field — PM tracks when and in what order; Superpowers drives how well.claude-code
Freeform Claude Code work with no external spec tool required. Stories live inline in
.conductor/state.json under the epic’s stories[] array. Each story has a title and a done boolean.decision
Architectural or process decisions. No stories, no task list — just a durable record that the decision was made, what was decided, and when. The epic is the artifact.
external
Work tracked in an external system (Jira ticket, GitHub issue, Linear card). PM records the
externalId and externalUrl; the external system owns the stories. PM mirrors status transitions via its tracker integration.Stories (checkboxes, phases, plan steps) always live in the best available external source — PM never copies them into
state.json except for claude-code-lane epics using inline stories[]. Keeping the source of truth in OpenSpec or Superpowers is intentional: it prevents duplication and keeps PM’s state file lean.Epic lifecycle
Every epic moves through a defined set of statuses. The normal progression is linear, but epics can be paused and unpaused by the detour stack.Priority
PM uses four priority levels plus an unset sentinel:Epic links
Epics can be related to each other via typed links. Links are directional and recorded on both ends.
The
may-invalidate link is the most important in the system. When the detour is archived and /pm:resume runs, the reconcile gate re-validates the paused proposal against what the detour actually shipped. The verdict is written back durably onto this link as {verdict, amendments, reconciledAt}.
Hierarchy
Epics can be nested under a single parent, forming a tree. Use--parent <id> on /pm:epic add (or add-many --from <json> for bulk creation) to nest an epic.
When a parent epic has children:
PROJECT.mdindents children under their parent and shows a rolled-upX/Y children archivedcount in the briefing.- NEXT UP preserves global priority order — grouping is render-only.
- A parent epic with all children
autonomouscan be dispatched as an unattended multi-agent batch viaplan-hierarchy --parent <id>, where each child runs in its own git worktree and converges back sequentially.
remove-epic is blocked by default if an epic still has children — pass --cascade to remove the parent and all descendants together.