Help us improve
Share bugs, ideas, or general feedback.
From leyline
Use when the human partner asks to build, add, change, or modify anything (features, components, functionality, behavior). Explores intent, requirements, and design before implementation. Hard-gated; nothing implements until the human partner approves the written product spec.
npx claudepluginhub forsonny/leyline --plugin leylineHow this skill is triggered — by the user, by Claude, or both
Slash command
/leyline:brainstormingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> I'm using the brainstorming skill to produce a product spec before any implementation. No code, no scaffolding, no implementation skill runs until you approve the written spec.
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
I'm using the brainstorming skill to produce a product spec before any implementation. No code, no scaffolding, no implementation skill runs until you approve the written spec.
Do NOT invoke any implementation skill, write any code, scaffold any project, or take
any implementation action until you have presented a product spec and the human partner
has approved it. This applies to EVERY project regardless of perceived simplicity.
Violating the letter of the rules is violating the spirit of the rules.
"Simple" projects are where unexamined assumptions cause the most wasted work. The cost of a 10-minute spec is one tenth of the cost of throwing away a half-built feature that solved the wrong problem. Skipping the gate to "save time" is the dominant failure mode for agents under pressure.
digraph when_to_use {
"Human partner: 'let's build X' / 'add Y' / 'make Z'" [shape=doublecircle];
"Spec already exists and approved?" [shape=diamond];
"Tiny tweak with no behavior change?" [shape=diamond];
"Use brainstorming" [shape=box];
"Skip to writing-plans" [shape=box];
"Make the change directly" [shape=box];
"Human partner: 'let's build X' / 'add Y' / 'make Z'" -> "Spec already exists and approved?";
"Spec already exists and approved?" -> "Skip to writing-plans" [label="yes"];
"Spec already exists and approved?" -> "Tiny tweak with no behavior change?" [label="no"];
"Tiny tweak with no behavior change?" -> "Make the change directly" [label="yes - typo, formatting, comment"];
"Tiny tweak with no behavior change?" -> "Use brainstorming" [label="no"];
}
The "tiny tweak" exit applies only to changes a code reviewer would not flag. Anything that adds, removes, or alters behavior goes through brainstorming.
digraph brainstorming_flow {
Start [shape=doublecircle, label="Triggered by 'let's build X'"];
Explore [shape=box, label="1. Explore project context"];
Visual [shape=diamond, label="2. Visual companion useful?"];
OfferVisual [shape=box, label="2a. Offer visual companion (own message)"];
Clarify [shape=box, label="3. Ask clarifying questions one at a time"];
Scope [shape=diamond, label="4. Scope: independent subsystems?"];
Decompose [shape=box, label="4a. Decompose; spec the first piece"];
Approaches [shape=box, label="5. Propose 2-3 approaches with trade-offs and a recommendation"];
Surfaces [shape=box, label="6. Surface scan; declare Surfaces field"];
Present [shape=box, label="7. Present spec in sections; approval per section"];
WriteSpec [shape=box, label="8. Write docs/leyline/specs/YYYY-MM-DD-<topic>-design.md and commit"];
SelfReview [shape=box, label="9. Spec self-review; fix placeholders, contradictions, ambiguity"];
HumanReview [shape=diamond, label="10. Human partner approves?"];
Revise [shape=box, label="Revise sections the human partner rejected; re-present"];
HasSurfaces [shape=diamond, label="11. Surfaces != none?"];
InvokeUX [shape=box, label="Invoke design-brainstorming (1b)"];
InvokeDeep [shape=box, label="Invoke deep-discovery (2a)"];
End [shape=doublecircle, label="Successor named"];
Start -> Explore -> Visual;
Visual -> OfferVisual [label="yes"];
Visual -> Clarify [label="no"];
OfferVisual -> Clarify;
Clarify -> Scope;
Scope -> Decompose [label="yes"];
Scope -> Approaches [label="no"];
Decompose -> Approaches;
Approaches -> Surfaces -> Present -> WriteSpec -> SelfReview -> HumanReview;
HumanReview -> Revise [label="no, revise"];
Revise -> Present;
HumanReview -> HasSurfaces [label="yes, approved"];
HasSurfaces -> InvokeUX [label="yes"];
HasSurfaces -> InvokeDeep [label="no, Surfaces: none"];
InvokeUX -> End;
InvokeDeep -> End;
}
Create one task entry (TodoWrite or harness equivalent) per item. Mark complete as you go.
Explore project context - read top-level files, recent commits, the relevant directory structure. Identify constraints already encoded in the codebase before proposing anything.
Offer visual companion - if the question involves layout, flow, or geometry, offer to attach a visual companion (visual-companion.md). Send the offer as its own message; do not combine it with a clarifying question. Wait for the human partner's answer before step 3.
Ask clarifying questions one at a time - never batch. Each question targets purpose, constraint, or success criteria. Wait for the answer before the next question.
Scope check - if the request decomposes into independent subsystems (different data models, different lifecycles, different audiences), say so and propose specing the first piece only. Do not silently widen scope.
Propose 2-3 approaches - for each: one-paragraph description, trade-offs (cost / risk / fit / reversibility), and a clear recommendation. Do not propose only the recommended one.
Surface scan - declare Surfaces (one of: none, developer-facing, cli-only, single-screen-ui, multi-screen-ui, cross-platform). Default multi-screen-ui. Anything other than the default requires active justification in the spec. Most "no UI" projects are developer-facing, not none. See ../../dev/reference/surface-types.md for per-type definitions.
Present spec in sections - tailored to complexity. Get explicit approval per section ("Approved? Y/N") before moving on.
Write the spec doc - save to docs/leyline/specs/YYYY-MM-DD-<topic>-design.md and commit it. The required Surfaces field appears in the doc verbatim.
Spec self-review - read your own document. Fix placeholders ("TODO", "TBD"), resolve contradictions, replace vague phrases. Use the spec-document-reviewer-prompt.md template if dispatching a reviewer subagent.
Human partner reviews the written spec - present the document. Wait for approval. Do not advance until approval is explicit. Once the human partner says approved, append the verbatim approval marker to the spec's front matter or a "Approvals" subsection so downstream stages can grep for it without relying on session state:
Product spec approved - round <N> - YYYY-MM-DD
Commit the spec with the marker line included.
Transition - if Surfaces is anything other than none, announce and invoke design-brainstorming (stage 1b). Otherwise, announce and invoke deep-discovery (stage 2a).
Every product spec must contain this field, verbatim, with one value chosen:
Surfaces: [none | developer-facing | cli-only | single-screen-ui | multi-screen-ui | cross-platform]
See ../../dev/reference/surface-types.md for full per-type definitions and triggering rules.
# <Topic> - product spec
Date: YYYY-MM-DD
Author: <human partner name or handle>
Surfaces: <one value>
## Problem
<one paragraph: what problem this solves and for whom>
## Goals
- <observable outcome 1>
- <observable outcome 2>
## Non-goals
- <thing this is explicitly not addressing>
## Constraints
- <technical, organizational, regulatory, or timeline constraints>
## Approaches considered
### Approach A - <short name>
<one paragraph>
Trade-offs: <cost / risk / fit / reversibility>
### Approach B - <short name>
<one paragraph>
Trade-offs: ...
(2-3 approaches total)
## Recommendation
<which approach, and why>
## Open questions
- <questions surfaced during clarification but not yet answered>
## Success criteria
- <how we know this is done>
none is for purely internal computations with zero observable output.| Thought | Reality |
|---|---|
| "I already know what they want" | Then writing it down takes 90 seconds. Do it. |
| "We can iterate after we see code" | Iteration on the wrong thing is rework, not progress. |
| "The request is too small for a spec" | Small requests are where assumptions hide. |
| "Just let me start coding to explore" | Exploration in code is hard to throw away; exploration in prose is free. |
| "I'll add the Surfaces field later" | Later means never. Declare it before approval. |
| "The product spec covers UX too" | No - product spec says what; UX spec says how it's experienced. They are different artifacts. |
| "I asked five questions, that's enough clarification" | The right number is the number that resolves ambiguity, not five. |
| "The human partner is busy, I'll just decide" | Then say so out loud and ask explicitly for permission to decide. Never silently. |
Before any of the following sentences leaves your reply, stop:
Each is the brainstorming hard gate being violated. Re-enter the checklist at step 1.
Do not say:
docs/leyline/specs/YYYY-MM-DD-<topic>-design.md committed to the repo.skills/brainstorming/:
spec-document-reviewer-prompt.md - prompt template for dispatching a reviewer subagent at step 9visual-companion.md - guidance for offering and constructing a visual companionIf Surfaces is anything other than none:
Invoking design-brainstorming (stage 1b). The product spec is approved; the UX spec is the next gate.
If Surfaces is none:
Invoking deep-discovery (stage 2a). The product spec is approved and there are no user-facing surfaces; pressure-testing the spec next.
If the named successor skill (design-brainstorming or deep-discovery) is not present in this version of the plugin, STOP. Tell the human partner the pipeline is incomplete and which skill is missing. Do not improvise the missing stage; do not skip ahead to a later successor. A pipeline that silently skips a gate is worse than one that visibly halts.
Do not exit without naming and invoking the named successor.