/ux-polish — World-Class UX Review
┌─ THE FLYWHEEL ──────────────────────────────────────────────────────────┐
│ SHAPE → PLAN → REVIEW×N → DECOMPOSE → SPRINT PLAN → EXECUTE → CLOSE │
│ ★ YOU ARE HERE: Three touchpoints — │
│ 1. Planning (UX section in PLAN.md — via /plan-review) │
│ 2. Wave gate (UX lens on frontend waves) │
│ 3. Sprint close (final UX sweep) │
│ See FLYWHEEL.md for the full development lifecycle. │
└─────────────────────────────────────────────────────────────────────────┘
Scrutinize every aspect of the application workflow and implementation. Look for
things that are sub-optimal, wrong, unintuitive, or unpolished. Target: the kind
of quality that makes people gasp at how stunning and perfect it is — Stripe-level
premium, where every pixel, every transition, every word feels intentional.
The bar: "Would someone screenshot this to show a friend?"
Not a checklist exercise — you're hunting for the gap between "works correctly"
and "feels magical." A Stripe-level product doesn't just function; it makes users
feel competent and in control. Every interaction should feel like the product
anticipated what you wanted. If you can't honestly say "this is beautiful and
delightful," keep looking for improvements.
What "Stripe-level" means concretely
Not a vague aspiration — these are specific benchmarks:
- Instant feedback on every interaction. Button press → immediate visual
response (opacity change, scale) before the async operation completes.
Optimistic updates everywhere. Never leave the user wondering "did that work?"
- Graceful degradation in every state. No blank screens, no raw error dumps,
no "something went wrong." Every failure has an actionable message and a
recovery path.
- Information density without clutter. Stripe dashboards show a lot of data
but it never feels overwhelming — spacing, typography, and color do the work.
- Motion with purpose. Transitions exist to orient the user (where did this
come from? where did that go?) — never decorative.
- Copywriting is product design. Every label, error message, and empty state
is written with the same care as the code. No "Error 500" — instead "We couldn't
save your changes. Try again, or contact support if this persists."
- Consistency is invisible. Same patterns everywhere so the user never has to
re-learn. Same button sizes, same spacing scale, same animation curves.
Scope
- If
$ARGUMENTS provided, focus on those components
- Otherwise, review the full application workflow
Workflow Discovery
Before reviewing individual components, map the user's journey:
- Find all routes/pages: scan router config, page files, navigation components
- Identify the core loop: what does the user do most? (e.g., create → configure → monitor)
- Map critical workflows:
- Onboarding / first-time experience
- Core loop (the thing users do daily)
- Settings / configuration
- Error recovery (what happens when things go wrong?)
- Edge cases (empty account, expired session, permission denied)
- Trace each workflow step by step through the code — every click, every
screen transition, every form submission, every response
Evaluation Axes
1. Usability
Is every interaction intuitive? Can users accomplish goals without thinking?
- Count the clicks/steps for each core task. Can any be eliminated?
- Are destructive actions guarded? (confirm dialog, undo option, or both)
- Is progressive disclosure used? (don't show advanced options upfront)
- Are defaults smart? (pre-fill what you can infer)
2. Consistency
Same patterns throughout?
- Mixed patterns (different button styles, inconsistent spacing, varying empty
states) are jarring
- Audit: do all forms validate the same way? Do all lists paginate the same way?
Do all modals dismiss the same way?
3. Visual hierarchy
Is the most important content prominent?
- Spacing, typography, and color should guide the eye
- Primary action should be immediately obvious on every screen
- Secondary actions should be visually subordinate
4. Component state completeness
Every interactive component must handle ALL 5 states. This is not optional —
missing states are the #1 source of "unpolished" feel.
| State |
What the user sees |
Common failure |
| Loading |
Skeleton screen (NOT spinner) |
Blank screen or raw spinner |
| Empty |
Helpful message + CTA to create first item |
Blank area or "No data" |
| Data |
The actual content |
— (usually fine) |
| Error |
Actionable message + retry button |
Raw error dump or "Error" |
| Partial |
Some data + inline error for failed portion |
Full page error hiding good data |
Systematic check: For every component that fetches data, grep for how it
handles each state. If any state is missing, flag it.
5. Micro-interactions & feedback
- Buttons: press → immediate visual feedback (scale/opacity) → loading state
→ success/error state. Never just "click and wait."
- Forms: validate on blur (not just on submit), show inline errors next to
the field, success state after save
- Toasts/notifications: success = auto-dismiss after 3-5s, error = persist
until dismissed, with action link
- Confirmation dialogs: for destructive actions. Include what will happen
("Delete 3 agents permanently") not just "Are you sure?"
- Undo patterns: prefer undo over confirm where possible (Stripe pattern:
"Agent deleted" toast with Undo button)
6. Copywriting quality
Bad copy kills premium feel. Review every user-facing string:
- Button labels: action verbs ("Create agent", not "Submit"), specific not
generic ("Save changes", not "OK")
- Error messages: what happened + what to do about it, not error codes
- Empty states: explain value + CTA ("Create your first agent to start
automating workflows" not "No agents found")
- Placeholder text: helpful examples, not field names ("jane@company.com"
not "Enter email")
- Confirmation copy: specific consequences ("This will permanently delete
Agent X and its 12 runs" not "Are you sure?")
- Onboarding copy: benefit-first, not feature-first
7. Performance UX
- Optimistic updates — show the result before the server confirms
- Lazy loading — don't load what's off-screen
- Progressive disclosure — show summary first, expand on click
- Perceived speed over raw speed — skeleton screens, staggered animations
8. Desktop UX
- Keyboard shortcuts for power users
- Hover states on every interactive element
- Information density — use the space
- Multi-panel layouts where natural
- Drag-and-drop where it reduces clicks
9. Mobile UX
- Touch targets min 44px
- Swipe gestures for common actions
- Thumb zones — primary actions in bottom half
- No hover-dependent features
- Responsive breakpoints that actually redesign, not just shrink
10. Accessibility
- Contrast ratios WCAG AA minimum (4.5:1 text, 3:1 UI components)
- Focus indicators visible and consistent
- Screen reader labels on all interactive elements
- Reduced-motion support (
prefers-reduced-motion)
- Keyboard navigation for all workflows
11. Dark mode & theming
- If dark mode exists: is it consistent? (no bright flashes, proper contrast)
- If no dark mode: flag as a gap for premium feel
- Are colors from a design token system or hardcoded hex values?
12. CLI UX
CLI is a first-class interface, not an afterthought:
- Does every feature accessible via UI/API also have CLI commands?
- Do all commands support
--json for agent/machine consumption?
- Is human-friendly output the default? (rich formatting, colors, tables)
- Are error messages actionable ("missing --workspace flag") not cryptic?
- Is help text (
--help) complete and useful?
- Are command names intuitive and consistent? (
<noun> list|show|create|update|delete)
- Is output scannable? (headers, whitespace, alignment for human mode;
parseable structure for
--json mode)
Process
- Discover workflows (see Workflow Discovery above)
- Trace the component hierarchy: pages → layouts → components → primitives.
Since you can't see the running app, reconstruct the visual structure from code.
- Desktop pass — walk through every critical workflow as a desktop user.
Evaluate all 12 axes. Think: large viewport, mouse + keyboard, hover states,
information density, multi-panel layouts, keyboard shortcuts. Desktop users
expect power and density. Tag all desktop findings with
[D].
- Mobile pass — walk through every critical workflow AGAIN as a mobile user.
This is a completely separate review, not "does desktop shrink OK." Think:
thumb zones, touch targets (44px min), swipe gestures, bottom-half primary
actions, no hover-dependent features, responsive breakpoints that REDESIGN
(not just reflow). Mobile users expect speed and reachability. Tag all mobile
findings with
[M].
- For each component: check the 5-state matrix (loading, empty, data, error, partial)
- Evaluate each axis above
- Output the Issues Table (see Output Protocol below) — include
[D]/[M]/[DM]
tags so desktop and mobile issues are visually distinct
- Walk through issues one-at-a-time with the user
- Implement changes directly OR create beads if the scope is large
- Final status table after all issues are walked
Output Protocol
All review output follows a three-phase structure. Do NOT dump a wall of findings.
Phase 1 — Issues Table
After completing your review, present ONLY a compact table:
| # | Tag | Handle | Description | Crit | Status |
|----|------|---------------------|---------------------------------------------------|------|--------|
| 1 | [DM] | no-loading-skeleton | Agent list shows spinner instead of skeleton screen | High | ✗ |
| 2 | [DM] | delete-no-undo | Deleting an agent has no undo — just a confirm box | Med | ✗ |
| 3 | [D] | no-keyboard-nav | Dashboard has no keyboard shortcuts for power users | Med | ✗ |
| 4 | [M] | touch-target-small | Action buttons are 32px — below 44px minimum | High | ✗ |
Column definitions:
- #: Sequential number
- Tag:
[D] desktop-only, [M] mobile-only, [DM] both modalities
- Handle: 2-5 word slug
- Description: 1-2 sentences
- Crit:
High / Med / Low
- Status:
✗ (open) or ✓ (addressed)
Sort by criticality (High first), then by workflow order.
After presenting the table, say:
"Ready to walk through each issue. Say go to start from #1, or pick a number."
Phase 2 — One-at-a-Time Walkthrough
For each issue:
- State the handle and issue number
- Show the full analysis: what's wrong, where in code, which Stripe benchmark it violates
- Propose the specific fix with code changes or bead structure
- Wait for approval before implementing
- Mark status
✓ or deferred
- Move to the next issue
Do NOT present multiple issues at once. One issue per response.
Phase 3 — Final Status Table
After all issues walked, present the updated table with final statuses.
If any remain ✗, call them out and ask if the user wants another pass.
Rules
- Desktop and mobile are separate modalities — each gets its own full review
pass. Desktop optimizes for density, keyboard flow, and hover richness. Mobile
optimizes for thumb reachability, touch precision, and speed. A feature that
works on desktop and "also works" on mobile is not mobile-optimized.
- Be specific. Not "improve spacing" but "increase card padding from 12px to 16px
for better visual breathing room."
- Every finding must reference a concrete Stripe-level benchmark, not just
"this could be better."
- The 5-state matrix is non-negotiable. Every data-fetching component must
handle all 5 states.
- When referencing best practices, explain the principle — don't just name-drop.
- Push past "correct" to "delightful." A button that works is table stakes.
A button with the right press feedback, loading state, success animation, and
hover treatment is Stripe-level. If the interaction doesn't feel crafted,
flag it — even if it's technically functional.
- Use extended thinking for deep UX analysis.
1---2name: hs-sw-ux-polish3description: Deep UI/UX scrutiny targeting Stripe-level quality for both desktop and mobile4---56# /ux-polish — World-Class UX Review78```9┌─ THE FLYWHEEL ──────────────────────────────────────────────────────────┐10│ SHAPE → PLAN → REVIEW×N → DECOMPOSE → SPRINT PLAN → EXECUTE → CLOSE │11│ ★ YOU ARE HERE: Three touchpoints — │12│ 1. Planning (UX section in PLAN.md — via /plan-review) │13│ 2. Wave gate (UX lens on frontend waves) │14│ 3. Sprint close (final UX sweep) │15│ See FLYWHEEL.md for the full development lifecycle. │16└─────────────────────────────────────────────────────────────────────────┘17```1819Scrutinize every aspect of the application workflow and implementation. Look for20things that are sub-optimal, wrong, unintuitive, or unpolished. Target: the kind21of quality that makes people gasp at how stunning and perfect it is — Stripe-level22premium, where every pixel, every transition, every word feels intentional.2324## The bar: "Would someone screenshot this to show a friend?"2526Not a checklist exercise — you're hunting for the gap between "works correctly"27and "feels magical." A Stripe-level product doesn't just function; it makes users28feel competent and in control. Every interaction should feel like the product29anticipated what you wanted. If you can't honestly say "this is beautiful and30delightful," keep looking for improvements.3132## What "Stripe-level" means concretely3334Not a vague aspiration — these are specific benchmarks:3536- **Instant feedback on every interaction.** Button press → immediate visual37 response (opacity change, scale) before the async operation completes.38 Optimistic updates everywhere. Never leave the user wondering "did that work?"39- **Graceful degradation in every state.** No blank screens, no raw error dumps,40 no "something went wrong." Every failure has an actionable message and a41 recovery path.42- **Information density without clutter.** Stripe dashboards show a lot of data43 but it never feels overwhelming — spacing, typography, and color do the work.44- **Motion with purpose.** Transitions exist to orient the user (where did this45 come from? where did that go?) — never decorative.46- **Copywriting is product design.** Every label, error message, and empty state47 is written with the same care as the code. No "Error 500" — instead "We couldn't48 save your changes. Try again, or contact support if this persists."49- **Consistency is invisible.** Same patterns everywhere so the user never has to50 re-learn. Same button sizes, same spacing scale, same animation curves.5152## Scope5354- If `$ARGUMENTS` provided, focus on those components55- Otherwise, review the full application workflow5657## Workflow Discovery5859Before reviewing individual components, map the user's journey:60611. **Find all routes/pages:** scan router config, page files, navigation components622. **Identify the core loop:** what does the user do most? (e.g., create → configure → monitor)633. **Map critical workflows:**64 - Onboarding / first-time experience65 - Core loop (the thing users do daily)66 - Settings / configuration67 - Error recovery (what happens when things go wrong?)68 - Edge cases (empty account, expired session, permission denied)694. **Trace each workflow** step by step through the code — every click, every70 screen transition, every form submission, every response7172## Evaluation Axes7374### 1. Usability75Is every interaction intuitive? Can users accomplish goals without thinking?76- Count the clicks/steps for each core task. Can any be eliminated?77- Are destructive actions guarded? (confirm dialog, undo option, or both)78- Is progressive disclosure used? (don't show advanced options upfront)79- Are defaults smart? (pre-fill what you can infer)8081### 2. Consistency82Same patterns throughout?83- Mixed patterns (different button styles, inconsistent spacing, varying empty84 states) are jarring85- Audit: do all forms validate the same way? Do all lists paginate the same way?86 Do all modals dismiss the same way?8788### 3. Visual hierarchy89Is the most important content prominent?90- Spacing, typography, and color should guide the eye91- Primary action should be immediately obvious on every screen92- Secondary actions should be visually subordinate9394### 4. Component state completeness9596**Every interactive component must handle ALL 5 states.** This is not optional —97missing states are the #1 source of "unpolished" feel.9899| State | What the user sees | Common failure |100|----------|---------------------------------------------|----------------------------------|101| Loading | Skeleton screen (NOT spinner) | Blank screen or raw spinner |102| Empty | Helpful message + CTA to create first item | Blank area or "No data" |103| Data | The actual content | — (usually fine) |104| Error | Actionable message + retry button | Raw error dump or "Error" |105| Partial | Some data + inline error for failed portion | Full page error hiding good data |106107**Systematic check:** For every component that fetches data, grep for how it108handles each state. If any state is missing, flag it.109110### 5. Micro-interactions & feedback111- **Buttons:** press → immediate visual feedback (scale/opacity) → loading state112 → success/error state. Never just "click and wait."113- **Forms:** validate on blur (not just on submit), show inline errors next to114 the field, success state after save115- **Toasts/notifications:** success = auto-dismiss after 3-5s, error = persist116 until dismissed, with action link117- **Confirmation dialogs:** for destructive actions. Include what will happen118 ("Delete 3 agents permanently") not just "Are you sure?"119- **Undo patterns:** prefer undo over confirm where possible (Stripe pattern:120 "Agent deleted" toast with Undo button)121122### 6. Copywriting quality123Bad copy kills premium feel. Review every user-facing string:124- **Button labels:** action verbs ("Create agent", not "Submit"), specific not125 generic ("Save changes", not "OK")126- **Error messages:** what happened + what to do about it, not error codes127- **Empty states:** explain value + CTA ("Create your first agent to start128 automating workflows" not "No agents found")129- **Placeholder text:** helpful examples, not field names ("jane@company.com"130 not "Enter email")131- **Confirmation copy:** specific consequences ("This will permanently delete132 Agent X and its 12 runs" not "Are you sure?")133- **Onboarding copy:** benefit-first, not feature-first134135### 7. Performance UX136- Optimistic updates — show the result before the server confirms137- Lazy loading — don't load what's off-screen138- Progressive disclosure — show summary first, expand on click139- Perceived speed over raw speed — skeleton screens, staggered animations140141### 8. Desktop UX142- Keyboard shortcuts for power users143- Hover states on every interactive element144- Information density — use the space145- Multi-panel layouts where natural146- Drag-and-drop where it reduces clicks147148### 9. Mobile UX149- Touch targets min 44px150- Swipe gestures for common actions151- Thumb zones — primary actions in bottom half152- No hover-dependent features153- Responsive breakpoints that actually redesign, not just shrink154155### 10. Accessibility156- Contrast ratios WCAG AA minimum (4.5:1 text, 3:1 UI components)157- Focus indicators visible and consistent158- Screen reader labels on all interactive elements159- Reduced-motion support (`prefers-reduced-motion`)160- Keyboard navigation for all workflows161162### 11. Dark mode & theming163- If dark mode exists: is it consistent? (no bright flashes, proper contrast)164- If no dark mode: flag as a gap for premium feel165- Are colors from a design token system or hardcoded hex values?166167### 12. CLI UX168CLI is a first-class interface, not an afterthought:169- Does every feature accessible via UI/API also have CLI commands?170- Do all commands support `--json` for agent/machine consumption?171- Is human-friendly output the default? (rich formatting, colors, tables)172- Are error messages actionable ("missing --workspace flag") not cryptic?173- Is help text (`--help`) complete and useful?174- Are command names intuitive and consistent? (`<noun> list|show|create|update|delete`)175- Is output scannable? (headers, whitespace, alignment for human mode;176 parseable structure for `--json` mode)177178## Process1791801. **Discover workflows** (see Workflow Discovery above)1812. Trace the component hierarchy: pages → layouts → components → primitives.182 Since you can't see the running app, reconstruct the visual structure from code.1833. **Desktop pass** — walk through every critical workflow as a desktop user.184 Evaluate all 12 axes. Think: large viewport, mouse + keyboard, hover states,185 information density, multi-panel layouts, keyboard shortcuts. Desktop users186 expect power and density. Tag all desktop findings with `[D]`.1874. **Mobile pass** — walk through every critical workflow AGAIN as a mobile user.188 This is a completely separate review, not "does desktop shrink OK." Think:189 thumb zones, touch targets (44px min), swipe gestures, bottom-half primary190 actions, no hover-dependent features, responsive breakpoints that REDESIGN191 (not just reflow). Mobile users expect speed and reachability. Tag all mobile192 findings with `[M]`.1935. For each component: check the 5-state matrix (loading, empty, data, error, partial)1946. Evaluate each axis above1957. **Output the Issues Table** (see Output Protocol below) — include `[D]`/`[M]`/`[DM]`196 tags so desktop and mobile issues are visually distinct1978. **Walk through issues one-at-a-time** with the user1989. Implement changes directly OR create beads if the scope is large19910. **Final status table** after all issues are walked200201## Output Protocol202203All review output follows a three-phase structure. Do NOT dump a wall of findings.204205### Phase 1 — Issues Table206207After completing your review, present ONLY a compact table:208209```210| # | Tag | Handle | Description | Crit | Status |211|----|------|---------------------|---------------------------------------------------|------|--------|212| 1 | [DM] | no-loading-skeleton | Agent list shows spinner instead of skeleton screen | High | ✗ |213| 2 | [DM] | delete-no-undo | Deleting an agent has no undo — just a confirm box | Med | ✗ |214| 3 | [D] | no-keyboard-nav | Dashboard has no keyboard shortcuts for power users | Med | ✗ |215| 4 | [M] | touch-target-small | Action buttons are 32px — below 44px minimum | High | ✗ |216```217218Column definitions:219- **#**: Sequential number220- **Tag**: `[D]` desktop-only, `[M]` mobile-only, `[DM]` both modalities221- **Handle**: 2-5 word slug222- **Description**: 1-2 sentences223- **Crit**: `High` / `Med` / `Low`224- **Status**: `✗` (open) or `✓` (addressed)225226Sort by criticality (High first), then by workflow order.227228After presenting the table, say:229> "Ready to walk through each issue. Say **go** to start from #1, or pick a number."230231### Phase 2 — One-at-a-Time Walkthrough232233For each issue:2341. State the handle and issue number2352. Show the full analysis: what's wrong, where in code, which Stripe benchmark it violates2363. Propose the specific fix with code changes or bead structure2374. Wait for approval before implementing2385. Mark status `✓` or deferred2396. Move to the next issue240241Do NOT present multiple issues at once. One issue per response.242243### Phase 3 — Final Status Table244245After all issues walked, present the updated table with final statuses.246If any remain `✗`, call them out and ask if the user wants another pass.247248## Rules249250- **Desktop and mobile are separate modalities** — each gets its own full review251 pass. Desktop optimizes for density, keyboard flow, and hover richness. Mobile252 optimizes for thumb reachability, touch precision, and speed. A feature that253 works on desktop and "also works" on mobile is not mobile-optimized.254- Be specific. Not "improve spacing" but "increase card padding from 12px to 16px255 for better visual breathing room."256- Every finding must reference a concrete Stripe-level benchmark, not just257 "this could be better."258- The 5-state matrix is non-negotiable. Every data-fetching component must259 handle all 5 states.260- When referencing best practices, explain the principle — don't just name-drop.261- **Push past "correct" to "delightful."** A button that works is table stakes.262 A button with the right press feedback, loading state, success animation, and263 hover treatment is Stripe-level. If the interaction doesn't feel crafted,264 flag it — even if it's technically functional.265- Use extended thinking for deep UX analysis.