| name | wtf.design-feature |
| description | This skill should be used when a designer wants to produce a holistic design for a full feature before it is broken into tasks โ for example "design feature |
Design Feature
Pick up a Feature as a designer and produce a holistic design covering the full user journey before tasks are cut. Core value: maps every user story to screens and states, identifies shared components across the feature, and writes a complete Design Handoff back into the Feature issue โ so wtf.feature-to-tasks can derive better tasks and wtf.design-task inherits feature-level decisions rather than reinventing them.
Process
0. GitHub CLI setup
Run steps 1โ2 of ../references/gh-setup.md (install check and auth check). Stop if gh is not installed or not authenticated. Extensions are not required for this skill.
Skip this step if invoked from another skill that already ran gh-setup this session.
1. Identify the Feature
If the user provided an issue number in their request, use it directly. Otherwise call AskUserQuestion (per ../references/questioning-style.md):
- question: "Which Feature are you designing?"
- header: "Feature"
- options: from recent open issues labeled
feature
Walk Feature โ Epic per ../references/spec-hierarchy.md to extract user stories, ACs, Edge Cases, Domain Events (Feature) and Goal, Context, Design Artifacts (Epic โ strategic input).
Extract and hold in context:
- Feature capability name (Actor + verb + object)
- All user stories
- All Acceptance Criteria
- Edge Cases
- Domain Events (emitted/consumed)
- Epic's Design Artifacts (any Figma links or research docs โ these are upstream constraints)
2. Lifecycle check
Apply the present-label overwrite gate from ../references/lifecycle-labels.md for the designed label on the Feature โ output is "Design Handoff", re-run verb is "Redesign". If absent, continue silently.
3. Load the design steering document
Load docs/steering/DESIGN.md per the strict consumer-side load in ../references/steering-doc-process.md (recommended skill: wtf.steer-design). Apply its design principles, tokens, component patterns, and accessibility standards silently throughout this session.
4. Explore the design system and codebase
Use the Agent tool with these searches (run in parallel):
Glob('src/components/**/*', 'src/**/components/**/*', 'components/**/*') โ existing UI components; flag any that map to domain objects in this Feature's user stories
Glob('**/{tokens,theme,variables,design-tokens}.{css,scss,ts,js,json}') โ design tokens
Glob('src/**/*.{stories,story}.{ts,tsx,js,jsx,mdx}') โ Storybook stories as pattern references for similar flows
Grep for figma.com URLs across .md, .mdx files โ existing Figma references in related issues or docs
Note which existing components can be reused vs which are new. This feeds step 7.
5. Map the full user journey
For each user story ("As a [Actor], I want [action] so that [outcome]"), derive:
- Entry point โ what triggers this story? (screen, action, event)
- Happy path screens โ ordered list of screens/states the actor moves through
- Branch states โ loading, error, empty, partial data, permission denied
- Exit point โ what confirms the story is complete for the actor?
Also map:
- Cross-story transitions โ screens shared between multiple user stories
- Edge case screens โ one screen per Edge Case from the Feature issue
- Domain Event surfaces โ where in the UI does each emitted Domain Event become visible to the actor?
Produce a journey map as a structured list โ do not ask the user, derive from user stories and ACs.
6. Ask about design assets
Call AskUserQuestion (per ../references/questioning-style.md):
- question: "How would you like to handle designs for this feature?"
- header: "Design assets"
- options:
- I have Figma frames โ provide frame URLs; I'll validate coverage against the full journey map (Path A)
- Generate designs for me โ use Figma MCP to generate frames from the user stories and design system (Path B)
- Scaffold a brief only โ no Figma; produce a text screen inventory and component map (Path C)
- Partial โ some screens designed โ provide available frames; remaining screens go to generate or scaffold
Path A โ Human provides frames:
Collect the top-level Figma file URL plus individual frame URLs. For each screen in the journey map (step 5), check whether a frame covers it. Present a coverage matrix: screen โ frame URL (or โ gap). If gaps exist, call AskUserQuestion (per ../references/questioning-style.md):
- question: "How should I handle the uncovered screens?"
- header: "Gaps"
- options:
- Generate missing frames โ run Path B for the gaps
- Leave as pending โ record gaps in the Design Handoff and continue
Also validate provided frames against spec:
- Every user story has at least one matching frame
- Every edge case from the Feature issue has a matching error/boundary state frame
- Every Domain Event surface identified in step 5 is represented
Flag any validation failures as gaps in the coverage matrix.
Path B โ AI generates via Figma MCP:
Check whether the Figma MCP tool generate_figma_design is available. If unavailable, warn the user and fall back to Path C (scaffold).
If available: for each screen in the journey map without a frame, call generate_figma_design with:
- The screen's user story and entry/exit points as the design brief
- Component patterns and tokens from
docs/steering/DESIGN.md (loaded in step 3)
- Shared components identified in step 7 as reuse constraints
- Any Figma URLs from the Epic's Design Artifacts as style reference
Collect the generated frame URLs and treat them as Path A frames for the coverage matrix and Design Handoff.
Path C โ Scaffold brief only:
For each screen in the journey map, produce a text brief listing required UI elements, interactions, and relevant design tokens. This is a Figma-free design brief a designer or developer can execute against. Use references/component-spec-template.md as the structure if available.
Partial:
Collect available frame URLs, run Path A validation on covered screens. For uncovered screens, call AskUserQuestion (per ../references/questioning-style.md):
- question: "How should I handle the remaining screens?"
- header: "Remainder"
- options:
- Generate โ run Path B
- Scaffold โ run Path C
7. Identify shared components
Across all screens in the journey map, identify:
- Reused existing components โ already in the codebase (found in step 4); list component path + which screens use it
- New shared components โ appear on 2+ screens but do not exist yet; name them using domain language
- Screen-specific components โ appear on only one screen; note them but do not detail here (that is
wtf.design-task's job)
This component map reduces duplication when wtf.design-task runs per-task.
8. Draft the Design Handoff
Produce content for the Design Handoff section of the Feature issue. Use the structure in references/design-handoff-template.md.
9. Review with user
Show the draft. Then call AskUserQuestion (per ../references/questioning-style.md):
- question: "Does this cover the full feature journey?"
- header: "Review"
- options:
- Looks complete โ update the issue โ proceed
- Missing screens or states โ add coverage
- Other changes โ adjust something else
Apply edits, then proceed.
10. Update the Feature issue
Read the current body with the gh body helper, replace only the Design Handoff section with the new content (Read + Edit tools), preserve all other sections. See ../references/gh-body-helper.md:
python3 .wtf/gh-body.py read <feature_number>
python3 .wtf/gh-body.py edit <feature_number> --body-file "<path-from-read>"
Add the designed label when either:
- Path A/B: all screens in the journey map have Figma frames (no open gaps in coverage matrix), or
- Path C: the full scaffold brief is complete (no Figma expected)
gh issue edit <feature_number> --add-label "designed"
If Path A/B has open gaps, do not add designed โ note it will be added once gaps are closed.
This fulfills the Feature DoR gate: "Design handoff complete".
Print the updated Feature issue URL.
11. Offer to continue
Call AskUserQuestion (per ../references/questioning-style.md):
-
question: "What's next?"
-
header: "Next step"
-
options:
- Break into Tasks โ run
feature-to-tasks; design context will inform task breakdown (default)
- Design another Feature โ design another Feature for the same Epic
- Stop here โ exit, no further action
-
Break into Tasks โ follow the wtf.feature-to-tasks skill, passing the Feature number in as context. Note to the user that wtf.design-task will inherit the shared component map from this Design Handoff.
-
Design another Feature โ restart from step 1, reusing the same Epic context.
-
Stop here โ exit.