Ralph Guide
Quick reference for operating Choo Choo Ralph across all workflow phases.
The Workflow
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 1. Plan │ ──▶ │ 2. Spec │ ──▶ │ 3. Pour │ ──▶ │ 4. Ralph │ ──▶ │ 5. Harvest │
│ (you) │ │ (you + AI) │ │ (AI) │ │ (AI) │ │ (you + AI) │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
- Plan - Write what you want to build (this is on you)
- Spec - AI transforms it into structured tasks; you review and refine
- Pour - Tasks become beads (workflow or singular)
- Ralph - The loop runs autonomously until done
- Harvest - Extract learnings into skills, docs, or CLAUDE.md
See ${CLAUDE_PLUGIN_ROOT}/docs/workflow.md for the complete guide.
Prerequisites & Safety
Required:
- Claude Code - Anthropic's CLI
- Beads - Git-backed issue tracker (
bdcommand) - jq - JSON parsing
Recommended:
- dev-browser - Browser automation for UI verification
Safety: Ralph runs with --dangerously-skip-permissions. Run in a Docker container or VM, especially for untrusted codebases.
Install
/choo-choo-ralph:install
Creates local copies you can customize:
| File | Purpose |
|---|---|
./ralph.sh | Main loop script |
./ralph-once.sh | Single iteration (for testing) |
./ralph-format.sh | Output formatting |
.beads/formulas/choo-choo-ralph.formula.toml | Standard workflow formula |
.beads/formulas/bug-fix.formula.toml | Bug fix workflow formula |
.choo-choo-ralph/ | Spec file directory |
Spec Phase
Generate a Spec
/choo-choo-ralph:spec [source-file] [spec-name]
- From plan file:
/choo-choo-ralph:spec plans/my-feature.md - From conversation:
/choo-choo-ralph:spec(uses context) - With explicit name:
/choo-choo-ralph:spec plans/feature.md auth-system
Specs are stored at .choo-choo-ralph/{spec-name}.spec.md
Spec Format
Tasks use XML-like tags with a review workflow:
<task id="add-login-form" priority="1" category="functional">
<title>Add Login Form Component</title>
<description>Create a reusable login form...</description>
<steps>
1. Create LoginForm component
2. Add validation
</steps>
<test_steps>
1. Verify form renders
2. Test validation
</test_steps>
<review></review> <!-- Empty = ready to pour -->
</task>
Review Process
- Add feedback in
<review>tags:<review>Split this into two tasks: validation and submission</review> - Run
/choo-choo-ralph:specagain - AI processes feedback - Repeat until all
<review>tags are empty
Common review patterns:
- Split:
<review>Split into: schema creation, indexes, migration</review> - Add detail:
<review>Add step for handling duplicate emails</review> - Remove:
<review>Remove - already exists in utils/</review> - Combine:
<review>Merge with task-xyz, too small separately</review>
See ${CLAUDE_PLUGIN_ROOT}/docs/spec-format.md for complete format reference.
Pour Phase
Convert Spec to Beads
/choo-choo-ralph:pour [target-tasks] [spec-file] [formula]
Examples:
- Auto-detect everything:
/choo-choo-ralph:pour - Target 80 tasks:
/choo-choo-ralph:pour 80 - Specific spec and formula:
/choo-choo-ralph:pour 80 auth-system choo-choo-ralph
Modes
Workflow Formula (recommended) - Multi-step process per task:
bearings → implement → verify → commit
Singular Tasks - Direct execution without phases (for research, prototyping)
What Happens
- Tasks created as beads in
.beads/issues/ - Spec's
pouredarray updated with bead IDs - Spec archived to
.choo-choo-ralph/archive/ - Tasks ready for Ralph
See ${CLAUDE_PLUGIN_ROOT}/docs/commands.md for all options.
Ralph Loop
Running Ralph
./ralph.sh # Default iterations
./ralph.sh 50 # Run up to 50 tasks
./ralph.sh --verbose # Detailed output
./ralph.sh 20 -v # 20 iterations, verbose
Test before a long run:
./ralph-once.sh # Exactly one iteration
How It Works
while [ $iteration -lt $MAX_ITERATIONS ]; do
available=$(bd list --status=open --assignee=ralph --json | jq -r 'length')
[ "$available" -eq 0 ] && exit 0
claude --dangerously-skip-permissions --output-format stream-json -p "
Run bd list --status=open --assignee=ralph to see available tasks.
Pick one, claim with bd update <id> --status in_progress, then execute.
" | ./ralph-format.sh
done
Key insights:
- Uses
--status=opento filter outin_progresstasks - Multiple Ralphs can run in parallel - each only sees unclaimed work
- Beads provide persistent memory per task
Core Concepts
Formula: TOML template defining a workflow (steps, dependencies, prompts) Molecule: Instance of a formula (actual beads with real tasks)
Default choo-choo-ralph formula has 4 steps:
- bearings - Health check and codebase understanding
- implement - Make changes
- verify - Run tests/types
- commit - Create git commit
Orchestrator Pattern: When Ralph picks up a molecule root:
- Spawns sub-agents for each step
- Steps execute in dependency order
- Progress tracked via comments
- Closes when all steps complete
Viewing Progress
bd show <root-id> # See molecule structure
bd ready --assignee ralph # What's ready for work
bd blocked # What's waiting
bd comments <id> # Read progress notes
bd list --status in_progress # Currently active tasks
Running Multiple Ralphs
Multiple instances run safely in parallel:
# Terminal 1
./ralph.sh
# Terminal 2
./ralph.sh
- Each claims work by setting
in_progress - Won't double-pick same task
- Need multiple ready molecules
Start with 2, scale to 3-4 if stable. Rarely need more than 4-5.
Error Handling
Key principle: steps report back to orchestrator, orchestrator makes state changes.
Verification Failures
When verify finds issues:
- Small fixes → Verify fixes inline and re-verifies
- Significant issues → Verify reports
STATUS: FAILto orchestrator - Orchestrator handles rework → Reopens implement with
[REWORK]comment - Attempt tracking →
[attempt-N]comments log each failure - After 3 failures → Molecule marked
[CRITICAL]and blocked
Health Check Failures
When bearings finds the app already broken:
- Bearings reports
STATUS: HEALTH_CHECK_FAILED - Orchestrator creates bug bead via
bug-fixformula - Current molecule blocked on the bug bead
- Once fixed, original molecule becomes ready again
Blocked Beads
After 3 failed attempts:
- Orchestrator blocks itself:
bd update <id> --status blocked - Loop continues - blocked beads don't appear in
bd ready - Other work continues unaffected
Manual resolution:
bd list --status=blocked # Find blocked beads
bd comments <bead-id> # Review what went wrong
bd update <bead-id> --status open # Reopen for retry
# or
bd close <bead-id> --reason "Fixed manually"
See ${CLAUDE_PLUGIN_ROOT}/docs/troubleshooting.md for recovery procedures.
Harvest Phase
Capturing Learnings
Agents capture insights as they work using comment tags:
- [LEARNING] - Useful discoveries (patterns, gotchas, conventions)
- [GAP] - Missing work or incomplete implementations
Example comments on a completed bead:
[bearings] This codebase uses barrel exports - import from index.ts
[implement] shadcn Button requires forwardRef when wrapping
[GAP] Missing input validation for user registration API
[summary] Completed: Add settings page. Recommendation: Consider skill for shadcn patterns.
Running Harvest
/choo-choo-ralph:harvest
The harvest workflow:
- Finds beads with
learningslabel (not yetlearnings-harvested) - Analyzes comments for patterns and gaps
- Creates a harvest plan for review
- On approval, creates artifacts and marks beads
learnings-harvested
Artifact types:
- Skills - Patterns that should auto-trigger
- CLAUDE.md - Critical project guidance
- Reference docs - Technology-specific documentation
- Gap tasks - New beads for approved gaps
Labels
| Label | Meaning |
|---|---|
learnings | Bead has recommendations worth harvesting |
learnings-harvested | Learnings have been processed |
gaps | Contains identified gaps |
gaps-harvested | Gaps have been processed |
Query by label:
bd list --label learnings --no-label learnings-harvested
Customization
All installed files are yours to modify.
Shell Scripts
ralph.sh customization points:
MAX_ITERATIONS=100- Default iteration limit- The prompt passed to
claude -p- Add project-specific guidance - Task sorting:
--sort=priorityvs--sort=created
ralph-format.sh:
- Colors and output formatting
- What gets shown for each tool type
Formulas
Edit .beads/formulas/choo-choo-ralph.formula.toml:
- Add/remove steps
- Modify step prompts
- Change assignee patterns
- Add conditional steps
Creating custom formulas:
formula = "quick-task"
description = """Instructions for the task..."""
version = 1
[vars]
title = ""
task = ""
[[steps]]
id = "implement"
title = "{{title}}"
assignee = "ralph-subagent-implement"
description = """Step instructions..."""
Assignee Conventions
| Prefix | Execution |
|---|---|
ralph | Picked up by Ralph loop |
ralph-subagent-* | Spawned as sub-agent |
ralph-inline-* | Executed by orchestrator directly |
See ${CLAUDE_PLUGIN_ROOT}/docs/customization.md for complete guide.
See ${CLAUDE_PLUGIN_ROOT}/docs/formulas.md for formula reference.
Troubleshooting
Common Issues
Tasks not being picked up:
bd show <bead-id> # Check status and assignee
bd update <bead-id> --assignee ralph # Assign to Ralph
bd update <bead-id> --status open # Set status
bd dep <bead-id> # Check for blockers
Health check always failing:
- Stop Ralph
- Run checks manually:
npm test,npm run build,npm run lint - Fix all failures
- Resume Ralph
Infinite retry loop:
bd update <bead-id> --status blocked # Block manually
bd comments <bead-id> # Review all attempts
# Fix underlying issue, then:
bd update <bead-id> --status open # Reopen when ready
Recovery Procedures
Re-pour a spec:
- Move spec from archive:
mv .choo-choo-ralph/archive/spec.md .choo-choo-ralph/ - Delete existing beads (IDs in spec's
pouredarray) - Clear
poured: []in frontmatter - Run
/choo-choo-ralph:pour
Session recovery (mid-task crash):
bd list --status=in_progress --assignee=ralph # Find in-progress task
bd comments <bead-id> # Review progress
bd update <bead-id> --status open # Reopen to retry
Debugging
./ralph-once.sh # Test single iteration
./ralph.sh -v # Verbose output
bd comments <bead-id> # View task history
bd show <root-id> # Inspect molecule structure
See ${CLAUDE_PLUGIN_ROOT}/docs/troubleshooting.md for complete guide.
Documentation
${CLAUDE_PLUGIN_ROOT}/docs/workflow.md- Complete workflow guide${CLAUDE_PLUGIN_ROOT}/docs/spec-format.md- Spec file format reference${CLAUDE_PLUGIN_ROOT}/docs/commands.md- All commands with examples${CLAUDE_PLUGIN_ROOT}/docs/formulas.md- Formula reference and customization${CLAUDE_PLUGIN_ROOT}/docs/customization.md- Customizing Ralph for your project${CLAUDE_PLUGIN_ROOT}/docs/troubleshooting.md- Common issues and solutions
Commands
| Command | Purpose |
|---|---|
/choo-choo-ralph:install | Set up Ralph in project |
/choo-choo-ralph:spec | Generate/refine spec from plan |
/choo-choo-ralph:pour | Create beads from spec |
/choo-choo-ralph:harvest | Extract learnings |
./ralph.sh | Run Ralph loop |
./ralph-once.sh | Run single task |
