woostack-plan
Turn one approved specification into a strict sequential chain of PR-sized direct Linear issues, Plane increment child work items, or parentless canonical-repository GitHub issues. Never approves, executes, commits, reviews, or merges.
Turn one approved specification into one complete execution plan. Standalone Plan reads one exact existing Linear project, canonical GitHub Project, or the canonical Plane repository project, derives and hardens a candidate chain, synchronizes the complete direct-issue, parented specification, or parentless GitHub graph, independently reads that graph back, and returns the verified result. When delegated by Build or project-backed Fix, Plan instead drafts the same complete candidate into the owning workflow's run-scoped manifest with zero provider calls and returns before synchronization.
Command
/woostack-plan <approved specification> [--project <exact Linear, Plane, or GitHub URL-or-UUID>]
/woostack-plan [--project <exact Linear, Plane, or GitHub URL-or-UUID>]For standalone Linear or GitHub use, --project is mandatory. For standalone Plane use, --project is optional
and omitted input uses the exact artifacts.plane.project; when supplied, it must identify that same
native project. Standalone use requires artifacts.provider: "linear", artifacts.provider: "plane", or
artifacts.provider: "github" in effective repository configuration. When artifacts.provider is "local"
or omitted, standalone Plan fails closed before any provider access with an error stating that provider
operations require artifacts.provider: "linear", artifacts.provider: "plane", or artifacts.provider: "github". There is no CLI provider override.
Standalone Plan loads the shared
artifact contract, then only the selected row:
artifacts.provider | Provider profile | Synchronization |
|---|---|---|
"github" | GitHub | GitHub procedure |
"linear" | Linear | Linear procedure |
"plane" | Plane | Plane procedure |
For Linear, resolve only the exact selected project, which must already exist and match the canonical
repository. For GitHub, resolve only the exact selected canonical Project URL, which must already exist
under the configured owner and match the canonical repository. For Plane, resolve only the exact configured
project, requiring any explicitly supplied --project to identify the same native project. The project
must match the canonical repository and belong to the configured provider scope. Wrong resource type,
missing project, foreign scope, incomplete read, or conflicting content blocks before mutation.
There is no fuzzy-discovery or alternate-provider path. Standalone Plan also reads the repository,
canonical parent branch and last admitted tip, existing patterns, and relevant tests.
Build/Fix-delegated Plan instead obeys the shared
manifest contract;
it reads no provider context or synchronization procedure during the delegated phase.
Repository parent-tip admission follows the shared
repository ancestry contract;
Plan owns only the approved parent-branch intent and last-admitted-tip handoff.
Input and ownership
The input is one complete specification containing goal, users, behavior, constraints, exclusions, architecture decisions, acceptance criteria, and verification expectations. Missing or conflicting product decisions return to the owning workflow; Plan never invents product decisions and never creates an approval event.
Build or Fix delegates candidate planning with the readable specification, baseline identity, and
verified run manifest. Delegated planning performs no provider read or mutation; it atomically
records complete candidate contracts, stable local task keys, dependencies, and unresolved questions
in that manifest. The owning wrapper hardens the manifest and writes execution-plan.md directly
under .woostack/tmp/runs/<run-id>/. In standalone use, Plan itself hardens and synchronizes the
graph. In every mode, Plan owns no implementation, source edit, commit, branch, PR, review, merge,
or execution handoff authority.
Direct issue contract
Create or reconcile exactly one direct project issue (for Linear), parentless repository issue with direct
Project membership (for GitHub), or child increment work item under the [Plan] <goal> specification work
item (for Plane) for each execution increment. Never create extra container, checklist, layer, or
synthetic issues. Historical parent/container issues are not current
increments and are not detached, migrated, archived, deleted, or treated as containment. Every direct issue
or increment work item must retain these fields in its complete description:
- stable task ID, unique positive ordinal, concise outcome, and exactly one intended PR;
- exact scope and explicit non-goals;
- affected files, symbols, or a bounded discovery surface, with relevant interfaces and constraints;
- observable acceptance criteria defining completion;
- focused checks and one executable smoke scenario;
- material risks, active blockers, and relevant documentation, migration, deployment, compatibility, or cross-increment effects; and
- a declared Graphite parent and exact predecessor dependency binding.
When an increment touches an inter-application boundary (HTTP/RPC server-client, service-to-service, webhooks, queues/events, or third-party APIs in either direction), the direct issue contract must explicitly identify each boundary and specify adapter mapping, boundary validation/narrowing, transport error translation, app-local placement, wire/API compatibility, and focused boundary test obligations following the canonical application-boundary adapters rule. Do not demand identity-only or no-op wrappers when a deliberately shared contract is already the application/domain shape.
Before admitting any verification command or smoke scenario, independently verify each named repository-local script or path already exists at the last admitted repository parent tip, is created by a predecessor increment whose native dependency orders it before use, or will be created by the same increment before use. Verify a manifest-defined command against its exact manifest entry and state any external runtime prerequisite. A missing or invented command blocks plan persistence; never defer existence checking to Execute.
Chain invariants
The plan is a strict sequential chain. If there are N increments, ordinals are exactly the positive
integers 1..N, each ordinal and task ID is unique, and each native Linear dependency, GitHub blocked-by
dependency, or Plane sibling blocking relation is exactly the matching predecessor edge:
ordinal 1: no predecessor
ordinal k (2..N): ordinal k-1 → ordinal kNo missing, extra, branching, cyclic, or synthetic dependency is valid. The declared Graphite parent for ordinal 1 is the approved integration parent branch; for every later ordinal it is the immediately preceding increment's branch. Bind that stable parent-branch intent in each complete issue description and carry the last admitted tip as separate repository evidence for Execute's base-change check. A different branch identity, unknown task, ordinal gap, out-of-order edge, or parent that Graphite cannot represent blocks the plan. Validate that every acceptance criterion is covered exactly by at least one increment and that every issue contract is complete before any provider mutation.
Prefer the fewest independently reviewable increments that deliver coherent outcomes. Do not split by file or layer merely to manufacture issues. Leave coding order and implementation decomposition to the executor within each approved increment's scope.
Provider synchronization
In standalone use only, after the chain is complete and valid, verify the canonical repository association and selected workspace/team or instance/workspace, then apply the existing-description mutation invariant while synchronizing one exact project graph through the matching provider synchronization procedure (GitHub, Linear, or Plane):
- Reconcile the complete current project context (for GitHub, write the managed README section and
update
shortDescription; for Plane, create/update the top-level[Plan] <goal>specification work item withparent = null). - Create or reconcile exactly one direct project issue (Linear), parentless repository issue in the canonical
repository with direct Project membership (GitHub), or child increment work item with
parent = <spec-item-UUID>(Plane) per increment with its full contract. - Create or reconcile only the strict predecessor dependency chain (for GitHub and Plane,
N-1native blocking relations/dependencies: predecessor blocks successor). - Independently read every project, spec item (where applicable), issue/work item, membership, description, and dependency edge back; accept the plan only when the complete graph matches the candidate. Preallocate stable mutation identities, make reconciliation idempotent, and preserve unknown outcomes for recovery without allocating replacements. This standalone synchronization is unchanged, owns no approval gate, and does not use the Build/Fix run manifest.
When delegated by Build or Fix, stop before every provider read or synchronization. Return the
complete manifest-backed candidate contracts and strict chain to the wrapper. The wrapper hardens
the manifest, writes execution-plan.md, displays every concise stable task and dependency mapping,
and owns optional post-drafting mirror synchronization (when artifacts.provider: "linear",
artifacts.provider: "plane", or artifacts.provider: "github") and exact read-back.
Return
Return the complete ordered task contracts, exact project or baseline identity, strict predecessor and Graphite parent edges, repository assumptions/effects, focused verification strategy, read-back evidence, provider mutation/read counts, and stable mutation identities. Delegated Plan returns its run/process/manifest identity and makes no provider claim. Do not return a parent-plan identity or an execution claim.
Hard constraints
- One approved specification in; one coherent strict chain out.
- One direct project issue (Linear), parentless repository issue with direct Project membership (GitHub), or specification child work item (Plane) per increment; no extra container issue and no hidden planning ledger.
- Ordinals are exactly
1..N; native dependencies are exactlyN-1 → N. - Standalone Plan requires
--projectfor Linear and GitHub; for Plane--projectis optional and omitted input uses the exactartifacts.plane.project. - Every issue carries the complete outcome, scope, acceptance, verification, and declared Graphite parent/dependency contract.
- Delegated Build/Fix planning performs zero provider reads and writes; its wrapper hardens,
writes plain
execution-plan.md, and optionally synchronizes when mirroring is enabled. - Standalone Plan keeps its direct project synchronization and independent read-back unchanged.
- Plan owns no implementation, source edit, commit, branch, PR, review, merge, or execution.
- No credential reads, fuzzy artifact discovery, implicit project creation (outside omitted-project Plane first use), alternate provider, synthetic dependencies, or obsolete container prose.
- Never claim synchronization or independent read-back without evidence.
woostack-change
Use for a small bounded non-bug enhancement or refactor that can ship in one reviewable PR. Invoke via /woostack-change <goal>.
woostack-execute
Execute one approved Linear, Plane, or GitHub project increment, one exact Linear/GitHub issue or Plane work item, or an approved local run manifest as a resumable sequential Graphite PR workflow. Never reviews or merges.