audit-ui-e2e — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited audit-ui-e2e (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Walk a running UI with beginner's mind. Drive the browser through every interactive surface inside the target scope, log each rough edge as a structured finding, and ship a triage-board the user can hand to a teammate or paste into a ticket system.
The target can be anything reachable in a browser — a local dev server, staging, production, a specific route, a single modal, an entire flow, a deployed PR preview. Branch context is detected and used as enrichment when the URL is on localhost, but isn't required.
_On startup, use the Read tool to load ~/.claude/skills/audit-ui-e2e/preferences.md. If missing, use defaults._
Defaults:
default-depth: standardauto-open-triage: true (open the resulting viewer in Chrome at the end)destructive-default: skip (Delete / Purge / Drop / Wipe buttons skipped unless --include-destructive)localhost-port-hint: 3000 (used only to ask "should I start the dev server" when localhost is the target and the port is dead)_On startup, use Bash to detect (best-effort, skip on failure):_
git rev-parse --is-inside-work-tree)_feat/ais-2060-…)_localhost: whether the port is listening__These are used to seed the audit's metadata + plan, not as preconditions. The skill works fine on any URL with no git context._
Check $ARGUMENTS:
help → show help, then stopconfig → interactive setup, then stopreset → delete preferences, confirm, then stop/audit-ui-e2e https://app.example.com/dashboard or /audit-ui-e2e /w/30/meetings)--scope <description> → free-text scope hint (e.g. --scope "the new export buttons in the header")--depth quick|standard|thorough → override default depth--include-destructive → don't skip destructive actions; clicks Delete/Purge/etc. but honors confirmation dialogs (missing confirms become findings)audit-ui-e2e — Beginner-mind end-to-end UI audit of any running app
Usage:
/audit-ui-e2e Ask for target, then audit
/audit-ui-e2e <url-or-path> Audit a specific URL (or localhost path)
/audit-ui-e2e <url> --scope "checkout flow" Narrow the audit to a named surface
/audit-ui-e2e <url> --depth quick Hit the headline surfaces only (~5 min)
/audit-ui-e2e <url> --depth thorough Walk every reachable interactive (~30+ min)
/audit-ui-e2e <url> --include-destructive Test Delete/Drop/Purge (confirms honored)
/audit-ui-e2e config Set defaults
/audit-ui-e2e reset Clear preferences
/audit-ui-e2e help This help
Target accepts:
- Full URL: https://app.example.com/dashboard, https://staging.acme.io
- Local path: /w/30/meetings (resolves against localhost:<port-hint>)
- Just /: / (the app root on localhost)
Output: Hands findings to /triage-board, which produces
~/Desktop/triage-boards/<scope-or-host>-<YYYY-MM-DD>/
├── report.json — schema-conformant findings
├── report.md — prose mirror
└── viewer.html — single-file viewer (MD/CSV/JSON exports + per-finding Copy as Markdown)If preferences.md is missing, show:
First time using /audit-ui-e2e — quick context: I drive Chrome (via the claude-in-chrome MCP) through any URL you point me at. I won't click anything destructive unless you pass--include-destructive. Output lands in~/Desktop/triage-boards/via the/triage-boardskill — open the viewer, click any card'sCopy as Markdownto paste into Linear/GitHub/Notion.
>
Run /audit-ui-e2e config for setup, or continue with defaults (standard depth, destructive skipped).Then proceed.
Inputs determine what's asked:
/relative-path against http://localhost:<port-hint> only if a server is listening; otherwise ask.AskUserQuestion:Show a concise plan derived from the target + scope + (optional) branch context:
Target: http://localhost:3000/w/30/meetings
Scope: delete-meeting modal flow (recent PR work)
Depth: standard
Skipping: Upload Transcript (destructive opted-out)
Plan:
1. Baseline render at the target
2. Three-dot menu → Delete Meeting → modal open / X / Esc / Cancel
3. Bulk select + bulk-action header
4. Cross-check: insight drawer behavior, filter pills, tab counts
Go?If the target is localhost and the port is dead, ask: should we start the dev server? (Detect command from package.json — pnpm run dev / npm run dev / yarn dev.)
Use ToolSearch to load the Chrome MCP tools that aren't already in context:
ToolSearch(query: "select:mcp__claude-in-chrome__tabs_context_mcp,mcp__claude-in-chrome__navigate,mcp__claude-in-chrome__computer,mcp__claude-in-chrome__find,mcp__claude-in-chrome__read_console_messages,mcp__claude-in-chrome__read_network_requests,mcp__claude-in-chrome__browser_batch")Then tabs_context_mcp to find or create a tab. Prefer reusing an existing tab on the target host; create new only if no match.
For each plan bullet:
navigate to the relevant URLscreenshot baseline (in-memory — used by the agent to read state, never persisted)computer / browser_batch (click, type, key)read_console_messages if anomalies are suspected (filter to error|warn|TypeError|Hydration)read_network_requests if a fetch is expected and might be silently absent or 4xx/5xxscreenshot after the interaction (in-memory)where + repro so the developer can reproduce it without the screenshotBeginner-mind heuristics (what to look for):
0Safety rules:
--include-destructive, click them but honor confirmation dialogs. If a confirmation dialog is missing, that itself is a finding (this is how PMI's bulk-delete bug was caught).Maintain an in-memory findings[] array as the audit progresses. Each finding:
{
"id": "B1",
"severity": "critical | high | medium | low | info",
"category": "bug | ux | accessibility | content | performance | console",
"title": "One-line summary",
"where": "specific surface / route / component",
"symptom": "what you saw (be concrete — quote labels, name elements)",
"impact": "why it matters to a user",
"repro": "step-by-step — precise enough that a developer can reproduce in their own browser without the agent's screenshot",
"triage": "suggested fix direction (not prescriptive)"
}ID convention: B# for bugs, U# for UX gaps, C# for console/perf/a11y. Number sequentially within each prefix as findings are discovered.
Severity calibration:
Findings are text-only. The repro field is the contract — a developer reading the report should be able to reproduce the issue in their own browser without ever seeing a screenshot. If you can't write a clean repro, the finding isn't well-scoped yet.
Before handing off to /triage-board, collect:
positives[] — things that worked well (deep-linking, drawer behavior, focus rings, etc.). Keep short — 3-8 lines.notes[] — side effects of testing if any (data destroyed when --include-destructive, accounts created, test uploads, etc.). Be specific — name what was modified.Build the report.json payload conforming to the triage-board schema:
{
"schemaVersion": "1",
"meta": {
"title": "<derived from --scope or target host/path>",
"date": "<today>",
"tester": "<git user.name or 'agent'>",
"surface": "<entry URL + brief description>",
"branch": "<git branch IF localhost AND inside a repo>",
"scopeIncluded": [...plan bullets that ran...],
"scopeExcluded": [...skipped items (destructive, unrelated)...]
},
"findings": [ ... ],
"positives": [ ... ],
"notes": [ ... ]
}Topic slug for the folder, in priority order:
--scope value (kebab-cased)app-example-com-dashboard)ui-audit as final fallbackInvoke /triage-board --findings <path-to-report.json> --topic <slug> (or write the folder directly using triage-board's template at ~/.claude/skills/triage-board/templates/).
If auto-open-triage is on, open <triage-folder>/viewer.html. Print a tight summary:
Audited {target} — {N} findings, {scope} scope
Critical: {n} High: {n} Medium: {n} Low: {n} Info: {n}
Folder: ~/Desktop/triage-boards/{slug}-{date}/
Viewer: ~/Desktop/triage-boards/{slug}-{date}/viewer.html
Hand off: open the viewer, click any card's "Copy as Markdown" to paste into Linear/GitHub/Notion.scopeExcluded).--include-destructive for a more thorough pass when they're on test data./triage-board produces the artifact. Keep the boundary clean.where + repro fields, without ever seeing what the agent saw._Auto-managed. The skill silently adds preferences here when the user corrects a default (e.g. always include destructive, always start at a specific route on this host). Surface once when adding: "Noted: <pattern>. Saved for next time."_
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.