home / skills / rohunj / claude-build-workflow / bugs-to-stories
This skill converts bug reports into prd.json user stories for autonomous fixing, prioritizing critical issues and updating records for Ralph.
npx playbooks add skill rohunj/claude-build-workflow --skill bugs-to-storiesReview the files below or copy the command above to add this skill to your agents.
---
name: bugs-to-stories
description: "Convert bug reports into prd.json user stories for autonomous fixing. Use after running test-and-break skill. Triggers on: convert bugs to stories, fix these bugs, add bugs to prd, create fix stories."
---
# Bugs to Stories Converter
Takes bug reports from the test-and-break skill and converts them into properly formatted user stories that can be added to prd.json for Ralph to fix autonomously.
---
## The Job
1. Read the bug report from `tasks/bug-report-*.md`
2. Convert each bug into a user story
3. Add stories to prd.json (or create new one)
4. Ensure proper prioritization (critical bugs first)
---
## Conversion Rules
### Bug → User Story Mapping
| Bug Field | Story Field |
|-----------|-------------|
| BUG-XXX | id: "FIX-XXX" |
| Title | title: "Fix: [title]" |
| Steps to Reproduce | Goes into notes |
| Expected Behavior | Part of description |
| Actual Behavior | Part of description |
| Severity | Determines priority |
### Priority Mapping
| Bug Severity | Story Priority Range |
|--------------|---------------------|
| Critical | 1-3 (fix immediately) |
| High | 4-7 |
| Medium | 8-12 |
| Low | 13+ |
### Story Format
```json
{
"id": "FIX-001",
"title": "Fix: [Descriptive bug title]",
"description": "As a user, I expect [expected behavior] but currently [actual behavior occurs].",
"acceptanceCriteria": [
"[Specific technical fix needed]",
"[Another fix criterion if needed]",
"Regression test: Following original bug steps no longer reproduces the issue",
"Typecheck passes"
],
"priority": 1,
"passes": false,
"notes": "Bug reproduction: [steps from bug report]"
}
```
---
## Process
### Step 1: Read Bug Report
```bash
# Find the latest bug report
ls -t tasks/bug-report-*.md | head -1
```
Read the bug report and parse each bug entry.
### Step 2: Check Existing prd.json
```bash
# Check if prd.json exists and get current state
if [ -f prd.json ]; then
cat prd.json | jq '{
project: .project,
totalStories: (.userStories | length),
maxPriority: ([.userStories[].priority] | max),
incompleteStories: ([.userStories[] | select(.passes == false)] | length)
}'
fi
```
### Step 3: Decide Integration Strategy
**Option A: Add to existing prd.json (recommended if original build incomplete)**
- Append bug fix stories after existing stories
- Set priorities to come after current highest priority
- Keep original project name and branchName
**Option B: Create bug-fix-only prd.json (if original build complete)**
- Create new prd.json with only bug fix stories
- Use branchName: `ralph/bugfix-[date]`
- Start priorities at 1
Ask user which approach if unclear.
### Step 4: Generate Stories
For each bug in the report:
```javascript
// Example conversion
const bugToStory = (bug, priorityOffset) => ({
id: bug.id.replace('BUG', 'FIX'),
title: `Fix: ${bug.title}`,
description: `As a user, I expect ${bug.expected} but currently ${bug.actual}.`,
acceptanceCriteria: [
...generateFixCriteria(bug),
`Regression test: ${bug.steps.join(' → ')} no longer reproduces the issue`,
"Typecheck passes"
],
priority: severityToPriority(bug.severity) + priorityOffset,
passes: false,
notes: `Original bug steps: ${bug.steps.join('; ')}`
});
```
### Step 5: Update prd.json
**If adding to existing:**
```bash
# Backup first
cp prd.json prd.json.backup
# Add new stories (Claude does this programmatically)
```
**If creating new:**
```json
{
"project": "[Original Project] - Bug Fixes",
"branchName": "ralph/bugfix-2024-01-15",
"description": "Bug fixes from automated testing",
"userStories": [
// converted bug stories here
]
}
```
### Step 6: Verify
```bash
# Verify the updated prd.json
cat prd.json | jq '{
project: .project,
totalStories: (.userStories | length),
bugFixStories: ([.userStories[] | select(.id | startswith("FIX"))] | length),
allPassesFalse: ([.userStories[] | select(.passes == false)] | length)
}'
```
---
## Example Conversion
**Input Bug:**
```markdown
## BUG-003: Form submits with empty required fields
**Severity:** High
**Type:** Functional
**Steps to Reproduce:**
1. Go to /signup
2. Leave all fields empty
3. Click "Create Account"
**Expected Behavior:**
Form should show validation errors and prevent submission
**Actual Behavior:**
Form submits and shows server error
```
**Output Story:**
```json
{
"id": "FIX-003",
"title": "Fix: Form submits with empty required fields",
"description": "As a user, I expect the signup form to show validation errors when I leave required fields empty, but currently it submits and shows a server error.",
"acceptanceCriteria": [
"Add client-side validation for all required fields",
"Show inline error messages for empty required fields",
"Disable submit button until required fields are filled",
"Regression test: Going to /signup → leaving fields empty → clicking Create Account shows validation errors instead of submitting",
"Typecheck passes"
],
"priority": 4,
"passes": false,
"notes": "Original bug steps: Go to /signup; Leave all fields empty; Click Create Account"
}
```
---
## After Conversion
Once bugs are converted to stories:
1. Tell the user how many bug fix stories were added
2. Show the priority distribution
3. Ask if they want to start Ralph to fix them:
> "I've added X bug fix stories to prd.json:
> - Critical fixes: X (priority 1-3)
> - High priority: X (priority 4-7)
> - Medium priority: X (priority 8-12)
> - Low priority: X (priority 13+)
>
> Ready to run Ralph to fix these bugs automatically?"
If yes, they can run `./ralph.sh` to start fixing.
This skill converts bug reports produced by the test-and-break workflow into well-formed prd.json user stories so an autonomous fixer (Ralph) can address them. It reads the latest bug report, maps bug fields to FIX- story fields, prioritizes by severity, and updates or creates a prd.json ready for automated fixes. It ensures critical bugs are surfaced first and includes regression criteria for verification.
The skill reads the latest tasks/bug-report-*.md file, parses each bug entry, and transforms fields into a standardized story object (id, title, description, acceptanceCriteria, priority, passes, notes). It maps severity to priority ranges and either appends stories to an existing prd.json or generates a new bug-fix-only prd.json with an appropriate branchName. Finally it summarizes counts and priority distribution for user review.
How are priorities chosen for each bug?
Severity maps to a priority range: Critical 1-3, High 4-7, Medium 8-12, Low 13+. The skill assigns a concrete priority within that range and shifts by an offset when appending to an existing prd.json.
Will this overwrite my existing prd.json?
No — when appending, the skill recommends creating a backup (prd.json.backup) and appends stories after the current highest priority. It can also create a separate bug-fix-only prd.json if requested.
What acceptance criteria are included by default?
Each story includes explicit technical fix items (derived from the bug), a regression test that reproduces original steps, and a Typecheck passes criterion.