Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when drafting, maintaining, refining, or auditing a structured user-stories catalogue from a product spec + design-review notes + open-questions list. Outputs persona-grouped stories with explicit linkage to unresolved open questions, in a readable format suited for product, engineering, and audit review alike. Trigger on "write user stories for", "draft stories from this spec", "expand the user stories", "add a story for X", "audit the catalogue", "clean up the open questions", "refine the
.claude/skills/lifinance-creating-user-stories/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 82% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 425% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 250% | 0% |
A structured, auditable user-stories catalogue — the kind that feeds a design doc, audit scope, or estimate. Not for one-off tickets or casual feature lists.
Inputs: product spec / PRD, design-review or meeting notes, open-questions list (or create one in parallel), optional comparable-product research.
Output: two pages — a Stories page and a companion Open Questions page. One readable format per page.
❓Q-id. Never invent an answer.*(research-derived)* in the title to distinguish from spec-derived stories.❓Q-id must resolve to a real Q. Phantom Q references erode trust. See "Keeping pages in sync".The catalogue is read by product managers, engineers, auditors, and ops. None of them tolerate dense jargon. Apply these rules to every story body and every open-question body:
Hard rule: whenever a body presents 2+ discrete options (alternative behaviors, alternative mechanisms, alternative scopes), label them (a), (b), (c), … and have the Recommendation explicitly reference the chosen letter.
*What*: **(a)** open to all, **(b)** invite-only, or **(c)** approval-gated.
*Recommendation*: **(a)** — lowest friction for first-time users.Reasons:
When sub-options nest under one parent, use roman numerals to disambiguate:
*Sub-questions if (b)*: (i) who issues invites? (ii) how do invitees redeem? (iii) expiry policy?When NOT to label: single-recommendation bodies, TBD entries with no enumerated choices, one-liners. If you find yourself writing "(a)" alone without a sibling, drop the label.
Add a Pros / Cons block only when the trade-off is real and a product owner needs to weigh it. If you find yourself listing only one Pro or one Con, the trade-off isn't real — delete the section and just recommend.
Group stories by who wants the capability. Typical persona shapes for an internal-platform team:
## As an [Org] admin, I want to... — IDs start with A## As an integrator, I want to... — IDs start with I## As an end user, I want to... — IDs start with UAdapt to your domain (operator / viewer / partner / regulator / curator) but keep persona separation. One story does not span multiple personas — if you find one that does, split it.
Within each persona, group stories by theme. Themes vary by product. Common shapes: lifecycle (deploy → configure → operate → decommission), permissioning, pricing or economics, safety and pause, observability, integrations, compliance. 6 themes per persona is typical; more than 10 usually means you should split a theme.
- **A1.** [verb-lowercase] [object], so that [why]. ❓[Q4.5](link), [Q9.1](link)The persona phrase ("As a ...") is in the H2 heading, not repeated per story. One sentence each. No acceptance hints, no implementation detail — those belong in the design doc that consumes this catalogue, not in the story.
Variants:
(see A16), (mirrors I18) for adjacent-lifecycle stories — see below.A user story has exactly two semantic slots: [verb] [object], so that [benefit]. Strict rule: one action, one benefit, no compound verbs in the action clause.
| Smell | Fix | |---|---| | update price AND emit event, so that… | Drop the mechanism: update price within bounds, so that I can react to market. Events are implementation. | | pause writes AND reads, so that… | Either split into two stories OR one composite: pause the instance, so that… | | do X so that things keep working | Sharpen the benefit: name the persona-specific stake, not generic "system works". |
run end-of-day close, so that the day's transactions are crystallized AND the next-day balance is initialized. — "and" connects two outcomes of one action. Fine. Compare to crystallize AND initialize in the action clause = two buttons, both must be pressed.
trigger X / configure Y = single verb-object, OK.)(see IX).Two stories on the same concept at different lifecycle stages can be confused by a reader. Always cross-link with (see IX).
Examples of pairings worth cross-linking:
Bidirectional — if A→B is worth linking, B→A usually is. Verify on every edit.
The product spec is owned by the product team, NOT by the catalogue author. The catalogue's job:
⚠️ PRODUCT DECISION NEEDED.Anti-pattern: writing "Recommend spec-amend §X.Y to authorize …". The catalogue's role is to surface the question, not to prescribe the answer.
Follow the readability format (title is the actual question; options labeled; recommendation references a letter). Two flavors depending on whether there's a real trade-off:
Standard (most Qs):
**QX.Y — [The actual decision question]**
*What*: [one-sentence context]. **(a)** ..., **(b)** ..., **(c)** ...
*Recommendation*: **(b)** — [rationale in plain English].With trade-off (only when a product owner must weigh options):
**QX.Y — [The actual decision question]**
*What*: [one-sentence context describing the capability and why it's debatable].
*Pros*:
- [specific upside]
- [specific upside]
*Cons*:
- [specific downside]
- [specific downside]
*Recommendation*: **[defer / accept / specific option]** — [rationale].Note: the lane tag (⚠️ PRODUCT DECISION NEEDED / TECH] / META]) sits on the section header, not in every question title — see "Open-question linkage".
Anti-patterns:
Pricing mechanism) instead of a question (How should pricing be tiered?).Some user-visible properties fall out "for free" from the architecture and have no explicit story. Readers ask about them first because they're invisible.
Litmus test: when reviewing the catalogue, ask "what questions would a first-time reader have here that the catalogue doesn't answer because the answer is architectural?" If the answer is yes, write the implicit-property story and cross-reference where the property comes from.
If a story title contains a noun that could mean many things ("manage the allowlist", "handle errors"), it's too vague. Either:
Rule of thumb: if a reader can ask "which actions exactly?", you must list them. Most common failure mode in spec-derived stories — the spec says "the system is configurable" and the story inherits the vagueness.
The catalogue lives across 2 pages: a Stories page and an Open Questions page. A story edit touches every page the change affects, in the same session. Stale cross-references erode the entire catalogue.
| Change | Stories page | Open Questions page | |---|---|---| | New story added | ✓ one-line entry | ✓ add any new Qs the story references | | Story re-titled / "so that" reframed | ✓ | — | | Open Q resolved | ✓ remove ❓ marker | ✓ move to "Resolved" section | | New open Q surfaced | ✓ add ❓[QX.Y](link) | ✓ add Q with candidate | | Story deleted | ✓ remove | ✓ resolve orphaned Qs | | Story renumbered | NEVER | — |
❓Q*.* in Stories resolves to a real Q on Open Questions (no phantom references).[META] (see below).(see IX) cross-reference resolves to a real story.How to verify practically: fetch both pages, extract Q*.* markers from Stories, extract real Q-ids from Open Questions, diff both directions. Same for (see *) against story IDs.
Phantom Qs are the quickest path to "nobody trusts this doc anymore". Treat verification as ship-blocking.
Some Qs legitimately don't map to a single story:
Tag these [META] in the title:
**Q4.6 [META] — Access-control matrix**Sync check ignores [META]-tagged Qs. When in doubt, link to a story — [META] is a last resort.
For block-anchor links, parallel-session drift, batched edits — see references/notion-mcp.md. Loading that doc is mandatory before any non-trivial Notion edit.
Don't. Half-synced edits accumulate; eventually nothing is trusted. If you can't update all affected pages in one session, don't ship the change.
Open questions live on their own dedicated page, never inline in stories. Stories reference Qs by ID only.
Open Questions page structure:
# BLOCKS [design-name] / # Nice-to-resolve / # Cosmetic / # Deferred / # Resolved.## ⚠️ Product decisions needed / ## [TECH] technical questions / ## [META] cross-cutting. Within each lane, group by theme.**QX.Y — Title** + prose description + optional *Recommendation*: .... The lane tag sits on the section header — no need to repeat the tag in every title.references/question-maintenance.md.Hard rule: every open question must sit in exactly one lane — ⚠️ PRODUCT DECISION NEEDED, [TECH], or [META]. Untagged Qs (or questions in the wrong lane) are sync failures.
Lane assignment — strict criterion:
Common mis-tagging: anything that affects what users see, what integrators can configure, or what's in V1 scope is product, even if it looks technical. The product/tech distinction is about what's already decided, not who will work on it.
For Qs with both aspects: default to ⚠️ PRODUCT (the technical implementation follows once product locks the requirement). Use both tags only when the two aspects are genuinely independent.
Why this matters: without consistent lane tagging, the Open Questions page reads as one undifferentiated list. The operator can't quickly see "what does product need to answer this week" vs "what does tech team handle during implementation". Tag drift turns the catalogue into a wishlist.
Linking from stories: ❓[Q4.9](url) — hyperlinked to the Open Questions page URL.
Lifecycle:
Anti-pattern: inline Q text in a story — Depends on open Q: should this be set globally? (no Q-id, untrackable). Promote to a real Q with an ID; link by ID.
(superseded by AX) over removing — preserves the ID and audit trail. Only delete when a feature drops pre-implementation.When the catalogue is past initial extraction and you're refining or auditing it, four patterns recur often enough to need a shared vocabulary: dispositions for questions that shift state (merge / reframe / elevate-to-story / remove / resolve), reframing a question whose context changed because of an upstream decision, layered-concern decomposition for cross-cutting topics, and recognizing questions that should be removed rather than answered. See references/question-maintenance.md for the full patterns + worked examples. Read it before doing a refinement pass on an existing catalogue.
The one rule to remember without opening the reference: never silently delete a question. Every removal must show up in the counts footer (Q1.7 elevated to user story I26, Q6.2 removed as structurally answered by A5, etc.). A year later, someone will ask why Q3.3 is missing — the footer must answer them in one line.
Pricing → How should tier boundaries be calculated?. Apply to both stories and open Qs.*(research-derived)*.When the catalogue feels "done" and you want to verify before locking it for downstream design work, run the three-lane filter. Default review, 30–60 min solo.
Every finding from any review is routed into exactly one of three lanes:
| Lane | Source of finding | Where it goes | Who decides | |---|---|---|---| | 1. Spec coverage | Capability in spec missing/mis-stated in catalogue | Add/fix story directly | You (catalogue operator) | | 2. Product decision | Capability NOT in spec — proposed by research / reviewer / design | Open Q tagged ⚠️ PRODUCT DECISION NEEDED | Product team | | 3. Tech implementation | Implementation detail spec doesn't speak to | Plain open Q tagged [TECH] | Tech team / reviewer (during design) |
If a finding doesn't fit any lane → noise → drop it.
⚠️ PRODUCT DECISION NEEDED with candidate, default V2 unless flagged). 15 min.⚠️ tags as needed. 10 min.Output: a tight ⚠️ PRODUCT DECISION NEEDED list for product + a clean catalogue ready for design.
⚠️ Q instead.Lane-1 walkthrough naturally produces a spec-section → story-IDs mapping. Maintain as a sibling page. Update every review. On the next review, the matrix is your starting point, not a blank slate.
A multi-agent persona review (with named senior reviewer personas) is escalation-only, NOT default. Trigger only when going into high-stakes review, the product has truly bimodal users, or an incident exposed a class of finding lightweight review missed. Expect ~50 findings of which ~25 are noise. See references/deep-review-persona-pass.md for the procedure — note that the reference's specific persona set is calibrated for smart-contract review and should be re-cast for your domain if different.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 36,543 | 34,413 | -6% | 1 | 1 | 0% | 6,248 | 11,743 | +88% | 0 | 0 | — |
case-02 | fail→pass | 37,734 | 26,636 | -29% | 1 | 1 | 0% | 6,243 | 10,663 | +71% | 0 | 0 | — |
case-03 | fail→pass | 35,449 | 29,508 | -17% | 1 | 1 | 0% | 5,779 | 10,545 | +82% | 0 | 0 | — |
case-04 | pass→fail | 26,675 | 35,127 | +32% | 1 | 1 | 0% | 4,395 | 11,676 | +166% | 0 | 0 | — |
case-05 | pass→pass | 35,933 | 35,925 | -0% | 1 | 1 | 0% | 6,180 | 11,675 | +89% | 0 | 0 | — |
case-06 | pass→pass | 14,562 | 12,274 | -16% | 1 | 1 | 0% | 2,369 | 7,456 | +215% | 0 | 0 | — |
case-07 | pass→pass | 9,432 | 6,663 | -29% | 1 | 1 | 0% | 1,567 | 6,520 | +316% | 0 | 0 | — |
case-08 | fail→pass | 7,638 | 6,119 | -20% | 1 | 1 | 0% | 1,245 | 6,542 | +425% | 0 | 0 | — |
case-09 | fail→pass | 13,044 | 8,416 | -35% | 1 | 1 | 0% | 1,955 | 6,849 | +250% | 0 | 0 | — |
case-10 | fail→pass | 10,249 | 8,756 | -15% | 1 | 1 | 0% | 1,602 | 6,955 | +334% | 0 | 0 | — |
case-11 | fail→pass | 12,062 | 9,733 | -19% | 1 | 1 | 0% | 1,747 | 6,992 | +300% | 0 | 0 | — |
case-12 | pass→pass | 8,691 | 5,082 | -42% | 1 | 1 | 0% | 1,348 | 6,328 | +369% | 0 | 0 | — |
case-13 | fail→pass | 3,683 | 6,700 | +82% | 1 | 1 | 0% | 636 | 6,667 | +948% | 0 | 0 | — |
case-14 | fail→pass | 10,805 | 5,309 | -51% | 1 | 1 | 0% | 1,799 | 6,415 | +257% | 0 | 0 | — |
case-15 | fail→pass | 15,390 | 5,649 | -63% | 1 | 1 | 0% | 1,077 | 6,337 | +488% | 0 | 0 | — |
case-16 | fail→pass | 12,594 | 7,561 | -40% | 1 | 1 | 0% | 1,881 | 6,552 | +248% | 0 | 0 | — |
case-17 | fail→pass | 5,227 | 5,332 | +2% | 1 | 1 | 0% | 920 | 6,366 | +592% | 0 | 0 | — |
case-18 | fail→pass | 9,549 | 6,055 | -37% | 1 | 1 | 0% | 1,486 | 6,462 | +335% | 0 | 0 | — |
case-19 | fail→pass | 11,413 | 7,772 | -32% | 1 | 1 | 0% | 1,610 | 6,703 | +316% | 0 | 0 | — |
case-20 | fail→pass | 16,956 | 12,174 | -28% | 1 | 1 | 0% | 2,373 | 7,491 | +216% | 0 | 0 | — |
case-21 | pass→pass | 9,936 | 6,135 | -38% | 1 | 1 | 0% | 1,503 | 6,520 | +334% | 0 | 0 | — |
case-22 | pass→pass | 9,511 | 3,169 | -67% | 1 | 1 | 0% | 1,369 | 5,933 | +333% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +64 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.