home / skills / jmagly / aiwg / ralph-loop
This skill detects requests for iterative AI task loops and routes them to the /ralph command to drive completion.
npx playbooks add skill jmagly/aiwg --skill ralph-loopReview the files below or copy the command above to add this skill to your agents.
---
name: ralph-loop
description: Detect requests for iterative AI task loops and invoke the Ralph command
version: 2.0.0
triggers:
- "ralph this"
- "ralph:"
- "ralph it"
- "keep trying until"
- "loop until"
- "iterate until"
- "run until passes"
- "fix until green"
- "keep fixing until"
- "keep going until"
- "iterate on"
---
# Ralph Loop Skill
You detect when users want iterative task execution and route to the `/ralph` command.
## Trigger Patterns
| Pattern | Example | Action |
|---------|---------|--------|
| `ralph this: X` | "ralph this: fix all lint errors" | Extract task, infer completion |
| `ralph: X` | "ralph: migrate to TypeScript" | Extract task, infer completion |
| `ralph it` | "ralph it" (after task description) | Use conversation context |
| `keep trying until X` | "keep trying until tests pass" | Task = current context, completion = X |
| `loop until X` | "loop until coverage >80%" | Task = improve coverage, completion = X |
| `iterate until X` | "iterate until no errors" | Task = fix errors, completion = X |
| `run until passes` | "run until passes" | Infer test command |
| `fix until green` | "fix until green" | Task = fix tests, completion = tests pass |
| `keep fixing until X` | "keep fixing until lint is clean" | Task = fix lint, completion = X |
## Extraction Logic
### Task Extraction
**From explicit task**:
- "ralph this: fix all TypeScript errors" → Task: "fix all TypeScript errors"
- "ralph: migrate src/ to ESM" → Task: "migrate src/ to ESM"
**From context**:
- "ralph it" after discussing a refactor → Use previous conversation as task context
### Completion Inference
When user doesn't specify explicit verification:
| Task Pattern | Inferred Completion |
|--------------|---------------------|
| "fix tests" | "npm test passes" |
| "fix lint" / "fix linting" | "npm run lint passes" |
| "fix types" / "fix TypeScript" | "npx tsc --noEmit passes" |
| "fix build" | "npm run build succeeds" |
| "add tests" | "test coverage increases" |
| "migrate to ESM" | "node runs without errors" |
| "refactor X" | "npm test passes" (preserve behavior) |
### Examples
**User**: "ralph this: migrate all files in lib/ to ESM"
**Extraction**:
- Task: "migrate all files in lib/ to ESM"
- Completion (inferred): "node --experimental-vm-modules lib/index.js runs without errors"
**Action**: Invoke `/ralph "migrate all files in lib/ to ESM" --completion "node --experimental-vm-modules lib/index.js succeeds"`
---
**User**: "keep fixing until the tests are green"
**Extraction**:
- Task: "fix failing tests" (from context or implied)
- Completion: "npm test passes with 0 failures"
**Action**: Invoke `/ralph "fix failing tests" --completion "npm test passes"`
---
**User**: "ralph it" (after discussing adding auth validation)
**Extraction**:
- Task: (from conversation context about auth validation)
- Completion: (infer based on task type)
**Action**: Invoke `/ralph "{context-based task}" --completion "{inferred criteria}"`
---
**User**: "loop until coverage is above 80%"
**Extraction**:
- Task: "add tests to improve coverage"
- Completion: "npm run coverage shows >80%"
**Action**: Invoke `/ralph "add tests to improve coverage" --completion "coverage report shows >80%"`
## Clarification Prompts
If extraction is ambiguous, ask the user:
```
I'll start a Ralph loop for: {extracted task}
What command verifies completion?
1. npm test (Recommended for test fixes)
2. npx tsc --noEmit (For type errors)
3. npm run lint (For lint errors)
4. npm run build (For build issues)
5. Custom command...
```
Or if task is unclear:
```
I detected a Ralph loop request. To start iterating:
What task should I repeat until success?
What command tells me when it's done?
```
## Multi-Loop Support
**Version 2.0** adds concurrent loop execution with registry tracking.
### Concurrency Limits
- **MAX_CONCURRENT_LOOPS**: 4 (per REF-086)
- **Research basis**: 17.2x error trap beyond 4 concurrent agents
- **Communication overhead**: n*(n-1)/2 paths = 6 at max capacity
### Loop ID Format
All loops have unique identifiers:
- Pattern: `ralph-{slug}-{uuid8}`
- Example: `ralph-fix-tests-a1b2c3d4`
### --loop-id Parameter
Users can optionally specify a loop ID:
```
/ralph "fix tests" --completion "npm test passes" --loop-id ralph-my-fixes-12345678
```
If not provided, ID is auto-generated from task description.
### Registry Tracking
All active loops tracked in `.aiwg/ralph/registry.json`:
```json
{
"version": "2.0.0",
"max_concurrent_loops": 4,
"active_loops": [
{
"loop_id": "ralph-fix-tests-a1b2c3d4",
"status": "running",
"iteration": 5,
"task": "fix all TypeScript errors",
"started_at": "2026-02-02T21:00:00Z",
"pid": 12345
}
]
}
```
### Concurrent Loop Behavior
**When starting a new loop**:
1. Check registry: `active_loops.length < 4`
2. If at limit: Show error with active loop list
3. If space available: Register new loop and start
**User sees**:
```
Error: Maximum concurrent loops (4) reached
Active loops:
1. ralph-fix-tests-a1b2c3d4 (iteration 5) - fix TypeScript errors
2. ralph-add-docs-b2c3d4e5 (iteration 3) - add JSDoc comments
3. ralph-refactor-c3d4e5f6 (iteration 8) - refactor API module
4. ralph-migrate-d4e5f6a7 (iteration 2) - migrate to ESM
Abort one with: aiwg ralph-abort {loop_id}
```
### Loop Status Commands
**Check all active loops**:
```
aiwg ralph-status --all
```
**Check specific loop**:
```
aiwg ralph-status ralph-fix-tests-a1b2c3d4
```
**Abort a loop**:
```
aiwg ralph-abort ralph-fix-tests-a1b2c3d4
```
**Resume a paused loop**:
```
aiwg ralph-resume ralph-fix-tests-a1b2c3d4
```
### Directory Structure
Multi-loop structure per loop:
```
.aiwg/ralph/
├── registry.json # Multi-loop registry
└── loops/
├── ralph-fix-tests-a1b2c3d4/
│ ├── state.json
│ ├── checkpoints/
│ │ ├── iteration-001.json.gz
│ │ └── iteration-002.json.gz
│ └── analytics/
│ └── analytics.json
└── ralph-add-docs-b2c3d4e5/
├── state.json
└── ...
```
## Invocation
Once task and completion are extracted/confirmed:
```
/ralph "{task}" --completion "{completion}"
```
With optional parameters if the user specified them:
- `--max-iterations N` if user mentioned iteration limit
- `--timeout M` if user mentioned time limit
- `--interactive` if task needs clarification
- `--loop-id {id}` if user wants custom loop ID
### Multi-Loop Examples
**Parallel bug fixes**:
```
User: "ralph: fix TypeScript errors in src/"
→ Loop 1: ralph-fix-ts-errors-a1b2c3d4
User: "also ralph: add missing tests in lib/"
→ Loop 2: ralph-add-tests-b2c3d4e5
Both running in parallel until completion criteria met.
```
**Sequential with manual abort**:
```
User: "ralph: refactor entire auth module"
→ Loop 1: ralph-refactor-auth-c3d4e5f6 (running)
User: "actually, abort that and just fix the login bug"
→ aiwg ralph-abort ralph-refactor-auth-c3d4e5f6
→ Loop 2: ralph-fix-login-d4e5f6a7 (running)
```
## Integration Notes
- This skill has **high priority** - ralph-related phrases should route here
- The skill is **exclusive** - once triggered, handle the entire request
- Always confirm extraction before invoking if there's ambiguity
- Prefer inferring completion criteria over asking (ask only if truly unclear)
- Check registry capacity before starting new loops
- Show helpful errors with active loop list when at capacity
## Related
- `/ralph` command - the actual loop executor
- `/ralph-status` - check loop progress
- `/ralph-resume` - continue interrupted loops
- `/ralph-abort` - abort active loops
- `@agentic/code/addons/ralph/schemas/loop-registry.yaml` - Registry schema
- `@agentic/code/addons/ralph/schemas/loop-state.yaml` - Loop state schema
- `@.aiwg/research/findings/REF-086-cognitive-load-limits.md` - Concurrency research
## Version History
- **2.0.0**: Added multi-loop support with registry tracking (Issue #268)
- **1.0.0**: Initial single-loop implementation
This skill detects user requests to run iterative AI task loops and routes them to the Ralph loop executor. It extracts the task and success criteria from explicit phrases or conversational context, then constructs and invokes the /ralph command. It supports single and concurrent loops, registry tracking, and user options like custom loop IDs, timeouts, and iteration limits.
The skill watches for trigger patterns such as "ralph: X", "keep trying until X", "loop until X", and context-followers like "ralph it." It extracts a concrete task and infers a completion command when none is specified (for example, mapping "fix tests" to "npm test passes"). When extraction is confirmed it generates a /ralph invocation with optional flags (--completion, --max-iterations, --timeout, --loop-id). For multi-loop operation it checks a registry and enforces a MAX_CONCURRENT_LOOPS limit before starting.
What if the skill misinterprets the task?
If extraction is ambiguous the skill will ask a clarifying question: confirm the task and the verification command before invoking /ralph.
How many loops can run at once?
By default up to 4 concurrent loops. If the limit is reached the skill returns an error listing active loops and how to abort one.
Can I provide a custom loop ID?
Yes. Pass --loop-id when you want a human-readable or reproducible identifier. If omitted the skill auto-generates one from the task.