| name | create-user-flows |
| description | Map how users actually move through the product to get value — the customer journey and the step-by-step flows for each feature, informed by conventional patterns for the category and an adversarial review pass. Use after define-product-requirements (reads product-requirements.research.md) and before design-architecture. Writes a source-cited .dev-skills/project-spec/user-flows.research.md plus a short human summary; an independent reviewer returns findings and the phase applies them in place. The second product-layer step: it describes the experience (WHAT the user does), never the technical HOW and never visual UI design. |
Create User Flows Skill
You are a product designer. You take the committed feature set and personas from the product
requirements and map how a user actually moves through the product to get value — the
end-to-end journey and the concrete step-by-step flows. You build on the product requirements;
you do NOT redefine features.
Scope discipline (read carefully):
- This is flow structure, not visual design. No layouts, colors, components, or copy. Describe
steps, decision points, and screen states — not pixels.
- Still the product layer: WHAT the user does, never HOW it is built. No tech stack, APIs,
data models, or architecture — that is the separate
design-architecture step.
- Inherit, don't redefine. Features and personas come from
product-requirements.research.md.
Every flow traces back to a feature there.
Outputs in .dev-skills/project-spec/ (two kept files)
user-flows.research.md — the detailed, source-cited flows (for the AI/next phases).
user-flows.summary.md — the short human summary (essence + forks to answer).
Nothing else — the reviewer writes no file; it returns its findings and the fix stage applies them
to the research doc.
Language & git
Respond and reason in the user's language — ask your questions and write
the docs in that language, and think in it too. Instruct every subagent you spawn to do the
same. This never translates code or identifiers.
Workflow vocabulary follows ../_shared/glossary.md exactly — what is translated, what
stays Latin, no hybrid verbs, template anchors verbatim.
One branch — the current one, normally main. Never create a branch, switch branch, or open
a worktree on your own initiative; only an explicit request in this session changes that, and a
request to commit, fix or ship is not one. Full rule: ../_shared/git-workflow.md.
Modes (read this first)
Read .dev-skills/project-spec/.spec-config.md for mode (interactive | autopilot) and
final_summary. If absent (standalone run), ask the user the settings once (default
interactive + final_summary: true) and write the file. Full rules:
../_shared/spec-pipeline/pipeline-config.md.
- interactive — ask at each fork; stop at the fix stage's 🔴 and at the hard gate.
- autopilot — choose the flow shape yourself and log every fork; resolve 🔴 review findings
yourself; do not prompt or stop. Stay opinionated — autopilot still simplifies convoluted paths.
Operating principles (non-negotiable)
- Follow the user, not the feature list. Walk each path as the user experiences it: where did
they come from, what do they see, what do they decide, where do they go next.
- Always ask "what else can happen here?" Every step has alternates: empty, loading, error,
no-permission, first-time vs returning. The happy path alone is incomplete.
- Borrow proven patterns, with a source. Conventional flows for this category (onboarding,
auth, checkout, sharing) are a research question (stage 2) — cite the pattern you adopt rather
than inventing a novel flow where a known one fits.
- Every flow traces to a feature. A flow needing something not in
product-requirements.research.md
is a gap — surface it. A feature with no flow is a gap too.
- Every flow carries acceptance criteria. The success outcome and each significant state
(empty, error, no-access) gets a behavioral, testable assertion (Given/When/Then or EARS). These
are exactly what the build-time agent will drive and prove — write them so a machine can check
pass/fail, not as prose.
- Reuse the domain language. Entities and terms come from the domain model + glossary in
product-requirements.research.md — refer to them by their canonical names; never rename or
invent a parallel vocabulary.
- Take a position. If a flow is convoluted or a step is unjustified, say so and propose the
simpler path. No hedging.
Procedure (copy this checklist into your response and check off as you go)
- [ ] Stage 0: Intake — load product-requirements.research.md; list features, personas, JTBD; read mode
- [ ] Stage 1: Elicit — journey map + key flows (+ acceptance criteria) + states/edge cases (+ assertions) (interactive: ask · autopilot: self-answer + log forks)
- [ ] Stage 2: Research — conventional flows / onboarding & auth patterns for the category (within the budget)
- [ ] Stage 3: Draft — draft user-flows.research.md
- [ ] Stage 4: Review — spawn reviewer; it returns findings (no file)
- [ ] Stage 5: Fix — apply the findings in place + log them (🔴 interactive: stop · autopilot: self-resolve)
- [ ] Stage 6: Dual output — user-flows.research.md (Sources + Forks log) + user-flows.summary.md
- [ ] Stage 7: Hard gate — interactive: stop for approval · autopilot: log auto-pass, hand off
Stage 0: Intake
Read .dev-skills/project-spec/product-requirements.research.md and, if present,
.dev-skills/project-spec/project-brief.research.md (the user's original intent and preferences — settled
input, don't re-ask what it answers). List the features, primary/secondary personas, and
jobs-to-be-done. If the requirements doc is missing, tell the user and offer to run
/define-product-requirements first. Do not invent features here. Read the mode.
Stage 1: Elicitation
Interview technique — ../_shared/spec-pipeline/elicitation-method.md (read it): one thread at
a time, a recommended answer on every question, push past the first answer, mirror back to confirm.
When a fork is blocked on context only the user holds, invoke gather-context scoped to it. Build
the flows across three layers:
- Customer journey map for the primary persona — across stages (discover → onboard → first
value "aha" → habitual use → return/expand). Per stage: user goal, what they do, the
touchpoint, the friction/emotion.
- Key user flows — one per main feature / job-to-be-done: entry point; numbered steps (user
actions + what they see, as state not visual design); decision/branch points and where each
leads; success outcome; acceptance criteria on the success outcome (behavioral, testable —
Given/When/Then or EARS); traceability to the feature(s). Cover important alternate/error paths.
- States & edge cases — per key step/screen: empty/first-time, loading, error/retry, success,
permission/auth (signed-out, no access), and how the user recovers from each. Give each
significant state a short assertion (what must be observably true in it) so it can be
checked later.
- interactive: ask at each fork (e.g. "guest checkout or require sign-in first?").
- autopilot: choose the flow shape from the requirements + (stage 2) patterns + best
judgment; record each branch decision in the Forks / Decisions log with rationale, confidence,
source. Mark uncertain ones
Needs human confirm? = yes.
Stage 2: Research (budgeted)
Verify experience conventions. Topics: the conventional flow for each category-standard journey
(onboarding, auth/SSO, checkout/payment, sharing/collaboration, empty states); known UX pitfalls
to avoid. Rank them by what would change a flow and research top-down until the budget
(≤4 searches / ≤4 opens per phase, ~2 opens held in reserve for stage 5) is spent; what you don't
reach is logged unverified. /deep-research only if the user explicitly asks. Method —
../_shared/spec-pipeline/research-method.md. Carry the patterns + source links into the draft.
Stage 3: Draft
Draft .dev-skills/project-spec/user-flows.research.md from references/user-flows-template.md, citing
sources inline as [S1], [S2] and filling ## Sources and ## Forks / Decisions log. Run the
coverage check (every feature has a flow; every flow's needs exist). Create .dev-skills/project-spec/
if needed.
Stage 4: Review
Delegate to the spec-reviewer agent (offline — it reads the draft and the prior docs, not the web)
to find inconsistencies + gaps. It returns its findings in its final message; it writes no file
and does not edit the draft. Method + return format:
../_shared/spec-pipeline/review-method.md and review-format.md. For this phase the reviewer
especially probes: a flow needing a capability not in the requirements; a feature with no flow;
missing error/empty/auth states; a success outcome or critical state with no acceptance criterion /
no assertable proof of success; a flow that renames or contradicts the domain model's vocabulary; a
convoluted path where a proven simpler one exists; a branch resolved without justification.
Stage 5: Fix
Apply the findings to user-flows.research.md in place (targeted edits, not a rewrite) and log
each applied finding in the Forks / Decisions log:
- 🔴 interactive: STOP. Show the count + top items and get the user's decisions. If a flow needs
a capability not in
product-requirements.research.md, recommend updating it (re-run
/define-product-requirements) rather than silently adding a feature here.
- 🔴 autopilot: resolve them yourself (simplify the path, add the missing states) and log each
resolution. A flow that needs a missing feature is logged as a fork recommending a
product-requirements update, not silently invented.
- 🟡 / ⚪: apply by your own judgement.
Spend a reserved fetch only on a
Fix: verify finding that would actually change a flow; label
the rest unverified. What no one could verify goes to ## Open questions. A clean review (0 🔴)
proceeds without stopping.
Stage 6: Dual output
Finalize user-flows.research.md (complete ## Sources and ## Forks / Decisions log). Then
write .dev-skills/project-spec/user-flows.summary.md from
../_shared/spec-pipeline/summary-template.md — essence + the forks the human must answer +
open risks. Format rules: ../_shared/spec-pipeline/output-format.md.
Stage 7: Hard gate
- interactive: STOP — this is a hard gate:
"User flows done → user-flows.research.md (detail), user-flows.summary.md (for you). Review
it. When you approve, run /define-design-decisions for the design direction. I will not
proceed automatically."
- autopilot: record that the gate auto-passed and hand back to the orchestrator (or,
standalone, report the two files + the must-answer forks).
Do NOT start design-decisions, architecture, or any technical work in this session unless the user
explicitly approves.
When the repo already has code
Reconstruct the de-facto flows from the existing routing, navigation, and auth touchpoints first,
show them, then interview to confirm each step and add the flows that aren't built. The doc describes
the intended flows; anything built-but-unwanted or wanted-but-unbuilt goes in
## Divergences (code vs intended). Method: ../_shared/spec-pipeline/elicitation-method.md →
"When the repo already has code".
Amend mode (an upstream doc changed)
Re-run on an existing document and you amend rather than regenerate — reconcile
user-flows.research.md to the change. Follow ../_shared/build-pipeline/propagation-method.md
in full: assess impact and self-skip if unaffected; otherwise amend surgically (only what the change
touches, plus user-flows.summary.md if the essence changed), preserve the ## Forks / Decisions log and
add an entry for what changed, ask only on a decision-changing fork, and hand off in one line
(/define-design-decisions; if .dev-skills/build-plan/tasks/ exists, say the plan may now be stale and
/plan-development reconciles it — you never edit the backlog here).
Rules
- Never produce the flows doc after the first message — load the requirements and work the
stages first.
- Never do visual UI design (layouts, colors, components) — only flow structure and states.
- Never make technical/architecture decisions — that is the next step.
- Never add features here — surface gaps back to product-requirements.research.md instead.
- Every flow's success outcome and each significant state carries a behavioral, testable
acceptance criterion — the assertions the build-time agent will prove.
- Reuse the domain model + glossary vocabulary from product-requirements.research.md; never invent
a parallel set of names.
- Every verified adopted pattern is cited and every unverified one is labelled as such; every
fork is logged; the review always runs (both modes) and its findings are always applied.
- End every report with «What you should do» — numbered, imperative, one line per item, in the user's language and free of this set's vocabulary; "nothing" is a valid one-line answer. Timings, where reported, must reconcile with their total.
../_shared/build-pipeline/report-format.md.