一句话摘要
搭建第一个 AI 自动化循环的方法
如何在 2026 年构建你的第一个 AI Loop2026 年 7 月 10 日 · 20 分钟阅读 · 查看原文 ↗ Claude AI 自动化 Loops
上个月,两位在世的、最资深的 AI 工程师说了同样的话。
Peter Steinberger,OpenClaw 的创作者,现在在 OpenAI:
"你不该再去提示 coding agent 了。你应该设计那些去提示你的 agent 的 loop。"
Boris Cherny,Anthropic 的 Claude Code 负责人:
"我不再提示 Claude 了。我让在跑的 loop 去提示 Claude、去弄清楚该做什么。我的工作是写 loop。"
大多数人读到这个时想:那到底是什么意思?
而更重要的是:我怎么构建一个?
这篇文章精确地告诉你怎么做。
没有代码就没有理论。没有上下文就没有代码。真实的步骤。真实的命令。复制就能跑。
大多数人使用 AI 的方式已经过时了
写提示词。等。读输出。手动修它。再写一个提示词。
你就是那个 loop。
每一步都要经过你。AI 等着。你决定。AI 又等着。
你停下的那一刻,一切就停了。
2026 年跑得最快的构建者,不是写出更好提示词的人。
他们是在构建替他们做提示的系统的人。
杠杆点已经移动了。
从"输入提示词"→ 到"设计 loop"。
GPT-5.6 改变了什么?
GPT-5.6 并没有改变对 loop 的需求。
它提高了 loop 的价值。
模型越好,在两次提示之间让它闲置的成本就越高。
在终端工作流里,GPT-5.6 在这些方面明显更好:
→ 理解大型代码库
→ 保持实现的一致性
→ 遵循多步骤计划
→ 从失败的尝试中恢复
→ 充当一个严格的验证者
结果不是"更好的提示"。
而是每个任务更少的人工干预。
一个 loop 到底是什么
简单的定义:
一个提示词回答一次,然后停。
一个 loop 一直工作到活真正干完。
不是到它生成出一个答案为止。
是到它达到一个被验证的结果为止。
每一个正经的 AI agent 都在跑同一个底层循环:
→ 发现(Discover)——需要做什么?
→ 执行(Execute)——干活
→ 验证(Verify)——它真的成功了吗?
→ 迭代(Iterate)——没完成?修了再重复
→ 停止(Stop)——条件满足,或触达硬上限
Claude Code。Cursor。Codex。
在底层,它们都在跑这个 loop。
一个提示词和一个 loop 之间的区别,不是模型。
是"是否有某个东西检查这项工作,并一直做下去直到它通过"。
4 条件测试——在构建任何东西之前先跑这个
大多数 loop 死在这里。
一个 loop 只有在全部 4 个条件都为真时,才值得它的搭建成本。
漏掉一个,这个 loop 的成本就超过它的回报。
任务会重复。至少每周一次。一次性任务还是用一条好提示词更划算。
验证是自动化的。必须有什么东西能在你不在场时判它失败。测试。Linter。构建。类型检查。没有闸门 = agent 在给自己的作业打分。
你的 token 预算能吸收浪费。loop 在每一次迭代都重新读完整上下文。它们重试、探索、烧 token,无论这次运行有没有交付任何东西。这是没人提的成本。
"完成"是客观的。一个通过或失败的测试。一个编译得动或编译不动的构建。不是"当它看起来不错"。如果完成需要人的判断,那就保持手动。
4 个全过 → 构建 loop。
任何一个不过 → 用一个提示词代替。
诚实的版本:大多数开发者现在还不需要重型 loop。每个人都能用的是简单 loop。我们马上会构建一个。
安装 Slate
Slate 是一个 AI coding agent,正是为这件事而构建的——在你的终端里跑长时、并行、多步骤的任务。
由 RandomLabs 构建。第一个专门为 swarm(群体)编排而构建的 agent。
它和 Claude Code 或 Cursor 的区别:
→ 自动为每一步选择正确的模型。用 Claude 规划、用另一个搜索、用 Codex 执行——Slate 决定。
→ 在你的代码库上同时并行跑多个 subagent
→ 在长达数小时的多会话里管理自己的上下文
→ 和你并肩工作——而不只是为你工作
一行安装它:
导航到你的项目并启动它:
这会打开 Slate TUI——一个终端界面,你在里面给它任务,看它工作。
第 1 步——设置你的工作区
在 Slate 能在你的项目上跑 loop 之前,它需要理解你的代码库。
在你的项目根目录创建一个 AGENTS.md 文件。这是 Slate 在每个会话开始时读的上下文。
Slate 启动时自动读这个文件——不用每个会话都粘一遍。
在 Slate 里添加你的工作区目录:
或者用 @ 提及内联引用特定文件:
第 2 步——配置 Slate
在你的项目根目录创建 slate.json,来控制 Slate 的行为。
它做什么:
→ "*": "allow" ——Slate 可以读写文件,不用每次都问
→ "bash": "ask" ——Slate 在跑 shell 命令前先问(保持开启,直到你信任它)
→ 模型配置——便宜的快速模型用于搜索,昂贵的模型用于主推理
对于想要零提示的 CI 或自动化运行:
第 3 步——你的第一个任务(还不是一个 loop)
在构建 loop 之前,先让一次手动运行变得可靠。
这是最被跳过的一步。也是大多数 loop 在生产中失败的原因。
给 Slate 一个真实的任务:
看着 Slate 工作。它会:
搜索你的文件
建立对架构的理解
起草 ARCH.md
在停下之前对照你的请求审查它
这已经是一个迷你 loop——它在完成之前检查自己的输出。
对于一个更长的任务:
Slate 返回一个计划。你迭代它:
批准计划。Slate 自主执行。
第 4 步——创建一个 Skill(让 loop 可复用)
Skill 是你不再每个会话都重新解释你项目的方式。
写一次。Slate 在每次相关运行时读它。
创建文件夹结构:
写这个 skill:
在 Slate 里列出可用 skills:
手动激活一个:
或者 Slate 在它判定某个 skill 与当前任务相关时自动激活它。
第 5 步——加状态(loop 的记忆)
agent 会忘。
文件不会。
在你的项目根目录创建 STATE.md:
通过加到 AGENTS.md,告诉 Slate 在每个会话开始时使用它:
没有状态:每次运行从零开始。
有状态:每次运行接续上一次,并复利。
第 6 步——构建真正的 loop
现在你有:
→ 工作区设置好了(AGENTS.md)
→ 配置设好了(slate.json)
→ 一次可靠的手动运行被证明过了
→ 一个 skill 写好了(ci-triage)
→ 状态文件创建了(STATE.md)
是时候把它包成一个真正的 loop 了。
选项 A:队列文件 loop(最简单)
创建 loop.md:
运行它:
Slate 读队列文件,把每个块当作一条排队的消息来跑。
选项 B:无头/CI loop(自动化)
在 GitHub Action 或 cron 任务里非交互式运行:
在一个 GitHub Actions 工作流里:
现在每次 CI 失败都会自动触发 triage loop。
直到升级之前都不需要人。
第 7 步——加 sub-agents(maker-checker 分离)
对任何 loop 来说,唯一最重要的结构性改进。
绝不要让同一个 agent 给自己的作业打分。
写了修复的那个模型,打分太宽松了。
在 Slate 里,你可以为不同角色设不同模型:
然后这样写你的任务,让 Slate 自然地使用这种分离:
Slate 自动编排 subagents。
搜索 agent 用一个快速便宜的模型。实现 agent 用一个更强的模型。验证者用一个严格的模型,且无法访问 maker 的推理。
这种分离正是 Slate 能在单个任务上跑 5 个并行 subagent 的原因——每个都专精,每个都隔离。
第 8 步——状态 loop 模式(用于长时任务)
对于跑几小时或几天的任务,在你的任务提示词里用这个模式:
每天早上跑这个:
--continue 接续最近的会话,而不是从新开始。
每天,多一条路由。STATE.md 追踪一切。
loop 精确地从它停下的地方接续。
第 9 步——为你最常用的 loop 加自定义命令
把自定义 slash 命令加到 slate.json,让你的 loop 总是一键即达:
现在在 Slate 里:
每一个都即时跑你预先写好的 loop 提示词。
你今天就能跑的 3 个完整 loop
Loop 1:CI 失败 triage(我们刚构建的那个)
何时:每次 CI 失败 做什么:分类 → 修简单的 → 升级难的 → 开 PR 状态:STATE.md 闸门:测试通过 搭建时间:30 分钟
Loop 2:晨间简报
何时:每个工作日早上 7 点(cron 任务) 做什么:扫描过去 24 小时的 commit、PR 和 open issue → 写一份 5 条要点的简报 → 发到 Slack
Loop 3:依赖升级 loop
何时:每周一 做什么:扫描过期的包 → 测试兼容性 → 为安全的升级开 PR
会花钱的失败模式
在排任何东西之前,先了解这些。
Ralph Wiggum Loop
agent 在一个干了一半的活上宣布完成。
提前退出。loop 继续烧钱。静悄悄地。
修复:由一个全新的模型来检查的硬停止条件。
目标漂移
在长会话里,早期的约束消失了。
第 3 条消息里的"绝不碰 src/billing/"到第 47 条消息就没了。
修复:加一个 VISION.md,让 Slate 在每个会话开始时重读。
自我偏好偏差
maker 给自己的作业打分。永远给自己通过。
修复:一个完全无法访问 maker 推理的验证者 subagent。
明确告诉 Slate:
Agentic 懒惰
loop 在部分完成时把一个任务叫成"够好了"。
尤其是在模糊的成功标准上。
修复:只用客观的停止条件。
真正要紧的 Slate 专属技巧
一些让 Slate 在实践中不同于其他 agent 的东西。
在它工作时排队消息
Slate 正在跑一个长任务。你想起一件重要的事。
按 Tab 排队这条消息——它在当前任务完成后运行,不打断它。
运行中转向
如果 Slate 走错了方向,你不必停掉它:
用 /enter-mode-next 在 steer / queue / interrupt 模式之间循环。
直接跑 shell 命令
在 Slate 会话里跑命令,不用切到另一个终端:
Slate 读输出,并在下一步动作里用它。
团队配置的 server 模式
把 Slate 作为 server 跑,从多个终端连上去:
对和 Slate 结对编程、或在一台远程机器上跑它很有用。
完整设置清单
在跑你的第一个真正的 loop 之前:
在排任何东西之前,把每个框都勾上。
跳过一个,loop 要么静默失败,要么给你记一堆空账。
更多 loop 灵感
一旦你理解了这个模式,瓶颈就从"我怎么构建一个 loop"变成了"我下一步该构建什么 loop"。
signals.forwardfuture.com/loop-library 的 Forward Future Loop Library 是个好地方,可以浏览跨品类真实在跑的 loop——内容、工程、运营、研究。
当你在一个地方看到 20 个正在工作的 loop 时,你就不再以一次性提示词来思考了。
不舒服的真相
两个构建者可以跑完全相同的 loop,得到相反的结果。
一个用它来在自己已经深刻理解的工作上更快地推进。
另一个用它来回避理解工作本身。
loop 不知道这两者的区别。
你知道。
loop 设计比提示词工程更难——不是更容易。
重点不是工作变得更容易了。
是杠杆点移动了。
构建这个 loop。
但要像一个打算继续做工程师的人那样去构建。
而不只是那个按下"go"的人。
而新的 GPT-5.6 并没有取代这个原则。如果说有什么,它强化了它。
前沿不再是谁写出最巧妙的提示词。
是谁在越来越强的模型周围设计出最好的系统。
60 秒回顾
loop 是什么:
→ 提示词 = 问题。loop = 工作。
→ 发现 → 执行 → 验证 → 迭代 → 停止
4 条件测试:
→ 任务重复 / 验证自动化 / 预算能吸收浪费 / 完成是客观的
5 个设置步骤:
→ AGENTS.md → slate.json → 一次手动运行 → SKILL.md → STATE.md
然后包起来:
→ loop.md 队列文件,或在 CI 里无头跑 slate
失败模式:
→ Ralph Wiggum(提前退出)/ 目标漂移(忘约束)/ 自我偏好偏差(maker = checker)/ Agentic 懒惰(够好了)
Slate 的优势:
→ 每步自动选模型 → 带隔离的并行 subagents → 长会话管理 → 你的 loop,你的设计
如果这有用:
→ 转发它,分享给你认识的每一个构建者
→ 关注 @sairahul1 获取更多这样的系统
→ 收藏这个——光是那份设置清单就值得存下来
订阅 theaibuilders.co 获取更多这样的有趣文章
我写 AI、构建产品,以及那些在你睡觉时也在运行的系统。
提到的工具:
→ Programs by Slate: randomlabs.ai/s | @wearerandomlabs
→ Slate 文档: docs.randomlabs.ai
→ Forward Future Loop Library: signals.forwardfuture.com/loop-library
提示词
slate --continue "$(cat loop.md)"
读 STATE.md 来理解已经试过什么。
在最后一次构建的所有失败测试上跑 CI triage skill。
对每个失败:
- 用 ci-triage skill 的规则分类它
- 为 bug 和依赖问题起草修复
- 升级 env 和 infra 问题
跑修复。检查测试是否通过。
如果测试通过 → 开 PR。
如果测试仍然失败 → 记进 STATE.md 并停。
用这次运行做的所有事更新 STATE.md。
硬停止:最多 8 次尝试。到上限时,报告当前状态。
# loop.md for morning brief
cat > morning-brief-loop.md << 'EOF'
Read the last 24 hours of:
- git log --since="24 hours ago" --oneline
- Open PRs in draft or review
- GitHub Issues opened or updated in the last 24h
Write a morning brief:
- 3 most important things that happened
- 2 things that need attention today
- 1 thing at risk of blocking someone
Keep it under 120 words. Post to the #engineering Slack channel.
EOF
# run on a schedule with cron
0 7 * * 1-5 slate run "$(cat morning-brief-loop.md)" --dangerously-skip-permissions
slate run "Run the test suite and fix any failures" --dangerously-skip-permissions --output-format stream-json
不,别加一个新的 auth provider 类。
让它遵循 src/auth/api-key.ts 里现有 ApiKeyAuth 的同样模式。
!npm test # run tests and send output to Slate
!git diff HEAD # check what changed
!git status # see current state
{
"models": {
"main": { "default": "anthropic/claude-opus-4.6" },
"subagent": { "default": "anthropic/claude-sonnet-4.6" },
"search": { "default": "anthropic/claude-haiku-4.5" }
}
}
请审查 @src/api/routes.ts 并提出改进建议
npm i -g @randomlabs/slate
你在跑一个多会话 loop。
目标:把所有 Express 路由迁移到新的 ApiError 模式。
在 STATE.md 里追踪进度。
每个会话开始时:
1. 读 STATE.md
2. 找到"剩余路由"里第一个未完成项
3. 只做那一项
每个会话结束时:
1. 把完成项移到 STATE.md 里的"已完成路由"
2. 在"阻塞"里记录任何阻塞
3. 更新"上次运行"时间戳
4. 干净地停
STATE.md 格式:
---
## Done routes
- [x] /api/users (2026-06-27)
- [x] /api/auth/login (2026-06-28)
## Remaining routes
- [ ] /api/payments/checkout
- [ ] /api/payments/refund
- [ ] /api/admin/users
## Blockers
- /api/payments/refund — requires human review (touches billing logic)
## Last run
2026-06-28 14:30 UTC
---
硬规则:
- 未经人工批准绝不碰 src/billing/
- 每次路由迁移后都跑测试
- 每个会话完成一条路由后就停
嘿 Slate,研究一下我的代码库里的认证流程,
然后为添加 OAuth2 支持做一个计划。
确保你查看 @src/auth/ 和 @src/api/routes.ts
# VISION.md — 每个会话开始时读
## 核心目标
把所有 Express 路由迁移到 ApiError 模式。
## 硬约束(绝不违反)
- 未经人工批准绝不碰 src/billing/
- 绝不禁用失败的测试
- 开任何 PR 前总是跑完整测试套件
## 当前优先
src/api/payments/ 里的路由——格外小心地处理
停止条件:tests/auth/ 里所有测试通过 且 lint 返回 0。
用一次单独的检查运行来验证,而不是 agent 自己的判断。
硬上限:8 次迭代。到上限:报告状态并停。
mkdir -p .slate/skills/ci-triage
touch .slate/skills/ci-triage/SKILL.md
# trigger
slate run "$(cat loop.md)" --dangerously-skip-permissions --output-format stream-json
# 或在 GitHub Actions 里——见上面的第 6 步
name: CI Triage Loop
on:
workflow_run:
workflows: ["CI"]
types: [completed]
jobs:
triage:
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Slate
run: npm i -g @randomlabs/slate
- name: Run triage loop
env:
SLATE_API_KEY: ${{ secrets.SLATE_API_KEY }}
run: |
slate run "$(cat loop.md)" \
--output-format stream-json \
--dangerously-skip-permissions \
--workspace ./src \
--workspace ./tests
[Slate 正在实现修复的中途……]
你:等等——别为这个加一个新类。用 src/utils/errors.ts 里现有的 BaseError
[Enter——立即转向]
Slate:明白,切换方法去用 BaseError……
# AGENTS.md
## 这个代码库做什么
[项目的一段描述]
## 架构
- src/api/ —— Express API 路由
- src/services/ —— 业务逻辑
- src/db/ —— 数据库模型(通过 Prisma 的 PostgreSQL)
- tests/ —— Jest 测试套件
## 关键命令
- npm test —— 跑完整测试套件
- npm run build —— TypeScript 编译
- npm run lint —— ESLint 检查
- npm run typecheck —— tsc --noEmit
## 规则
- 未经人工批准绝不修改 src/billing/ 或 src/auth/
- 把任何任务标记完成之前总是跑测试
- 用 src/utils/errors.ts 里现有的错误处理模式
## 环境
- .env.slate 包含 Slate 需要的所有 env 变量
slate --queue loop.md
cd /path/to/your/project
slate
/triage
/review src/api/payments.ts
/migrate
请审查我整个代码库的架构。
创建一个 ARCH.md,包含:
- 当前结构
- 模块间的依赖
- 3 个可以改进的地方
先看 @src/,然后看 @tests/
□ npm i -g @randomlabs/slate 已安装
□ 已创建 AGENTS.md,带项目概览、命令、规则
□ 已创建 slate.json,带权限和模型配置
□ 一次手动运行完成并验证可靠
□ 为你的第一个重复任务写好 SKILL.md
□ 已创建 STATE.md 并在 AGENTS.md 里引用
□ 已写好带明确停止条件的 loop.md
□ 迭代的硬上限(先 8 次)
□ 验证者不是 maker 那个 agent
□ 任何不可逆动作(PR、部署)上的人工审查闸门
验证者 agent 不应看到实现 agent 的工作。
它应该只看到:原始测试需求和测试输出。
如果测试通过 → 批准。如果测试失败 → 拒绝。除此之外没有意见。
## 会话开始
总是先读 STATE.md。从上次运行停下的地方接上。
每次运行结束时更新 STATE.md,写下做了什么、下一步是什么。
slate run "$(cat loop.md)" --output-format stream-json --dangerously-skip-permissions
[Slate 正在做迁移任务……]
你:对了,确保新模式也处理 userId 为 null 的情况
[Tab——排队]
[Slate 完成当前步骤,然后读你排队的消息]
/workspace add ./src
/workspace add ./tests
/workspace list
{
"command": {
"triage": {
"description": "Run CI triage loop",
"template": "Read STATE.md. Run the ci-triage skill on all failing tests. Update STATE.md when done.",
"agent": "build"
},
"review": {
"description": "Review a file for correctness",
"template": "Review @$ARGUMENTS for correctness, edge cases, and consistency with surrounding code."
},
"migrate": {
"description": "Migrate one route to ApiError pattern",
"template": "Read STATE.md. Migrate the next incomplete route to ApiError pattern. Run tests. Update STATE.md."
}
}
}
# Loop State — CI Triage
## 上次运行
2026-06-28 03:30 UTC —— 分类了 7 个失败,起草了 3 个修复,升级了 4 个
## 进行中
- claude/fix-auth-token-refresh —— 本地测试通过,等待 CI
- claude/fix-flaky-payment-webhook —— 已应用重试模式,监控中
## 已完成
- claude/bump-axios-1.7.4 → 已合并(CI 绿灯)
- claude/lint-fix-pass-june-28 → 已合并
## 升级给人类
- src/billing/refund.ts —— 测试以 3 种方式失败,根因不明
- ci/staging-runner —— infra 超时,不是代码问题
## 学到的教训
- 2026-06-27:PowerShell 在这个 Windows runner 上触发 TLS 1.2 问题。用 bash。
- 2026-06-26:tests/e2e/checkout 需要环境里的 Stripe webhook secret。缺失就跳过。
完成当:npm test 返回退出码 0 且 npm run lint 返回退出码 0。
不是当"测试看起来不错"。不是当"大多数测试通过"。
两个命令都退出码 0。那是唯一的完成。
---
name: "ci-triage"
description: "Classify CI failures by root cause and draft fixes for the easy ones."
---
# CI Triage Skill
## 我做什么
当一次 CI 运行失败时,我:
1. 读测试输出
2. 分类失败:env 问题 / flaky 测试 / 真实 bug / 依赖升级 / infra
3. 为 bug 和依赖问题起草修复
4. 把 env 和 infra 问题升级给人类
## 分类规则
- env:缺失 secret、错误的 env 变量 → 标记给人类
- flake:不改代码、重试就通过 → 重试一次,然后提 issue
- bug:与最近 commit 绑定的确定性失败 → 起草修复
- dependency:与版本升级绑定的失败 → 起草回滚 PR
- infra:超时、OOM、runner 问题 → 立即升级
## 修复模式
- Auth 测试失败 → 先查 src/auth/middleware.ts
- 数据库测试失败 → 验证 CI 环境里跑过 migration
- E2E 失败 → 对照最新快照查 UI 选择器
## 绝不做
- 禁用失败的测试
- 未经询问修改 CI 配置
- 碰 src/billing/ 或 src/payments/
## 状态
每次运行后更新 STATE.md:
- 检查过的文件
- 做出的分类
- 开的 PR
- 升级的事项
{
"$schema": "https://randomlabs.ai/config.json",
"permission": {
"*": "allow",
"bash": "ask"
},
"models": {
"main": { "default": "anthropic/claude-opus-4.6" },
"subagent": { "default": "anthropic/claude-sonnet-4.6" },
"search": { "default": "anthropic/claude-haiku-4.5" },
"reasoning": { "default": "openai/gpt-5.6" }
}
}
@ci-triage 请 triage 今天失败的测试
请修复失败的 auth 测试。
第 1 步:让一个搜索 agent 探索 src/auth/ 来理解当前实现。
第 2 步:让一个单独的 agent 基于发现来实现修复。
第 3 步:让第三个 agent 对照原始测试需求验证这个修复——
这个 agent 不应该看过实现。
第 4 步:只有验证者批准了才开 PR。
# 终端 1——启动 server
slate serve --port 7777
# 终端 2——连接 TUI
slate attach http://localhost:7777 --dir /path/to/project
cat > deps-loop.md << 'EOF'
Read STATE.md.
Run: npm outdated
For each outdated package:
1. Check if the version bump is major (breaking) or minor/patch (safe)
2. For minor/patch: update the package, run npm test
3. If tests pass: open a PR
4. If tests fail: record in STATE.md as "needs human review"
5. For major bumps: always escalate to humans
Hard rules:
- Never bump more than 5 packages in a single loop
- Never bump packages in the "peer dependencies" section
- Always run the full test suite after each bump, not just related tests
Update STATE.md with what was bumped and what was escalated.
EOF
# 每周一跑
0 9 * * 1 slate run "$(cat deps-loop.md)" --dangerously-skip-permissions
/skills
链接
signals.forwardfuture.com/loop-library
theaibuilders.co
randomlabs.ai/s
docs.randomlabs.ai
theaibuilders.co/
标签:# X # Claude # AI # 自动化 # Loops # 指南 # Chatgpt # Sonnet 相关文章 别再自己干活:构建永不睡觉的 AI Loops 2026 年 Playbook AI 自动化 Claude Loops
原文参考:https://maxed.wiki/posts/how-to-build-your-first-ai-loop-in-2026/ (Maxed.wiki,本页为站内中文整理)