| name | ux-waiting-audit |
| description | Audit UX waiting states for web applications with long-running operations (30+ seconds). Use when asked to evaluate, audit, or analyze a product's loading states, wait times, progress indicators, or user experience during slow operations. Requires browser automation (Chrome MCP tools). Generates comprehensive reports with screenshots, checklist evaluation, and prioritized recommendations. |
UX Waiting States Audit
Evaluate how applications handle long-running operations (30+ seconds) using browser automation.
Core Principle
Screenshot First, DOM Second — always take a screenshot when navigating or stuck. Visual inspection beats DOM probing.
📸 Screenshot → 👀 Analyze visually → 🎯 Click coordinates → 📸 Verify → Repeat
Critical: Screenshot-First Automation
When to Screenshot
ALWAYS screenshot:
- After opening any URL (initial state)
- Before trying to interact with elements
- When ANY JavaScript returns "missing value" or fails
- After clicking/submitting (verify success)
- At timed intervals during long operations
Why Screenshots Beat DOM Probing
| DOM Approach | Screenshot Approach |
|---|
| Complex selectors fail silently | Visual shows exact UI state |
| "missing value" gives no info | Image reveals button locations |
| 10+ attempts to find element | 1 screenshot → click coordinates |
| Can't see actual user experience | See exactly what user sees |
Screenshot Workflow Pattern
Control Chrome:open_url(TARGET_URL)
sleep(2)
Control Chrome:execute_javascript("document.elementFromPoint(1200, 650).click()")
Quick Start Workflow
Phase 1: Setup & Navigate
Control Chrome:open_url(TARGET_URL)
sleep(3)
Phase 2: Trigger Operation (The Hard Part)
This is often where audits get stuck. Modern SPAs have complex UIs.
Control Chrome:execute_javascript("document.querySelector('button[type=submit]').click()")
Control Chrome:execute_javascript("document.elementFromPoint(X, Y).click()")
Phase 3: Capture Waiting States
Once operation is running:
sleep(10)
sleep(20)
Phase 4: Evaluate & Report
Troubleshooting: When Stuck
Problem: Can't find/click element
❌ WRONG: Keep trying different selectors
→ Wastes time, silent failures
✅ RIGHT: Take screenshot, analyze visually
→ Ask user for help if needed
→ Use coordinate-based clicking
Problem: JavaScript returns "missing value"
This usually means:
- The script is too complex (simplify it)
- The element doesn't exist (screenshot to verify)
- Timing issue (add sleep, retry)
Fix: Use simple one-liner JS, not complex functions.
(function() { const elements = []; ... return JSON.stringify(elements); })()
document.body.innerText.substring(0, 500)
document.querySelectorAll('button').length
document.querySelector('.loading') !== null
Problem: Form won't submit
Try in order:
- Screenshot to see submit button location
document.forms[0].submit()
- Click submit button by coordinates
- Ask user to submit manually
Audit Instructions
Step 1: Understand the Target
Ask user for:
- URL to audit
- Operation to test (search, report generation, AI task, etc.)
- How to trigger — button name, location, or steps
- Expected duration (helps calibrate screenshot intervals)
- Any auth requirements (login credentials if needed)
If user is available: Ask them to trigger the operation manually while you capture screenshots. This avoids navigation complexity.
Step 2: Capture Sequence
Always screenshot first. Then run simple state checks:
!!document.querySelector('[class*="spin"], [class*="load"], .spinner')
!!document.querySelector('progress, [role="progressbar"]')
document.body.innerText.substring(0, 1000)
document.querySelectorAll('[class*="result"], [class*="item"]').length
Capture Timeline:
| Time | Action |
|---|
| T+0s | Screenshot + note what triggered |
| T+10s | Screenshot + simple state checks |
| T+30s | Screenshot + simple state checks |
| T+Complete | Screenshot + final state |
Step 3: Evaluate Against Checklist
Load and evaluate against references/checklist.md. Score each category:
- ✅ Present and well-implemented
- ⚠️ Partially implemented / needs improvement
- ❌ Missing
- N/A Not applicable to this operation
Step 4: Generate Report
Use template from references/report-template.md.
Key Evaluation Patterns
Progressive Value Detection
Look for:
document.querySelectorAll('[class*="result"], [class*="item"], li, tr').length
document.querySelector('[class*="stream"], [class*="typing"], [class*="cursor"]')
Heartbeat Indicators
Look for:
document.body.innerText.match(/\d+\s*(found|processed|complete|%)/gi)
document.querySelectorAll('[class*="animate"], [class*="pulse"], [class*="spin"]')
Time Estimation
Look for:
document.body.innerText.match(/(\d+\s*(sec|min|second|minute)|remaining|left|ETA)/gi)
document.querySelector('[role="progressbar"]')?.getAttribute('aria-valuenow')
Screenshot Comparison Strategy
For each interval, note:
- What changed from previous screenshot
- Activity signals (counters, animations, partial results)
- User anxiety factors (frozen UI, no feedback)
Compare:
| Element | T+0s | T+10s | T+30s | Complete |
|---|
| Results visible | | | | |
| Counter/progress | | | | |
| Status message | | | | |
| Animation active | | | | |
Report Output Structure
Generate markdown report with:
- Summary Score: X/10 categories addressed
- Screenshots Gallery: With timestamps and annotations
- Strengths: What works well
- Critical Gaps: Missing elements hurting UX most
- Quick Wins: Low-effort, high-impact improvements
- Detailed Findings Table: See
references/report-template.md
- Priority Matrix: P1/P2/P3 recommendations
Best-in-Class Comparisons
Reference these examples of excellent waiting UX:
- Figma exports: Progress bar + percentage + file count
- Notion AI: Streaming text + cursor animation
- ChatGPT: Token-by-token streaming + stop button
- Linear search: Instant partial results + refinement
- Vercel deployments: Step-by-step progress + logs
Error Scenarios to Test
If possible, test:
- Partial failure: Does UI degrade gracefully?
- Network interruption: Is progress preserved?
- Timeout: Is there clear feedback?
Common Issues to Flag
| Issue | User Impact | Quick Fix |
|---|
| Spinner only | Anxiety, abandon | Add status text |
| No progress | "Is it stuck?" | Add heartbeat counter |
| No cancellation | Trapped feeling | Add cancel button |
| Silent completion | Missed results | Add completion animation |
| Full-page block | Can't multitask | Move to background |