Plan the roadmap as a DAG. Generate the specs per card.
specplan models your project as a directed acyclic graph of two node types — specs and user stories — on a React Flow canvas. Spec→spec edges are dependencies (cycles are rejected, with the path named); spec→story edges are containment, which doubles as coverage: anything not contained by a spec sits in the backlog. Each spec card generates its own OpenSpec change from the stories it contains.
npx @coopcli/specplan ./openspec
Open the printed URL. Add specs and stories from the backlog's New
spec… / New story… dialogs (or ask the chat), draw links
between cards, and press Generate OpenSpec
on a spec card. The change lands in
openspec/changes/<specId>/, validated with
openspec validate --strict.
.md byte alone.specplan.yaml; migrated-in specs start as draft.npx @coopcli/specplan validate # schema + acyclicity + story formula
npx @coopcli/specplan generate <specId> # generate one card, exit non-zero on validation failure
npx @coopcli/specplan login # CoopCLI account (for what's coming next)
Plain YAML, comments preserved: the DAG in openspec/specplan.yaml,
plus openspec/changes/<specId>/specplan.yaml per spec with its
stories, dependencies, and the generation hash. The filesystem is the source of
truth — edit by hand freely; specplan reloads before every change.