OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  ralph-mode: 具备迭代机制与背压门的自主开发循环

ralph-mode: 具备迭代机制与背压门的自主开发循环

 
  kernel ·  2026-02-01 20:11:52 · 3 次点击  · 0 条评论  

name: ralph-mode
description: 通过迭代、背压门和完成标准实现自主开发循环。适用于需要多次迭代、测试验证和结构化进度跟踪的持续编码会话。支持 Next.js、Python、FastAPI 和 GPU 工作负载,采用适配 OpenClaw 的 Ralph Wiggum 方法。


Ralph 模式 - 自主开发循环

Ralph 模式实现了适配 OpenClaw 的 Ralph Wiggum 技术:通过带有背压门、完成标准和结构化规划的持续迭代,实现自主任务完成。

何时使用

在以下情况使用 Ralph 模式:
- 构建需要多次迭代和优化的功能
- 处理具有验收标准的复杂项目
- 需要自动化测试、代码检查或类型检查门控
- 希望系统性地跟踪多次迭代的进度
- 偏好自主循环而非手动逐条指导

核心原则

三阶段工作流

阶段 1:需求定义
- 在 specs/ 中记录规范(每个关注点一个文件)
- 定义验收标准(可观察、可验证的结果)
- 创建包含优先级任务的实施计划

阶段 2:规划
- 差距分析:将规范与现有代码进行比较
- 生成包含优先级任务的 IMPLEMENTATION_PLAN.md
- 此阶段不进行实施

阶段 3:构建(迭代)
- 每次迭代从计划中选取一个任务
- 实施、验证、更新计划、提交
- 持续进行,直到所有任务完成或标准满足

背压门

通过验证自动拒绝不完整的工作:

程序化门控(始终使用):
- 测试:[test command] - 提交前必须通过
- 类型检查:[typecheck command] - 及早捕获类型错误
- 代码检查:[lint command] - 强制执行代码质量
- 构建:[build command] - 验证集成

主观门控(用于用户体验、设计、质量):
- LLM 作为评审员,审查语调、美观性、可用性
- 二进制通过/失败 - 通过迭代收敛
- 仅在程序化门控可靠工作后添加

上下文效率

  • 每次迭代一个任务 = 每次都有新鲜的上下文
  • 为探索生成子代理,而非占用主上下文
  • 简洁提示 = 智能区域(约 40-60% 利用率)
  • 计划是可丢弃的 - 重新生成比修复更廉价

文件结构

为每个 Ralph 模式项目创建以下结构:

项目根目录/
├── IMPLEMENTATION_PLAN.md     # 共享状态,每次迭代更新
├── AGENTS.md                  # 构建/测试/检查命令(约60行)
├── specs/                     # 需求(每个主题一个文件)
│   ├── topic-a.md
│   └── topic-b.md
├── src/                       # 应用程序代码
└── src/lib/                   # 共享工具

IMPLEMENTATION_PLAN.md

优先级任务列表 - 单一事实来源。格式:

# 实施计划

## 进行中
- [ ] 任务名称(迭代 N)
  - 备注:发现、错误、阻塞项

## 已完成
- [x] 任务名称(迭代 N)

## 待办事项
- [ ] 未来任务

主题范围测试

能否在不使用“和”的情况下用一句话描述主题?
- ✅ “使用 JWT 和会话管理的用户认证”
- ❌ “认证、配置文件和计费” → 3 个主题

AGENTS.md - 操作指南

运行项目的简明指南。保持在 60 行以内:

# 项目操作

## 构建命令
npm run dev      # 开发服务器
npm run build    # 生产构建

## 验证
npm run test     # 所有测试
npm run lint     # ESLint
npm run typecheck # TypeScript
npm run e2e      # 端到端测试

## 操作备注
- 提交前测试必须通过
- 类型检查失败会阻止提交
- 优先使用 src/lib 中的现有工具,而非临时复制

