Pin down the ask
before anything is built.
A vague request turns into a confident spec, and the spec is wrong. PM mode puts a short question round in front of the drafting. It fills in what it can from the request and the repo, then asks you only about the gaps that would change what gets built.
Check when the round runs
PM mode fires at Step 0.5 of whichever skill starts your workflow: /intake, /spec or /tdd. It runs before that skill opens its template, so the answers shape the first draft instead of correcting it later.
/triage decides whether it runs, and writes skip_brainstorm into .claude/state/workflow.json on every workflow. It sets the flag to true when your request already comes from a spec chapter, a roadmap, a backlog entry or an approved epic. It also sets true for fresh work that already names who is affected, when the problem shows up, and what should happen instead.
The flag reads false in one case: the request is genuinely unclear, and your answers would change what gets built. A workflow with no flag at all runs the round.
Answer the questions
Claude works out as much as it can before it asks you anything. It reads your request, the artifact triage cited, repo memory and the conversation so far, then fills in six fields.
A real role or person. "Users" is too broad to count.
When the problem shows up.
What happens today, as observed. Guesses stay out.
What should happen instead.
What this work leaves alone.
Solution-shaped verbs in your request: add X, use Y, refactor to.
A field it can fill with cited support is filled, and you never see a question about it. Only the gaps it cannot fill, and that would change the build, reach you. You get two rounds of those at most.
The questions stay off solutions. discipline.mjs scans each one before you see it. It catches solution verbs, library names such as Redis or PostgreSQL, and phrasing like "we could" or "I recommend". Anything it flags gets rewritten first.
Propose a solution yourself and it lands under solution_leakage. The questions keep working on the need behind it, because that is what the spec has to be right about.
Gaps still open after two rounds become open_questions in the brief, and travel with the work from there.
Confirm the brief
Claude reads the brief back to you and offers three answers: capture it, edit one section, or start over. Editing sends you back to the questions for that one field.
Say yes and it writes docs/brief/<slug>.md with the six fields in a fixed order. Your entry skill picks that file up as its main input, so each field flows into the matching section of the intake or spec.
actor who is affected trigger when it happens current_state what happens today desired_state what should happen non_goals what stays untouched solution_leakage solutions you proposed
Reject it five times in a row and the round stops and hands the work back to you.
If docs/brief/<slug>.md is already on disk for that slug, the round short-circuits and reads the existing file. Only the brief lasts. .claude/state/brainstorm/<slug>.json is scratch for picking a half-finished dialogue back up in a later session, and it is left out of the archive.
Skip the round
Put --no-brainstorm in your triage request and the round returns straight away. No question ever fires.
> /triage "your request --no-brainstorm"
Two tracks stay quiet on their own. chore and freeform have no /intake, /spec or /tdd step for the round to hook into, so it cannot fire there by design.
The skip path matches the behaviour the baseline had before PM mode existed, byte for byte. Opting out costs you the brief and nothing else.
Turn on engineer mode
PM mode captures what to build. Engineer mode captures how, and it ships off. Turn it on with --codesign on your triage request, or by setting codesign_mode in workflow.json yourself.
With it on, /spec Step 1.5 hunts for the technical calls your expertise should decide. A computer-vision approach, a model architecture, a numerical method, an IPC pattern. Claude names its pick for each one and gives you a short reason. Then it asks: approve that pick, offer your own, or talk the trade-off through.
Your words win. Override the pick and your reasoning goes into the spec's ## Decisions section as a blockquote, with the recorded choice being yours. spec-lint check #4 fails a spec that has engineer mode on and no ## Decisions heading. With the mode off, that check drops out of the report entirely.
Triage will suggest engineer mode when your request mentions one of a fixed set of words, among them cryptographic, consensus, realtime, kernel and algorithm design. It asks; the switch is yours to throw.
Each decision can come back around three times. Say /integrate fails later and the cause is the spec, Claude reopens the decision that caused it. The fourth pass on the same decision stops and asks for you.