Install any skill in seconds. Free to start, no credit card required.
Get Started Free →User story generation - INVEST criteria, acceptance criteria (BDD/Given-When-Then), story mapping, epic decomposition, edge case stories, NFR stories
.claude/skills/user-story-generator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 167% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 169% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 435% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 72% | 0% |
| case-14 | ✓→✓ | = Same ✓ | 177% | 0% |
As a [role/persona],
I want [goal/feature],
so that [benefit/value].As a [role/persona],
In the context of [situation/scenario],
I want [goal/feature],
so that [benefit/value].As a new user,
I want to sign up with my email and password,
so that I can create an account and start using the service.
As a team admin,
In the context of onboarding a new team member,
I want to invite users via email,
so that they can join the workspace without manual account creation.
As an API consumer,
I want to authenticate with an API key,
so that I can securely access resources programmatically.| Criteria | Question | Example (Iyi) | Example (Kotu) | |----------|----------|---------------|----------------| | Independent | Can it be developed without other stories? | "User can reset password" | "User can reset password (requires email service story)" | | Negotiable | Is implementation flexible? | "User can search products" | "User searches with Elasticsearch 8.x using fuzzy match" | | Valuable | Does it deliver user/business value? | "User can export data as CSV" | "Refactor database schema" | | Estimable | Can the team estimate it? | "User can upload a profile photo" | "Improve system performance" | | Small | Can it be done in one sprint? | "User can add item to cart" | "User can complete entire checkout flow" | | Testable | Can we verify it's done? | "Login with wrong password shows error message" | "System should be user-friendly" |
markdown## Story: [story title] ### INVEST Check - [ ] **Independent:** No hard dependency on other stories - [ ] **Negotiable:** Multiple implementation approaches possible - [ ] **Valuable:** Clear end-user or business value - [ ] **Estimable:** Team can estimate within 1 story point range - [ ] **Small:** Fits within a single sprint - [ ] **Testable:** Clear pass/fail acceptance criteria
gherkinScenario: [descriptive scenario name] Given [precondition / initial state] And [additional precondition if needed] When [action / trigger] And [additional action if needed] Then [expected result / assertion] And [additional assertion if needed] But [exception / negative assertion if needed]
gherkinFeature: Shopping Cart Scenario: Add item to empty cart Given the user is logged in And the cart is empty When the user clicks "Add to Cart" on a product Then the cart should contain 1 item And the cart badge should show "1" And the cart total should equal the product price Scenario: Add same item twice Given the user has 1 unit of "Widget A" in the cart When the user clicks "Add to Cart" on "Widget A" again Then the cart should show 2 units of "Widget A" And the cart total should be 2x the unit price But a duplicate line item should NOT be created Scenario: Add item when not logged in Given the user is not logged in When the user clicks "Add to Cart" Then the item should be saved to a guest cart (cookie-based) And the user should NOT be redirected to login And the guest cart should merge on login Scenario: Add out-of-stock item Given the product "Widget B" has 0 stock When the user views "Widget B" Then the "Add to Cart" button should be disabled And a "Notify me" option should be shown
| Anti-Pattern | Neden Yanlis | Dogru Yol | |-------------|-------------|-----------| | "Should work properly" | Tanimsiz | Specify exact expected behavior | | Implementation details | Cozumu kisitlar | "Data persists" not "saves to PostgreSQL" | | Missing error cases | Incomplete spec | Add scenarios for every failure mode | | Too many scenarios (10+) | Story too big | Split the story | | No performance criteria | NFR eksik | Add "within 2 seconds" where needed | | Duplicate of another story | Redundancy | Reference, don't repeat |
User Journey (left to right)
─────────────────────────────────────
Activities: | Discovery | Purchase | Support |
─────────────────────────────────────
User Tasks: | Search | Add to | Contact |
| Browse | Cart | Support |
| Compare | Checkout | Return |
| | Pay | Review |
─────────────────────────────────────
Release 1: | Basic | Cart + | Email |
(MVP) | search | Checkout | form |
─────────────────────────────────────
Release 2: | Filters | Saved | Live |
| Sort | cards | chat |
| Compare | Wishlist | FAQ |
─────────────────────────────────────
Release 3: | AI search | Subscr. | Chatbot |
| Reco's | Gift cards | Ticket |markdown## Story Map: [Product/Feature Name] ### Backbone (Activities - user's high-level goals) 1. [Activity 1]: [description] 2. [Activity 2]: [description] 3. [Activity 3]: [description] ### Walking Skeleton (minimum viable flow) | Activity | Minimum Story | Priority | |----------|--------------|----------| | [Act 1] | [simplest version] | Must | | [Act 2] | [simplest version] | Must | | [Act 3] | [simplest version] | Must | ### Release Slices | Release | Scope | Theme | |---------|-------|-------| | R1 (MVP) | Walking skeleton | "It works" | | R2 | Enhanced UX | "It's pleasant" | | R3 | Advanced features | "It's powerful" |
EPIC: User Authentication System
├── STORY: Email/password registration
├── STORY: Email verification
├── STORY: Login with email/password
├── STORY: Password reset via email
├── STORY: Social login (Google)
├── STORY: Social login (GitHub)
├── STORY: MFA setup (TOTP)
├── STORY: MFA verification on login
├── STORY: Session management (logout, expire)
└── STORY: Account deletion| Strategy | When to Use | Example | |----------|-------------|---------| | By workflow step | Sequential processes | Checkout: cart -> address -> payment -> confirmation | | By data variation | Multiple input types | Import: CSV upload, API sync, manual entry | | By user role | Multi-role features | Dashboard: admin view, manager view, user view | | By CRUD operation | Data management | Products: create, read, update, delete | | By business rule | Complex logic | Pricing: base price, discounts, tax, shipping | | By platform | Multi-platform | Notifications: email, push, SMS, in-app | | By performance | Optimization layers | Search: basic search, filters, autocomplete, facets |
markdown## Epic: [Epic Name] **Business Value:** [neden onemli] **Target Persona:** [kim icin] **Size Estimate:** [S/M/L/XL] ### Stories | # | Story | Priority | Size | Sprint | |---|-------|----------|------|--------| | 1 | As a [role], I want [X], so that [Y] | Must | S | 1 | | 2 | As a [role], I want [X], so that [Y] | Must | M | 1 | | 3 | As a [role], I want [X], so that [Y] | Should | S | 2 | | 4 | As a [role], I want [X], so that [Y] | Could | M | 3 | ### Dependencies - Story 2 depends on Story 1 - Story 4 can be done in parallel with Story 3 ### Definition of Done (Epic Level) - [ ] All Must stories completed - [ ] Integration tests passing - [ ] Documentation updated - [ ] Stakeholder demo completed
| Anti-Pattern | Neden Yanlis | Dogru Yol | |-------------|-------------|-----------| | Technical decomposition | "Create DB schema" has no user value | Split by user-facing behavior | | Too small (< 1 hour) | Overhead > value | Combine related micro-tasks | | Too large (> 1 sprint) | Unestimable, risky | Decompose further | | Horizontal slicing | "Build all APIs, then all UI" | Vertical slice (API + UI for one feature) |
markdown## Edge Case Stories for [Feature] ### Empty State As a new user, When I have no [items/data/history], I want to see a helpful empty state with a clear CTA, so that I know how to get started. ### Error Recovery As a user, When an operation fails (network error, timeout, server error), I want to see a clear error message with a retry option, so that I can recover without losing my work. ### Boundary Values As a user, When I enter the maximum allowed value (e.g., 10,000 characters in a text field), I want to see a character counter and graceful truncation, so that I know my limits before submitting. ### Concurrent Access As a user, When another user edits the same resource simultaneously, I want to be notified of the conflict, so that I don't accidentally overwrite their changes. ### Offline / Slow Connection As a mobile user, When I lose network connectivity, I want my pending actions to be queued and synced when back online, so that I don't lose my work. ### Permission Denied As a user without admin privileges, When I try to access an admin-only feature, I want to see a clear message explaining why access is denied, so that I can request access if needed. ### Data Migration As an existing user, When the system migrates to a new version, I want my existing data to be preserved and correctly mapped, so that I don't lose any information.
As a user,
I want the dashboard to load within 2 seconds,
so that I can quickly access my data without frustration.
Acceptance Criteria:
- Given normal network conditions (4G+)
- When the user navigates to the dashboard
- Then the page is fully interactive within 2 seconds
- And the Largest Contentful Paint (LCP) is < 2.5s
- And the First Input Delay (FID) is < 100msAs a security-conscious user,
I want my session to expire after 30 minutes of inactivity,
so that my account is protected if I forget to log out.
Acceptance Criteria:
- Given the user has been inactive for 30 minutes
- When the user tries to perform an action
- Then the user is redirected to the login page
- And a "Session expired" message is shown
- And no sensitive data remains in the browserAs a user with visual impairment,
I want all form fields to have proper labels and error announcements,
so that I can use the application with a screen reader.
Acceptance Criteria:
- Given all form fields have associated labels (aria-label or <label>)
- When a validation error occurs
- Then the error is announced by the screen reader (aria-live)
- And focus moves to the first invalid field
- And color is not the only indicator of error stateAs a system,
I need to handle 10,000 concurrent users without degradation,
so that the service remains reliable during peak usage.
Acceptance Criteria:
- Given 10,000 concurrent users
- When performing standard operations
- Then response time remains < 500ms (p95)
- And error rate stays < 0.1%
- And CPU usage stays < 80%As a user,
I want my data changes to be saved even if the server crashes,
so that I never lose my work.
Acceptance Criteria:
- Given the user submits a form
- When the server acknowledges the request
- Then the data is persisted to durable storage
- And a power failure does not result in data loss
- And transactions are ACID-compliant| Smell | Symptom | Fix | |-------|---------|-----| | Too vague | "As a user, I want a better experience" | Be specific about what "better" means | | Too technical | "As a developer, I want to refactor the DB" | Reframe as user value | | Too large | Team can't estimate confidently | Decompose into smaller stories | | No value | "Create config file" | Attach to a user-facing story | | Hidden dependency | "Requires API not built yet" | Make dependency explicit, plan accordingly | | Gold plating | 15 acceptance criteria | Split into multiple stories |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-14 | pass→pass | 11,016 | 12,594 | +14% | 1 | 1 | 0% | 2,070 | 5,742 | +177% | 0 | 0 | — |
case-02 | fail→fail | 21,351 | 15,378 | -28% | 1 | 1 | 0% | 3,746 | 6,330 | +69% | 0 | 0 | — |
case-13 | pass→pass | 13,945 | 14,784 | +6% | 1 | 1 | 0% | 2,312 | 6,227 | +169% | 0 | 0 | — |
case-01 | fail→fail | 18,783 | 20,223 | +8% | 1 | 1 | 0% | 3,470 | 6,905 | +99% | 0 | 0 | — |
case-03 | pass→pass | 5,127 | 8,394 | +64% | 1 | 1 | 0% | 906 | 5,009 | +453% | 0 | 0 | — |
case-04 | fail→pass | 12,757 | 10,706 | -16% | 1 | 1 | 0% | 2,034 | 5,438 | +167% | 0 | 0 | — |
case-05 | pass→pass | 17,158 | 17,513 | +2% | 1 | 1 | 0% | 2,852 | 6,126 | +115% | 0 | 0 | — |
case-06 | fail→pass | 12,473 | 12,896 | +3% | 1 | 1 | 0% | 2,126 | 5,710 | +169% | 0 | 0 | — |
case-07 | pass→pass | 8,568 | 5,861 | -32% | 1 | 1 | 0% | 1,691 | 4,642 | +175% | 0 | 0 | — |
case-08 | fail→pass | 4,175 | 4,515 | +8% | 1 | 1 | 0% | 815 | 4,363 | +435% | 0 | 0 | — |
case-09 | pass→pass | 10,690 | 13,353 | +25% | 1 | 1 | 0% | 2,117 | 5,659 | +167% | 0 | 0 | — |
case-10 | pass→pass | 18,619 | 16,137 | -13% | 1 | 1 | 0% | 2,942 | 6,045 | +105% | 0 | 0 | — |
case-11 | pass→pass | 12,450 | 18,534 | +49% | 1 | 1 | 0% | 2,541 | 6,327 | +149% | 0 | 0 | — |
case-12 | fail→pass | 22,457 | 26,156 | +16% | 1 | 1 | 0% | 4,691 | 8,071 | +72% | 0 | 0 | — |
case-15 | pass→pass | 12,632 | 12,768 | +1% | 1 | 1 | 0% | 2,368 | 5,669 | +139% | 0 | 0 | — |
case-16 | pass→pass | 9,902 | 9,315 | -6% | 1 | 1 | 0% | 1,739 | 5,071 | +192% | 0 | 0 | — |
case-17 | pass→pass | 11,730 | 7,675 | -35% | 1 | 1 | 0% | 2,102 | 4,810 | +129% | 0 | 0 | — |
case-18 | pass→pass | 10,265 | 7,681 | -25% | 1 | 1 | 0% | 1,863 | 4,806 | +158% | 0 | 0 | — |
case-19 | pass→pass | 10,422 | 10,201 | -2% | 1 | 1 | 0% | 1,801 | 5,337 | +196% | 0 | 0 | — |
case-20 | pass→pass | 11,609 | 13,819 | +19% | 1 | 1 | 0% | 1,978 | 5,473 | +177% | 0 | 0 | — |
case-21 | pass→pass | 6,357 | 7,310 | +15% | 1 | 1 | 0% | 1,317 | 4,944 | +275% | 0 | 0 | — |
case-22 | pass→pass | 12,925 | 14,429 | +12% | 1 | 1 | 0% | 2,324 | 5,908 | +154% | 0 | 0 | — |
case-23 | pass→pass | 10,181 | 11,396 | +12% | 1 | 1 | 0% | 1,931 | 5,668 | +194% | 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. 23 cases were attempted. The headline lift of +17 percentage points is the difference between those two pass rates over the 23 comparable cases.
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.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 7/29/2026 | +18% |
Other measured skills in the registry, with their headline benchmark lift.