Plan Proposal
Plan and structure OpenSpec changes before implementation work begins.
Installation
- Make sure Claude is on your device and in your terminal.
Skills load from
~/.claude/skills/when Claude Code starts up β so you need it on your machine first. If you don't have it yet, install it once with the command below, then runclaudein any terminal to verify.One-time setupnpm i -g @anthropic-ai/claude-codeAlready have it? Skip ahead.
- Paste into Claude Code or into your terminal.
This copies the whole skill folder into
~/.claude/skills/plan-proposal-blackbelttechnology/β the SKILL.md plus any scripts, reference docs, or templates the skill ships with. Safe default: works for every skill.Faster alternative (instruction-only skills)
Skips the clone and grabs only the SKILL.md file. Don't use this if the skill ships Python scripts, reference markdowns, or asset templates β they won't be downloaded and the skill will fail when it tries to load them.
Quick install (SKILL.md only)Sign up to copy - Restart Claude Code.
Quit and reopen Claude Code (or any other agent that loads from
~/.claude/skills/). New skills are picked up on startup. - Just ask Claude.
Skills auto-activate when your request matches the skill's description β no slash command needed. Trigger phrases live in the skill's own frontmatter; you can read them in the βWhat this skill doesβ section above.
Prefer to read the source first? Open on GitHub.
When Claude uses it
Develop-side planning orchestrator for an OpenSpec change: artifact creation β doubt-driven-review β scenario-design β fold of automated scenarios into tasks.md, then STOPS at the git-worktree boundary. Main interactive session only; never a subagent. Triggers: "plan this change", "draft the proposal and plan", "scaffold + review + fold", "prep a change for building".
What this skill does
plan-proposal
Orchestrates the planning phase of an OpenSpec change on develop. Composes
existing skills β it does not reimplement them. Twin of ship-it, which owns
the implementation phase inside the worktree. The two split at the git-worktree
boundary, which is also the interactive/headless line.
flowchart LR
subgraph Planning ["PLANNING β develop, human present"]
A["new/ff/continue"] --> B["doubt-review"]
B --> C["scenario-design + category-fold + manifest"]
C --> D["plan-proposal (this skill)"]
end
D -->|"boundary: commit + spawn worktree"| E["ship-it"]
subgraph Implementation ["IMPLEMENTATION β worktree"]
E
end
Hard constraint β main session only (never a subagent)
plan-proposal MUST run in the main interactive session. It invokes
doubt-driven-review (which spawns a fresh-context reviewer, and interactively a
second cross-model reviewer β nested subagent spawn is blocked) and
scenario-design (whose proposal/design-stage HARD gate calls ask_user). Both
need a live main session.
Guard: if you detect you are running inside a subagent context (nested
reviewer spawn would be blocked, or ask_user is unavailable), STOP and
surface: "plan-proposal must run in the main session β doubt-review and the
scenario-design gate cannot run nested. Re-invoke from the main session on
develop." Do not degrade the doubt-review to a self-questioning fallback.
Preconditions
- On the
developbranch (planning happens on develop; the worktree is spawned from the planning commit). openspecCLI available; resolve the change name from--change <name>, the conversation, oropenspec list --json(ask if ambiguous).- Announce: "Planning change:
<change>(override with/plan-proposal <other>)."
Procedure
1. Ensure planning artifacts exist
Bring the change to a drafted state using the existing generated skills β do not hand-roll the directory:
- No change dir yet β
openspec-new-change(or-fffor the fast path). - Partial artifacts β
openspec-continue-change.
Artifacts live at openspec/changes/<change>/: proposal.md, design.md (when
the change warrants one), specs/**/spec.md, tasks.md.
2. Doubt-review proposal.md + design.md (trigger: drafted or modified)
Whenever proposal.md or design.md is created or changed in this session,
invoke doubt-driven-review on the changed artifact:
- Pass ARTIFACT + CONTRACT only β never the CLAIM, never your reasoning.
- ARTIFACT = the proposal/design prose (decompose if large per doubt-review).
- CONTRACT = the requirements/constraints the artifact must satisfy (the specs deltas, the non-goals, the invariants it asserts).
- Surface the cross-model offer β this is an interactive session, so the offer is mandatory (doubt-review Step 3 "always offer, never silently skip").
- Reconcile every finding against the artifact text using doubt-review's precedence (contract-misread β actionable β trade-off β noise). When a finding is valid + actionable, PAUSE: the artifact is corrected before proceeding.
Do not fold scenarios until the doubt cycle reaches a stop condition (trivial findings, 3 cycles, or explicit "ship it").
3. scenario-design β category-routed fold into tasks.md (MANDATORY β never skip)
scenario-design is a required step, not an option. A change never reaches
the worktree boundary without a test-plan.md manifest and its automated rows
folded into tasks.md. Do not hand-author test tasks, infer scenarios from
the proposal, or skip straight to the commit β always drive the tasks from the
scenario-design output. Smoke-test-only tasks.md is a planning failure.
Run scenario-design for the change (proposal/design stage β HARD gate; it may
ask_user and STOP on a spec gap β that is expected, answer and continue). It
writes openspec/changes/<change>/test-plan.md β the manifest, carrying a
level + disposition (automated | manual-only) per scenario row. If
test-plan.md does not exist after this step, scenario-design did not run β
re-invoke it before folding.
Then fold each row into tasks.md:
-
automatedrows β one vanilla- [ ]task each, routed to its category:manifest levelhome check-first (reuse infra) L1 packages/*/**/__tests__/*.test.ts(vitest)sibling *.test.tsL2 qa/tests/*.sh|*.ps1existing qa test for that OS L3 tests/e2e/*.spec.ts(docker harness)existing spec for that surface electron ci-electron.yml/_electron-build.ymlexisting electron job ci ci.yml/ workflow-levelexisting workflow assertion Before tasking new infra, scan for an existing test of that type to extend. Each folded test task MUST carry:
- a harness-exemplar pointer β the nearest existing spec/test of that
category to copy harness glue from (e.g.
see tests/e2e/reconnect.spec.ts). Bare "author X.spec.ts" tasks are forbidden βship-itresolves the exemplar path into the task context it handsapply. - the scenario Triple (
input Β· trigger Β· observable) as plain text. - a manifest reference as ordinary prose β either
(test-plan #<id>)or an inline(test-plan: automated)β soship-it/ship-changecan map it back.
- a harness-exemplar pointer β the nearest existing spec/test of that
category to copy harness glue from (e.g.
-
manual-onlyrows β a plain manual task tagged(test-plan: manual-only); no test is folded.ship-changedefers these post-merge (its manifest-aware defer rule).
Fold-completeness gate (before Step 4): every automated row in
test-plan.md MUST map to exactly one folded test task in tasks.md, and every
manual-only row MUST map to one tagged manual task. Verify the count matches
the manifest β if any scenario row has no corresponding task, the fold is
incomplete; finish it before committing. Do not proceed to the boundary with an
unfolded manifest.
Parser-safety (load-bearing): tasks.md MUST stay vanilla checkbox format.
No custom token, no bracketed tag, no non-standard syntax on a task line β only
- [ ] <text> where the manifest reference is ordinary prose. openspec status --json and the generated apply skill parse this file; a stray token could
break them. Verify openspec status --change <change> --json reports the same
task counts after folding as the plain checkboxes imply.
4. Commit planning artifacts + stop at the worktree boundary
Precondition: test-plan.md exists and the fold-completeness gate passed.
Never commit without the manifest β a missing test-plan.md means Step 3 was
skipped; go back and run scenario-design.
Commit proposal.md, design.md, specs/**, tasks.md, and test-plan.md to
develop. The worktree is spawned from that commit via the existing worktree
flow (dashboard "start work" / git worktree add).
Then STOP. plan-proposal does not enter the implementation phase. Report:
Planning complete for
<change>. Artifacts committed todevelop; worktree ready. Automated scenarios folded to tasks (manifest dispositions intest-plan.md). Next: runship-itinside the worktree to build + ship. If a design issue surfaces during build,ship-itwritesSHIP_IT_BLOCKED.mdand hands back here.
Guardrails
- Main session only β refuse and surface if nested (see Hard constraint).
- Never pass the CLAIM to the reviewer; ARTIFACT + CONTRACT only.
- Never fold before reconciling actionable doubt-review findings.
tasks.mdstays vanilla β the manifest (test-plan.md), not a task tag, is the automated-vs-manual source of truth.scenario-designis mandatory β notest-plan.md, no commit. Never hand-author test tasks or skip scenario design; the manifest is the sole source of the folded test tasks.- Fold every manifest row β the boundary is blocked until every
automatedandmanual-onlyrow maps to a task. - Never author test/app code here β folding writes tasks;
ship-itauthors the tests. This skill plans; it does not implement. - Stop at the boundary β do not continue into implementation.
Composed skills
openspec-new-change / -ff / -continue Β· doubt-driven-review Β·
scenario-design (+ its test-plan.md manifest) Β· handoff to ship-it.
Related skills
Poster & Visual Design
anthropics
Create original posters and visual art in PNG and PDF formats.
PowerPoint Slide Decks
anthropics
Create, edit, read, and extract content from PowerPoint presentations.
Canvas Design
Prat011
Create original visual designs as PNG and PDF files using design philosophy.
PowerPoint Editor
Prat011
Create, edit, and analyze PowerPoint presentations and slide content.