# Ralph Loop Guide ## What is a Ralph Loop? A Ralph Loop is an autonomous AI development pattern where a language model is invoked repeatedly in a loop, performing exactly one task per iteration. Each iteration is a **fresh context** — the model has no memory of previous runs. Persistence is achieved through files: the model reads project state from disk at the start of each iteration and writes its results back before stopping. The name originates from [Geoffrey Huntley's technique](https://ghuntley.com/loop/) for autonomous coding with Claude Code. The core insight: by constraining each iteration to a single task and using files as shared memory, you get reliable, incremental progress without context window exhaustion. Sources and further reading: - [Geoffrey Huntley — Everything is a Ralph Loop](https://ghuntley.com/loop/) - [snarktank/ralph — Original implementation](https://github.com/snarktank/ralph) - [frankbria/ralph-claude-code — Claude Code adaptation](https://github.com/frankbria/ralph-claude-code) ## How Ralph Works in This Project ### Directory Structure Each Ralph run lives in its own directory under `.ralph/`: ``` .ralph/ └── my-run/ ├── instructions.md # Agent prompt (user-created, required) ├── meta.md # Run metadata (auto-generated) ├── chief-wiggum.md # Chief Wiggum directives (auto-generated template) ├── answers.md # Human answers to questions (auto-generated template) ├── questions.md # Questions raised by Ralph (auto-generated template) ├── progress.txt # Iteration log (auto-generated template) └── run.log # Execution log (auto-generated) ``` ### The Iteration Cycle ``` ┌─────────────────────────────────┐ │ ralph.sh starts iteration N │ │ │ │ 1. Read project state │ │ (files listed in │ │ instructions.md) │ │ │ │ 2. Select ONE task │ │ (by priority order) │ │ │ │ 3. Execute that task │ │ (edit files as needed) │ │ │ │ 4. Append summary to │ │ progress.txt │ │ │ │ 5. Stop │ │ (or emit COMPLETE signal) │ └────────────┬────────────────────┘ │ ▼ ralph.sh checks output for COMPLETE │ ┌────┴────┐ │ Found? │ ├─Yes─────┼──► Loop ends └─No──────┘ │ ▼ Sleep 2s, start iteration N+1 ``` ### File Roles Each run directory contains files with specific roles: | File | Purpose | Who writes it | |------|---------|---------------| | `instructions.md` | Defines what Ralph does, which files to read, task priorities | Human (before run) | | `progress.txt` | Append-only iteration log — Ralph's memory across iterations | Ralph | | `chief-wiggum.md` | Directives from the Chief Wiggum session | Chief Wiggum | | `answers.md` | Human answers to Ralph's questions | Human | | `questions.md` | Questions Ralph raises when encountering ambiguity | Ralph | | `meta.md` | Run metadata (date, model, config) | Auto-generated | | `run.log` | Execution log (start/stop times, iteration count) | ralph.sh | ## How to Run Ralph ### Basic Usage ```bash ./ralph.sh .ralph/my-run ``` This runs the default configuration: up to 20 iterations, using Claude Opus, with Read/Edit/Write tools. ### Prerequisites The run directory must contain an `instructions.md` file. All other files are auto-created as templates if they don't exist. ### Options ```bash ./ralph.sh [options] Options: -n, --max-iterations N Maximum iterations (default: 20) -m, --model MODEL Claude model to use (default: opus) -t, --tools TOOLS Allowed tools, quoted (default: "Read Edit Write") ``` ### Examples ```bash # Short run with cheaper model ./ralph.sh .ralph/my-run -n 10 -m sonnet # Run with more tools (e.g. for coding tasks) ./ralph.sh .ralph/my-run -n 30 -t "Read Edit Write Bash Glob Grep" # New run mkdir .ralph/my-new-task # Write .ralph/my-new-task/instructions.md, then: ./ralph.sh .ralph/my-new-task -n 15 ``` ### Path Convention in instructions.md Use `{{RUN_DIR}}` as a placeholder for run-specific files. The script substitutes it automatically before passing the prompt to Claude: ``` {{RUN_DIR}}/progress.txt # run-specific {{RUN_DIR}}/chief-wiggum.md # run-specific {{RUN_DIR}}/answers.md # run-specific {{RUN_DIR}}/questions.md # run-specific ``` All other file paths are relative to the project root as usual. ## How to Communicate with Ralph Ralph cannot be talked to directly. Communication happens through files: ### As Chief Wiggum (directing Ralph) Edit `chief-wiggum.md` in the run directory **before** starting the loop: - **`## Action Required`** — Ralph MUST address these, one per iteration, in order. - **`## Observations`** — Informational notes. Ralph may use them but is not required to act. Ralph never modifies `chief-wiggum.md`. To confirm an item was addressed, check `progress.txt`. ### As the Human (answering questions) When Ralph raises a question in `questions.md`, write your answer in `answers.md` in the run directory. On the next iteration, Ralph will process the answer. ### Monitoring Progress - **`progress.txt`** — Append-only log of every iteration. What Ralph did and why. - **`run.log`** — Execution metadata (start time, iterations, completion status). - **Project files** — Diff the files Ralph was allowed to edit to see actual changes. ## Writing instructions.md The `instructions.md` file defines Ralph's behavior for a run. Key elements: 1. **Role definition** — What is Ralph doing? (Refining stories, writing code, reviewing, ...) 2. **One-task-per-iteration rule** — Always enforce this. Without it, the model tries to do everything at once and produces lower-quality results. 3. **Startup sequence** — Which files to read and in what order. This is Ralph's "memory load." Use `{{RUN_DIR}}` for run-specific files. 4. **Task selection priorities** — A strict priority list. Ralph picks the first applicable task, does it, and stops. 5. **File ownership table** — What Ralph may read vs. write. Prevents accidental overwrites. 6. **Completion signal** — How Ralph signals that all work is done (`COMPLETE`). 7. **Guardrails** — Rules to prevent Ralph from making unauthorized decisions. ## Best Practices ### Do - **Keep iterations small.** One task per iteration produces better results than batching. - **Use progress.txt as memory.** Ralph reads it every iteration. Be explicit about what was done and what was deferred. - **Clean up chief-wiggum.md** between runs. Remove addressed items to avoid confusion. - **Review diffs after the loop.** Ralph is autonomous but not infallible. Spot-check the changes. - **Use the right model.** Opus for complex reasoning tasks, Sonnet for straightforward work. - **Match tools to the task.** Read/Edit/Write for spec work. Add Bash/Glob/Grep for coding tasks. ### Don't - **Don't modify files Ralph owns during a run.** File conflicts will confuse the model. - **Don't give Ralph tools it doesn't need.** Minimal tool sets reduce unintended side effects. - **Don't expect Ralph to remember across iterations.** Every iteration is a fresh context. If it's not in a file, it doesn't exist. - **Don't skip instructions.md.** Running without a structured prompt loses the task selection that makes Ralph reliable.