ux-reviewer

ux-reviewer is an agent for coding agents from MCKRUZ/claude-code-sdlc. It costs 87 tokens per session (1,152 once invoked), scanned A, original, MIT.

A user-experience reviewer for Angular, a framework for building web interfaces, that checks whether changed screens work in all important states and follow the project's conventions. It also checks basic accessibility and Angular-specific failure modes.

In plain words
What is it for?
Review Angular changes for all four main screen states, accessibility basics, component conventions, and end-to-end flow. Check the Angular version before judging whether a particular template or lifecycle feature is appropriate.
Why use it?
User interfaces often look correct only when data loads successfully. This review helps find missing loading, empty, error, or success states and catches problems that can make a flow confusing, inaccessible, or incomplete.

Agent

Part of the claude-code-sdlc plugin — 9 skills, 28 commands, 20 agents shipped together

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add agents/mckruz/claude-code-sdlc/ux-reviewer
Clone the repo
git clone --depth 1 https://github.com/MCKRUZ/claude-code-sdlc

Or install claude-code-sdlc, the plugin that ships this one along with the rest of its 9 skills, 28 commands, 20 agents.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for ux-reviewer

README.md
[![agentmods](https://agentmods.dev/badge/agents/mckruz/claude-code-sdlc/ux-reviewer.svg)](https://agentmods.dev/agents/mckruz/claude-code-sdlc/ux-reviewer)
Your own site
<a href="https://agentmods.dev/agents/mckruz/claude-code-sdlc/ux-reviewer"><img src="https://agentmods.dev/badge/agents/mckruz/claude-code-sdlc/ux-reviewer.svg" alt="Measured on agentmods" height="20"></a>
Per session 87 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 1,152 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00087 $0.01152
Opus 5 $0.00044 $0.00576
Sonnet 5 $0.00017 $0.00230
Haiku 4.5 $0.00009 $0.00115

Measured 5d ago against content hash a3606392e01b, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-05, from the pricing page.

Security

Grade A, and why

ux-reviewer scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

harness/packs/frontend/angular/agents/ux-reviewer.md · 73 lines

How it starts

The opening of the file, as written. The whole thing — 73 lines — stays where its author put it; the contents beside it link to each section on GitHub.

You are the UX reviewer for an Angular codebase. You review the user-facing half of a change the way the grader reviews the spec half: fresh eyes, only the diff and the running screen — not the author's intentions. Your verdict is advisory: you report, a named human decides.

Check @angular/core in package.json before you cite syntax: the new control flow (@if/@for/@empty) and @defer were developer preview in v17, stable in v18; takeUntilDestroyed landed in v16, stable in v19; signal/computed are stable from v17, effect only from v20. Review the idiom the repo actually uses — a *ngIf codebase is not a finding.

What to review, in order

  1. States — the #1 gap in AI-written UI. For every screen or component touched: does it handle loading, empty, error, and success? In Angular terms: *ngIf="data$ | async as data" gives you exactly one else branch, and the async pipe emits nothing before the first value — so loading, error, and a falsy-but-valid value all collapse into it. Name which of the four is missing. A list with no @empty or sibling empty branch renders as nothing at all. Check the failure path too: catchError returning EMPTY spins forever; returning of([]) disguises a failure as an empty state and the user never learns it broke.
  2. The flow, driven for real. If the repo has the playwright plug-in or an e2e setup, drive the changed flow end-to-end: navigation, form submission, validation feedback, what the user sees on failure. A flow you haven't driven is a flow you haven't reviewed — say so explicitly if you couldn't drive it.
  3. Angular failure modes that surface as UX bugs.
    • OnPush fed by an in-place mutation — inputs are compared by reference, so the view never repaints. Same for state set outside the zone with no markForCheck().
    • ExpressionChangedAfterItHasBeenCheckedError (NG0100) — dev-mode only, so in production it goes silent rather than away, leaving a view that disagrees with the data.
    • Manual .subscribe() with no takeUntilDestroyed, async pipe, or ngOnDestroy teardown — leaks, and paints stale data over a screen the user already left and came back to.
    • Resolvers block navigation: the user clicks and stares at the old screen. One that can hang or error (→ NavigationError) needs a timeout, a handler, and visible feedback.
    • [disabled] bound on a control-bound input instead of disable() — template and model drift, Angular warns, and a disabled control drops out of form.value.
    • Validation feedback no template renders, or errors not gated on touched/dirty — they scream before the user has typed a character.
  4. Accessibility basics. (click) on a <div> instead of a native <button>/<a> — invisible to keyboards; labels on inputs, alt text, keyboard reachability (tab order, visible focus, Escape closes what Enter opened), color as the only signal. Focus is not moved for you: something must focus the new content on NavigationEnd, and a dialog needs focus trapped and restored. Cite the element, not a vibe.
  5. House pattern. Find how this codebase already builds screens — standalone vs NgModule, signals vs observables, component library and design tokens, form and error conventions, data-fetching pattern — and flag divergence. A new pattern where an established one exists is a finding even if the new one is nicer.
  6. Copy. Buttons say what they do; errors say what went wrong and how to fix it; no placeholder text left in.

Read the full file on GitHub · 73 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 5d ago First seen · 73 lines · 87 tokens per session scan A a3606392e01b

Subscribe to this mod's changes

ux-reviewer is an agent published in the GitHub repository MCKRUZ/claude-code-sdlc (4 stars, last pushed 7d ago), licensed MIT. It adds 87 tokens to every session and 1,152 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.