Turn an approved PRD into the design half of the spec (IA, flows, a screen inventory, and per-screen
state/interaction specs), spec'ing only as much as the work warrants. This skill writes no UI code; it
produces the design the build (implement-feature) then works from. Output lands under
docs/specs/design/. <skill-dir> below is this skill's directory.
Input
$ARGUMENTS
Parse the source (first match wins), then read it:
| Pattern | Source | Read via |
|---|---|---|
existing docs/specs/prd/*.md or any path |
the approved PRD / a file | Read it (grab every PRD-<CAT>-NNN ID) |
PROJ-123 |
Jira | jira issue view PROJ-123 |
#42 / owner/repo#42 |
GitHub issue | gh issue view 42 --json title,body,labels,comments |
http(s):// |
URL | WebFetch |
| anything else | plain text | the idea itself |
A trailing --tier small|medium|big overrides the size assessment.
Prerequisites & fallback
Component-library detection and flow research use the Task tool with Explore/haiku subagents. No Task
tool? Run every detection and research step inline, sequentially: the phase → gate → phase structure below
is the workflow; subagents are just how it parallelizes.
Gate: an approved PRD is the source of truth
A design spec traces to requirements it does not invent. Before spec'ing anything:
- If an approved PRD (or a clear requirement set) exists, read it and harvest every requirement ID.
- If no PRD exists, do not fabricate requirements. Stop and say so:
"There's no approved PRD to trace this design to. Point me at one, or run
product-prdfirst and I'll spec the design against it."
Source-of-truth hierarchy, and never silently violate it: approved requirement > design spec > mockup. A
mockup or a nice-looking screen never overrides an approved requirement: if the design implies a change,
flag it as an open question against the PRD, don't quietly redesign the requirement away.
Lean by default
The organizing principle: default to a single docs/specs/design/design-spec.md, and split a screen into
its own file under docs/specs/design/screens/ only when it outgrows the inventory.
- Speccing every screen is a failure mode, not thoroughness, so give full detail to only the 2-3 most critical screens; everything else gets a one-line inventory entry.
- Sketch the IA, then take one critical journey end-to-end before going wide (thin-slice, not waterfall). Producing output early is cheap to correct; a finished tree is not.
- If the work seems to want a giant state matrix or a screen-per-file tree, stop and ask before emitting it. Never auto-generate a 30-file design tree.
Reuse the existing component library first
Before specifying anything bespoke, detect and adopt what the project already ships (spawn an Explore/haiku
agent or check inline):
| Marker | Library to reuse |
|---|---|
components.json |
shadcn/ui |
tailwind.config.* |
Tailwind |
@mui/material in package.json |
MUI |
*.swift + SwiftUI / @Composable in Kotlin |
native platform components |
Name the detected library in the spec and reference its components by name. Invent bespoke components only for genuinely novel surfaces, and say why the library couldn't cover them.
Tiers
| Tier | When | Output |
|---|---|---|
| small | one feature/surface | IA sketch + the single primary flow + a screen list with applicable states noted, one file |
| medium | a module or small app | IA + 2-3 key flows + a screen inventory + a full spec for the 1-2 most critical screens |
| big | a full product/app | full IA + primary+secondary flows + complete inventory + full spec for only the 2-3 most critical surfaces |
references/design-workflow.md carries the full detail: the reuse ladder and the source-of-truth rule.
Workflow
Four phases carry the work: Discover, thin-slice one journey, a plan gate, then Author and Validate & hand off.
Phase: Discover
Read the approved PRD and harvest its requirement IDs. Detect the component library (above). Pick the
discovery mode by context: cold start → 3-5 lettered clarifying questions (terse answers like 1A,2C); warm
start → synthesize from the conversation + a repo scan, then run a lightweight gap check. Tag every finding
CONFIRMED / INFERRED / UNKNOWN: never present an inference as a fact.
Phase: Thin-slice one journey
Sketch the IA (nav / screen map), then spec one critical journey end-to-end before going wide: walk its flow through each screen and note the states along the way. This proves the shape early and is cheap to correct.
Phase: Plan gate (authorization)
Present the IA + screen inventory + which 2-3 screens you'll spec in full, and ask:
"Here's the IA and screen inventory, plus the 2-3 critical screens I'd spec in full, each traced to {req IDs}. Authorize me to author
docs/specs/design/design-spec.md?"
If the answer is no, stop here, revise, and re-present. Author nothing before authorization.
Phase: Author
Create the single file from assets/templates/design-spec.md. It needs:
| Element | What goes in it |
|---|---|
| IA + flows | Delegate Mermaid flow/journey diagrams to the docs-diagram skill (via the Skill tool where available, otherwise apply its diagram conventions inline). |
| Screen inventory | Every screen is a row with a Screen ID (SCR-NN), a purpose, and the PRD requirement ID(s) it traces to. Fill the lightweight traceability table (requirement-ID ↔ screen-ID). |
| Critical screen specs (2-3 only) | Use assets/templates/screen-spec.md (~10 fields). Enumerate the applicable subset of the ~10-state shortlist (assets/templates/state-shortlist.md) rather than just the happy path. Each critical screen carries an accessibility/keyboard field and a responsive field, plus acceptance criteria; for AC quality apply product-prd's shared requirement-hygiene rulebook inline (via the Skill tool where available, else read requirement-hygiene.md from product-prd's references/) rather than duplicating it here. |
| Personas | Only if the PRD lacks them and they change the design: assets/templates/persona.md, ~6 fields, evidence-labeled, no invented demographics. |
Tag every unresolved gap [NEEDS CLARIFICATION: ...] rather than guessing, so it stays greppable.
Phase: Validate & hand off
python <skill-dir>/scripts/screen-states.py --dir docs/specs/design # gate: 0 MAJOR
Fix every MAJOR (a critical screen missing its empty/error/permission states, or missing an a11y-keyboard / responsive / acceptance-criteria field, or a screen that traces to no requirement). Then:
- Delegate the accessibility audit to
review-design(via theSkilltool where available, otherwise apply its checklist inline): WCAG 2.2 AA, including the 9 criteria new since 2.1 (24px target size, focus appearance, dragging alternatives, accessible authentication, consistent help, redundant entry). Don't hand-roll the audit, and don't upgrade to WCAG 3.0 / APCA (references/design-workflow.mdnames the scope). Pair any translucent surface, on Material 3 Expressive or Apple Liquid Glass, with a mandatory contrast check. - Self-grade inline, with no separate report file: does every screen trace to a requirement? Do the critical screens cover their error/empty/permission states? Is anything over-specced? State the readiness verdict in a sentence or two.
- Report the written path when handing off. Name the downstream consumers:
product-design-tokens(consumes the screen inventory) andimplement-feature(builds the UI). Offerproject-plannerfor a screen-build breakdown.
Anti-hallucination
- Never invent a requirement. Every screen traces to a PRD requirement ID; a mockup never overrides an approved requirement (source-of-truth hierarchy above).
- Tag every finding CONFIRMED / INFERRED / UNKNOWN; never present an inference as a fact.
- Reuse the detected component library before inventing bespoke components; name what you detected.
- No invented personas or demographics: evidence-label every persona field and omit unbacked demographics.
- Delegate the WCAG audit to
review-design; do not fabricate conformance claims. Runscreen-states.pybefore declaring done. - The plan gate is real: author files only after explicit authorization.
References
references/design-workflow.md: the four phases, thin-slice rule, tiers, the component-reuse ladder, the source-of-truth hierarchy, the ~10-state shortlist, WCAG 2.2 AA scope (delegated to review-design), Material 3 Expressive / Apple Liquid Glassproduct-prd's shared requirement-hygiene rulebook: RFC-2119, the vague blocklist, INVEST, GWT; referenced inline for screen-level acceptance criteria, not duplicated. Read it fromproduct-prd'sreferences/(itsrequirement-hygiene.md).assets/templates/: design-spec, screen-spec, state-shortlist, personascripts/screen-states.py: critical-screen state/field/traceability linter
Boundaries
- The requirements themselves →
product-prd. - The visual token system (DTCG / DESIGN.md) →
product-design-tokens. - A UX / accessibility critique of an existing or rendered UI →
review-design. - Rendering illustrative assets, mockups, heroes, or icons →
codex-imagegen. - Building the UI →
implement-feature. - Enforces the source-of-truth hierarchy (approved requirement > design spec > mockup). Writes no application code.