Visual and UX quality audit using Playwright. Triggers ONLY when: PR has passed pre-pr and is ready to merge with UI/UX changes, or user explicitly asks for UX audit. Do NOT trigger for backend-only changes or during development.
Scope: This skill audits UX quality for feature PRs merging to dev. For release verification (dev → main), use the staging-verify skill instead — it tests the deployed staging environment.
UX Audit — Visual & Functional Quality Gate
Run this audit AFTER pre-pr passes and BEFORE merging. The goal is to verify the product works correctly from a user's perspective, not just from a code perspective.
Take screenshots of every page or component affected by this PR.
For each screenshot, verify:
Layout integrity — elements are properly aligned, no overlapping, no overflow, spacing is consistent
Visual hierarchy — primary actions are visually prominent, secondary actions are subordinate, information flows logically top-to-bottom / left-to-right
Color and contrast — text is readable against its background, interactive elements are visually distinct from static content, disabled states are visually differentiated
Responsive behavior — take screenshots at mobile (375px), tablet (768px), and desktop (1280px) widths. Layout adapts without breaking, no horizontal scrolling, touch targets are ≥44px on mobile
Empty states — pages with no data show helpful guidance, not blank screens or raw error messages
Loading states — skeleton screens or spinners appear during async operations, not frozen UI
Error states — invalid inputs show clear, contextual error messages near the relevant field
How to screenshot:
browser_navigate → target URL
browser_take_screenshot → review the image
browser_resize → change viewport → browser_take_screenshot again
Phase 2: Discoverability Test
Approach the interface as a first-time user with zero prior knowledge. Do not reference the code, issue description, or implementation details.
Can you find the new/changed feature? Navigate from the app's entry point using only visible UI elements. If the feature requires more than 3 clicks or is hidden behind non-obvious navigation, flag it.
Are interactive elements recognizable? Buttons look clickable, links look like links, inputs have placeholders or labels, drag targets have affordances.
Is the flow self-explanatory? Without reading documentation, can you understand what each step does and what comes next? If you feel lost at any point, that is a UX failure.
Are labels and copy clear? No developer jargon in user-facing text, no ambiguous button labels (e.g., "Submit" without context), no placeholder text left in production.
Phase 3: Functional UX Test
Interact with every feature affected by this PR. Test both the functionality and the experience of using it.
For each interaction, verify:
Immediate feedback — every user action produces a visible response within 100ms (button press effect, input character appears, loading indicator starts). No "dead clicks" where nothing happens.
State transitions — UI updates correctly after actions: form submits → success message, item deleted → removed from list, toggle switched → state reflected everywhere it appears
Input behavior — text fields accept input and display it in real time, selections are reflected immediately, multi-step forms preserve state between steps
Undo/recovery — destructive actions have confirmation dialogs, accidental navigation away from unsaved work triggers a warning, errors are recoverable without data loss
Boundary conditions — extremely long text wraps or truncates gracefully, rapid repeated clicks don't cause duplicate submissions, concurrent actions don't corrupt state
Keyboard navigation — critical flows are completable with keyboard alone (Tab, Enter, Escape). Focus indicators are visible. Modal dialogs trap focus.
Cross-browser basics — if feasible, test in both Chromium and Firefox (Playwright supports both)
How to test interactions:
browser_click → interact with element
browser_take_screenshot → verify visual response
browser_type → input text
browser_take_screenshot → verify real-time feedback
browser_snapshot → verify accessibility tree reflects correct state
Phase 4: Performance Measurement
Use Playwright's browser_evaluate to run Performance API calls and measure Core Web Vitals.
If ANY phase fails: fix the issues before merging. Re-run the failing phase to verify the fix.
If ALL phases pass: state "UX audit passed. Ready to merge."
All features merged → "Run staging-verify for release"
1---2name: ux-audit3description: Visual and UX quality audit using Playwright. Triggers ONLY when: PR has passed pre-pr and is ready to merge with UI/UX changes, or user explicitly asks for UX audit. Do NOT trigger for backend-only changes or during development.4---56> **Scope:** This skill audits UX quality for feature PRs merging to `dev`. For release verification (`dev` → `main`), use the `staging-verify` skill instead — it tests the deployed staging environment.78# UX Audit — Visual & Functional Quality Gate910Run this audit AFTER pre-pr passes and BEFORE merging. The goal is to verify the product works correctly **from a user's perspective**, not just from a code perspective.1112**Tools required:** Playwright MCP (`browser_navigate`, `browser_take_screenshot`, `browser_click`, `browser_type`, `browser_snapshot`, `browser_evaluate`)1314---1516## Phase 1: Visual Review (Screenshots)1718Take screenshots of every page or component affected by this PR.1920**For each screenshot, verify:**21- [ ] **Layout integrity** — elements are properly aligned, no overlapping, no overflow, spacing is consistent22- [ ] **Visual hierarchy** — primary actions are visually prominent, secondary actions are subordinate, information flows logically top-to-bottom / left-to-right23- [ ] **Color and contrast** — text is readable against its background, interactive elements are visually distinct from static content, disabled states are visually differentiated24- [ ] **Responsive behavior** — take screenshots at mobile (375px), tablet (768px), and desktop (1280px) widths. Layout adapts without breaking, no horizontal scrolling, touch targets are ≥44px on mobile25- [ ] **Empty states** — pages with no data show helpful guidance, not blank screens or raw error messages26- [ ] **Loading states** — skeleton screens or spinners appear during async operations, not frozen UI27- [ ] **Error states** — invalid inputs show clear, contextual error messages near the relevant field2829**How to screenshot:**30```31browser_navigate → target URL32browser_take_screenshot → review the image33browser_resize → change viewport → browser_take_screenshot again34```3536---3738## Phase 2: Discoverability Test3940Approach the interface as a **first-time user with zero prior knowledge**. Do not reference the code, issue description, or implementation details.4142- [ ] **Can you find the new/changed feature?** Navigate from the app's entry point using only visible UI elements. If the feature requires more than 3 clicks or is hidden behind non-obvious navigation, flag it.43- [ ] **Are interactive elements recognizable?** Buttons look clickable, links look like links, inputs have placeholders or labels, drag targets have affordances.44- [ ] **Is the flow self-explanatory?** Without reading documentation, can you understand what each step does and what comes next? If you feel lost at any point, that is a UX failure.45- [ ] **Are labels and copy clear?** No developer jargon in user-facing text, no ambiguous button labels (e.g., "Submit" without context), no placeholder text left in production.4647---4849## Phase 3: Functional UX Test5051Interact with every feature affected by this PR. Test both the **functionality** and the **experience** of using it.5253**For each interaction, verify:**54- [ ] **Immediate feedback** — every user action produces a visible response within 100ms (button press effect, input character appears, loading indicator starts). No "dead clicks" where nothing happens.55- [ ] **State transitions** — UI updates correctly after actions: form submits → success message, item deleted → removed from list, toggle switched → state reflected everywhere it appears56- [ ] **Input behavior** — text fields accept input and display it in real time, selections are reflected immediately, multi-step forms preserve state between steps57- [ ] **Undo/recovery** — destructive actions have confirmation dialogs, accidental navigation away from unsaved work triggers a warning, errors are recoverable without data loss58- [ ] **Boundary conditions** — extremely long text wraps or truncates gracefully, rapid repeated clicks don't cause duplicate submissions, concurrent actions don't corrupt state59- [ ] **Keyboard navigation** — critical flows are completable with keyboard alone (Tab, Enter, Escape). Focus indicators are visible. Modal dialogs trap focus.60- [ ] **Cross-browser basics** — if feasible, test in both Chromium and Firefox (Playwright supports both)6162**How to test interactions:**63```64browser_click → interact with element65browser_take_screenshot → verify visual response66browser_type → input text67browser_take_screenshot → verify real-time feedback68browser_snapshot → verify accessibility tree reflects correct state69```7071---7273## Phase 4: Performance Measurement7475Use Playwright's `browser_evaluate` to run Performance API calls and measure Core Web Vitals.7677**Metrics to collect:**7879| Metric | Target | How to measure |80|--------|--------|----------------|81| **TTFB** (Time to First Byte) | < 200ms | `performance.getEntriesByType('navigation')[0].responseStart` |82| **FCP** (First Contentful Paint) | < 1.8s | `performance.getEntriesByType('paint').find(e => e.name === 'first-contentful-paint').startTime` |83| **LCP** (Largest Contentful Paint) | < 2.5s | `PerformanceObserver` with type `largest-contentful-paint` |84| **CLS** (Cumulative Layout Shift) | < 0.1 | `PerformanceObserver` with type `layout-shift`, sum entries without recent input |85| **Total page weight** | < 1MB initial | `performance.getEntriesByType('resource').reduce((sum, r) => sum + r.transferSize, 0)` |8687**Process:**881. Navigate to each affected page892. Collect all metrics via `browser_evaluate`903. Compare against targets914. If any metric exceeds its target, flag it and investigate:92 - TTFB high → server/API latency93 - FCP high → render-blocking resources94 - LCP high → large images, slow fonts, heavy JS95 - CLS high → elements shifting after load (missing dimensions on images/embeds)96 - Page weight high → uncompressed assets, unnecessary dependencies9798---99100## Verdict101102**Report format:**103```104## UX Audit Report105106### Visual Review107- [PASS/FAIL] Layout, color, responsive, empty/loading/error states108109### Discoverability110- [PASS/FAIL] Feature findable within 3 clicks, labels clear, flow self-explanatory111112### Functional UX113- [PASS/FAIL] Immediate feedback, state transitions, input behavior, keyboard nav114115### Performance116- TTFB: Xms (target <200ms) [PASS/FAIL]117- FCP: Xs (target <1.8s) [PASS/FAIL]118- LCP: Xs (target <2.5s) [PASS/FAIL]119- CLS: X (target <0.1) [PASS/FAIL]120121### Issues Found1221. [severity] description — screenshot reference123```124125**If ANY phase fails:** fix the issues before merging. Re-run the failing phase to verify the fix.126**If ALL phases pass:** state "UX audit passed. Ready to merge."127128## Next Steps129Report to user: "UX audit [PASS/FAIL]. Visual: [score]. Discoverability: [score]. Performance: [LCP/CLS]"130131Suggested next steps (user decides):132- Passed → "Merge PR, then run post-merge"133- Failed → "Fix UX issues, then re-run self-review"134- All features merged → "Run staging-verify for release"
Run npx skillmds@latest add docat0209/ux-audit in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Visual and UX quality audit using Playwright. Triggers ONLY when: PR has passed pre-pr and is ready to merge with UI/UX changes, or user explicitly asks for UX audit. Do NOT trigger for backend-only changes or during development. It is listed under Security on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
Docat0209 (@docat0209) published this skill. Their other Agent Skills are listed on their SkillMD profile.