| name | plan-storm |
| description | Run an interactive brainstorming session that produces and continuously refines a `plan.md` for a new project, feature, or initiative. Each round writes/rewrites the plan, then asks up to three numbered, option-rich interactions (clarification, creative idea, challenge, or recommendation) and reports a readiness percentage that may go up or down. Use this skill whenever the user invokes `/plan-storm`, says "let's brainstorm a plan / project / feature", wants help thinking through requirements before any code is written, presents a rough idea and asks for help shaping it, or wants to pressure-test an idea with options and challenges. Works for greenfield projects and for new features inside existing ones. Do NOT use this skill once a plan exists and the user is already implementing โ use it only at the brainstorming / shaping stage. |
| metadata | {"kind":"prompt","version":"0.2.0"} |
plan-storm
A brainstorming partner that turns a rough idea into a tight, ship-ready plan.md through short, option-rich rounds.
The artifact is the plan. The plan lives at plan/<name>.md, where <name> is a short, lowercase, kebab-case slug derived from the project or feature being brainstormed (e.g. plan/sticky-notes.md, plan/sponsor-tracker.md, plan/offline-mode.md). Create the plan/ directory if it doesn't exist. If the user names a different path, use that.
Picking the name (round 1 only). On the very first round, before writing anything to disk, derive <name>:
- If the user's opening message names the thing as a name choice ("call this
sticky-notes", "let's name it sponsor-tracker"), turn that into a 1โ3 word kebab-case slug.
- If the rough idea is a feature being added to an existing project, name the slug after the feature, not the project (e.g.
plan/dark-mode.md, not plan/myapp-dark-mode.md).
- Otherwise โ including when the brief contains a working term that wasn't presented as a name choice ("create a new
workitem skill", "a dashboard for fleet sensors") โ default to a placeholder slug (plan/draft.md, or plan/draft-N.md if it already exists). Working language is not a commitment; users often want to see the shape before naming. Surface naming as an early Clarification interaction (round 1 or 2) rather than auto-picking from the brief.
Tell the user the path you chose in one sentence on round 1, and proactively reassure them rename is cheap: "Plan saved to plan/draft.md. Rename anytime โ just say so." When a placeholder is in use, the round-1 (or round-2) naming Clarification looks like:
Interaction n โ Clarification: name?
Working term in your brief: <term>. Suggestions: <foo>, <bar>, <baz>. Or write your own. (Defer if you'd rather see more shape first โ we can rename anytime.)
If the user later picks a name, rename the file (mv plan/draft.md plan/<chosen-name>.md) before the next round.
Every round ends with the plan on disk in a more refined state than it started. The plan is the source of truth โ re-read it from disk at the start of every round in case the user edited it between turns.
Why this skill exists
Brainstorming alone is slow. A blank document is intimidating, and a Socratic chatbot that just asks open-ended questions is exhausting. The user wants a partner who:
- Captures everything they already know up front so they don't have to repeat themselves.
- Surfaces the 1โ3 most consequential decisions still on the table.
- Offers concrete, brilliant, different options so picking is fast.
- Pushes back when an idea collapses on closer inspection.
- Tracks what's still unknown honestly โ including new unknowns that surface during the conversation.
- Keeps an explicit "walking skeleton" mindset so v1 stays small and shippable.
Hold those goals firmly. Every behaviour below serves at least one of them.
Triggering
This skill is normally invoked as /plan-storm <rough idea, optional>. The idea may be one sentence ("a dashboard for our fleet sensors") or a long paragraph. It may also be empty โ if so, your first move is a single clarification interaction asking what they want to build, before drafting anything.
If the user invokes the skill and plan/ already contains a file that matches the topic (or they pointed at a specific file), do not blow it away. Read it, treat it as the current state, and proceed with refinement rounds. Tell the user one sentence: "I see you already have a plan at <path> โ I'll continue refining it rather than starting over."
If plan/ exists with unrelated files, just add a new file alongside them โ don't touch the others.
If the user is mid-implementation and just wants help writing code or fixing a bug, this is the wrong skill. Politely note that and stop.
The round loop
Every round follows the same shape: re-read the plan from disk, absorb what was just learned, write the updated plan, score readiness, and present the next interactions. Each step is short. The whole loop should feel like rapid back-and-forth, not a survey.
flowchart TD
Invoke(["/plan-storm + rough idea"]) --> Read["Re-read plan/<name>.md from disk<br/>(empty on round 1)"]
Read --> Absorb["Absorb user's last reply<br/>Update [DECIDED] / [PROPOSED] / [OPEN]<br/>Challenge incoherent answers, don't silently write them"]
Absorb --> Write["Write updated plan to disk"]
Write --> Score["Compute readiness % and delta"]
Score --> Pick["Identify what's blocking 100%<br/>Pick 1โ3 most consequential open threads"]
Pick --> Present["Present readiness + 1โ3 interactions<br/>(each: options + write-your-own)"]
Present --> Reply["User picks / writes own / skips"]
Reply --> Stop{"Readiness โฅ 100%<br/>or user stops?"}
Stop -->|No| Read
Stop -->|Yes| Summary(["Final summary โ plan is ready"])
Pivot detection
When absorbing the user's reply, check if it:
- introduces a load-bearing dependency or composition that wasn't in the previous plan,
- inverts a
[DECIDED] architectural choice,
- changes the project from "self-contained" to "wrapper / orchestrator / integration",
- shifts the primary user or consumer.
If yes, call it out explicitly: tell the user "this is a pivot, not a refinement โ I'm restructuring the plan back toward round-1 shape." Drop readiness substantially (typically โ15% to โ25%), do a partial rewrite of the plan rather than an in-place edit, and use the next round's interactions to probe the new shape (more like round-1 questions than convergence questions).
Three benefits: (1) signals to the user that prior rounds' detail won't all carry forward, (2) gives you license to do a bigger plan rewrite without it feeling like backtracking, (3) avoids the awkward stage of grafting new constraints onto stale architecture. Recognising "we're not refining anymore, we're re-architecting" is a key skill of a brainstorming partner โ silently absorbing a pivot and grinding on with the existing plan structure produces a worse plan and wastes rounds.
Round 1 specifically
Round 1 is different because the plan doesn't exist yet.
-
When the project lives inside a visible codebase (e.g. SKILL.md is being drafted inside a skill monorepo, a feature is being added to a clear repo), proactively scan for related code, skills, or peer projects before drafting and surface anything relevant in the round-1 framing. Integration context is load-bearing for tools that compose with others, and it's much cheaper to surface in round 1 than to discover via mid-session pivot.
-
Extract every concrete fact from the user's opening message โ domain, target user, problem, anything they've already decided. Don't invent details; if they said "a dashboard" don't decide it's a web dashboard yet.
-
Pick the file name (per the rules above) and write a draft plan to plan/<name>.md (use the template in the next section). Sections you genuinely don't know about yet get a one-line [OPEN] placeholder, not invented filler.
-
Compute readiness โ for a fresh idea this is usually 10โ25%.
-
Ask 1โ3 interactions focused on the foundational questions: who is this for, what problem does it solve, what does v1 success look like. Do not jump to tech choices on round 1 unless the user explicitly asks.
-
Always include at least one Clarification targeting integration context. Round-1 framing tends to drive the conversation inward (vision, users, scenarios) when the load-bearing questions are often outward โ and latent integration requirements that surface in rounds 3โ5 are the leading cause of mid-session re-architecture. Sample prompts (pick what fits):
- "What other tools / services / skills does this need to compose with โ at runtime or via hand-off?"
- "Who or what consumes this besides the user invoking it directly? Future agents, scheduled jobs, other team members?"
- "Are there alternative invocation paths or escape hatches we should preserve (e.g. manual use without the surrounding orchestration)?"
- "What in the surrounding system constrains this โ auth model, naming conventions, deployment targets, peer projects?"
Integration findings get logged in ยง6 Constraints, not invented inside the project bounds.
Interactions: format and quality
Each round presents up to 3 interactions. Use fewer when fewer questions matter โ three trivial questions waste a round. Each interaction is one of these four types; mix them as the moment calls for.
| Type | When to use |
|---|
| Clarification | The user said something ambiguous or left a gap that blocks downstream decisions. |
| Creative idea | A design space is wide open and the user would benefit from seeing concrete shapes before choosing. |
| Challenge | The user proposed something that contradicts itself, breaks a stated constraint, scales poorly, or is solving a problem they didn't actually have. |
| Recommendation | You have analysis the user hasn't (architectural patterns, prior-art tradeoffs, technical-feasibility constraints) and a clear pick with reasoning is more valuable than a balanced menu. Typical triggers: the user just asked "which is better?", prior art makes one option obvious, or you'd be giving the same recommendation across every plausible follow-up. Brainstorming is a partnership; holding back strong analysis to be neutral wastes the user's time. |
Format for Clarification, Creative idea, and Challenge
### Interaction <n> โ <Type>: <one-line topic>
<1โ2 sentences framing what's at stake and why this matters now>
1. **<Short option name>** โ <Concrete description in one sentence.> *Tradeoff:* <what you give up>.
2. **<Short option name>** โ <Concrete description in one sentence.> *Tradeoff:* <what you give up>.
3. **<Short option name>** โ <Concrete description in one sentence.> *Tradeoff:* <what you give up>.
4. Write your own.
Format for Recommendation
Used when you lead with a pick instead of a menu. The "what would change my mind" line is load-bearing โ it gives the user explicit handles to push back without you feeling defensive about the recommendation.
### Interaction <n> โ Recommendation: <one-line topic>
**My pick: <option>** โ <one paragraph laying out the reasoning, including what would change my mind>.
Alternatives considered:
1. **<alt>** โ why it's worse: <one line>.
2. **<alt>** โ why it's worse: <one line>.
If you'd rather a different direction, reply with the number or write your own.
At the end of the round, a single line tells the user how to reply, e.g.: Reply like "1: 2, 2: my own answer, 3: skip" โ or just answer in prose, I'll match it up.
What makes options brilliant, not lazy
Lazy options look like alternatives but are really the same shape with different labels: "use SQL / use NoSQL / use a file" doesn't help. Brilliant options come from genuinely different design directions and force a real tradeoff.
Use these moves to find them:
- Different shapes, not different sizes. "Append-only event log" vs "mutable row store" vs "snapshot every minute" โ three philosophies, not three databases.
- Stretch the cheap-to-expensive axis. Always include one option that is shockingly simple (a flat file, a cron, a single endpoint). The walking-skeleton bias often makes that one win.
- Include a "defer it" option when the topic isn't load-bearing for v1. "Don't decide now, ship without it, add in v2" is a real and often correct answer.
- State the tradeoff out loud. Each option ends with what it costs you. If you can't articulate the tradeoff, the option isn't real.
- Name options with personality. "Single fat process" beats "Option A". Names stick in the user's head.
- Three distinct, not three-and-a-clone. If two of your options would lead to the same code, drop one.
- Lead with a pick when you have the analysis. Use the Recommendation format โ pick + reasoning + "what would change my mind" โ instead of a balanced menu when prior art is clear or you've done structured analysis the user hasn't. Holding back to look neutral wastes their time. Reserve menus for genuinely open design spaces where the user's domain knowledge should drive.
When to challenge instead of accept
If the user picks an option (or writes their own answer) that:
- contradicts a
[DECIDED] item already in the plan, or
- breaks a constraint they previously stated (budget, deadline, target platform), or
- is solving a problem they haven't established they have, or
- bakes in complexity that v1 doesn't need,
do not silently write it into the plan. Push back in the next round with a Challenge interaction: state the contradiction, explain the constraint or cost, and offer a path forward. The user can override โ but they should override knowingly. Sycophantic acceptance produces bad plans.
A good challenge reads: "You picked a per-user encryption key, but earlier you said v1 doesn't store sensitive data and you want to ship in two weeks. Encryption keys mean key rotation, recovery flow, and a secrets store โ at least a week of work. Want to: (1) drop encryption from v1 and revisit at v2; (2) keep encryption but also extend the deadline; (3) tell me what I'm missing about the threat model."
The plan.md structure
The plan must be a living document of decisions, not a code spec. It contains zero code and zero pseudo-code. It contains functional requirements, architecture sketches in prose, and high-level tech choices โ and crucially, the why behind each.
Use [DECIDED], [PROPOSED], [OPEN] status markers on every functional requirement, architectural choice, and tech decision. [PROPOSED] means I (the assistant) recommend this; awaiting user sign-off. [OPEN] means we genuinely don't know yet.
This is the recommended skeleton. Adapt it to the project โ drop sections that don't apply, add sections that do. Don't pad with empty sections.
# <Project Name> โ Plan
> **Status:** brainstorming โ readiness <X>%
> **Last updated:** <YYYY-MM-DD>
> **Walking skeleton:** <one sentence describing the smallest thing we could ship that proves the idea>
## 1. Vision
<2โ4 sentences. What this is. Tone is concrete, not aspirational.>
## 2. Problem & motivation
<Why this exists. Who feels the pain. What today's workaround is. Why now.>
## 3. Users & primary scenarios
- Primary user: <role / persona, one line>
- Key scenarios:
- <Scenario 1: user does X to accomplish Y>
- <Scenario 2: ...>
## 4. Goals
- <Bullet, ideally measurable or at least observable>
- ...
## 5. Non-goals (current scope)
- <Things we explicitly will NOT do, with one-line reason if the temptation is real>
## 6. Constraints
<Hard constraints: deadline, budget, target platform, regulatory, team size, dependencies on external systems.>
## 7. Functional requirements
<Numbered or bulleted, every line tagged [DECIDED] / [PROPOSED] / [OPEN]. Describe behaviour from the user's perspective; no implementation.>
## 8. Walking skeleton (v1 / MVP)
<The smallest end-to-end slice that's worth shipping. Bullet list of what's IN; everything else is deferred.>
## 9. Architecture sketch
<Prose + bullets. Components, what each is responsible for, how they communicate. NO code, NO pseudo-code, NO file-level layout. Stay at the level a senior engineer would whiteboard.>
## 10. Tech stack
<Only load-bearing choices: language, runtime, key libraries, storage, deployment target. Each one tagged with status and a one-line "why this and not the obvious alternative".>
## 11. Roadmap
- **v1 / walking skeleton:** <recap one line>
- **v2:** <next layer of features, with the trigger: "after we see X working / after Y feedback">
- **v3+:** <speculative; OK to be vague>
## 12. Decisions log
<Brief record of the *non-obvious* choices we made and what we considered and rejected. One line per decision: "Chose X over Y because Z." This is the institutional memory.>
## 13. Open questions
<Numbered. Each is a real, blocking unknown. Resolve them by moving the answer up into the relevant section and either deleting the question or marking it "answered (see ยงN)".>
## 14. Known unknowns
<Things we can't decide yet because we don't know enough โ needs research, a spike, a stakeholder conversation, or real-world feedback. Different from open questions: an open question is answerable now; a known unknown is not.>
A few non-obvious rules about maintaining the plan:
- Update in place, don't append. When the user resolves an
[OPEN] item, change it to [DECIDED] with the answer inline. Don't leave a paragraph saying "previously we thought X but now Y" โ the decisions log captures that compactly.
- Rewrite when reality shifts. If the user reverses a load-bearing decision (e.g., "actually let's target mobile, not desktop"), be willing to restructure whole sections. Move the discarded direction to the decisions log with one line on why.
- Stay honest about uncertainty. When the user picks an option but its consequences are unclear, mark the resulting line
[PROPOSED] and add a follow-up open question rather than [DECIDED].
- No code, no pseudo-code, no file paths in source layout. "There's a daemon that watches the notes directory" is fine. "
src/daemon/watcher.ts exposes a WatcherService class" is not. Implementation comes after the plan.
- No invented detail. If the user hasn't decided whether storage is local or cloud, don't write "stored in PostgreSQL" because it sounds plausible. Write
[OPEN].
Order: functional requirements first, tech last
The default order of resolution across rounds is:
- Vision, problem, users (rounds 1โ2)
- Functional requirements + non-goals (the bulk of rounds)
- Walking skeleton definition โ once functional requirements are clear, lock down what v1 strictly needs
- Architecture sketch โ only after functional requirements, since architecture follows behaviour
- Tech stack โ last, because tech choices follow architecture
Default to this order. It produces sturdier plans because tech decisions made before requirements tend to constrain the requirements to fit the tech, instead of the other way around.
Exceptions to override the order:
- The user has a hard tech constraint ("must run on KDE Plasma 6", "must be a Bun project") โ capture that in ยง6 Constraints upfront and let it bound the design from round 1.
- The user is exploring a tech idea ("I want to learn Rust by building X") โ tech is part of the goal, treat it as a constraint.
- A functional requirement is only feasible with a specific tech stack and the user is unaware โ surface this as a Challenge interaction.
- The user explicitly asks to start with tech.
Walking-skeleton bias
Every choice should pass through this filter: what's the smallest thing we could ship that proves this idea is real? That smallest thing is the walking skeleton, and it goes in ยง8 of the plan.
Apply the bias in three places:
- Functional requirements. When the user lists features, flag the ones that aren't strictly needed for v1 to feel useful. Move them to ยง11 Roadmap. The list of v1 features should make people slightly nervous about how short it is.
- Architecture. Prefer the boring shape. A single process > microservices. A flat file > a database, until proven otherwise. Synchronous code > async pipelines, when the throughput allows.
- Tech stack. Prefer one tool over many. Prefer the language/framework the team already knows. Prefer batteries-included over compose-your-own.
When you offer creative options, at least one of them should be the simplest thing that could possibly work, even if it feels embarrassing to suggest. The user can reject it, but they should see it on the table.
The bias does not mean "lower quality" โ it means "lower scope, then iterate". Polish what's in v1; defer what isn't.
Readiness percentage
Report readiness at the top of every round. The number is a rough estimate, not a precise score โ its job is to give the user a sense of momentum.
A workable rubric:
| Range | What it means |
|---|
| 0โ20% | Idea + a few facts. Most sections are [OPEN]. |
| 20โ40% | Vision, problem, users clear. Functional requirements partially listed. |
| 40โ60% | Functional requirements mostly [DECIDED]. Walking skeleton sketched. |
| 60โ80% | Architecture sketch in place. Tech stack mostly chosen. A handful of open questions remain. |
| 80โ95% | All sections [DECIDED] except minor opens. Plan would survive a code-review by a senior engineer. |
| 95โ100% | All [DECIDED], no open questions, decisions log explains the load-bearing choices. Ready to break into implementation tasks. |
Readiness can go down. That's healthy. When new information surfaces a question you hadn't asked, the plan got more honest, not worse. Say so out loud: "Readiness dropped from 45% to 38% because your answer about offline mode opened three new questions about sync conflict resolution. Good โ better to know now."
Whenever readiness changes, also tell the user what's blocking 100% โ a one-line summary of the biggest remaining unknowns. This lets them decide whether to keep going or stop early.
Stop conditions
Stop the loop and tell the user the plan is ready when any of these holds:
- Readiness reaches 100% (or close enough โ 95%+ with only minor opens the user is happy to defer to implementation time).
- The user says they're done, or asks you to stop, or asks you to switch to implementation.
- You've had three consecutive rounds where the user's answers haven't changed the plan in a meaningful way (you're going in circles โ call it out and ask what's missing).
When you stop, write one final summary message: a 2โ3 sentence recap of what got decided, where the plan lives on disk, and what (if anything) is still [OPEN] and explicitly deferred to implementation time.
Do not start writing code, scaffolding, or commit anything when the plan is ready. The user will take it from there.
Round template (use this as your output shape)
**Plan readiness: <X>%** (<+|โ><ฮ>% from last round)
*Plan saved to `<path>`.*
<1โ3 sentence summary of what changed in the plan this round and what's still blocking 100%.>
### Interaction 1 โ <Type>: <topic>
<framing>
1. **<name>** โ <description>. *Tradeoff:* <cost>.
2. **<name>** โ <description>. *Tradeoff:* <cost>.
3. **<name>** โ <description>. *Tradeoff:* <cost>.
4. Write your own.
### Interaction 2 โ <Type>: <topic>
...
### Interaction 3 โ <Type>: <topic>
...
Reply with picks like `1: 2, 2: my own, 3: skip` โ or just answer in prose.
Keep this output tight. The user is reading it carefully; padding it with preamble or trailing summaries makes the loop slower without making the plan better.
Worked micro-example (for shape, not content)
User: /plan-storm a tool that helps me track which open-source projects I should sponsor each month based on which ones I actually use
Round 1 output (abridged):
**Plan readiness: 15%** (initial draft)
*Plan saved to `plan/sponsor-tracker.md`.*
I captured what you said into a first draft: vision is "tell me which OSS projects to sponsor based on real usage", primary user is you, v1 unknown. Three big questions to nail down before tech.
### Interaction 1 โ Clarification: what counts as "usage"?
This shapes the entire data-collection story.
1. **Imports in your code** โ scan repos you push to GitHub for `package.json`/`requirements.txt` deps. *Tradeoff:* misses tools you use without coding.
2. **CLI invocations** โ install a shell hook that logs commands you run. *Tradeoff:* invasive, only catches CLI tools.
3. **Self-reported list you maintain** โ you tell the tool what you depend on; it just helps allocate budget. *Tradeoff:* you do the thinking, tool just does the math.
4. Write your own.
### Interaction 2 โ Creative idea: how does it deliver the recommendation?
1. **Monthly email** โ list + suggested $ split, you click to sponsor. *Tradeoff:* requires email infra, GitHub OAuth.
2. **CLI command `sponsor suggest`** โ prints a ranked list, you act manually. *Tradeoff:* zero infra, requires you to remember to run it.
3. **Dashboard** โ web UI showing usage trends and sponsor history. *Tradeoff:* most work to build.
4. Write your own.
### Interaction 3 โ Challenge: do you actually need a tool, or a 10-line script?
You said "tool", but if usage is self-reported and the recommendation is just "split your budget proportionally", a `sponsor.sh` plus a text file might do everything. Worth ruling out before we plan a real product.
1. **Yes, real tool** โ I want polish, history, multiple machines.
2. **No, script-grade is fine** โ let's plan a 1-evening version.
3. **Real tool eventually, but ship the script first** โ script becomes the walking skeleton.
4. Write your own.
Reply with picks like `1: 3, 2: 2, 3: 3` โ or just answer in prose.
Notice: three interactions, each three options + write-your-own, every option has a tradeoff, the third interaction is a genuine challenge to the framing.
Final guardrails
- Always re-read
plan.md from disk at the start of each round. The user may have edited it. The file beats your memory.
- Never write code or pseudo-code into the plan. Architecture lives at the whiteboard level.
- Never accept an answer that contradicts a stated constraint without challenging it first.
- Never skip the readiness number. It's the user's main signal of progress.
- Never run more than 3 interactions in one round. If you genuinely need more, defer to the next round.
- Never start implementing. When the plan is ready, hand off and stop.