角色(人物)

为不同任务设置的专业角色:

角色:架构师 (@architect)
- 高层设计、数据建模、API 契约
- 关注点:模式、可扩展性、可维护性

角色:实施者 (@implementer)
- 编写代码、实施功能、修复错误
- 关注点:正确性、性能、测试覆盖率

角色:测试员 (@tester)
- 测试编写、验证、边界情况
- 关注点:覆盖率、可靠性、可复现性

角色:评审员 (@reviewer)
- 代码审查、PR 反馈、质量评估
- 关注点:风格、可读性、规范遵循

用法:

“生成一个带有 @architect 角色的子代理来设计数据模型”

循环机制

外层循环(由您协调)

您作为主代理的工作:工程设置、观察、纠正方向。

  1. 不要将工作分配给主上下文 - 生成子代理
  2. 让 Ralph 做 Ralph 的事 - LLM 将自我识别、自我纠正
  3. 使用保护措施 - 沙盒是您的安全边界
  4. 计划是可丢弃的 - 当计划错误或过时时重新生成
  5. 置身循环之外 - 坐下观察,不要微观管理

内层循环(子代理执行)

每个子代理迭代:
1. 研究 - 阅读计划、规范、相关代码
2. 选择 - 选择最重要的未完成任务
3. 实施 - 编写代码,仅一个任务
4. 验证 - 运行测试、代码检查、类型检查(背压)
5. 更新 - 标记任务完成、记录发现、提交
6. 退出 - 下一次迭代重新开始

停止条件

循环在以下情况结束:
- ✅ IMPLEMENTATION_PLAN.md 中的所有任务完成
- ✅ 所有验收标准满足
- ✅ 测试通过,无阻塞问题
- ⚠️ 达到最大迭代次数(配置限制)
- 🛑 手动停止(Ctrl+C)

完成标准

预先定义成功 - 避免“似乎完成”的模糊性。

程序化(可测量)

  • 所有测试通过:[test_command] 返回 0
  • 类型检查通过:无 TypeScript 错误
  • 构建成功:生产包创建完成
  • 覆盖率阈值:例如 80%+

主观(LLM 作为评审员)

针对难以自动化的质量标准:

## 完成检查 - 用户体验质量
标准:导航直观,主要操作易于发现
测试:用户能够完成核心流程而不感到困惑

## 完成检查 - 设计质量
标准:视觉层次清晰,品牌一致性保持
测试:布局遵循既定模式

运行 LLM 作为评审员的子代理进行二进制通过/失败检查。

技术特定模式

Next.js 全栈

specs/
├── authentication.md
├── database.md
└── api-routes.md

src/
├── app/                    # App Router
├── components/             # React 组件
├── lib/                   # 工具(数据库、认证、助手)
└── types/                 # TypeScript 类型

AGENTS.md:
  构建: npm run dev
  测试: npm run test
  类型检查: npx tsc --noEmit
  代码检查: npm run lint

Python(脚本/笔记本/FastAPI)

specs/
├── data-pipeline.md
├── model-training.md
└── api-endpoints.md

src/
├── pipeline.py
├── models/
├── api/
└── tests/

AGENTS.md:
  构建: python -m src.main
  测试: pytest
  类型检查: mypy src/
  代码检查: ruff check src/

GPU 工作负载

specs/
├── model-architecture.md
├── training-data.md
└── inference-pipeline.md

src/
├── models/
├── training/
├── inference/
└── utils/

AGENTS.md:
  训练: python train.py
  测试: pytest tests/
  代码检查: ruff check src/
  GPU 检查: nvidia-smi

快速开始命令

启动 Ralph 模式会话:

“为我在 ~/projects/my-app 的项目启动 Ralph 模式。我想实施使用 JWT 的用户认证。”

我将:
1. 创建包含优先级任务的 IMPLEMENTATION_PLAN.md
2. 生成子代理进行迭代实施
3. 应用背压门(测试、代码检查、类型检查)
4. 跟踪进度并宣布完成

