Added
-
/craftsman:discover <vague idea>: a requirements-discovery interview that turns an
underspecified request into a numbered, testable spec. It exists because the shallow end of
ideation-firstwas the only option — 3–5 questions and a three-line brief, with no way to invoke
it deliberately, so a substantially open request ("build a notifications system") got the same
treatment as a merely fuzzy one.The work is split across two surfaces because of a hard constraint: a subagent cannot conduct an
interview. It receives one cold prompt and returns one result, which is whyorchestratoralready
has to bounce underspecified features back to its caller. So the interview runs in the main thread
as a command, and only the half a subagent is genuinely good at — reading the codebase — is
delegated. -
requirements-analystagent (read-only: Read/Glob/Grep, Opus): drafts the clarifying questions a
request leaves unanswered, grounded in prior art and existing abstractions rather than a generic
checklist. Every question carries afile:lineor an explicit "gap" label, plus an assumption
default so the interview never stalls on a declined question; questions the code already settles
come back as constraints instead. Capped at 10–20 questions — past that, it is asking things the
codebase already answers. It never asks the user anything itself and never writes files.
Changed
-
ideation-first: now runs at two depths. Quick is unchanged and still the default (3–5
questions, one per turn, Scope brief). Deep grounds 10–20 questions in the analyst's dossier and
asks them in 3–4 sequenced rounds of 2–4 questions viaAskUserQuestion— a deliberate
divergence from the one-question-per-turn rule, which is right for five questions and punishing for
fifteen. What the rule actually protects is that later questions adapt to earlier answers, and
sequenced rounds preserve that; batching all fifteen at once does not.Deep mode ends by writing a numbered requirements spec (
R1,R2, … each with an acceptance
criterion, sotesterandreviewercan trace coverage back to a requirement) at
docs/requirements/<slug>.md— proposed, shown in full, and written only on confirmation, per the
same ask-before-writing rule/craftsman:initfollows. The Scope brief is still emitted inline
at both depths and remains the machine handoff the planner and the orchestrator's ideation gate
consume; the spec file is additive, and the brief gained aSpec:line pointing at it.New explicit rule: expand the questions, bound the scope. Deep mode raises error states, empty
states, migration, and offline behavior — then still recommends the smallest build that satisfies
the request, with everything surfaced but unagreed recorded under Out of scope. A deep interview
that ends with a bigger scope than a quick one has failed; it should end with the same scope, held
with more confidence and a longer out-of-scope list. Without this, deep mode would have quietly
contradictedsmallest-change-first. -
orchestrator: the ideation gate now accepts either an inline Scope brief or a path to a
requirements spec, and instructs the planner to read the spec when one is named. Availability table
gainsrequirements-analyst. -
/craftsman:orchestrate: the ideation-gate step routes substantially open requests to deep mode
rather than a three-line brief. -
userpromptsubmit-task-router: the feature-shaped nudge names/craftsman:discoverfor
substantially open requests. Still one nudge per prompt; no newcasebranch.
Fixed
session-startannounced "Seven skills" and "Five commands" — both already wrong before this
release (8 and 6), and both invisible to CI: the count validator skips any line containing
"commands" when checking skills, and only matches the literal phrase "N slash commands" for
commands. The whole reminder is a single line, so both slipped through every check. The skill list
was also missingui-craftand the command list was missing/craftsman:orchestrate— a session
therefore started without being told two components existed.