ux-interview — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ux-interview (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.
Play a real user in an interview-style test of a web product. Narrate think-aloud reactions live as you click, scroll, and try to accomplish realistic goals — then deliver a structured report with severity-ranked findings, delight moments, and prioritized recommendations.
This skill is not an automated test runner (see /ui-test for that). It is a qualitative user-perspective audit. Findings are based on judgement, not assertions.
_On startup, use the Read tool to load ~/.claude/skills/ux-interview/preferences.md. If missing, treat as first-run (see First-time detection)._
Defaults when no preferences exist:
output-root: ./ux-interviews/ (cwd-relative when in a project; falls back to ~/.claude/skills/ux-interview/runs/ otherwise)default-depth: standard (quick ≈ 5–7 min walkthrough / standard ≈ 12–18 min / deep ≈ 25 min+ with multiple flows)narration-style: expressive (expressive — feels like a real user / neutral — observational / terse — short notes only)persona-mode: auto-suggest (auto-suggest with override / always-ask / fixed-default)severity-floor: minor (nitpick / minor / moderate / major — anything at-or-above is reported)capture-mode: friction-only (friction-only / per-section / never) — when GIFs/screenshots are takenviewport: 1440x900 — also accepts a list (e.g. 375x812,1440x900) to test responsiveconfirm-plan: always (always / never) — confirm the test plan before opening the browserauto-open-report: true_Also load ~/.claude/skills/ux-interview/feedback-journal.md if present — surface the latest 5 Signal: lines to bias defaults (e.g. if the user repeatedly downgraded "minor copy issues", raise the severity floor pre-selection)._
_On startup, use Bash to detect: today's date+time (date +%Y-%m-%d-%H%M), the current working directory (pwd), and whether the configured output-root exists. Do NOT call any browser tool yet — that happens in Step 4._
Check $ARGUMENTS:
preferences.md + feedback-journal.md + sessions/ + resume-state.md, confirm, stopresume-state.md and continue an interrupted session, stop on completion$ARGUMENTS as an inline brief (URL + free-text description), run from Step 1ux-interview — Real-user-perspective UX testing via real Chrome
Usage:
/ux-interview "<url> <brief>" Inline brief, runs the session
/ux-interview --from-brief <path> Load brief from a markdown file
/ux-interview resume Resume an interrupted session
/ux-interview history List recent sessions (verdict + date)
/ux-interview feedback Rate the last session (teaches the skill)
/ux-interview config Set preferences
/ux-interview reset Clear preferences + journal + sessions
/ux-interview help This help
Per-run flags:
--persona "<who>" Override the auto-suggested persona
--focus "<areas>" Comma-list of areas/flows to prioritize
--depth quick|standard|deep
--viewport <WxH[,WxH]> Single viewport or comma-list for responsive
--no-narration Skip live think-aloud, only output the final report
--no-gif Disable GIF capture
--severity-floor <nitpick|minor|moderate|major>
--verbose
Examples:
/ux-interview "https://stripe.com — checkout flow + nav clarity"
/ux-interview --from-brief ./brief.md --persona "non-technical small-biz owner"
/ux-interview "https://acme.app/signup --focus signup,onboarding --depth deep"
Output: {output-root}/{YYYY-MM-DD-HHMM}-{slug}/ contains
report.md, brief.md, transcript.md, findings.json, captures/.
Current preferences:
(loaded from preferences.md)Use AskUserQuestion to collect (max 4 per call):
Batch 1 — Output & defaults
./ux-interviews/)quick / standard / deep)auto-suggest / always-ask / fixed-default)expressive / neutral / terse)Batch 2 — Capture & strictness
nitpick / minor / moderate / major)friction-only / per-section / never)1440x900 or 375x812,1440x900)always / never)Save to ~/.claude/skills/ux-interview/preferences.md in the three-tier format below.
# /ux-interview preferences
Updated: YYYY-MM-DD
## Defaults
- output-root: ./ux-interviews/
- default-depth: standard
- narration-style: expressive
- persona-mode: auto-suggest
- severity-floor: minor
- capture-mode: friction-only
- viewport: 1440x900
- confirm-plan: always
- auto-open-report: true
## Profile (optional — edit freely)
- I usually test B2B SaaS — bias personas toward time-pressed admins.
- Skip nitpicky copy issues unless they actually block comprehension.
## Learned
- (populated from feedback over time)Delete preferences.md, feedback-journal.md, sessions/, and resume-state.md. Confirm: Cleared. Defaults + journal + sessions wiped.
If no preferences.md exists:
First time using/ux-interview? Run/ux-interview configto set defaults — or just continue and I'll use sensible ones.
Then proceed.
Read preferences.md and feedback-journal.md (graceful: if missing, continue with defaults). Note any Learned rules — they pre-bias the choices in Steps 2–6 (persona pick, severity floor, narration style).
Inputs may come from: $ARGUMENTS inline string, --from-brief <path>, or interactive prompt. The brief should answer:
If any are missing, ask via AskUserQuestion (≤4 questions in one batch). Pre-select based on Learned rules.
Save the parsed brief to {session-dir}/brief.md.
Based on the product description + focus areas, propose a persona that's likely to surface real issues. A persona is 3–5 lines:
Per persona-mode:
auto-suggest: present the suggested persona via AskUserQuestion with options Use it / Tweak it / Pick a different onealways-ask: skip the suggestion, prompt the user for the personafixed-default: use the persona stored in preferences.md ProfileSave the chosen persona to {session-dir}/brief.md under ## Persona.
Draft a short test plan (5–10 bullet points) covering:
If confirm-plan: always, present the plan and ask one AskUserQuestion to approve, tweak, or restart. If confirm-plan: never, log the plan to the transcript and proceed.
Save the plan to {session-dir}/transcript.md under ## Plan.
Open a fresh Chrome tab via mcp__claude-in-chrome__tabs_create_mcp (call tabs_context_mcp first if you don't have a current tab). Set viewport via resize_window. Then walk the plan.
For each step:
navigate, find, computer (click/scroll/type), form_input for forms.read_page or get_page_text for content; read_console_messages if something looks broken.[delight] — something exceeded expectations[friction] — slow, awkward, or required guessing (severity: nitpick / minor / moderate / major)[confusion] — couldn't tell what to do, where to go, or what something meant[bug] — broken or behaved unexpectedly[neutral] — noted but no judgementcapture-mode):friction-only → call gif_creator only on friction/confusion/bug momentsper-section → capture a short GIF for each major flow transitionnever → skip captureSave captures under {session-dir}/captures/.
Append every reaction to {session-dir}/transcript.md as a timestamped line:
[HH:MM:SS] [tag/severity] (location) "narration" — observationStop conditions — end early if:
If the session is interrupted (user halts, browser disconnect), save resume-state.md with the current step + transcript pointer.
After exploration:
severity-floor — anything below the floor goes to ## Below floor (kept but not promoted).[delight]).(severity × confidence) / effort (effort guessed: low/med/high).Save structured data to {session-dir}/findings.json.
Write {session-dir}/report.md with this structure:
# UX Interview — {product name} — {date}
## Verdict (one paragraph)
Persona "{persona-summary}" tried to {goal}. Outcome: {succeeded / partially / abandoned}. {1–2 sentences on overall feel}.
## Top friction (severity ≥ {floor})
1. **{Title}** — {severity} · {confidence} · {type}
What happened: {…}
Why it matters: {…}
Where: {URL or location} ({capture link if any})
Suggested fix: {…}
## What worked
- {delight moment 1}
- {delight moment 2}
## Prioritized recommendations
| # | Issue | Severity | Effort | Impact |
|---|-------|----------|--------|--------|
| 1 | … | major | low | high |
## Persona & plan
{persona block}
{plan bullets}
## Full transcript
See `transcript.md`.
## Captures
See `captures/` ({N} files).If auto-open-report: true, run open {session-dir}/report.md.
Print to chat:
{N} major, {M} moderate, {K} minor; {D} delight moments)report.mdAskUserQuestion: What's next? — Open report / Run another persona on the same product / Try a different flow / DoneThen add the line:
Run /ux-interview feedback — even one rating helps me sharpen which findings are signal vs noise for you.Append a session log to ~/.claude/skills/ux-interview/sessions/{YYYY-MM-DD-HHMM}.md with the brief, persona, plan summary, finding counts by severity, and a 1-line verdict. This is what feedback reads.
When invoked as /ux-interview feedback:
sessions/YYYY-MM-DD-HHMM.md. If none, say No recent session found. and stop.AskUserQuestion (4 questions in one batch):spot-on / close / off)mostly real / mixed / mostly noise)right / too harsh / too lenient)right / too shallow / too deep)~/.claude/skills/ux-interview/feedback-journal.md: ## {session slug} — {date}
- Persona fit: {answer}
- Findings quality: {answer}
- Severity calibration: {answer}
- Depth: {answer}
- Signal: {one-line generalisation, e.g. "User wants severity floor raised for B2B SaaS — they keep flagging minor copy as noise"}Signal, promote it to ## Learned in preferences.md. Mention once: Noticed you consistently {…}. Saved as standing default.Learned rule is contradicted in 2 newer sessions, demote it (log the demotion in the journal).Pre-selection in Step 2's persona question and Step 5's severity-floor application should be biased by Learned rules.
nitpick, not major. Inflating severity ruins the signal.preferences.md / feedback-journal.md can't be read; skip captures if gif_creator fails; don't abort the whole session for one tool error.resume-state.md and exit cleanly. Don't keep poking the browser.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.