文档定位 这是一份"分享稿"——讲给同事 / 实习生 / 跨团队听众,用通俗的语言解释一套已经跑了 34 轮(约 200 个 user story)、做完一个完整个人知识库产品并免费部署上线的远程自动化编码流程。
配套的"工程沉淀"文档见 远程控制自动化开发流程——那边有所有真实配置、命令、踩坑细节;这里更偏故事、动机、隐喻和经验。
我不是工程师。我是产品经理。
过去半年我做了一件听起来不可思议的事——仅用一部手机,在 34 个工作"轮次"里完成了一个完整的个人知识库产品的开发,并把它免费部署到了公网上。
写代码的不是我。是一个跑在 Arch Linux 服务器上的 AI 编码循环。 告诉它要做什么的,也不是我直接告诉它的——是另一个 AI,先把我"在地铁上打的一句话"翻译成了几十条可执行的验收标准,再把它们扔进循环里去执行。
我的角色,只剩下两个:
这套流程不是魔法,也不是一个"agent"在做事——是五段链路、四个角色互相牵制的工程结果。今天我把它拆开讲。
我用 飞书 当遥控器,vibe-remote 当中继站,Claude 当项目经理,Ralph 循环 当包工头,Codex 当编码工人,Encore Cloud + Cloudflare 当免费机房——把"想做一个产品"压缩成了"在地铁上发一句话"。
比喻:把它想成一个剧组 我是甲方(产品经理),下了一个 brief。剧组里:制片(vibe)+ 导演(Claude)+ 副导演兼场务(Ralph)+ 三个分别负责拍摄/审片/写场记的现场(Codex × 3)+ 后期发行(Encore Cloud / Cloudflare)。我只对接导演,其他人导演去管。
| 角色 | 是什么 | 我对它说什么 | 它对谁交付 |
|---|---|---|---|
| 我(产品经理) | 唯一的人类 | "想要 X 功能 / 改 Y 体验" | 整条链路 |
| 飞书 | IM 平台 | 直接发消息 | vibe-remote |
| vibe-remote | 本地消息桥 | 不直接说话,只是转交 | Claude |
| Claude(Max 订阅) | 项目经理 / 规划者 | 详细需求 + 约束 + 不做的范围 | 把意图翻成 prd.json,启动 Ralph |
| Ralph 循环 | 自主执行循环(一个 Python 脚本) | 不说话,只读 prd.json | 调度三个 Codex 进程 |
| Codex(订阅) | 真正写代码的 AI(也可以换成 Claude) | 不说话,只读分配给它的 prompt 文件 | git commit |
| Encore Cloud + Cloudflare | 免费机房 | git push | 公网 URL |
关键:六个角色全程不进同一个上下文窗口。 每个 Codex 进程被 spawn 出来时只知道自己这一份 prompt + 当前 user story 的验收标准,干完就退出。这是这套系统能稳定跑 34 轮的核心结构性原因。
步骤 1.我发消息
飞书私聊 @vibe-bot: "我想给知识库加一个语音笔记功能:录音、转写、自动 ingest 到 wiki。先做后端骨架,前端下一轮再做。"
步骤 2.消息穿越云端 → 我的服务器
飞书开放平台通过 WebSocket 把消息推给跑在 130 服务器上的 vibe-remote。vibe 把消息塞进当前飞书会话对应的那个 Claude Code 进程的 stdin。
这一步不经任何云中转 我的代码、我的服务器都在本地。飞书只是消息总线,不接触代码。
步骤 3.Claude 听懂了,开始规划
Claude 读完消息后做几件事:
关键转换:自然语言 → 客观可验证规则 "我想要语音笔记功能"是主观需求;acceptanceCriteria 是客观规则——能用编译器、测试、grep 来判断真假。Claude 在这里完成了"主观→客观"的翻译。
步骤 4.Ralph 接管
Ralph 是一个最多迭代 50 次的 Python while 循环。每次迭代:
步骤 5.飞书提示叮一声
我刚出地铁,手机震动:
🤖 Ralph R35 watcher event: STORY_DONE: S198 (a3f29c1 feat: [S198] - voice upload endpoint) — 新增 voice 服务
我在咖啡店点单,发了一句"继续"。Claude 看到 STORY_DONE 事件,知道这一轮还在跑,回复"在跑 S199 的转写实现"。
步骤 6.大约 90 分钟后
🤖 Ralph R35 watcher event: ROUND_COMPLETE: round-35 digest written
这一轮 5 个 user story 全部跑完,Summarizer 已经把本轮成果写成 agent-rules/rounds/round-35-voice-io.md,并且把"已交付轮次"那一行追加到了 AGENTS.md。
步骤 7.我决定要不要上线
Ralph 默认不 push——所有 commit 都留在 130 本机。我看 dashboard 的截图、看 progress.txt 里的 Validator 验收报告,觉得可以了,飞书发一句"push"。Claude 跑 git push origin main。
GitHub webhook → Encore Cloud → Build → Test → Provision → Deploy。约 6 分钟后,新功能在 https://staging-knowledge-encore-vpzi.encr.app/ 可访问。
整条流程,我在飞书里说了 4 句话:发需求、说继续、说 push、看部署成功。
业界常见的失败模式:用一个超大上下文 agent 一口气做"规划 + 拆任务 + 写代码 + 自我验证"。 长程 agent 跑着跑着就开始幻觉、跑偏、甚至自己改自己的验收标准来"通过"测试。
这套系统的拆法:
比喻 像让出题人、考生、阅卷人是三个不能私下沟通的人——出题人定标准,考生闷头答,阅卷人按标准客观打分。如果让一个人同时干三件事,他会偷偷修改答案。
prd.json 是这套系统的"宪法"——所有人都改它,但改的字段被严格规定:
"passes:true 不是开发者说了算" 这条是这套系统能信得过的根本——Dev 自报通过,Validator 用编译器和测试客观复核。中间不留任何"自评"空间。
我没办法在飞书里 tail -f /var/log/ralph.log。所以系统反过来——Ralph 跑出有意义的事件时,主动推送给我。
watch_round.sh 是一个 bash 脚本,由 vibe-remote 在后台拉起。它做的事情很简单:每 30 秒看一眼 prd.json 和 ralph 日志,命中以下任一条件就退出并打印一行:
| 事件 | 我的反应 |
|---|---|
| STORY_DONE: S198 ... | 知道在前进,不动 |
| ERROR_SIGNAL: <traceback / quota / 401> | 出问题了,进飞书会话问 Claude 详情 |
| HEARTBEAT: round-35 alive after 1800s | 30 分钟没动静但还活着,不动 |
| ROUND_COMPLETE / RALPH_EXITED_NO_DIGEST | 一轮跑完或挂了,决定下一步 |
vibe 接收这些事件并自动以飞书消息卡片形式投递回我所在的话题。整套系统对外只有这一个出口:飞书消息。
Round 5-33 一直用本地文件系统存 raw / wiki markdown,本地 dev 跑得好好的。
2026-05-07 第一次部署 staging 成功。我在飞书里说"试试 ingest 一篇文章"。 回报:internal_message='ENOENT: no such file or directory, open /workspace/storage/<uid>/scheme/<sid>.md'
Encore Cloud 是无状态容器,pod 重启 / 多副本之间不共享本地盘。本地 FS 这条路从一开始就走不通。
我没写一行代码。
一个反直觉的结论 AI 越长程越不可信。所以工程的目标不是"让 AI 一次干更多",而是"把 AI 的不可信压缩成短程可验证 + 异常可上报"。
这套系统所有的设计——单 story 切片、Validator 独立校验、watch heartbeat、Summarizer 二次校验——都在做这一件事。
| 阶段 | 投入 | 产出 |
|---|---|---|
| 0. 零成本试水 | 跟着 Geoffrey Huntley 的 Ralph 原文(这套流程的灵感来源)跑一个小 demo | 跑通"循环 + Codex / Claude 写代码 + 自动 commit" |
| 1. 加状态机 | 写 prd.json + Dev/Validator 两个 prompt | 跑通"Dev 自报 + Validator 复核" |
| 2. 加 Summarizer | 写第三个 prompt + 跨轮 round digest 索引 | 跑通"多轮迭代不丢上下文" |
| 3. 加飞书桥 | 装 vibe-remote + 配飞书自建应用 | 移动端能下指令、能收事件 |
| 4. 加云部署 | Encore Cloud(TS/Go)/ Fly.io(Python/Java/Go)+ Cloudflare Pages | 公网可访问 |
| 5. 复刻完成 | ≈ 3-5 个工作日(按本指南 + 工程沉淀文档) | 自己的"AI 编码工厂" |
Q1:跟传统 IDE + Copilot 比,效率到底高多少? A:不是"快多少",是"在线时长"差。Copilot 需要我坐在电脑前;这套流程允许我在地铁、咖啡店、晚饭后躺床上推进项目。一个产品经理一天里真正能在电脑前的时间也就 4-5 小时;这套系统让其他 19 小时也变成了可生产时段。
Q2:成本真的是 0? A:现金 0,订阅费 ≈ 全年 1 万人民币以内(Claude Max + Codex 双订阅,按个人节奏开关)。Encore Cloud / Cloudflare 的免费档对个人项目完全够用——这个项目跑了 34 轮,没付过一分钱给云厂商。
Q3:Codex 写出来的代码质量行吗? A:单 story 粒度(30-90 分钟、20-200 行改动、有完整测试)下,质量稳定可用——重要的不是 Codex 多聪明,而是 acceptanceCriteria 写得多严格 + Validator 跑的客观闸有多多。Acceptance 写松了,AI 一定会偷工减料;写得严,AI 写出来的代码反而比我自己写的更规整(因为它从不偷懒省 typecheck)。
Q4:会不会有一天 AI 把代码改飞了我没察觉? A:会,发生过。两道防线:(1) Ralph 默认不 push——commit 全留 130 本机,要部署得我手动说"push";(2) Validator 跑全量 encore test——回归一定会被打回。真正出过事故的是"Validator 把验证写到错误 story 上"——靠改成按 id 精确匹配解决。
Q5:能不能把它用到机票 / 支付的工作项目上? A:原则上可以,需要做的改造:(1) 写一份 agent-rules/<framework>-rules.md 给 Java / PHP;(2) Validator 的客观闸要换成现有 CI(mvn test / phpunit);(3) 不直接 commit 主干——改成提交到 claude/round-N 候选分支,类似 OpenClaw 的 candidate-branch 方案,由我审核后再合到主干。
Q6:失败的轮次有没有? A:有。早期 Round 8 撞 Codex 的 usage limit、Round 17 watch 的 OOM 词汇误报、Round 25 验收标准歧义反复打架——这些坑都已沉淀成现在的过滤规则、心跳机制、Summarizer 二次校验。这套流程的 80% 工程价值,在跑过的 20 个事故里。