Use when exploring a new idea before writing formal specifications. Guides users through iterative discovery, research, and critical analysis to crystallize vague ideas into validated requirement drafts. Includes anti-pseudo-requirement checks, competitive research, demand evidence gathering, and "What if we don't build this?" analysis. Supports pause/resume across sessions, stores ideas in the project's ideas/ directory, and graduates validated ideas into the spec-forge document chain (/prd → /srs → /tech-design → /test-plan).
Guides iterative idea exploration and demand validation through research and critical analysis before formal specification.
npx claudepluginhub tercel/spec-forgeThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Explore, research, validate, and crystallize ideas through iterative sessions before committing to formal specification. Every idea must prove it's a real need before graduating.
ideas/ directory, close to the codebase and docs they relate to
ideas/is a top-level directory at the project root, separate fromdocs/. Never nest it insidedocs/.
{project-root}/
├── ideas/ # Brainstorming workspace (TOP-LEVEL, not under docs/)
│ ├── {idea-name}/
│ │ ├── state.json # Status, metadata, and validation checklist
│ │ ├── sessions/
│ │ │ ├── overview.md # Session index: chronological order, summaries
│ │ │ ├── explore-initial-spark.md # First session
│ │ │ ├── research-competitors.md # Second session
│ │ │ ├── validate-demand.md # Third session
│ │ │ └── ...
│ │ ├── research/
│ │ │ ├── competitors.md # Competitive landscape analysis
│ │ │ └── market-notes.md # Market research, user evidence, data points
│ │ └── draft.md # Evolving summary (auto-updated after each session)
│ └── ...
├── docs/ # Formal spec documents (PRD, SRS, etc.)
└── .gitignore # Add "ideas/" if you want to keep them private
On first run, if ideas/ does not exist, ask the user:
Each return session, the user chooses a focus. The idea matures through these phases:
| Phase | Focus | Key Activities |
|---|---|---|
| Explore | Diverge, discover | Brainstorm, free association, "what if" thinking |
| Research | Investigate, evidence | Competitive analysis, market research, user pain points |
| Validate | Challenge, prove | Anti-pseudo-requirement checks, demand evidence, feasibility |
| Refine | Converge, sharpen | MVP scope, success criteria, draft polishing |
Phases are not strictly sequential — users can revisit any phase at any time. But an idea cannot reach ready status without completing the Validate phase.
Each idea maintains a sessions/overview.md that tracks all sessions in chronological order. This file is the single source of truth for session ordering — filenames do NOT encode sequence.
Create this file when the first session is recorded. Update it after every subsequent session.
# Session Overview — {idea-name}
> Chronological index of brainstorming sessions.
> Updated: {date}
## Sessions
| # | Session | Type | Date | Summary |
|---|---------|------|------|---------|
| 1 | [explore-initial-spark](./explore-initial-spark.md) | Explore | {date} | {one-line summary} |
| 2 | [research-competitors](./research-competitors.md) | Research | {date} | {one-line summary} |
| 3 | [validate-demand](./validate-demand.md) | Validate | {date} | {one-line summary} |
| ... | ... | ... | ... | ... |
Rules:
# column is the chronological order (for human readability only — NOT part of the filename)IMPORTANT: ideas/ MUST be at the project root — the same level as docs/, NOT inside it.
{project-root}/ideas/{project-root}/docs/ideas/Check if ideas/ exists in the project root. If not:
ideas/ directory at the project rootideas/ to .gitignoreExtract idea name from arguments. Convert to kebab-case.
If no name provided, list existing ideas:
Your Ideas:
# | Idea | Status | Validated | Sessions | Last Updated
1 | cool-feature | refining | Yes | 5 | 2026-02-10
2 | payment-system | exploring | No | 1 | 2026-02-14
3 | ai-assistant | ready | Yes | 7 | 2026-02-12
Actions:
Enter a number to resume that idea
Enter a new name to start brainstorming
Use AskUserQuestion to let the user choose.
Check if ideas/{idea-name}/ exists:
New idea (directory doesn't exist):
state.json, sessions/, research/, draft.mdstate.json:
{
"idea": "{idea-name}",
"status": "exploring",
"created": "{ISO timestamp}",
"updated": "{ISO timestamp}",
"session_count": 0,
"draft_version": 0,
"validation": {
"problem_evidence": null,
"demand_evidence": null,
"competitive_analysis": false,
"not_build_analysis": null,
"validated": false
}
}
Existing idea:
state.jsonstatus is graduated: inform user this idea has already moved to formal specs, ask if they want to start a new variantstatus is ready: ask if they want to continue refining, or graduate nowstatus is exploring, researching, or refining: read draft.md to restore context, proceed to Step 3 (Continue Session)This is the first session for a brand new idea. The goal is to understand the user's raw thinking AND begin planting seeds of critical analysis.
Use AskUserQuestion with open questions. Ask 2-3 at a time, adapt follow-ups based on answers.
Round 1 — The Spark:
Round 2 — The Problem:
Round 3 — The Landscape:
Round 4 — The Shape:
Do NOT force answers. If the user says "I don't know yet" — record it as an open question that needs research.
Based on the user's answers, provide an honest initial assessment:
Initial Demand Signal:
Problem clarity: [Clear / Vague / Unknown]
Evidence of demand: [Strong / Weak / None yet]
Existing solutions: [None / Inadequate / Good (risk!)]
Differentiation: [Clear / Unclear / Not yet defined]
Suggested next session focus: [Research / Explore more / Validate]
Be honest. If the idea sounds like a solution looking for a problem, say so gently:
"The idea is interesting, but I notice we haven't identified who specifically suffers from this problem. In a future session, it would help to research concrete user pain points."
Write the session to ideas/{idea-name}/sessions/{type}-{slug}.md (e.g., explore-initial-spark.md):
Session filename rules:
{session-type}-{brief-slug}.md where type is one of: explore, research, validate, refineinitial-spark, competitors, demand-check, mvp-scope)001.md, 002.md, etc.) — chronological order is tracked in sessions/overview.mdexplore-initial-spark.md, explore-new-angles.mdSession filename:
# Session 1 — {date}
## Type: Exploration
## Context
{Where this idea came from, what triggered it}
## Key Points
- {Bullet points of main ideas discussed}
## Problem Definition
- **Who suffers**: {who}
- **How they suffer**: {pain description}
- **Current workaround**: {what they do today}
## Demand Signal
- Problem clarity: {Clear/Vague/Unknown}
- Evidence: {what evidence exists or is needed}
## Decisions
- {Any decisions made, even tentative ones}
## Open Questions
- {Things still uncertain or needing research}
## Research Needed
- {Specific research tasks identified for next session}
## Raw Notes
{Full Q&A exchange, preserving the user's original words}
Create draft.md:
# {Idea Name}
> Status: Exploring | Draft v1 | {date}
## One-Liner
{One sentence description}
## Problem
{What problem this solves — be specific about who suffers and how}
## Target Users
{Who would use this — be specific, not "everyone"}
## Core Concept
{How it would work at a high level}
## Existing Solutions & Gaps
{What exists today, why it's insufficient}
## MVP Scope
{Simplest useful version — or "not yet defined"}
## Demand Validation Status
- [ ] Problem backed by evidence (not just assumption)
- [ ] Target users identified and reachable
- [ ] Existing solutions analyzed (competitors, workarounds)
- [ ] "What if we don't build this?" answered convincingly
- [ ] At least one form of demand evidence (user complaints, data, research)
## Open Questions
- {List of unresolved questions}
## Research Backlog
- {Things to investigate in future sessions}
## Session History
- [{date}] explore-initial-spark — {one-line summary}
Update state.json: session_count: 1, updated: now, draft_version: 1
Display:
Idea saved: {idea-name}
Location: ideas/{idea-name}/
Status: exploring
Sessions: 1
Validated: No
Suggested next session: {Research / Continue exploring}
/spec-forge:idea {idea-name}
When validated and ready:
/spec-forge {idea-name} Start full spec chain
The user is returning to an existing idea.
Read draft.md and display a concise summary:
Resuming idea: {idea-name}
Status: {status} | {session_count} sessions | Last: {last_date}
Validated: {Yes/No}
Current summary:
{One-liner from draft.md}
Validation status:
[x] Problem backed by evidence
[ ] Competitive analysis done
[ ] "What if we don't build this?" answered
...
Open questions:
- {question 1}
- {question 2}
Research backlog:
- {research item 1}
Use AskUserQuestion:
Open-ended brainstorming, similar to Step 2 but adaptive:
Record as new session. Update draft.md with new insights.
This is where the idea gets grounded in reality. Use WebSearch and critical analysis.
Use WebSearch to research:
For each competitor found, analyze:
Write findings to research/competitors.md:
# Competitive Analysis — {idea-name}
> Last updated: {date}
## Direct Competitors
### {Competitor 1}
- **What they do**: ...
- **Strengths**: ...
- **Weaknesses**: ...
- **Why we're different**: ...
## Indirect Competitors / Workarounds
### {Alternative approach}
- ...
## Key Takeaway
{Is there a real gap in the market? Or is this already well-served?}
Use WebSearch to find:
Write findings to research/market-notes.md.
Ask the user:
Be rigorous: "I think users want this" is not evidence. Evidence is:
Record all findings in the session file. Update draft.md with research results. Update state.json validation fields. Change status to researching if not already.
The critical session that separates real needs from pseudo-requirements.
Run through the Demand Validation Checklist with the user:
"What concrete evidence do we have that this problem exists and is painful enough to justify a solution?"
Rate: Strong (data, user quotes, patterns) / Moderate (anecdotes, logical reasoning) / Weak (assumption only)
If Weak: flag it. "This is still an assumption. Before going further, we need to find evidence. What's the cheapest way to validate this?"
"Imagine we decide not to build this. What happens?"
Possible answers and their implications:
"Can you name 3-5 specific people (or specific types of people) who would use this in the first week?"
If the user cannot name concrete early adopters, the target user definition is too vague.
"If a user is already using {competitor/workaround}, why would they switch to this?"
Switching cost is real. The new solution must be significantly better, not just slightly different.
"Can you explain what this does in one sentence to someone outside the industry?"
If not, the concept may be too complex or poorly defined.
After all checks, provide an honest assessment:
Validation Summary:
Problem evidence: [Strong / Moderate / Weak]
"Not build" impact: [Significant / Moderate / Low]
Target users: [Concrete / Vague]
Differentiation: [Clear / Unclear]
Simplicity: [Pass / Needs work]
Overall: [VALIDATED / NEEDS WORK / NOT VALIDATED]
VALIDATED: All checks pass with at least Moderate strength → idea can proceed to ready
NEEDS WORK: Some checks are Weak → specific guidance on what to research or rethink next
NOT VALIDATED: Core checks fail (no problem evidence, no impact if not built) → honest conversation:
"Based on our analysis, this idea doesn't yet have strong evidence of real demand. That doesn't mean it's a bad idea — it means it needs more validation before committing resources to formal specification. Here's what I suggest..."
Update state.json validation fields and draft.md.
Available only after validation passes. Shift to convergent thinking:
draft.md with the user/spec-forge:prdUpdate draft.md to a polished version. Change status to refining.
When the draft has:
→ Suggest changing status to ready.
Pre-graduation check: Verify validation.validated is true in state.json. If not:
"This idea hasn't completed demand validation yet. Graduating without validation risks building something nobody needs. Would you like to run a validation session first, or graduate anyway (not recommended)?"
If user insists on graduating without validation, record it in state:
{ "validation": { "validated": false, "graduated_without_validation": true } }
If validated, update state.json:
{ "status": "ready" }
Display:
Idea '{idea-name}' is ready for formal specification!
Validation: Passed
Draft: ideas/{idea-name}/draft.md
To start the spec chain:
/spec-forge {idea-name} Full chain (PRD -> SRS -> Tech Design -> Test Plan)
/spec-forge:prd {idea-name} PRD only
Note: The actual graduated status is set by the /spec-forge chain command after it successfully generates the PRD.
Update state.json timestamp only. Display:
Idea '{idea-name}' parked.
Everything is saved. Come back anytime:
/spec-forge:idea {idea-name}
sessions/{type}-{slug}.md (use session type + descriptive slug, NOT sequential numbers)sessions/overview.md to append the new session entry (see Session Overview below)draft.md with any new contentresearch/ files if research was conductedstate.json: session_count, updated, draft_version, status, validation| Status | Meaning |
|---|---|
exploring | Early stage, divergent thinking, brainstorming |
researching | Investigating market, competitors, user needs |
refining | Direction clear and validated, converging on specifics |
ready | Validated and ready for formal specification |
graduated | PRD has been generated from this idea |
parked | Intentionally set aside, can resume anytime |
An idea cannot reach ready status without these being addressed:
ideas/ directory. Users can add ideas/ to .gitignore for privacy, or commit for team collaboration.{type}-{slug}.md. Never overwrite or merge sessions — they are the historical record of how the idea evolved. Chronological order is tracked in sessions/overview.md, not in filenames.research/ directory preserves competitive analysis and market research. This data feeds directly into the PRD's market analysis and competitive sections.draft.md is the living document that evolves. Old versions are implicitly preserved in the session history.