ds-ui-quality-review
Skill20 starsChanged 47 days agoMITView on GitHub
Run a strict review of UI quality — whether the interface is soundly engineered, crafted, accessible, and fast. Reports a findings list by default; `--fix` applies the mechanical, unambiguous fixes (design-judgment ones stay reported).
In this repository52 other files it gives its agents.
- ds-dev-skill-benchSkill
- ds-agent-reviewSkill
- ds-architecture-planSkill
- ds-arenaSkill
- ds-blast-radiusSkill
- ds-blueprintSkill
- ds-bug-reviewSkill
- ds-clarity-reviewSkill
- ds-code-quality-reviewSkill
- ds-comment-reviewSkill
- ds-data-modeSkill
- ds-data-reviewSkill
- ds-debugSkill
- ds-deslopSkill
- ds-doc-quality-reviewSkill
- ds-exploreSkill
- ds-git-modeSkill
- ds-go-reviewSkill
- ds-grill-meSkill
- ds-handoffSkill
- ds-howSkill
- ds-humanizeSkill
- ds-interaction-modeSkill
- ds-java-reviewSkill
- ds-notebook-reviewSkill
- ds-onboardingSkill
- ds-osvSkill
- ds-perf-planSkill
- ds-project-checkpointSkill
- ds-project-resumeSkill
- ds-python-reviewSkill
- ds-quality-gateSkill
- ds-reflectSkill
- ds-retroSkill
- ds-roadmapSkill
- ds-rust-reviewSkill
- ds-security-reviewSkill
- ds-semgrepSkill
- ds-shell-reviewSkill
- dsSkill
- ds-specSkill
- ds-step-modeSkill
- ds-tdd-modeSkill
- ds-test-modeSkill
- ds-test-quality-reviewSkill
- ds-tiger-style-modeSkill
- ds-tldtSkill
- ds-ts-reviewSkill
- ds-ui-modeSkill
- ds-verify-thisSkill
- ds-zig-reviewSkill
- ds-zoom-outSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 2 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 13
Treat positional args as scope (files, directories, globs).
- Distinctive: line 23
Async states: Every async surface handles all four explicitly: loading, error, empty, success.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
When invoked, audit the UI in scope against one governing principle: a UI is judged on both halves — it works and it's crafted. Correct rendering is the floor, not the bar. Hunt the failures that ship broken or generic interfaces with equal energy: components that mishandle state and async edges (the bug a user hits), and interfaces that are inaccessible, slow, or generic-by-default (the experience nobody chose). Framework-agnostic — apply it whether the stack is React, Svelte, Vue, Solid, or plain HTML, on any runtime.
Report-only by default — the output is a prioritized list, no edits unless --fix is passed. This is the after-the-fact audit; to build UI to this standard from the start, use /ds-ui-mode.
Arguments
- Treat positional args as scope (files, directories, globs). With no scope, review the UI code changed on the current branch.
--full→ review all UI code in the repo instead of just the branch's changes. Explicit positional scope still wins;--fullonly replaces the no-scope default.- Freeform scope ("the checkout flow", "the settings page") is interpreted reasonably.
--fix→ after reporting, apply only the findings whose fix is mechanical and unambiguous — a missingalt/aria-label, a non-semantic<div>that should be a<button>, an index-as-key, a missing image dimension that causes layout shift. Anything touching design craft, visual hierarchy, or async/state logic rests on judgment and stays report-only. After applying, re-run any build/test/lint check already in the loop and revert any fix that breaks it — or that touched more than the intended mechanical edit. Close with a summary of what was applied and what was left.
What to check
Match the project's existing stack and conventions — a finding is "wrong for this codebase," never "doesn't use my preferred library." Judge against the four dimensions below, in priority order.
1. Engineering correctness (highest priority — this is where it breaks).
- Async states. Every async surface handles all four explicitly: loading, error, empty, success. Empty is the one most often skipped — flag it specifically.
- Fetch discipline. Render waterfalls (sequential awaits that could be parallel), stale responses not cancelled or ignored (the last-to-arrive wins instead of the latest request), data fetched far from the component that needs it.
- State. State that should be derived from props/existing state but is stored instead (two copies that drift); state lifted higher than its only owner; a component doing two jobs because render logic and data logic are tangled.
- Boundaries. Untrusted I/O (API responses, route params, props from outside) used without validation or types at the edge.
- List keys that are the array index instead of a stable, data-derived id — flag wherever the list can reorder, insert, or delete.
2. Accessibility (non-negotiable — a real barrier, not a nit).
- Clickable non-semantic elements (
<div onClick>where a real<button>/<a>belongs); ARIA used where a native element exists. - Interactive elements not keyboard-reachable, illogical tab order, focus traps, missing visible focus (
:focus-visible), focus not managed on route change / modal open-close. - Color as the sole signal for state; body text below 4.5:1 contrast.
- Inputs without a programmatic label; dynamic updates not announced via a live region.
3. Performance (Core Web Vitals — field thresholds at p75: LCP < 2.5s, INP < 200ms, CLS < 0.1).
- Layout shift: images/media/fonts without reserved space (dimensions /
aspect-ratio); content injected above existing content. - INP risk: long synchronous work on the main thread during interaction.
- Wasted bytes: no lazy-loading below the fold, no code-splitting of non-critical paths, render waterfalls on the critical path.
4. Design craft (the difference between generic and intentional).
- Ad-hoc pixel values instead of a type scale and spacing system (tokens/variables).
- Flat, uniform-weight hierarchy — everything the same size/weight/spacing, nothing leading the eye.
- The generic-AI defaults: purple-gradient / glass-card cliché, default system typography where the look matters, cramped or gridless spacing.
- Motion that isn't gated by
prefers-reduced-motion.
Also flag the tells of unfinished work: hardcoded or mock data left in place of real wiring, and inline/default-export types where the project's convention is co-located, named exports.
Output
A prioritized findings list, in this order:
- Engineering correctness — broken/missing async states, fetch and stale-response bugs, drifting state (the failure a user hits)
- Accessibility barriers — keyboard, focus, labels, contrast
- Performance — layout shift, INP, oversized critical path
- Design craft — generic-by-default, broken hierarchy, unsystematized spacing/type
For each finding:
- Anchor to
file:line. - State the problem in one line, then the fix. Name the concrete failure — which of the four async states is missing, which element isn't keyboard-reachable, what shifts the layout — not "improve a11y" or "needs polish."
Rules:
- A short high-conviction list beats a long pedantic one. Don't pad it with subjective styling nits — design findings must point to a concrete, defensible problem (broken hierarchy, missing token system), not personal taste.
- Respect the project's conventions and stack. Never recommend a new library or pattern where the codebase already has one.
- With
--fix, additionally summarize what was applied vs. left (mechanics in Arguments).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

