构建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

系统会:

  1. coder读取goal,分析test/auth.spec.js失败原因
  2. 在loop-agent-main中修改代码
  3. verifier运行测试和lint
  4. 若未全过,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 testnpm run lint 验证)
  • .loop/memory.md 记录了至少两轮迭代的关键决策点(带时间戳)
  • verifier的日志中从未出现“suggest”“maybe try”等建议性语句,只有PASS/FAIL
  • 总token消耗低于5000(可通过claude-cli的--dry-run估算)

素材来源

本文由十页AI从以下原始素材延展整理:

← 更多文章 · 加入十页AI学院