ux-persona — persona-driven usability walkthrough
You become a real user and walk through one usage flow of the application, judging whether it is usable — not whether the code "works", but whether a real person can reach the goal on their own. You record every point of friction and deliver an actionable report. Works in any web project: everything project-specific (entry URL, persona, steps) comes from the flow file, not from this skill.
These skills also validate coded screens against the planned design (design fidelity), not only abstract usability. When a flow (or a step) declares a design reference (design_ref — e.g., a Figma node URL, an exported image, a spec), the coded screen is judged against it: a screen that doesn't match its planned design is a finding, even if it "works".
Input (the flow comes FIRST)
$ARGUMENTS = path to a flow file (convention: e2e/flows/<id>.md in the project). If empty, list the available flows in the project and ask which to run.
- The flow file declares: the persona, the entry point (the first URL — typically the home/landing), the preconditions, and the steps (each step is a UI action + the expected result).
- The persona is the lens you adopt. Resolve it in this order:
- A project persona at
e2e/personas/<persona>.md (project-specific).
- A common persona bundled with this skill at
personas/<persona>.md (relative to this SKILL.md) — see Bundled personas below.
- Fallback: a novice user, in a hurry, who does not type URLs or guess paths.
Golden rule (non-negotiable)
You navigate only through the interface. Starting from the entry point declared in the flow, every next step must be reached by clicking/typing on visible elements. NEVER type an internal route URL to "jump" to a screen. If the next step is only reachable by typing the URL, that is a BLOCKER usability finding — record it and stop the flow there (the screen exists, but the user cannot get to it). Falling back to the direct URL hides the bug; don't.
Execution backend
Default to the browser-automation tools available in the session. Use the
Webwright skill/plugin as the execution backend when the user explicitly asks
for Webwright, replayable evidence, a generated browser script, or a stronger
screenshot/action-log audit trail.
When using Webwright:
- Keep this skill's flow file as the source of truth. Translate the flow's user
goal, steps, preconditions, expected result, persona lens, and any
design_refs into Webwright critical points.
- Preserve the golden rule: the generated script must start at the flow
entry URL and reach every later screen through visible UI actions, never by
typing internal URLs.
- Treat Webwright
final_runs/run_<id>/ artifacts as evidence, not as the
durable report. Cite the relevant screenshots/log lines in this skill's
normal e2e/usability/<flow-id>--<YYYY-MM-DD>.md report.
- If Webwright succeeds mechanically but the persona rubric finds poor
discoverability, unclear copy, missing feedback, design mismatch, or fake
data, record that as a usability finding. Automation success is not UX
success.
- If the Webwright script becomes broadly useful as a regression, recommend
porting the stable path into the project's native Playwright E2E suite; do
not treat generated Webwright scripts as the CI source of truth.
Procedure
- Preconditions. Read the flow. Confirm the app is reachable at the flow's entry point (if not, start it via the project's run command, or report and stop) and that the flow's minimal data exists.
- Open the browser (the browser-automation tools available in the session): get the tab context → create a new tab for this walkthrough → navigate to the entry point. Take an initial screenshot.
- Embody the persona. For each step:
- Narrate in the first person, in character ("As , I want . I look for something like…").
- Screenshot, look at the screen, and attempt the action through the UI (click/fill).
- Fidelity check — if the flow/step declares a
design_ref, pull the planned design (Figma node / image / spec). First ENUMERATE every section, block and component the design contains, top to bottom. Then judge each one against the rendered screen and classify it: present (matches), missing (in the design, absent in code), extra (in code, not in the design), or different (present but diverges — layout, copy, colors/tokens). The fidelity verdict comes from this section-by-section enumeration — never from an overall impression. Never silently treat a section as "optional" or "simplify" it away: anything in the design that isn't implemented is a missing finding, listed explicitly. "Faithful" is a claim you must back with the per-section list, not an opinion. A placeholder/unstyled screen that doesn't match its design is a finding even if it "works".
- Data authenticity check — whenever a screen shows data back to the user (a confirmation, a detail/result screen, a list, a summary), verify it reflects real data: the values you actually entered earlier in the flow, or what the backend genuinely returned — not placeholder, lorem ipsum, sample, or hardcoded values. A polished screen wired to mock/stub content (e.g. "Lorem ipsum",
000000/00, a fixed name, a static date) is a finding even though it "works" and looks faithful — because a real user is being shown fake data. Cross-check at least one field against a value you produced earlier in the walkthrough (the protocol you searched, the text you typed, the file you uploaded). Showing fabricated data as if it were the user's is typically high severity. A design mock containing lorem ipsum is expected in the design; the same lorem ipsum surviving into the running app is the defect.
- Evaluate with the rubric below and record what hurt.
- Conclude. Write the report (see Output) and return a short summary.
Usability rubric (assess every step)
| Dimension |
The persona's question |
| Discoverability |
Did I find the path without guessing? Was the action/entry visible? |
| Clarity |
Were labels, titles and instructions clear? Did I know what to fill in? |
| Feedback |
Did the system confirm/respond to each action (success, error, loading)? |
| Friction |
Too many steps/fields? Redundant requests? Info I didn't have? |
| Error/Dead-end |
Did it break, error out, or leave me with no next step? |
| Fidelity |
Does the coded screen match its planned design (design_ref)? Brand/header, layout, components, copy, colors/tokens. |
| Data authenticity |
Does the screen show MY real data — the values I entered and the genuine results of my actions — or placeholder/sample/lorem/hardcoded data? Mock content shown to a real user is a finding even on a faithful-looking screen. |
Each finding gets a severity: blocker (prevents completion) · high (completes with heavy friction) · medium (annoying) · low (polish).
Output (durable report)
Write to e2e/usability/<flow-id>--<YYYY-MM-DD>.md (get the date from the environment; ask/derive — don't invent):
# Usability — <flow name> (<flow-id>)
- **Persona:** <persona> · **Date:** <YYYY-MM-DD> · **Entry:** <flow url>
- **Verdict:** ✅ completable | ⚠️ completable with friction | ❌ blocked at "<step>"
## Walkthrough
<one line per step: what the persona did and saw>
## Findings (prioritized)
| # | Severity | Step | What happened | Suggested fix |
|---|---|---|---|---|
| 1 | blocker | ... | ... | ... |
## Key screens
<reference to the saved screenshots>
Return at the end: verdict + number of findings per severity + the report path.
Bundled personas
This skill ships a set of common, project-agnostic personas under personas/ (next to this file), usable out of the box: novice, rushed, skeptical, mobile, accessibility, power-user. A project can define its own under e2e/personas/ (which take precedence). See personas/README.md for the catalog.
Operating notes
- Don't fake success: if the page didn't respond, say "no feedback" — that's a finding, not your failure.
- Anti-loop: if a browser action fails 2–3 times, stop and report; don't keep re-clicking or wander into screens outside the flow.
- Use plausible test data; reuse values produced by an earlier step (e.g., a freshly created reference id). If a precondition is missing, record it as a finding/precondition — don't force it.
- The browser is a single shared resource — validate one flow at a time. The
ux-flows skill invokes you sequentially.
1---2name: ux-persona3description: Embody a user persona and walk through ONE usage flow of a web application THROUGH THE UI (starting from the flow's entry point, never typing internal URLs), judging whether the journey is usable and recording actionable findings. Takes the flow as an argument. Use when you want to "test as a user", "check if it's usable", "walk flow X as a persona", "validate the usability of a screen/journey", or run a flow with Webwright-style replayable screenshots/log evidence.4---56# ux-persona — persona-driven usability walkthrough78You become a **real user** and walk through **one** usage flow of the application, judging whether it is **usable** — not whether the code "works", but whether a real person can reach the goal on their own. You record every point of friction and deliver an actionable report. Works in **any web project**: everything project-specific (entry URL, persona, steps) comes from the **flow file**, not from this skill.910These skills also validate **coded screens against the planned design** (design fidelity), not only abstract usability. When a flow (or a step) declares a **design reference** (`design_ref` — e.g., a Figma node URL, an exported image, a spec), the coded screen is judged against it: a screen that doesn't match its planned design is a finding, even if it "works".1112## Input (the flow comes FIRST)1314- `$ARGUMENTS` = path to a **flow file** (convention: `e2e/flows/<id>.md` in the project). If empty, list the available flows in the project and ask which to run.15- The flow file declares: the **persona**, the **entry point** (the first URL — typically the home/landing), the **preconditions**, and the **steps** (each step is a UI action + the expected result).16- The **persona** is the lens you adopt. Resolve it in this order:17 1. A project persona at `e2e/personas/<persona>.md` (project-specific).18 2. A **common persona bundled with this skill** at `personas/<persona>.md` (relative to this SKILL.md) — see *Bundled personas* below.19 3. Fallback: a novice user, in a hurry, who does not type URLs or guess paths.2021## Golden rule (non-negotiable)2223**You navigate only through the interface.** Starting from the **entry point declared in the flow**, every next step must be reached by **clicking/typing on visible elements**. **NEVER** type an internal route URL to "jump" to a screen. If the next step is only reachable by typing the URL, **that is a BLOCKER usability finding** — record it and stop the flow there (the screen exists, but the user cannot get to it). Falling back to the direct URL hides the bug; don't.2425## Execution backend2627Default to the browser-automation tools available in the session. Use the28Webwright skill/plugin as the execution backend when the user explicitly asks29for Webwright, replayable evidence, a generated browser script, or a stronger30screenshot/action-log audit trail.3132When using Webwright:3334- Keep this skill's flow file as the source of truth. Translate the flow's user35 goal, steps, preconditions, expected result, persona lens, and any36 `design_refs` into Webwright critical points.37- Preserve the golden rule: the generated script must start at the flow38 `entry` URL and reach every later screen through visible UI actions, never by39 typing internal URLs.40- Treat Webwright `final_runs/run_<id>/` artifacts as evidence, not as the41 durable report. Cite the relevant screenshots/log lines in this skill's42 normal `e2e/usability/<flow-id>--<YYYY-MM-DD>.md` report.43- If Webwright succeeds mechanically but the persona rubric finds poor44 discoverability, unclear copy, missing feedback, design mismatch, or fake45 data, record that as a usability finding. Automation success is not UX46 success.47- If the Webwright script becomes broadly useful as a regression, recommend48 porting the stable path into the project's native Playwright E2E suite; do49 not treat generated Webwright scripts as the CI source of truth.5051## Procedure52531. **Preconditions.** Read the flow. Confirm the app is reachable at the flow's **entry point** (if not, start it via the project's run command, or report and stop) and that the flow's minimal data exists.542. **Open the browser** (the browser-automation tools available in the session): get the tab context → **create a new tab** for this walkthrough → navigate to the **entry point**. Take an initial screenshot.553. **Embody the persona.** For each step:56 - **Narrate in the first person, in character** ("As <persona>, I want <goal>. I look for something like…").57 - Screenshot, **look at the screen**, and attempt the action **through the UI** (click/fill).58 - **Fidelity check** — if the flow/step declares a `design_ref`, pull the planned design (Figma node / image / spec). **First ENUMERATE every section, block and component the design contains, top to bottom.** Then judge each one against the rendered screen and classify it: `present` (matches), `missing` (in the design, absent in code), `extra` (in code, not in the design), or `different` (present but diverges — layout, copy, colors/tokens). The fidelity verdict comes from this **section-by-section enumeration — never from an overall impression**. **Never silently treat a section as "optional" or "simplify" it away:** anything in the design that isn't implemented is a `missing` finding, listed explicitly. "Faithful" is a claim you must back with the per-section list, not an opinion. A placeholder/unstyled screen that doesn't match its design is a finding even if it "works".59 - **Data authenticity check** — whenever a screen shows data **back** to the user (a confirmation, a detail/result screen, a list, a summary), verify it reflects **real data**: the values you actually entered earlier in the flow, or what the backend genuinely returned — **not** placeholder, lorem ipsum, sample, or hardcoded values. A polished screen wired to mock/stub content (e.g. "Lorem ipsum", `000000/00`, a fixed name, a static date) is a finding even though it "works" and looks faithful — because a real user is being shown fake data. Cross-check at least one field against a value you produced earlier in the walkthrough (the protocol you searched, the text you typed, the file you uploaded). Showing fabricated data as if it were the user's is typically `high` severity. A design mock containing lorem ipsum is expected in the *design*; the same lorem ipsum surviving into the *running app* is the defect.60 - **Evaluate** with the rubric below and record what hurt.614. **Conclude.** Write the report (see *Output*) and return a short summary.6263## Usability rubric (assess every step)6465| Dimension | The persona's question |66|---|---|67| **Discoverability** | Did I find the path without guessing? Was the action/entry visible? |68| **Clarity** | Were labels, titles and instructions clear? Did I know what to fill in? |69| **Feedback** | Did the system confirm/respond to each action (success, error, loading)? |70| **Friction** | Too many steps/fields? Redundant requests? Info I didn't have? |71| **Error/Dead-end** | Did it break, error out, or leave me with no next step? |72| **Fidelity** | Does the coded screen match its planned design (`design_ref`)? Brand/header, layout, components, copy, colors/tokens. |73| **Data authenticity** | Does the screen show MY real data — the values I entered and the genuine results of my actions — or placeholder/sample/lorem/hardcoded data? Mock content shown to a real user is a finding even on a faithful-looking screen. |7475Each finding gets a **severity**: `blocker` (prevents completion) · `high` (completes with heavy friction) · `medium` (annoying) · `low` (polish).7677## Output (durable report)7879Write to `e2e/usability/<flow-id>--<YYYY-MM-DD>.md` (get the date from the environment; ask/derive — don't invent):8081```markdown82# Usability — <flow name> (<flow-id>)83- **Persona:** <persona> · **Date:** <YYYY-MM-DD> · **Entry:** <flow url>84- **Verdict:** ✅ completable | ⚠️ completable with friction | ❌ blocked at "<step>"8586## Walkthrough87<one line per step: what the persona did and saw>8889## Findings (prioritized)90| # | Severity | Step | What happened | Suggested fix |91|---|---|---|---|---|92| 1 | blocker | ... | ... | ... |9394## Key screens95<reference to the saved screenshots>96```9798Return at the end: verdict + number of findings per severity + the report path.99100## Bundled personas101102This skill ships a set of common, project-agnostic personas under `personas/` (next to this file), usable out of the box: `novice`, `rushed`, `skeptical`, `mobile`, `accessibility`, `power-user`. A project can define its own under `e2e/personas/` (which take precedence). See `personas/README.md` for the catalog.103104## Operating notes105106- **Don't fake success:** if the page didn't respond, say "no feedback" — that's a finding, not your failure.107- **Anti-loop:** if a browser action fails 2–3 times, stop and report; don't keep re-clicking or wander into screens outside the flow.108- Use plausible test data; reuse values produced by an earlier step (e.g., a freshly created reference id). If a precondition is missing, record it as a finding/precondition — don't force it.109- The browser is a **single shared resource** — validate **one flow at a time**. The `ux-flows` skill invokes you sequentially.