Review Product
Review a product the way its users experience it, not the way its code is
structured. Where code-review and the review-* family judge the
implementation, this skill judges whether the product serves the people using
it: it builds a profile of the user, maps the jobs they come to do, then walks
those jobs through the product to find friction, gaps, and concrete things to
add or change.
Reusable findings (the persona and the use cases) are persisted to docs/product/
and refined on each run, so the product's understanding of its users
accumulates instead of being re-derived every time. The review itself is written
to docs/product/<date>-review.md so it isn't lost. All of this lives under
docs/product/ as a section of the project's docs/ tree, indexed by
docs/product/overview.md once the section has several files (consistent with the
doc skill's "index when warranted" convention).
docs/product/ is the high-level, user-centric layer (why, for whom, what's
missing). It is the upstream of docs/features/ (the "what it does" layer the doc
skill owns and keeps in sync with the implementation; formerly docs/prd/). This
skill owns docs/product/ and does not write docs/features/; it only checks that
the feature docs reflect the product understanding (Step 7).
Usage
review-product # codebase + product description (default)
review-product --live # also drive the running app to verify real behavior (slow)
review-product --multi # add external advisor opinions on the findings
review-product checkout flow # scope the review to a feature/area
Scope
| Argument |
What it reviews |
Cost |
| (none) |
Infers the experience from the codebase + any product description (README, docs/features/, CLAUDE.md, docs). Default. |
Fast |
--live |
Adds to the default: launches/exercises the running app to confirm what really happens (use run or browser tooling). Don't assume — observe. |
Slow |
--multi |
After the review, calls second-opinion --quick with the findings and adds a short cross-model section. |
+external advisors |
| free text |
Scopes persona/use-cases/audit to the named feature or area instead of the whole product. |
— |
--live is opt-in because exercising the app is slow; the default reasons from
code + docs only and says so.
Gotchas
- Evidence, not invention. Every persona claim and use case must trace to the
codebase, a doc, or explicit user input. Do not fabricate demographics, market
size, or user quotes. If something is an assumption, label it and ask.
- User's job, not the code's structure. A "friction point" is something that
slows or blocks the user, described in their terms — not a refactor or a code
smell. Send those to
review-cleancode / code-review.
- Refine, don't clobber. If
docs/product/persona.md or use-cases.md already
exist, edit them — reconcile new evidence with prior content and note what
changed. Don't overwrite a richer file with a thinner one.
- Without
--live, you are reasoning about intended behavior from source. State
that explicitly; flag where real behavior would need to be verified.
Workflow
Create a TodoWrite item per step.
Step 1 — Build or refine the user persona
- Read
docs/product/persona.md if it exists. Read the product description (README,
docs/features/, docs/, CLAUDE.md) and survey the codebase (entry points, routes/screens,
auth, settings) for who the product is built for.
- Produce the persona(s) using the template in
references/checklist.md: who they
are, why they're here, environment, what they value, frustrations, what success
looks like. Mark the primary persona.
- If core facts can't be inferred (who the real user is, what they're optimizing
for), ask the user 2-4 focused questions before continuing — a wrong persona
invalidates the whole review.
- Write/refine
docs/product/persona.md.
Step 2 — Map the use cases (jobs-to-be-done)
- Read
docs/product/use-cases.md if present. From the persona's goals plus the
product's actual flows, enumerate the jobs the user comes to do, phrased from
their point of view (When ___, I want to ___, so I can ___).
- For each: trigger, the path the product requires today (cite screens/routes),
definition of done, frequency/stakes. Order by centrality to the persona.
- Write/refine
docs/product/use-cases.md.
Step 3 — Walk the experience
- Trace each primary use case end-to-end through the product. Without
--live,
follow the code paths/screens. With --live, actually exercise the running app
(launch via run, drive the UI, screenshot key states) and record what really
happens vs what the code implies.
- Note what works well — effective flows worth keeping. A review that only
lists problems is incomplete.
Step 4 — Audit friction & gaps
- Evaluate each use case against the lenses in
references/checklist.md:
(A) job coverage (the most important — can the user actually finish the
job?), (B) friction (Nielsen heuristics applied to flows), (C) onboarding
& first run, (D) trust & safety, (E) opportunities to add/change/remove.
- For large products or
--live, assign primary use cases to workers and queue
them within the runtime concurrency limit, then merge their findings. Give them
the read/browser tools needed for the walkthrough without code edits. Disable
delegation tools for ordinary workers; any coordinating role needs explicit
subtasks, a descendant limit, and a stopping condition.
- Rate each finding by user impact: Critical / High / Medium / Suggestion
(definitions in the checklist).
Step 5 — Prioritize recommendations
- Turn findings into concrete, actionable changes — what to add, change, or remove,
in the user's terms. Each gets a severity, a rough effort (S/M/L), and ties back
to the use case it unblocks. Lead with the changes that most help the primary
persona on their primary job.
- Wide-open gap → diverge before converging. When a finding is a job the product
doesn't serve at all (a Step 4(A) coverage gap or a Step 7 uncovered use case) and
the fix isn't obvious, optionally invoke
ideation (Skill tool) on that specific job —
tell it the job is an already-validated unmet user need so it focuses on how to serve it
rather than whether to — to generate a wider spread of approaches, then bring the best one
back as the recommendation. The gap stays evidence-anchored (an observed unmet job); only
the solution search is divergent, so this doesn't breach "evidence, not invention." Skip
it when the fix is already clear — most findings won't need it.
Step 6 — Write the review
- Run
date +%F to get today's date. Write the review to
docs/product/<date>-review.md using the Output Format below.
- If
--multi, call second-opinion --quick (which queries every advisor it has
configured, in parallel) with a summary of the findings and append a short
"Second opinion" section (agreements / dissent / additions), attributing points
to each advisor that responded by name.
- Give the user an inline summary: the headline finding, the top 3 prioritized
recommendations, and the path to the written review.
Step 7 — Check the feature docs against the product (if docs/features/ exists)
The doc skill owns docs/features/ (the "what it does" layer, formerly docs/prd/)
and keeps it in sync with the implementation; this step checks the other side — that
the feature docs reflect the product understanding in docs/product/. Report-only; do
not edit docs/features/ (that's doc's job).
- Use cases with no feature-doc coverage: a job in
use-cases.md that no
docs/features/ doc describes → the product intends something the docs don't capture.
- Feature docs serving no use case: a
docs/features/ doc that ties to no documented
use case or persona need → scope the product can't justify, or a missing use case.
- List both kinds of divergence so the user can reconcile (update a use case, write a
feature doc via
doc, or drop scope). Pair with doc --review (features ↔ implementation)
for the full three-layer check: product ↔ features ↔ code.
- Lean repos (no
docs/features/): a small project won't have a dedicated behavior
layer. Skip the doc-to-doc check and instead spot-check the top use cases straight
against the code (and any docs/<flow>.md explanation docs), noting jobs the code
doesn't appear to support. Say you did this because there's no feature-doc layer.
Step 8 — Update the docs/product index
- Write/refresh
docs/product/overview.md as the section index: a one-line intro,
links to persona.md and use-cases.md (the reusable, current-state artifacts), and
a reverse-chronological list of the dated reviews (newest first). Overwrite each run.
- If a root
docs/overview.md index exists, ensure it links to docs/product/. Don't
create the root index when it's absent — that's the doc skill's job.
Output Format
Written to docs/product/<date>-review.md, and summarized inline:
# Product Review — <scope> — <date>
> Method: codebase + docs [+ live app] · Persona: see persona.md · Use cases: see use-cases.md
## Summary
Headline assessment in 2-4 sentences: how well the product serves its primary
persona on their primary job, and the single most important thing to change.
## What works well
- ...
## Findings
### Critical
- **<title>** (UC<n>, effort: M) — what the user hits, why it blocks the job, the fix.
### High
- ...
### Medium
- ...
### Suggestions
- ...
## Prioritized recommendations
1. **<change>** — adds/changes/removes ___, unblocks UC<n>. Severity / effort.
2. ...
## Feature-doc consistency (if docs/features/ exists)
- Use cases with no feature-doc coverage / feature docs with no use case (from Step 7).
## Second opinion (only with --multi)
- Agreements / dissent / additions from each advisor that responded, attributed by name. Note where multiple advisors converge — consensus raises confidence.
## Verify with users / open questions
- Assumptions that real user behavior or `--live` testing would confirm.
Examples
Example 1: First review of a SaaS app
User says: "review the product"
Actions: No docs/product/persona.md exists. Read the README + dashboard routes,
infer a "small-team ops manager" persona, ask 2 questions to confirm their main
goal. Write persona.md and use-cases.md (UC1 set up a workspace, UC2 invite
teammates, UC3 read the daily report). Walk each from code. Find UC2 has no resend
for a lost invite (High) and the empty dashboard teaches nothing (Medium). Write
docs/product/2026-05-30-review.md; summarize top 3 fixes inline.
Example 2: Live, scoped review
User says: "review-product --live the onboarding flow"
Actions: Refine the existing persona, focus use-cases on first-run. Launch the app
via run, click through signup → first value, screenshot each step. Discover the
email-verification step dead-ends on mobile (Critical) and time-to-first-value is
~6 steps (High). Recommend a deferred-verification path. Write the dated review.
Example 3: Cross-model check before a roadmap meeting
User says: "review product --multi"
Actions: Run the full review, then pass the findings to second-opinion --quick.
The advisors variously agree on the missing undo, dissent on severity of one item,
and add a discoverability gap. Append the "Second opinion" section attributing each
point to the advisor that raised it.
Troubleshooting
The persona feels generic or made-up
Cause: Not enough evidence; defaulting to a stock persona.
Solution: Cite sources for every claim. If the codebase and docs don't reveal
the user, stop and ask the user directly — don't invent demographics.
Findings read like a code review
Cause: Reviewing the implementation instead of the experience.
Solution: Re-anchor every finding to a use case and describe the impact in the
user's terms ("the user can't tell the save worked"), not the code's ("no toast
component"). Route true code issues to code-review.
--live can't run the app
Cause: No run command, missing deps, or the app needs credentials.
Solution: Ask the user how to launch it (suggest ! <command> for interactive
logins). If it can't be run, fall back to the code-only review and clearly mark
which findings are unverified against real behavior.
docs/product/ already has reviews and they're drifting
Cause: Persona/use-cases edited per-review instead of kept canonical.
Solution: persona.md and use-cases.md are the single source of truth —
refine them in place. Dated review files are snapshots and are never rewritten.
Notes
docs/product/ layout:docs/product/
├── overview.md # Section index; open this first
├── persona.md # Reusable, refined in place (current state)
├── use-cases.md # Reusable, refined in place (current state)
└── <date>-review.md # Dated review snapshots; never rewritten
- Three-layer model (altitude stack):
docs/product/ (this skill — who & why,
high level) → docs/features/ (the doc skill — what it does, tracks the code;
formerly docs/prd/) → docs/tech/ + implementation (how it's built). This skill
checks docs/product/ ↔ docs/features/ (Step 7); doc --review checks
docs/features/ ↔ code. doc never syncs docs/product/ to code. On a Lean repo
with no docs/features/, Step 7 checks use cases straight against the code.
- This skill judges the product, not the code. Pair it with
code-review /
review-cleancode for implementation quality and frontend-design for visual craft.
- See
references/checklist.md for the persona/use-case templates, the friction
lenses (Nielsen heuristics + product/JTBD), and severity definitions.
1---2name: review-product3description: Review a product from the user's perspective — build/refine a user persona, map their use cases (jobs-to-be-done), then audit the product for friction, gaps, and things to add or change. Triggers "review product", "product review", "review from the user's perspective", "product/UX critique", "what's missing for users". Use --live to also exercise the running app.4---56<!-- Generated from https://github.com/nielsmadan/agentic-coding — edits here are overwritten. -->78# Review Product910Review a product the way its users experience it, not the way its code is11structured. Where `code-review` and the `review-*` family judge the12implementation, this skill judges whether the *product serves the people using13it*: it builds a profile of the user, maps the jobs they come to do, then walks14those jobs through the product to find friction, gaps, and concrete things to15add or change.1617Reusable findings (the persona and the use cases) are persisted to `docs/product/`18and **refined** on each run, so the product's understanding of its users19accumulates instead of being re-derived every time. The review itself is written20to `docs/product/<date>-review.md` so it isn't lost. All of this lives under21`docs/product/` as a section of the project's `docs/` tree, indexed by22`docs/product/overview.md` once the section has several files (consistent with the23`doc` skill's "index when warranted" convention).2425`docs/product/` is the **high-level, user-centric** layer (why, for whom, what's26missing). It is the upstream of `docs/features/` (the "what it does" layer the `doc`27skill owns and keeps in sync with the implementation; formerly `docs/prd/`). This28skill owns `docs/product/` and does not write `docs/features/`; it only *checks* that29the feature docs reflect the product understanding (Step 7).3031## Usage3233```34review-product # codebase + product description (default)35review-product --live # also drive the running app to verify real behavior (slow)36review-product --multi # add external advisor opinions on the findings37review-product checkout flow # scope the review to a feature/area38```3940## Scope4142| Argument | What it reviews | Cost |43|----------|-----------------|------|44| (none) | Infers the experience from the **codebase + any product description** (README, `docs/features/`, CLAUDE.md, docs). Default. | Fast |45| `--live` | Adds to the default: launches/exercises the **running app** to confirm what really happens (use `run` or browser tooling). Don't assume — observe. | Slow |46| `--multi` | After the review, calls `second-opinion --quick` with the findings and adds a short cross-model section. | +external advisors |47| free text | Scopes persona/use-cases/audit to the named feature or area instead of the whole product. | — |4849`--live` is opt-in because exercising the app is slow; the default reasons from50code + docs only and says so.5152## Gotchas5354- **Evidence, not invention.** Every persona claim and use case must trace to the55 codebase, a doc, or explicit user input. Do not fabricate demographics, market56 size, or user quotes. If something is an assumption, label it and ask.57- **User's job, not the code's structure.** A "friction point" is something that58 slows or blocks the *user*, described in their terms — not a refactor or a code59 smell. Send those to `review-cleancode` / `code-review`.60- **Refine, don't clobber.** If `docs/product/persona.md` or `use-cases.md` already61 exist, edit them — reconcile new evidence with prior content and note what62 changed. Don't overwrite a richer file with a thinner one.63- Without `--live`, you are reasoning about *intended* behavior from source. State64 that explicitly; flag where real behavior would need to be verified.6566## Workflow6768Create a TodoWrite item per step.6970### Step 1 — Build or refine the user persona71- Read `docs/product/persona.md` if it exists. Read the product description (README,72 `docs/features/`, `docs/`, CLAUDE.md) and survey the codebase (entry points, routes/screens,73 auth, settings) for who the product is built for.74- Produce the persona(s) using the template in `references/checklist.md`: who they75 are, why they're here, environment, what they value, frustrations, what success76 looks like. Mark the **primary** persona.77- If core facts can't be inferred (who the real user is, what they're optimizing78 for), **ask the user 2-4 focused questions** before continuing — a wrong persona79 invalidates the whole review.80- Write/refine `docs/product/persona.md`.8182### Step 2 — Map the use cases (jobs-to-be-done)83- Read `docs/product/use-cases.md` if present. From the persona's goals plus the84 product's actual flows, enumerate the jobs the user comes to do, phrased from85 their point of view (When ___, I want to ___, so I can ___).86- For each: trigger, the path the product requires today (cite screens/routes),87 definition of done, frequency/stakes. Order by centrality to the persona.88- Write/refine `docs/product/use-cases.md`.8990### Step 3 — Walk the experience91- Trace each **primary** use case end-to-end through the product. Without `--live`,92 follow the code paths/screens. With `--live`, actually exercise the running app93 (launch via `run`, drive the UI, screenshot key states) and record what really94 happens vs what the code implies.95- Note **what works well** — effective flows worth keeping. A review that only96 lists problems is incomplete.9798### Step 4 — Audit friction & gaps99- Evaluate each use case against the lenses in `references/checklist.md`:100 **(A) job coverage** (the most important — can the user actually finish the101 job?), **(B) friction** (Nielsen heuristics applied to flows), **(C) onboarding102 & first run**, **(D) trust & safety**, **(E) opportunities** to add/change/remove.103- For large products or `--live`, assign primary use cases to workers and queue104 them within the runtime concurrency limit, then merge their findings. Give them105 the read/browser tools needed for the walkthrough without code edits. Disable106 delegation tools for ordinary workers; any coordinating role needs explicit107 subtasks, a descendant limit, and a stopping condition.108- Rate each finding by user impact: **Critical / High / Medium / Suggestion**109 (definitions in the checklist).110111### Step 5 — Prioritize recommendations112- Turn findings into concrete, actionable changes — what to add, change, or remove,113 in the user's terms. Each gets a severity, a rough effort (S/M/L), and ties back114 to the use case it unblocks. Lead with the changes that most help the primary115 persona on their primary job.116- **Wide-open gap → diverge before converging.** When a finding is a job the product117 doesn't serve *at all* (a Step 4(A) coverage gap or a Step 7 uncovered use case) and118 the fix isn't obvious, optionally invoke `ideation` (Skill tool) on that specific job —119 tell it the job is an already-validated unmet user need so it focuses on *how* to serve it120 rather than whether to — to generate a wider spread of approaches, then bring the best one121 back as the recommendation. The *gap* stays evidence-anchored (an observed unmet job); only122 the *solution search* is divergent, so this doesn't breach "evidence, not invention." Skip123 it when the fix is already clear — most findings won't need it.124125### Step 6 — Write the review126- Run `date +%F` to get today's date. Write the review to127 `docs/product/<date>-review.md` using the Output Format below.128- If `--multi`, call `second-opinion --quick` (which queries every advisor it has129 configured, in parallel) with a summary of the findings and append a short130 "Second opinion" section (agreements / dissent / additions), attributing points131 to each advisor that responded by name.132- Give the user an inline summary: the headline finding, the top 3 prioritized133 recommendations, and the path to the written review.134135### Step 7 — Check the feature docs against the product (if `docs/features/` exists)136The `doc` skill owns `docs/features/` (the "what it does" layer, formerly `docs/prd/`)137and keeps it in sync with the *implementation*; this step checks the *other* side — that138the feature docs reflect the product understanding in `docs/product/`. Report-only; do139not edit `docs/features/` (that's `doc`'s job).140- **Use cases with no feature-doc coverage**: a job in `use-cases.md` that no141 `docs/features/` doc describes → the product intends something the docs don't capture.142- **Feature docs serving no use case**: a `docs/features/` doc that ties to no documented143 use case or persona need → scope the product can't justify, or a missing use case.144- List both kinds of divergence so the user can reconcile (update a use case, write a145 feature doc via `doc`, or drop scope). Pair with `doc --review` (features ↔ implementation)146 for the full three-layer check: product ↔ features ↔ code.147- **Lean repos (no `docs/features/`):** a small project won't have a dedicated behavior148 layer. Skip the doc-to-doc check and instead spot-check the top use cases straight149 against the code (and any `docs/<flow>.md` explanation docs), noting jobs the code150 doesn't appear to support. Say you did this because there's no feature-doc layer.151152### Step 8 — Update the docs/product index153- Write/refresh `docs/product/overview.md` as the section index: a one-line intro,154 links to `persona.md` and `use-cases.md` (the reusable, current-state artifacts), and155 a reverse-chronological list of the dated reviews (newest first). Overwrite each run.156- If a root `docs/overview.md` index exists, ensure it links to `docs/product/`. Don't157 create the root index when it's absent — that's the `doc` skill's job.158159## Output Format160161Written to `docs/product/<date>-review.md`, and summarized inline:162163```markdown164# Product Review — <scope> — <date>165166> Method: codebase + docs [+ live app] · Persona: see persona.md · Use cases: see use-cases.md167168## Summary169Headline assessment in 2-4 sentences: how well the product serves its primary170persona on their primary job, and the single most important thing to change.171172## What works well173- ...174175## Findings176### Critical177- **<title>** (UC<n>, effort: M) — what the user hits, why it blocks the job, the fix.178### High179- ...180### Medium181- ...182### Suggestions183- ...184185## Prioritized recommendations1861. **<change>** — adds/changes/removes ___, unblocks UC<n>. Severity / effort.1872. ...188189## Feature-doc consistency (if docs/features/ exists)190- Use cases with no feature-doc coverage / feature docs with no use case (from Step 7).191192## Second opinion (only with --multi)193- Agreements / dissent / additions from each advisor that responded, attributed by name. Note where multiple advisors converge — consensus raises confidence.194195## Verify with users / open questions196- Assumptions that real user behavior or `--live` testing would confirm.197```198199## Examples200201### Example 1: First review of a SaaS app202User says: "review the product"203Actions: No `docs/product/persona.md` exists. Read the README + dashboard routes,204infer a "small-team ops manager" persona, ask 2 questions to confirm their main205goal. Write `persona.md` and `use-cases.md` (UC1 set up a workspace, UC2 invite206teammates, UC3 read the daily report). Walk each from code. Find UC2 has no resend207for a lost invite (High) and the empty dashboard teaches nothing (Medium). Write208`docs/product/2026-05-30-review.md`; summarize top 3 fixes inline.209210### Example 2: Live, scoped review211User says: "review-product --live the onboarding flow"212Actions: Refine the existing persona, focus use-cases on first-run. Launch the app213via `run`, click through signup → first value, screenshot each step. Discover the214email-verification step dead-ends on mobile (Critical) and time-to-first-value is215~6 steps (High). Recommend a deferred-verification path. Write the dated review.216217### Example 3: Cross-model check before a roadmap meeting218User says: "review product --multi"219Actions: Run the full review, then pass the findings to `second-opinion --quick`.220The advisors variously agree on the missing undo, dissent on severity of one item,221and add a discoverability gap. Append the "Second opinion" section attributing each222point to the advisor that raised it.223224## Troubleshooting225226### The persona feels generic or made-up227**Cause:** Not enough evidence; defaulting to a stock persona.228**Solution:** Cite sources for every claim. If the codebase and docs don't reveal229the user, stop and ask the user directly — don't invent demographics.230231### Findings read like a code review232**Cause:** Reviewing the implementation instead of the experience.233**Solution:** Re-anchor every finding to a use case and describe the impact in the234user's terms ("the user can't tell the save worked"), not the code's ("no toast235component"). Route true code issues to `code-review`.236237### `--live` can't run the app238**Cause:** No run command, missing deps, or the app needs credentials.239**Solution:** Ask the user how to launch it (suggest `! <command>` for interactive240logins). If it can't be run, fall back to the code-only review and clearly mark241which findings are unverified against real behavior.242243### docs/product/ already has reviews and they're drifting244**Cause:** Persona/use-cases edited per-review instead of kept canonical.245**Solution:** `persona.md` and `use-cases.md` are the single source of truth —246refine them in place. Dated review files are snapshots and are never rewritten.247248## Notes249250- `docs/product/` layout:251 ```252 docs/product/253 ├── overview.md # Section index; open this first254 ├── persona.md # Reusable, refined in place (current state)255 ├── use-cases.md # Reusable, refined in place (current state)256 └── <date>-review.md # Dated review snapshots; never rewritten257 ```258- Three-layer model (altitude stack): **`docs/product/`** (this skill — who & why,259 high level) → **`docs/features/`** (the `doc` skill — what it does, tracks the code;260 formerly `docs/prd/`) → **`docs/tech/` + implementation** (how it's built). This skill261 checks `docs/product/` ↔ `docs/features/` (Step 7); `doc --review` checks262 `docs/features/` ↔ code. `doc` never syncs `docs/product/` to code. On a Lean repo263 with no `docs/features/`, Step 7 checks use cases straight against the code.264- This skill judges the product, not the code. Pair it with `code-review` /265 `review-cleancode` for implementation quality and `frontend-design` for visual craft.266- See `references/checklist.md` for the persona/use-case templates, the friction267 lenses (Nielsen heuristics + product/JTBD), and severity definitions.