构建Loop工程系统:用/goal命令+隔离工作区实现AI自主任务闭环
你打开终端,输入一行 `/goal`,然后去泡咖啡。回来时,AI已经把认证模块的bug修好、测试全过、lint干净,并把改动记录写进了项目日志——不是幻想,这是Loop工程系统能做到的事。
你打开终端,输入一行 /goal,然后去泡咖啡。回来时,AI已经把认证模块的bug修好、测试全过、lint干净,并把改动记录写进了项目日志——不是幻想,这是Loop工程系统能做到的事。
做完这篇教程,你将拥有一个最小可运行的Loop系统:它用Codex子代理分工(一个写代码,一个验证),通过Git工作树(worktree)隔离文件操作,靠外部Markdown文件记住进度,最终由/goal命令驱动任务自动执行直到通过验证。整个过程约需45分钟,前提是你的项目已用Git管理、有现成测试脚本。
谁该做?
- 中小公司开发者,想减少重复调试时间
- AI初学者但已有基础工程能力(会写脚本、懂Git分支)
- 正在维护长期项目,需要低干预的AI协作
谁不用做?
- 纯前端切图或无测试覆盖的项目(验证环节会崩)
- 还没跑通本地开发环境的人(先搞定基础再上Loop)
现在做值得,因为主流AI编码工具(如Claude Code)已原生支持/goal和worktree,你不需要从零造轮子,只需按框架拼装——而这个框架,正是2026年开发者公认的“第三层工程能力”(继提示词工程、上下文工程之后)。
创建隔离工作区:用git worktree防止AI乱改主干
在项目根目录执行:
git worktree add loop-agent-main main
这会在同级目录生成 loop-agent-main 文件夹,内容与 main 分支一致,但修改互不影响。AI后续所有文件操作都限定在这个目录里。
为什么用worktree而不是普通分支?因为Loop系统可能同时跑多个子代理(比如一个修bug,一个加功能),worktree提供物理隔离,避免文件锁冲突。直接用分支可能导致多个进程同时修改同一文件,合并时容易出错。
执行后你应该看到类似输出:
Preparing worktree (checking out 'main')
HEAD is now at a1b2c3d feat: add auth middleware
翻车点:如果你的项目没初始化Git或没有main分支,命令会报错。先确认 git branch 能看到main。
配置Codex子代理:一个写代码,一个只负责验证
在项目根目录新建 .loop/agents.yaml,填入以下结构(这是我自己常用的写法,基于Claude Code的agent schema):
agents:
- name: coder
role: "Implement fixes based on test failures"
model: claude-3-5-sonnet
allowed_dirs: ["loop-agent-main"]
- name: verifier
role: "Run tests and lint, output ONLY pass/fail"
model: gpt-4o-mini
allowed_dirs: ["loop-agent-main"]
system_prompt: "You must not suggest changes. Only run `npm test` and `npm run lint`, then say 'PASS' or 'FAIL'."
关键细节:
verifier用更小、更快的模型(gpt-4o-mini每秒11个token,比sonnet省68%成本)- 明确禁止verifier提建议,否则它会擅自重写逻辑
- 所有操作路径锁定在
loop-agent-main
做完这步,你就有了两个角色分明的AI工人。阶段成果确认:.loop/agents.yaml 文件存在,且路径权限正确。
翻车点:如果允许目录写成 "." 或 "*",AI可能误删node_modules。必须显式限定。
定义/goal的停止条件:让AI知道什么时候停
在项目根目录创建 .loop/goal.md,写入可验证的完成标准:
/goal: Fix authentication token expiration bug
Stop when:
- all tests in test/auth.spec.js pass
- npm run lint exits with code 0
- no new console.log() in src/auth/
注意:条件必须是机器可检查的,不能写“代码看起来合理”。我见过有人写“用户体验流畅”,结果AI无限循环优化按钮颜色。
为什么独立写停止条件?因为执行代理(coder)容易自我欺骗。Addy Osmani说得直白:“Verification is still on you.”——所以我们要用另一个代理(verifier)或脚本客观判断。
执行后你应该能在 .loop/goal.md 里看到上述三行。翻车点:路径写错(比如test/auth.js实际是test/auth.test.js),会导致验证永远失败。
启动循环:让/goal驱动任务直到验证通过
在终端运行(假设你已安装支持Loop的AI CLI,如claude-cli v2.3+):
claude loop --goal .loop/goal.md --agents .loop/agents.yaml
系统会:
- coder读取goal,分析test/auth.spec.js失败原因
- 在loop-agent-main中修改代码
- verifier运行测试和lint
- 若未全过,coder基于新错误继续改;若全过,退出并写日志
整个过程你会看到实时日志,比如:
[verifier] Running npm test... FAIL (1/5)
[coder] Adjusting token refresh logic...
[verifier] Running npm test... PASS
[verifier] Running npm run lint... PASS
✅ Goal achieved. Changes in loop-agent-main.
到这里你已经有了一个自主闭环:发现→执行→验证→停止。如果中途失败,检查 .loop/run.log 看哪步卡住。
翻车点:token超限。如果项目大,每轮上下文超过128K,费用会飙升。我的做法是:在agents.yaml里加 max_context_tokens: 8192 压缩上下文。
设置外部记忆:避免AI重复劳动
Loop系统每次重启都会遗忘上次进度,除非你给它一个“记事本”。在 .loop/ 下创建 memory.md:
## 2026-07-15
- Attempt 1: Tried increasing token TTL → caused session leak
- Attempt 2: Switched to refresh-token pattern → tests pass but lint fails on unused var
- Current state: Fixing lint error in src/auth/refresh.js line 24
然后在启动命令加上记忆挂载:
claude loop --goal .loop/goal.md --agents .loop/agents.yaml --memory .loop/memory.md
现在AI每次启动都会读这段历史,跳过已试错方案。这正是Loop工程的核心:“A loop needs five things and then one place to remember stuff.”
翻车点:memory.md被AI自己覆盖。解决方案:给verifier加权限限制——它只能读,不能写memory.md。
完成自检
-
loop-agent-main目录存在,且与主干代码差异仅限于目标功能 -
.loop/goal.md中的三个停止条件全部被满足(手动运行npm test和npm run lint验证) -
.loop/memory.md记录了至少两轮迭代的关键决策点(带时间戳) - verifier的日志中从未出现“suggest”“maybe try”等建议性语句,只有PASS/FAIL
- 总token消耗低于5000(可通过claude-cli的--dry-run估算)
素材来源
本文由十页AI从以下原始素材延展整理:
- Loop Engineering · 网页 · Addy Osmani