skills/user-story-writer/SKILL.md
Write well-structured user stories with acceptance criteria and edge cases. Use when asked to write user stories, create tickets from a feature brief, convert a PRD into stories, or write acceptance criteria. Produces ready-to-estimate stories in the standard format with clear acceptance criteria, edge cases, and definition of done.
npx skillsauth add mohitagw15856/pm-claude-skills user-story-writerInstall 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.
This skill produces production-ready user stories from a feature brief, PRD section, or verbal description. Each story follows the standard format with a clear who/what/why, behavioural acceptance criteria in Given/When/Then format, edge cases, and definition of done. Output is ready to paste into Jira, Linear, or your planning tool.
Ask the user for these if not provided:
For each story:
Epic: [Parent epic name — e.g. "Advanced Search"] Story ID: [Jira/Linear ID — leave blank if not yet created] Priority: [P1 / P2 / P3] Story points: [Leave blank — for engineering to estimate]
As a [specific user type — not "user"], I want to [concrete action they want to take], So that [the outcome they achieve — business value, not feature description].
Example:
As an account manager, I want to filter my client list by last contact date, so that I can quickly identify clients I haven't spoken to in over 30 days and prioritise outreach.
[1–3 sentences of context that aren't in the user story itself: when does this story matter, what triggers the need, how does it fit into a larger flow. This helps engineers understand why before they ask.]
Format: Given / When / Then
Each criterion tests one specific behaviour. Write one GWT per observable outcome — not one GWT for the whole feature.
AC1: [Short name for this criterion]
Given [starting state or context]
When [user action]
Then [observable system behaviour]
AC2: [Short name]
Given [...]
When [...]
Then [...]
AC3: [Short name]
Given [...]
When [...]
Then [...]
[List scenarios that are non-obvious but must be handled. These become additional ACs or notes to engineering.]
[Explicitly state what this story does NOT cover — prevents scope creep and clarifies where the next story begins.]
If the user provides an epic or feature brief, decompose it into a full set of stories before writing them:
Epic: [Name] Goal: [What outcome does completing this epic achieve?] Stories:
| # | Story | Notes | Dependencies | |---|---|---|---| | 1 | [Core happy path story — the simplest version of the feature that delivers value] | | | | 2 | [Validation / error handling story] | | Depends on #1 | | 3 | [Edge case or power user story] | | Depends on #1 | | 4 | [Admin or configuration story] | | | | 5 | [Performance or scale story — if applicable] | | Depends on #1 |
Suggested sprint order: [Which stories are P1 for MVP? Which can follow in a later sprint?]
Use these to review stories before handing to engineering:
| Anti-pattern | Example | Fix | |---|---|---| | Solution in the story | "As a user I want a dropdown filter" | Remove the UI decision — "As a user I want to filter by date range" | | Vague "so that" | "so that it's easier to use" | Make it specific — "so that I can prioritise outreach without opening each record manually" | | Too big | Story covers 5 distinct user flows | Split into separate stories per flow | | No acceptance criteria | Story has description only | Add at least 3 GWT criteria before engineering starts | | ACs that test the solution, not the behaviour | "Given the dropdown is open, When I select an option" | Test the outcome — "Given I have applied a date filter, When I view my results, Then only clients last contacted in that date range appear" | | Missing empty state | No AC for what happens with 0 results | Add it — empty states are part of the feature | | Missing error state | No AC for network failure or invalid input | Add error handling ACs explicitly |
Feature brief: "Allow users to export their invoice history as a PDF or CSV"
As a finance admin, I want to export my invoice history as a CSV file, so that I can import it into our accounting software without manual data entry.
AC1: Successful export
Given I am on the Invoices page with at least one invoice
When I click "Export" and select "CSV"
Then a CSV file is downloaded containing all visible invoices with columns: Invoice ID, Date, Amount, Status, Customer Name
AC2: Empty state
Given I am on the Invoices page with no invoices
When I click "Export"
Then the export button is disabled and a tooltip reads "No invoices to export"
AC3: Filtered export
Given I have applied a date filter showing invoices from Jan 2026 only
When I click "Export" and select "CSV"
Then the export contains only invoices from Jan 2026 — not all invoices
Edge cases:
Out of scope: PDF export (Story 2), scheduled exports (future epic)
As a finance admin, I want to export my invoice history as a formatted PDF, so that I can share a professional summary with our accountant.
[... ACs follow same pattern ...]
development
Build a framework for creating shareable, high-reach social media content. Use when asked to plan viral content, develop a shareable content strategy, create a hook writing system, or build a repeatable process for content that gets shared. Produces a platform-specific viral content framework with hook formulas, content structures, shareability triggers, and a content testing system.
development
Generate article or newsletter thumbnail candidates using the Gemini API from inside Claude Code. Claude reads article copy, proposes composition concepts, writes image generation prompts incorporating brand specs, calls Gemini to generate the images, evaluates the results via computer vision, and returns ranked candidates with rationale. Use when asked to create thumbnails, generate cover images, or produce visual candidates for an article or newsletter.
testing
Flips Claude's default from "find reasons you're right" to "find reasons you're wrong." A genuine thinking partner, not a mirror with grammar. Use before high-stakes decisions, plans, assumptions, or pitches you haven't stress-tested.
development
Scrapes a Substack Notes page and exports engagement data (likes, comments, restacks) to a formatted .xlsx file with conditional formatting and summary stats.