story
/story - Interactive User Story Management
Create, manage, and track user stories in proper narrative format. Stories feed into Ralph Loop for autonomous implementation.
What It Does
The /story skill provides an interactive workflow for creating well-structured user stories that follow the proven "As a / I want / So that" narrative format. Stories are:
- Narrative-driven - Forces clarity of user role, desired action, and business value
- Validated - Ensures proper format before adding to work queue
- Trackable - Integrates with Ralph Loop for autonomous execution and progress tracking
- Filterable - Search by priority, status, or affected files
- Exportable - Generate markdown summaries for documentation
Quick Start
Create a Story
/story new
You'll be prompted for:
- User role - "As a [developer/researcher/etc.]"
- Desired action - "I want to [action]"
- Business value - "So that [benefit]"
- Title - Suggested auto-generated from action
- Priority - 1 (high), 2 (normal), 3 (low)
- Files - Affected files (comma-separated, optional)
- Acceptance criteria - Multiple criteria (at least 1 required)
View Stories
/story show # List all stories with status
/story view STORY-001 # Show full details for one story
/story list --priority 1 # Filter by priority
/story list --status in_progress # Filter by status
/story list --files src/auth.ts # Find stories touching a file
Update Story
/story update STORY-001
Interactively change: status, priority, acceptance criteria
Export
/story export > stories.md
Generate markdown summary grouped by priority and status.
Two Paths: Quick vs Structured
When you run /story new, you choose your approach:
Quick Path (Default)
Traditional narrative format - fast for simple stories.
- User role → Desired action → Business value
- Builds "As a X, I want Y, so that Z" automatically
- Best for: Simple features, quick iterations, clear scope
Structured Path (Prevents Ralph Spiraling)
Ryan's methodology - comprehensive planning for complex work.
- Problem statement (what challenge does this solve?)
- Narrative format (As a / I want / So that)
- Functional requirements (what must the system do?)
- Constraints & non-goals (what's out of scope?)
- Success metrics (how do we measure success?)
- Auto-generates subtasks to prevent infinite iteration loops
Choose Structured when:
- Building large features with many moving parts
- You want Ralph to have clear sub-goals
- You need to prevent "Ralph spiraling" (infinite iteration loops)
- You want detailed requirements documented
Why Structured prevents spiraling:
- Breaks complex work into finite, testable subtasks
- Each subtask has one clear purpose
- Ralph processes TASK-001, TASK-002... in order
- Forces upfront thinking about scope and boundaries
Story Format
Stories follow the user story narrative:
As a [user role]
I want to [desired action]
So that [business value]
Why this format?
- Clarity - Each part serves a specific purpose
- User-focused - Starts with who benefits and why
- Context - Helps Claude understand the bigger picture
- Traceability - Each story has clear reasoning
Example story:
As a developer in a Ralph loop
I want to see my task context in a collapsible JSON card
So that I can quickly reference my context without switching windows
Acceptance Criteria:
- Card displays TIER 0 project context
- Card shows top 5 relevant golden rules for current domain
- JSON is syntax-highlighted (keys, values, strings colored differently)
- Card has 'Collapse all' button to minimize nested objects
- Card loads in <500ms
- Works offline (no external CDN dependencies)
Story Lifecycle
pending (waiting for work)
↓
in_progress (Ralph Loop assigned it)
↓
done ✓ (Ralph completed + tests passed)
OR blocked ✗ (Ralph encountered an issue)
Automatic transitions:
- Ralph Loop changes status to
in_progresswhen starting work - Status becomes
doneif implementation + tests succeed - Status becomes
blockedif tests fail or error occurs - Manual update via
/story updateas needed
Commands Reference
/story new
Create a new story interactively.
First, you choose your path: [Q] Quick (default) or [S] Structured
Quick Path Prompts
- Story ID (auto-suggest next available)
- Path choice:
[Q/S, default=Q] - User role (As a)
- Desired action (I want to)
- Business value (So that)
- Title (auto-suggested from action)
- Priority (1-3)
- Files (comma-separated, optional)
- Acceptance criteria (blank to finish, at least 1)
Structured Path Prompts
- Story ID (auto-suggest next available)
- Path choice:
[S] - Problem statement (What problem does this solve?)
- User role (As a)
- Desired action (I want to)
- Business value (So that)
- Title (auto-suggested)
- Priority (1-3)
- Functional requirements (blank to finish)
- Constraints & non-goals (blank to finish)
- Success metrics (blank to finish, at least 1 recommended)
- Files (comma-separated, optional)
- Acceptance criteria (blank to finish, at least 1)
- Generate subtasks?
[Y/n, default=Y]- If yes: Automatically creates TASK-001, TASK-002... for each requirement
Output (Quick Path):
✓ Created story: [STORY-001] Your Story Title
Output (Structured Path):
✓ Created story: [STORY-006] Your Story Title
Linked subtasks: 4
/story show
List all stories with visual status and brief info.
Output:
STORIES (5 total, 2 complete)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[ ] [P1] STORY-001: User Authentication
Status: pending | Files: 2
[~] [P2] STORY-002: Dashboard UI
Status: in_progress | Files: 4
[X] [P1] STORY-003: Database Migration
Status: done | Files: 3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Status icons: [ ] pending, [~] in_progress, [X] done, [!] blocked
/story view STORY-001
Show complete details for a single story.
Output:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STORY-001: User Authentication
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Description:
As a developer, I want to implement JWT-based authentication,
so that users can login securely.
Priority: 1 (High)
Status: pending
Acceptance Criteria:
- Users can login with email/password
- JWT tokens are issued on successful auth
- Protected routes require valid token
- Token expiration is enforced
Files:
- src/auth/login.ts
- src/auth/middleware.ts
- tests/auth.test.ts
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
/story update STORY-001
Interactively modify a story's status, priority, or criteria.
Prompts:
- Status (pending/in_progress/done/blocked)
- Priority (1-3)
- New acceptance criteria (optional)
Output:
✓ Updated story STORY-001
/story list [OPTIONS]
Filter and display stories matching criteria.
Options:
--priority 1|2|3 # Filter by priority
--status pending|in_progress|done|blocked # Filter by status
--files src/path/file.ts # Find stories touching specific file
Examples:
/story list --priority 1 # All high-priority stories
/story list --status in_progress # What Ralph is currently working on
/story list --files src/components/Card.tsx # Stories affecting Card component
/story export
Generate markdown summary of all stories.
Output: Markdown file with:
- Summary stats (total, complete %, in progress, pending)
- Stories grouped by priority
- Each story shows: status, narrative, criteria, files
Redirect to file:
/story export > stories.md
Integration with Ralph Loop
How Stories Flow Through Ralph Loop
1. /story new → Create story in narrative format
2. /prd validate → Verify format (warns on issues)
3. /loop start → Ralph picks next story from prd.json
4. Ralph implements → Writes code
5. Code review step → Catches issues
6. Simplify code → Cleans up
7. Run tests → Validates correctness
8. If pass:
- Commit to git
- Set "passes": true in prd.json
- Log learnings to progress.txt
- Pick next story → back to step 3
9. If fail:
- Set status to "blocked"
- Log failure analysis
- Human review required
Story Status in Ralph Loop
Stories start as pending → Ralph changes to in_progress → ends as done (✓ tests passed) or blocked (✗ failed)
You can manually update status with /story update if needed.
How Ralph Processes Stories with Subtasks
When a story has subtasks (created with structured path):
- Ralph processes subtasks in order (TASK-001, TASK-002...)
- Each subtask is a separate, finite work item
- Ralph marks each subtask in_progress → done individually
- When all subtasks done → parent story marked done
- If any subtask fails → parent story marked blocked
Why this prevents spiraling:
- Each subtask is too small to spiral on (one clear purpose)
- Ralph finishes TASK-001 completely before TASK-002
- Clear success criteria at the subtask level
- Parent story only marks done when all children done
Example flow:
STORY-007: Search Context Card
├─ TASK-001: Create feature branch [DONE]
├─ TASK-002: Search is case-insensitive [DONE]
├─ TASK-003: Highlights matching [DONE]
├─ TASK-004: Returns count [IN_PROGRESS]
└─ TASK-005: Filters nested objects [PENDING]
Ralph is working on TASK-004. When done, moves to TASK-005. Once all complete, STORY-007 marked done.
Validation
Stories are validated for:
✅ Required fields:
- Unique ID
- Title
- Description with proper narrative format
- At least 1 acceptance criterion
- Valid status (pending, in_progress, done, blocked)
- Priority 1-3
⚠️ Warnings (don't block):
- Less than 3 acceptance criteria (recommend 3-5)
- Missing narrative format ("As a X, I want Y, so that Z")
- No files listed (sometimes OK for cross-cutting concerns)
Validate stories:
/prd validate # Validates all stories (including format checks)
Best Practices
1. Clear User Role
✅ "As a developer debugging a failed loop" ❌ "As a user"
2. Specific Action
✅ "I want to see the exact JSON state that triggered the failure" ❌ "I want to see something"
3. Real Business Value
✅ "So that I can understand what went wrong without digging through logs" ❌ "So that I have a feature"
4. Testable Criteria
✅ "Card displays TIER 0 project context" ✅ "JSON is syntax-highlighted" ❌ "Card is nice" ❌ "UI is better"
5. Right Scope
- One story = one feature or user interaction
- If it takes >4 hours to implement, consider breaking it
- List affected files upfront (helps Ralph plan work)
6. Priority Guidance
- P1 (High) - Blocks other work or critical path
- P2 (Normal) - Important but not urgent
- P3 (Low) - Nice to have, can defer
Comparison: /story vs /prd
| Aspect | /story |
/prd |
|---|---|---|
| Input | Interactive prompts | Manual JSON editing |
| Format | Guided narrative | Free-form |
| Validation | Enforced | Optional |
| ID Prefix | STORY-XXX (user stories) | TASK-XXX (technical tasks) |
| Use case | Feature work | Project setup/management |
| Best for | Ralph Loop automation | Overall PRD management |
When to use /story:
- Creating new user stories for Ralph Loop
- Iterating on features with clear user benefits
- Ensuring narrative format is followed
When to use /prd:
- Viewing/managing entire PRD
- Adding technical tasks (non-story work)
- Validating entire project structure
Both tools read/write the same prd.json - they're complementary!
Troubleshooting
Story not appearing after creation
- Check:
/story showlists it - Validate:
/prd validateshows no errors - File: Verify
prd.jsonwas updated:tail prd.json
Ralph Loop not picking up story
- Verify status is pending or in_progress
- Run validation:
/prd validate - Check story ID starts with
STORY-orTASK- - View Ralph log: check
progress.txtfor errors
Can't update story status
- Verify story ID:
/story show - Valid status: pending, in_progress, done, blocked
- Try:
/story update STORY-001(interactive mode)
See Also
/prd- Full PRD management and validation/loop- Start Ralph Loop for autonomous executionprd.json- Raw data file (view with/story show)progress.txt- Learnings and execution logprompt.md- Ralph's work order (generated per iteration)
Examples
Example 1: Quick Path - React Component Story
$ /story new
Story ID [STORY-006]:
Path [Q/S, default=Q]: Q
User role (As a): developer in a React project
Desired action (I want to): implement a collapsible JSON card component
Business value (So that): display context at a glance without opening other windows
Title [Implement Collapsible JSON Card]:
Priority [1=high, 2=normal, 3=low, default=2]: 1
Files (comma-separated, optional): src/components/ContextCard.tsx, src/hooks/useContext.ts, tests/ContextCard.test.tsx
Add acceptance criteria (blank line to finish, need at least 1):
- Component accepts JSON data as prop
- Sections collapse/expand on click
- JSON is syntax-highlighted
- Works with deeply nested objects
- Component is <500ms to render
- No external dependencies
(blank to finish)
✓ Created story: [STORY-006] Implement Collapsible JSON Card
Example 2: Structured Path - Complex Feature with Subtasks
$ /story new
Story ID [STORY-007]:
Path [Q/S, default=Q]: S
=== Problem Statement ===
What problem does this solve? Users can't easily search through large heuristics in the context card
Create narrative: 'As a X, I want Y, so that Z'
User role (As a): developer in Ralph loop with large knowledge base
Desired action (I want to): search the context card by domain or keyword
Business value (So that): I can find relevant heuristics without manual scrolling
Title [Search Context Card By Domain Or Keyword]:
Priority [1=high, 2=normal, 3=low, default=2]: 1
=== Functional Requirements ===
List what the system must do (blank to finish):
Requirement: Search is case-insensitive
Requirement: Highlights matching keys and values
Requirement: Returns count of matches
Requirement: Filters work with nested objects
Requirement: Search input is sticky while scrolling
Requirement: (blank to finish)
=== Constraints & Non-Goals ===
What should this NOT do? Any limits? (blank to finish):
Constraint: Don't add external search libraries (keep it lightweight)
Constraint: Don't modify the JSON structure for search purposes
Constraint: (blank to finish)
=== Success Metrics ===
How do we measure success? (blank to finish, at least 1):
Metric: Search returns results in <100ms
Metric: All criteria work with 1000+ item datasets
Metric: Works offline without external dependencies
Metric: (blank to finish)
Files (comma-separated, optional): src/components/ContextCard.tsx, src/components/SearchFilter.tsx
Add acceptance criteria (blank line to finish, need at least 1):
- Search box accepts text input
- Results highlight in card
- Count displayed: "X matches found"
- Escape key clears search
- (blank to finish)
Generate subtasks to prevent Ralph spiraling? [Y/n]: Y
=== Generating Subtasks ===
- [TASK-001] Create feature branch
- [TASK-002] Search is case-insensitive
- [TASK-003] Highlights matching keys and values
- [TASK-004] Returns count of matches
- [TASK-005] Filters work with nested objects
- [TASK-006] Search input is sticky while scrolling
✓ Generated 5 subtasks (plus feature branch)
✓ Created story: [STORY-007] Search Context Card By Domain Or Keyword
Linked subtasks: 6
Example 2: Filter High-Priority Pending Work
$ /story list --priority 1 --status pending
[STORY-001] User Authentication
[STORY-005] Dashboard KPI Display
[STORY-009] Error Handling Framework
→ Ralph will process these in order
Example 3: Review Before Starting Ralph Loop
$ /story show
$ /prd validate # Ensure all stories are valid
$ /loop # Start Ralph Loop
Contributing
To improve the /story skill:
- Use it regularly and note friction points
- Suggest UX improvements to the prompts
- Add new filters for
/story list - Extend validation rules (in
/prd validate) - Share story templates for common patterns