操作学习

当出现 Ralph 模式时,更新 AGENTS.md:

## 发现的模式

- 添加 API 路由时,同时添加到 OpenAPI 规范
- 优先使用 src/lib/db 中的现有数据库工具,而非直接调用
- 测试文件必须与实现文件位于同一位置

逃生舱口

当轨迹出错时:
- Ctrl+C - 立即停止循环
- 重新生成计划 - “丢弃 IMPLEMENTATION_PLAN.md 并重新规划”
- 重置 - “Git 重置到最后已知的良好状态”
- 缩小范围 - 为特定工作创建更小范围的计划

高级:LLM 作为评审员装置

针对主观标准(语调、美观性、用户体验):

创建 src/lib/llm-review.ts

interface ReviewResult {
  pass: boolean;
  feedback?: string;
}

async function createReview(config: {
  criteria: string;
  artifact: string; // 文本或截图路径
}): Promise<ReviewResult>;

子代理发现并使用此模式进行二进制通过/失败检查。

关键操作要求

根据经验使用情况,强制执行以下实践以避免静默失败:

1. 强制进度日志记录

Ralph 必须在每次迭代后写入 PROGRESS.md。 这是不可协商的。

在项目根目录开始时创建 PROGRESS.md

# Ralph: [任务名称]

## 迭代 [N] - [时间戳]

### 状态
- [ ] 进行中 | [ ] 阻塞 | [ ] 完成

### 已完成的工作
- [项目 1]
- [项目 2]

### 阻塞项
- 无 | [描述]

### 下一步
[来自 IMPLEMENTATION_PLAN.md 的具体下一个任务]

### 更改的文件
- `path/to/file.ts` - [简要描述]

原因: 外部观察者(父代理、定时任务、人类)可以跟踪一个文件,而不是扫描目录或从会话日志推断状态。

2. 会话隔离与清理

在生成新的 Ralph 会话之前:
- 通过 sessions_list 检查现有的 Ralph 子代理
- 终止或验证先前会话的完成情况
- 不要在同一代码库上生成重叠的 Ralph 会话

反模式: 在 v1 仍在运行时生成 Ralph v2 = 文件冲突、竞态条件、工作丢失。

3. 显式路径验证

切勿假设目录结构。每次迭代开始时:

// 验证当前工作目录
const cwd = process.cwd();
console.log(`工作目录: ${cwd}`);

// 验证预期路径是否存在
if (!fs.existsSync('./src/app')) {
  console.error('预期 ./src/app,找到:', fs.readdirSync('.'));
  // 调整或显式失败
}

原因: Ralph 可能从具有不同工作目录的不同上下文生成。

4. 完成信号协议

完成后,Ralph 必须:

  1. 写入最终的 PROGRESS.md,包含“## 状态: 完成”
  2. 列出所有创建/修改的文件
  3. 干净退出(无挂起进程)

示例完成的 PROGRESS.md:

# Ralph: 影响者详情页面

## 状态: 完成 ✅

**完成时间:** [ISO 时间戳]

### 最终验证
- [x] TypeScript: 通过
- [x] 测试: 通过
- [x] 构建: 通过

### 创建的文件
- `src/app/feature/page.tsx`
- `src/app/api/feature/route.ts`

### 测试说明
1. 运行: `npm run dev`
2. 访问: `http://localhost:3000/feature`
3. 验证: [具体检查]

5. 错误处理要求

如果 Ralph 遇到不可恢复的错误:

  1. 记录到 PROGRESS.md,包含“## 状态: 阻塞”
  2. 详细描述阻塞项
  3. 列出尝试的解决方案
  4. 干净退出(不要挂起)

不要静默失败。 一个停止迭代但没有进度日志的 Ralph 与仍在工作的 Ralph 无法区分。

6. 迭代时间限制

