plugins/powerups/skills/user-research/SKILL.md
Run PM-grade discovery before building any user-facing feature — problem statement, jobs-to-be-done, core flow, decision matrix. Output is a short brief with open decisions surfaced as explicit questions. Invoked by plan-driven-development and give-me-five.
npx skillsauth add jackyliang/powerups user-researchInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Features fail more often from building the wrong thing than building the thing wrong. This skill front-loads the thinking a good PM does before pixels or code: who hires this feature, for what job, through what flow, with which decisions locked and which deliberately deferred.
The output is a discovery brief the requester reads and reacts to. It is short (one screen-ish), opinionated (every open decision has a recommended default), and decision-forcing (ends with the 2–4 questions only the requester can answer).
Invoked by other powerups skills:
powerups:plan-driven-development runs this BEFORE writing the plan, whenever
the feature is user-facing — the discovery brief feeds the Context and Design
sections and surfaces the decisions that become plan questions.powerups:give-me-five runs this BEFORE brainstorming directions — all five
variants must embody the same job analysis, so the research happens once up front.Skip it when: the change is mechanical (rename, restyle, bugfix), the flow is already industry-standard (login form), or the requester has already specified the exact behavior and owns the consequences.
Work through the four artifacts below IN ORDER — each feeds the next. Keep every artifact table-shaped and scannable; prose only where a table can't carry the nuance.
Name the user's problem without mentioning the feature. Test: a competitor could read it and build a different solution to the same sentence.
Weak: "Users want to compare models." (names the mechanism) Strong: "Users can't tell which model to trust for their task, so they're always guessing." (names the pain)
If you cannot write this sentence, stop and ask the requester what prompted the request — usually there's a triggering incident that contains the answer.
Enumerate the distinct jobs a user would "hire" this feature for. 3–5 jobs is typical; 1 means the feature may be a button not a feature; 7+ means scope needs cutting.
| # | Job (verb phrase, user's voice) | Trigger moment | What "done" looks like | Frequency | |---|---|---|---|---| | J1 | "..." | the situation that makes them reach for it | the state where they stop | rare/periodic/constant |
Rules:
After the table, extract 1–3 structural insights — consequences the table forces. ("J2 starts from an existing reply, so a message-level entry point matters as much as a composer-level one.") These are the part the requester actually remembers; don't skip them.
Draw the happy path as 3–4 stages, ASCII boxes, one line each. Annotate the step that resolves the feature's hardest design tension — every feature has one (for comparison UIs it's "what happens on the next turn?"; for wizards it's "what if they leave halfway?"). If you can't name the tension, you haven't found it yet — look at what happens AFTER the happy path ends.
entry (from JTBD triggers) → the work → the resolution
┌─────────────┐ ┌──────────────┐ ┌─────────────────────┐
│ ... │ → │ ... │ → │ the tension-resolver │
└─────────────┘ └──────────────┘ └─────────────────────┘
Every axis where the design could plausibly go multiple ways gets a row. This is the contract between you and the requester: silent assumptions are the failure mode this artifact exists to kill.
| Decision | Options | v1 position | Why | |---|---|---|---| | ... | A / B / C | the recommendation | one line tying it to a JTBD row |
Rules:
End by asking the requester ONLY the decisions that genuinely change what gets built (2–4 max), each with the recommended option marked. Everything else proceeds on your stated defaults. If an interactive question tool is available, use it; otherwise list the questions with defaults that apply if unanswered.
Then STOP. Do not start designing or building until the requester answers — the entire point of discovery is that these answers reshape the work.
| Mistake | Fix | |---|---| | Starting from the requested mechanism ("add compare") | Rewrite as a problem statement first; the mechanism is one candidate solution | | Personas instead of jobs | Jobs are situational ("when X happens, I need Y"), not demographic | | Skipping the trigger-moment column | Entry points come from triggers; without them you'll default to a new top-level screen nobody finds | | A decision matrix with no positions | Recommend on every row; the requester edits, not authors | | Asking the requester every question | Only decisions that change the build; defaults for the rest | | Sliding into implementation in the same breath | Discovery ends at the hand-off questions; building starts after answers | | Analysis longer than the feature spec | One screen. If it's longer, the insights are diluted |
testing
Ultra-short replies — answer a quick question, draft a short text/social post, or draft a short email. No preamble, no offers to elaborate, drafts under 480 characters (280 for X), never em-dashes.
development
Reconcile shipped code with the plan in both directions — additive drift (unplanned work that landed) and subtractive drift (dead files, stale TODOs, completed deferred items). Run as part of PDD's post-completion audit, before /simplify.
data-ai
Generate 5 meaningfully distinct UI/UX variants of the same screen in parallel (one subagent each), reachable via ?style=1...5, so the user can compare and pick. Calling again on a chosen style refines within that direction.
development
Use when building any feature (small or large), fixing bugs, or refactoring — always write failing tests first against real infrastructure