第一次使用? 请先阅读 SETUP.md 来安装依赖并验证你的设置。
用于迭代开发的自主 AI 代理循环。基于 Geoffrey Huntley 的 Ralph Wiggum 技术,由 Clayton Farr 记录。
脚本: skills/ralph-loops/scripts/ralph-loop.mjs
仪表板: skills/ralph-loops/dashboard/ (使用 node server.mjs 运行)
模板: skills/ralph-loops/templates/
归档: ~/clawd/logs/ralph-archive/
Claude Code 2.1.29 存在一个严重错误,会生成占用 99% CPU 的孤立子代理。首次运行时迭代会因 "exit code null" 而失败。
修复方法: 降级到 2.1.25:
npm install -g @anthropic-ai/claude-code@2.1.25
验证:
claude --version # 应显示 2.1.25
此问题于 2026-02-01 发现。在升级前请检查新版本是否已修复该问题。
运行 Ralph 循环时,不要同步监控它。循环作为独立的 Claude CLI 进程运行——你可以继续聊天。
❌ 错误做法(阻塞对话):
启动循环 → 休眠 60 秒 → 轮询 → 休眠 60 秒 → 轮询 → ...(6 分钟沉默)
✅ 正确做法(保持响应):
启动循环 → "循环正在运行,我会定期检查" → 继续聊天 → 检查心跳
如何在不阻塞的情况下监控:
1. 使用 node ralph-loop.mjs ... 启动循环(在后台运行)
2. 告诉人类:"循环正在运行。我会定期检查进度,或者你可以随时询问。"
3. 在被询问时或心跳期间通过 process poll <sessionId> 检查
4. 使用 http://localhost:3939 上的仪表板进行实时查看
循环是自主运行的——这正是其核心所在。不要为了监控它而忽略与你对话的人类。
当人类说:
| 短语 | 动作 |
|---|---|
| "采访我关于系统 X" | 启动第 1 阶段需求访谈 |
| "开始规划系统 X" | 运行 ./loop.sh plan(需要先有规格说明) |
| "开始构建系统 X" | 运行 ./loop.sh build(需要先有计划) |
| "对 X 进行 Ralph 循环" | 询问具体阶段(见下文) |
不要假设阶段。请询问:
"我们正在进行哪种类型的 Ralph 循环?
1️⃣ 访谈 — 我将通过提问来构建规格说明(第 1 阶段)
2️⃣ 规划 — 我将迭代制定实施计划(第 2 阶段)
3️⃣ 构建 — 我将根据计划实施,每次迭代一个任务(第 3 阶段)
4️⃣ 通用 — 对单一主题进行简单的迭代优化"
然后根据他们的回答进行:
| 选择 | 动作 |
|---|---|
| 访谈 | 使用 templates/requirements-interview.md 协议 |
| 规划 | 需要先有规格说明 → 使用 PROMPT_plan.md 运行规划循环 |
| 构建 | 需要先有计划 → 使用 PROMPT_build.md 运行构建循环 |
| 通用 | 创建提示文件,直接运行 ralph-loop.mjs |
用于简单的迭代优化(非完整系统构建):
/tmp/ralph-prompt-<任务>.mdbash
node skills/ralph-loops/scripts/ralph-loop.mjs \
--prompt "/tmp/ralph-prompt-<task>.md" \
--model opus \
--max 10 \
--done "RALPH_DONE""人类的角色从'告诉代理做什么'转变为'设计条件,让良好的结果通过迭代自然涌现。"
— Clayton Farr
三个原则驱动一切:
┌─────────────────────────────────────────────────────────────────────┐
│ 第 1 阶段:需求 │
│ 人类 + LLM 对话 → JTBD → 主题 → specs/*.md │
├─────────────────────────────────────────────────────────────────────┤
│ 第 2 阶段:规划 │
│ 差距分析(规格说明 vs 代码) → IMPLEMENTATION_PLAN.md │
├─────────────────────────────────────────────────────────────────────┤
│ 第 3 阶段:构建 │
│ 每次迭代一个任务 → 全新上下文 → 反向压力 → 提交 │
└─────────────────────────────────────────────────────────────────────┘
目标: 在构建之前理解要构建什么。
这是最重要的阶段。使用结构化对话来:
识别待完成工作
将 JTBD 分解为关注主题
为每个主题创建规格说明
specs/ 中每个主题一个 markdown 文件模板: templates/requirements-interview.md
目标: 创建优先任务列表,但不实施任何内容。
在循环中使用 PROMPT_plan.md:
- 研究所有规格说明
- 研究现有代码库
- 比较规格说明与代码(差距分析)
- 生成带有优先级的 IMPLEMENTATION_PLAN.md 任务列表
- 不进行实施——仅规划
通常 1-2 次迭代即可完成。
目标: 在全新上下文中逐个实施任务。
在循环中使用 PROMPT_build.md:
1. 读取 IMPLEMENTATION_PLAN.md
2. 选择最重要的任务
3. 调查代码库(不要假设未实现)
4. 实施
5. 运行验证(反向压力)
6. 更新计划,提交
7. 退出 → 全新上下文 → 下一次迭代
关键见解: 每次迭代一个任务可以保持上下文简洁。代理保持在"智能区域",而不是积累冗余。
为什么全新上下文很重要:
- 没有累积的错误 — 每次迭代都从干净状态开始;之前的错误不会叠加
- 完整的上下文预算 — 200K token 用于此任务,不与已完成的工作共享
- 减少幻觉 — 更短的上下文 = 更可靠的响应
- 自然的检查点 — 每次提交都是一个保存点;易于回滚单个迭代
project/
├── loop.sh # Ralph 循环脚本
├── PROMPT_plan.md # 规划模式指令
├── PROMPT_build.md # 构建模式指令
├── AGENTS.md # 操作指南(最多约 60 行)
├── IMPLEMENTATION_PLAN.md # 优先级任务列表(生成)
└── specs/ # 需求规格说明
├── topic-a.md
├── topic-b.md
└── ...
| 文件 | 用途 | 创建者 |
|---|---|---|
specs/*.md |
需求的唯一真实来源 | 人类 + 第 1 阶段 |
PROMPT_plan.md |
规划模式指令 | 从模板复制 |
PROMPT_build.md |
构建模式指令 | 从模板复制 |
AGENTS.md |
构建/测试/检查命令 | 人类 + Ralph |
IMPLEMENTATION_PLAN.md |
带优先级的任务列表 | Ralph(第 2 阶段) |
对于 Clawdbot 系统,每个 Ralph 项目位于 <workspace>/systems/<name>/:
systems/
├── health-tracker/ # 示例系统
│ ├── specs/
│ │ ├── daily-tracking.md
│ │ └── test-scheduling.md
│ ├── PROMPT_plan.md
│ ├── PROMPT_build.md
│ ├── AGENTS.md
│ ├── IMPLEMENTATION_PLAN.md # ← 存在 = 已过第 1 阶段
│ └── src/
└── activity-planner/
├── specs/ # ← 空 = 仍在第 1 阶段
└── ...
通过检查存在的文件来检测当前阶段:
| 存在的文件 | 当前阶段 | 下一步动作 |
|---|---|---|
无 / specs/ 为空 |
第 1 阶段:需求 | 运行需求访谈 |
有 specs/*.md 但无 IMPLEMENTATION_PLAN.md |
准备进入第 2 阶段 | 运行 ./loop.sh plan |
有 specs/*.md + IMPLEMENTATION_PLAN.md |
第 2 或 3 阶段 | 审查计划,运行 ./loop.sh build |
| 计划显示所有任务已完成 | 完成 | 归档或迭代 |
快速检查:
# 我们处于哪个阶段?
[ -z "$(ls specs/ 2>/dev/null)" ] && echo "第 1 阶段:需要规格说明" && exit
[ ! -f IMPLEMENTATION_PLAN.md ] && echo "第 2 阶段:需要计划" && exit
echo "第 3 阶段:准备构建(或已完成)"
层次结构很重要:
JTBD
└── 关注主题(每个规格说明文件一个)
└── 任务(每个主题多个,在 IMPLEMENTATION_PLAN.md 中)
示例:
- JTBD: "帮助设计师创建情绪板"
- 主题:
- 图像收集 → specs/image-collection.md
- 颜色提取 → specs/color-extraction.md
- 布局系统 → specs/layout-system.md
- 分享 → specs/sharing.md
- 任务: 每个规格说明生成多个实施任务
你能用一句话描述这个主题,且不含"和"吗?
如果需要"和"或"也",那可能是多个主题。拆分它。
何时拆分:
- 描述中有多个动词 → 拆分为单独的主题
- 涉及不同的用户角色 → 拆分为单独的主题
- 可以由不同的团队实施 → 拆分为单独的主题
- 有自己的故障模式 → 可能是一个独立的主题
拆分示例:
❌ "用户管理处理注册、身份验证、配置文件和权限"
✅ 拆分为:
- "注册通过邮箱/密码创建新用户账户"
- "身份验证通过登录流程验证用户身份"
- "配置文件让用户查看和编辑其信息"
- "权限控制用户可以执行的操作"
反例(不要拆分):
✅ 保持在一起:
"颜色提取分析图像并返回主色调调色板"
为什么:"分析"和"返回"是一个操作中的步骤,不是独立的关注点。
当错误输出被拒绝时,自主循环会收敛。三个层次:
测试、类型检查、代码检查、构建验证。确定性的。
# 在 AGENTS.md 中
## 验证
- 测试:`npm test`
- 类型检查:`npm run typecheck`
- 代码检查:`npm run lint`
现有代码模式引导代理。它通过探索发现约定。
对于主观标准(语气、用户体验、美学),使用另一个 LLM 调用进行二元通过/失败判断。
从硬性关卡开始。只有在机械反向压力有效后,才为主观标准添加 LLM 作为评判者。
Geoffrey 的提示遵循编号模式:
| 部分 | 目的 |
|---|---|
| 0a-0d | 定位: 研究规格说明、源代码、当前计划 |
| 1-4 | 主要指令: 本次迭代要做什么 |
| 999+ | 防护栏: 不变式(数字越大越关键) |
防护栏使用递增的数字(99999, 999999, 9999999...)来表示优先级:
99999. 重要:在文档中捕获原因。
999999. 重要:单一真实来源,无需迁移。
9999999. 成功构建后创建 git 标签。
99999999. 如需调试,添加日志记录。
999999999. 保持 IMPLEMENTATION_PLAN.md 最新。
为什么这有效:
1. 视觉突出 — 大数字更显眼,更难跳过
2. 隐含优先级 — 9 越多越关键(类似于反向的 DEFCON 等级)
3. 无冲突 — 稀疏编号允许插入新规则而无需重新编号
4. 助记性 — Claude 将这些视为不变式,而非建议
"重要:"前缀是刻意的——它能触发 Claude 的注意力。
使用 Geoffrey 的特定措辞——这很重要:
mkdir -p myproject/specs
cd myproject
git init # Ralph 期望使用 git 进行提交
# 复制模板
cp .//templates/PROMPT_plan.md .
cp .//templates/PROMPT_build.md .
cp .//templates/AGENTS.md .
cp .//templates/loop.sh .
chmod +x loop.sh
PROMPT_plan.md — 将 [PROJECT_GOAL] 替换为你的实际目标:
# 之前:
ULTIMATE GOAL: We want to achieve [PROJECT_GOAL].
# 之后:
ULTIMATE GOAL: We want to achieve a fully functional mood board app with image upload and color extraction.
PROMPT_build.md — 如果不使用 src/,请调整源代码路径:
# 之前:
0c. For reference, the application source code is in `src/*`.
# 之后:
0c. For reference, the application source code is in `lib/*`.
AGENTS.md — 为你的技术栈更新构建/测试/检查命令。
此阶段与人类一起进行。使用访谈模板:
cat .//templates/requirements-interview.md
工作流程:
1. 讨论 JTBD——结果,而非功能
2. 分解为关注主题(每个都通过"一句话"测试)
3. 为每个主题编写规格说明文件:specs/topic-name.md
4. 人类审查并批准规格说明
示例输出:
specs/
├── image-collection.md
├── color-extraction.md
├── layout-system.md
└── sharing.md
./loop.sh plan
等待生成 IMPLEMENTATION_PLAN.md(通常 1-2 次迭代)。审查它——这是你的任务列表。
./loop.sh build 20 # 最多 20 次迭代
观察其工作。随着模式出现,添加反向压力(测试、检查)。检查提交以了解进度。
./loop.sh # 构建模式,无限制
./loop.sh 20 # 构建模式,最多 20 次迭代
./loop.sh plan # 规划模式,无限制
./loop.sh plan 5 # 规划模式,最多 5 次迭代
或者使用 Node.js 包装器以获得更多控制:
```bash
node skills/ralph-loops/scripts/ralph-loop.mjs \
--prompt "./PROMPT_build.md" \
--model opus \
--max 20 \
--done "RALPH_D