设置显式迭代超时:

## 操作参数
- 最大迭代时间: 10 分钟
- 总会话超时: 60 分钟
- 如果迭代超限: 记录阻塞项,退出

原因: 防止在卡住的任务上无限循环,允许父代理干预。

记忆更新

每次 Ralph 模式会话后,记录:

## [日期] Ralph 模式会话

**项目:** [项目名称]
**持续时间:** [迭代次数]
**结果:** 成功 / 部分 / 阻塞
**学习:**
- 哪些工作良好
- 需要调整什么
- 添加到 AGENTS.md 的模式

附录:失败案例

常见的反模式:

反模式 后果 预防措施
无进度日志记录 父代理无法确定状态 强制 PROGRESS.md
静默失败 工作丢失,时间浪费 显式错误日志记录
重叠会话 文件冲突,状态损坏 生成前检查/清理
路径假设 错误目录,错误文件 显式验证
无完成信号 父代理无限等待 清晰的完成状态
无限迭代 资源浪费,无进展 时间限制 + 阻塞项
复杂的初始提示 子代理从未启动(空会话日志) 简化指令

新增:会话初始化最佳实践 (2025-02-07)

问题:子代理生成但不执行

证据: 空会话日志(2 字节),无工具调用,0 令牌使用

根本原因

  1. 指令太复杂 - 压倒隔离的会话初始化
  2. 无明确的执行触发 - 代理不知道何时开始
  3. 分支逻辑 - “如果 X 做 Y,如果 Z 做 W” 混淆任务选择
  4. 提及多个文件 - 无法决定从哪个开始

修复:简化的 Ralph 任务模板

## 任务: [一个具体事项]

**文件:** 确切的/路径/to/file.ts
**内容:** 更改的精确描述
**验证:** 要运行的精确命令
**然后:** 更新 PROGRESS.md 并退出

## 规则
1. 不要查看其他文件
2. 不要“先检查”
3. 进行更改,验证,退出

之前(错误 - 导致停滞):

修复所有这些文件中的 TypeScript 错误:
- lib/db.ts 有 2 个错误
- lib/proposal-service.ts 有 5 个错误
- route.ts 有错误
检查先修复哪些,然后...

之后(正确 - 执行):

修复 lib/db.ts 第 27 行:
更改: PoolClient 为 pg.PoolClient
验证: npm run typecheck
完成后立即退出

关键:单一文件规则

每个 Ralph 迭代处理一个文件。不是“所有错误”,不是“检查然后决定”。一个文件,一个更改,验证,退出。

关键:更新 PROGRESS.md

强制: 每次迭代后,更新 PROGRESS.md,包含:

## 迭代 [N] - [时间戳]

### 状态: 完成 ✅ | 阻塞 ⛔ | 失败 ❌

### 已完成的工作
- [所做的具体更改]

### 验证
- [测试/代码检查/类型检查结果]

### 下一步
- [接下来应该发生什么]

原因: 定时任务读取 PROGRESS.md 以获取状态更新。如果未更新,状态显示为陈旧/重复。

调试 Ralph 停滞

如果 Ralph 停滞:
1. 检查会话日志(应在 60 秒内显示工具调用)
2. 如果生成后为空 → 指令太复杂
3. 简化:一个文件,一个行号,一个更改
4. 更短的超时强制更小的任务(300 秒而非 600 秒)

修复陈旧状态报告

如果定时任务重复报告相同状态:
1. 检查子代理是否更新了 PROGRESS.md
2. 如果未更新 → 子代理跳过了文档步骤
3. 更新技能:在提示中添加“强制 PROGRESS.md 更新”
4. 手动修复:更新 PROGRESS.md 以反映实际状态

总结

Ralph 在以下情况工作:单一文件焦点 + 显式更改 + 验证 + 退出
Ralph 在以下情况停滞:复杂决策 + 多个文件 + 条件逻辑

3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor