
上个月,两位在世的最资深 AI 工程师说了同样的话。
OpenClaw 的创造者、现任职于 OpenAI 的 Peter Steinberger:
"你不应该再手动提示编程 Agent 了。你应该设计循环来提示你的 Agent。"
Anthropic 旗下 Claude Code 的负责人 Boris Cherny:
"我不再手动提示 Claude 了。我有循环在运行,它们提示 Claude 并决定该做什么。我的工作是编写这些循环。"
大多数人读到这些话,心里想的是:这到底是什么意思?
更重要的是:我该如何构建这样一个循环?
这篇文章将告诉你确切的方法。
没有无代码的理论。没有无上下文的代码。只有真实的步骤。真实的命令。复制并运行。

Slate 正在协调 GPT-5.6、Claude 以及专门的子 Agent 跨一个真实的迁移任务。模型变得更聪明了。更大的变化在于,像 Slate 这样的工具终于能让这些模型持续忙碌,而不是等待人类提示。
大多数人使用 AI 的方式已经过时了
写提示。等待。读取输出。手动修复。再写另一个提示。
你就是那个循环。
每一步都要经过你。AI 在等待。你来做决定。AI 再次等待。
你一旦停下,一切就都停了。
那些在 2026 年发展最快的构建者,并不是在写更好的提示。
他们是在构建能替他们完成提示工作的系统。
杠杆点已经转移了。
从输入提示 → 转向设计循环。

GPT-5.6 改变了什么?
GPT-5.6 并没有改变对循环的需求。
它提升了循环的价值。
模型越好,让它在两次提示之间闲置的代价就越高。
在终端工作流中,GPT-5.6 在以下方面明显更优秀:
→ 理解大型代码库
→ 保持实现的一致性
→ 遵循多步骤计划
→ 从失败的尝试中恢复
→ 充当严格的验证者
其结果不是"更好的提示"。
而是每个任务所需的人工干预更少。
循环到底是什么
简单定义:
一个提示只回答一次,然后停止。
一个循环会持续工作,直到任务真正完成。
不是直到它生成一个答案。
而是直到它达到一个已验证的结果。
每个严肃的 AI Agent 都运行着相同的底层循环:
→ 发现 — 需要做什么?
→ 执行 — 做工作
→ 验证 — 它真的起作用了吗?
→ 迭代 — 还没完成?修复并重复
→ 停止 — 满足条件,或达到硬性限制
Claude Code。Cursor。Codex。
在底层,它们都运行着这个循环。
提示和循环之间的区别不在于模型。
而在于是否有东西检查工作,并持续进行直到通过。

4 条件测试 — 在构建任何东西之前运行它
大多数循环都在这里失败。
一个循环只有在这 4 个条件都为真时,才值得投入设置成本。
错过任何一个,循环的代价就会超过其回报。
1. 任务是重复的。 至少每周一次。一次性任务仍然更适合用一个好的提示来解决。
2. 验证是自动化的。 必须有东西能在你不在场时指出工作失败。测试。代码检查工具。构建。类型检查。没有验证关卡 = Agent 在给自己的作业打分。
3. 你的 Token 预算能承受浪费。 循环在每次迭代时都会重新读取完整的上下文。它们会重试、探索,无论运行是否产出任何东西,都会消耗 Token。这是没人提到的成本。
4. "完成"是客观的。 一个通过或失败的测试。一个能编译或不能编译的构建。而不是"看起来不错"。如果完成需要人的主观判断,那就保持手动。
全部通过 4 点 → 构建循环。
任何 1 点不满足 → 改用提示。
说实话:大多数开发者还不需要繁重的循环。每个人都能用的,是一个简单的循环。我们马上会构建一个。
安装 Slate
Slate 是一个 AI 编程 Agent,正是为此而构建的——在终端中运行长时间、并行、多步骤的任务。
由 RandomLabs 构建。这是第一个专门为群体编排而构建的 Agent。
它和 Claude Code 或 Cursor 有什么不同:
→ 自动为每个步骤选择合适的模型。用 Claude 规划,用另一个模型搜索,用 Codex 执行——Slate 来决定。
→ 在你的代码库中同时运行并行的子 Agent
→ 在长达数小时的多轮会话中管理自己的上下文
→ 与你并肩工作——而不仅仅是为你工作
一行命令安装:
1npm i -g @randomlabs/slate
导航到你的项目并启动:
1cd /path/to/your/project2slate
这会打开 Slate TUI——一个终端界面,你可以在其中给它分配任务并观察它工作。

第一步 — 设置你的工作区
在 Slate 能在你的项目上运行循环之前,它需要理解你的代码库。
在你的项目根目录创建一个 AGENTS.md 文件。这是 Slate 在每个会话开始时读取的上下文。
1# AGENTS.md23## 这个代码库是做什么的4[项目的一段描述]56## 架构7- src/api/ — Express API 路由8- src/services/ — 业务逻辑9- src/db/ — 数据库模型 (通过 Prisma 的 PostgreSQL)10- tests/ — Jest 测试套件1112## 关键命令13- npm test — 运行完整的测试套件14- npm run build — TypeScript 编译15- npm run lint — ESLint 检查16- npm run typecheck — tsc --noEmit1718## 规则19- 未经人工批准,切勿修改 src/billing/ 或 src/auth/20- 在标记任何任务完成前,务必运行测试21- 使用 src/utils/errors.ts 中现有的错误处理模式2223## 环境24- .env.slate 包含 Slate 需要的所有环境变量
Slate 在启动时会自动读取这个文件——无需在每个会话中粘贴。
在 Slate 内部添加你的工作区目录:
1/workspace add ./src2/workspace add ./tests3/workspace list
或者使用 @ 提及功能内联引用特定文件:
1请审查 @src/api/routes.ts 并提出改进建议

第二步 — 配置 Slate
在你的项目根目录创建 slate.json 来控制 Slate 的行为。
1{2 "$schema": "https://randomlabs.ai/config.json",3 "permission": {4 "*": "allow",5 "bash": "ask"6 },7 "models": {8 "main": { "default": "anthropic/claude-opus-4.6" },9 "subagent": { "default": "anthropic/claude-sonnet-4.6" },10 "search": { "default": "anthropic/claude-haiku-4.5" },11 "reasoning": { "default": "openai/gpt-5.6" }12 }13}
这是做什么的:
→ "*": "allow" — Slate 可以读写文件,无需每次都询问
→ "bash": "ask" — Slate 在运行 shell 命令前会询问(在信任它之前保持此设置)
→ 模型配置 — 便宜的快速模型用于搜索,昂贵的模型用于主要推理
对于希望零提示的 CI 或自动化运行:
1slate run "运行测试套件并修复所有失败" --dangerously-skip-permissions --output-format stream-json
第三步 — 你的第一个任务(还不是循环)
在构建循环之前,先让单个手动运行可靠。
这是最常被跳过的一步。也是大多数循环在生产中失败的原因。
给 Slate 一个真实的任务:
1请审查我整个代码库的架构。2创建一个包含以下内容的 ARCH.md:3- 当前结构4- 模块间的依赖关系5- 3 个可以改进的地方6先查看 @src/,然后查看 @tests/
观察 Slate 工作。它会:
- 搜索你的文件
- 建立对架构的理解
- 起草 ARCH.md
- 在停止之前根据你的要求审查它
这已经是一个迷你循环——它在完成前会检查自己的输出。
对于更长的任务:
1嘿 Slate,研究我的代码库中关于身份验证流程的部分,2然后制定一个添加 OAuth2 支持的计划。3确保你查看了 @src/auth/ 和 @src/api/routes.ts
Slate 返回一个计划。你对其进行迭代:
1不,不要添加一个新的认证提供者类。2让它遵循 src/auth/api-key.ts 中现有的 ApiKeyAuth 模式
批准计划。Slate 自主执行。

第四步 — 创建一个技能(让循环可重用)
技能是你无需在每个会话中重新解释你的项目的方法。
一次编写。Slate 会在每次相关运行时读取它。
创建文件夹结构:
1mkdir -p .slate/skills/ci-triage2touch .slate/skills/ci-triage/SKILL.md
编写技能:
1---2name: "ci-triage"3description: "按根本原因分类 CI 失败,并为简单的失败起草修复方案。"4---56# CI 分类技能78## 我做什么9当 CI 运行失败时,我会:101. 读取测试输出112. 对失败进行分类:环境问题 / 不稳定的测试 / 真正的错误 / 依赖更新 / 基础设施问题123. 为错误和依赖问题起草修复方案134. 将环境和基础设施问题上报给人类1415## 分类规则16- env: 缺少密钥,错误的环境变量 → 标记给人17- flake: 不修改代码,重新运行就能通过 → 重试一次,然后提交 issue18- bug: 与最近提交相关的确定性失败 → 起草修复方案19- dependency: 与版本升级相关的失败 → 起草回滚 PR20- infra: 超时,OOM,运行器问题 → 立即上报2122## 修复模式23- 认证测试失败 → 首先检查 src/auth/middleware.ts24- 数据库测试失败 → 验证迁移是否在 CI 环境中运行25- E2E 失败 → 检查 UI 选择器与最新快照2627## 绝不做28- 禁用失败的测试29- 未经询问修改 CI 配置30- 触碰 src/billing/ 或 src/payments/3132## 状态33每次运行后更新 STATE.md:34- 检查过的文件35- 做出的分类36- 开启的 PR37- 上报的事项
在 Slate 内部列出可用的技能:
1/skills
手动激活一个:
1@ci-triage 请分类今天失败的测试
或者当 Slate 认为技能与当前任务相关时,它会自动激活这些技能。
第五步 — 添加状态(循环的记忆)
Agent 会遗忘。
文件不会。
在你的项目根目录创建 STATE.md:
1# 循环状态 — CI 分类23## 上次运行42026-06-28 03:30 UTC — 7 个失败已分类,3 个修复方案已起草,4 个已上报56## 进行中7- claude/fix-auth-token-refresh — 本地测试通过,等待 CI8- claude/fix-flaky-payment-webhook — 已应用重试模式,正在监控910## 已完成11- claude/bump-axios-1.7.4 → 已合并 (CI 通过)12- claude/lint-fix-pass-june-28 → 已合并1314## 已上报给人类15- src/billing/refund.ts — 测试以 3 种方式失败,根本原因不明16- ci/staging-runner — 基础设施超时,不是代码问题1718## 经验教训19- 2026-06-27: PowerShell 在此 Windows 运行器上遇到 TLS 1.2 问题。使用 bash。20- 2026-06-26: tests/e2e/checkout 需要环境中的 Stripe webhook 密钥。如果缺少则跳过。
通过在 AGENTS.md 中添加内容,告诉 Slate 在每个会话开始时使用它:
1## 会话开始2始终先读取 STATE.md。从上一次运行停止的地方继续。3在每次运行结束时更新 STATE.md,记录做了什么以及下一步是什么。
没有状态:每次运行都从零开始。
有了状态:每次运行都能恢复并叠加在上一次的基础上。
第六步 — 构建实际的循环
现在你已经有了:
→ 工作区设置好了 (AGENTS.md)
→ 配置设置好了 (slate.json)
→ 一次可靠的手动运行已验证了
→ 一个技能写好了 (ci-triage)
→ 状态文件创建了 (STATE.md)
是时候将它包装成一个真正的循环了。
选项 A:队列文件循环(最简单)
创建 loop.md:
1读取 STATE.md 以了解已经尝试过什么。23在所有上次构建中失败的测试上运行 CI 分类技能。45对于每个失败:6- 使用 ci-triage 技能规则进行分类7- 为错误和依赖问题起草修复方案8- 上报环境和基础设施问题910运行修复方案。检查测试是否通过。11如果测试通过 → 开启 PR。12如果测试仍然失败 → 记录在 STATE.md 中并停止。1314用本次运行完成的所有事项更新 STATE.md。1516硬性停止:最多尝试 8 次。达到限制后,报告当前状态。
运行它:
1slate --queue loop.md
Slate 读取队列文件并将每个块作为队列消息运行。
选项 B:无头/CI 循环(自动化)
在 GitHub Action 或 cron 作业中非交互式运行:
1slate run "$(cat loop.md)" --output-format stream-json --dangerously-skip-permissions
在 GitHub Actions 工作流中:
1name: CI 分类循环2on:3 workflow_run:4 workflows: ["CI"]5 types: [completed]67jobs:8 triage:9 if: ${{ github.event.workflow_run.conclusion == 'failure' }}10 runs-on: ubuntu-latest11 steps:12 - uses: actions/checkout@v41314 - name: 安装 Slate15 run: npm i -g @randomlabs/slate1617 - name: 运行分类循环18 env:19 SLATE_API_KEY: ${{ secrets.SLATE_API_KEY }}20 run: |21 slate run "$(cat loop.md)" \22 --output-format stream-json \23 --dangerously-skip-permissions \24 --workspace ./src \25 --workspace ./tests
现在,每次 CI 失败都会自动触发分类循环。
在需要上报之前,无需人工干预。

第七步 — 添加子 Agent(制造者-检查者分离)
任何循环中最重要的结构性改进。
永远不要让同一个 Agent 给自己的作业打分。
写了修复方案的模型,作为评分者过于宽容。
在 Slate 中,你可以为不同的角色设置不同的模型:
1{2 "models": {3 "main": { "default": "anthropic/claude-opus-4.6" },4 "subagent": { "default": "anthropic/claude-sonnet-4.6" },5 "search": { "default": "anthropic/claude-haiku-4.5" }6 }7}
然后编写你的任务,让 Slate 自然地利用这种分离:
1请修复失败的认证测试。23步骤 1:让一个搜索 Agent 探索 src/auth/ 以了解当前实现。4步骤 2:让一个单独的 Agent 基于发现的内容实现修复。5步骤 3:让第三个 Agent 根据原始测试需求验证修复方案 ——6 这个 Agent 不应该看到实现过程。7步骤 4:只有在验证者批准后才开启 PR。
Slate 会自动协调子 Agent。
搜索 Agent 使用快速的便宜模型。实现 Agent 使用更强的模型。验证者使用严格的模型,无法访问制造者的推理过程。
这种分离正是 Slate 能在单个任务上运行 5 个并行子 Agent 的原因——每个都专业化,每个都隔离。

第八步 — 状态循环模式(用于长时间运行的任务)
对于需要数小时或数天运行的任务,在你的任务提示中使用这种模式:
1你正在运行一个多会话循环。23目标:将所有 Express 路由迁移到新的 ApiError 模式。4在 STATE.md 中跟踪进度。56每个会话的开始:71. 读取 STATE.md82. 找到"剩余路由"中第一个未完成的项目93. 只做那个项目1011每个会话的结束:121. 将已完成的项目移到 STATE.md 中的"已完成路由"132. 将任何阻塞项记录在"阻塞项"中143. 更新"上次运行"时间戳154. 干净地停止1617STATE.md 格式:18---19## 已完成路由20- [x] /api/users (2026-06-27)21- [x] /api/auth/login (2026-06-28)2223## 剩余路由24- [ ] /api/payments/checkout25- [ ] /api/payments/refund26- [ ] /api/admin/users2728## 阻塞项29- /api/payments/refund — 需要人工审查(涉及计费逻辑)3031## 上次运行322026-06-28 14:30 UTC33---3435硬性规则:36- 未经人工批准,切勿触碰 src/billing/37- 每次路由迁移后务必运行测试38- 每个会话只完成一个路由后停止
每天早上运行这个:
1slate --continue "$(cat loop.md)"
--continue 会接续最近的会话,而不是从头开始。
每天,一个路由。STATE.md 跟踪一切。
循环会从它停止的地方精确恢复。
第九步 — 为你最常用的循环创建自定义命令
在 slate.json 中添加自定义斜杠命令,让你的循环始终触手可及:
1{2 "command": {3 "triage": {4 "description": "运行 CI 分类循环",5 "template": "读取 STATE.md。在所有失败的测试上运行 ci-triage 技能。完成后更新 STATE.md。",6 "agent": "build"7 },8 "review": {9 "description": "审查文件的正确性",10 "template": "审查 @$ARGUMENTS 的正确性、边界情况以及与周围代码的一致性。"11 },12 "migrate": {13 "description": "将一个路由迁移到 ApiError 模式",14 "template": "读取 STATE.md。将下一个未完成的路由迁移到 ApiError 模式。运行测试。更新 STATE.md。"15 }16 }17}
现在在 Slate 内部:
1/triage2/review src/api/payments.ts3/migrate
每个命令都会立即运行你预先编写的循环提示。
3 个你今天就能运行的完整循环
循环 1:CI 失败分类(我们刚刚构建的)
时间:每次 CI 失败 内容:分类 → 修复简单的 → 上报难的 → 开启 PR 状态:STATE.md 关卡:测试通过 设置时间:30 分钟
1# 触发2slate run "$(cat loop.md)" --dangerously-skip-permissions --output-format stream-json34# 或在 GitHub Actions 中 — 参见上面的第六步
循环 2:晨间简报
时间:每个工作日上午 7 点(cron 作业) 内容:扫描过去 24 小时的提交、PR 和开放的 issue → 写一个 5 点的简报 → 发布到 Slack
1# morning-brief-loop.md2cat > morning-brief-loop.md << 'EOF'3读取过去 24 小时的内容:4- git log --since="24 hours ago" --oneline5- 草稿或审查中的开放 PR6- 过去 24 小时内创建或更新的 GitHub Issue78写一份晨间简报:9- 发生了的 3 件最重要的事情10- 今天需要关注的 2 件事11- 1 件可能阻碍他人的事情1213控制在 120 字以内。发布到 #engineering Slack 频道。14EOF1516# 使用 cron 定时运行170 7 * * 1-5 slate run "$(cat morning-brief-loop.md)" --dangerously-skip-permissions
循环 3:依赖更新循环
时间:每个星期一 内容:扫描过时的包 → 测试兼容性 → 为安全的更新开启 PR
1cat > deps-loop.md << 'EOF'2读取 STATE.md。34运行:npm outdated56对于每个过时的包:71. 检查版本更新是 major(破坏性)还是 minor/patch(安全)82. 对于 minor/patch:更新包,运行 npm test93. 如果测试通过:开启一个 PR104. 如果测试失败:在 STATE.md 中记录为"需要人工审查"115. 对于 major 更新:始终上报给人类1213硬性规则:14- 单个循环中最多更新 5 个包15- 绝不更新"peer dependencies"部分中的包16- 每次更新后务必运行完整的测试套件,而不仅仅是相关测试1718用更新的内容和上报的内容更新 STATE.md。19EOF2021# 每个星期一运行220 9 * * 1 slate run "$(cat deps-loop.md)" --dangerously-skip-permissions

会耗费金钱的失败模式
在安排任何东西之前了解这些。
Ralph Wiggum 循环
Agent 在任务完成一半时就宣布完成。
提前退出。循环继续消耗。悄无声息。
修复:由一个新的模型检查硬性停止条件。
1停止条件:tests/auth/ 中的所有测试通过 并且 lint 返回 0。2使用一个单独的检查运行来验证,而不是 Agent 自己的判断。3硬性限制:8 次迭代。达到限制后:报告状态并停止。
目标漂移
在长时间会话中,早期的约束会消失。
第 3 条消息中的"绝不触碰 src/billing/"到了第 47 条消息时已经没了。
修复:添加一个 VISION.md,Slate 在每个会话开始时重新读取。
1# VISION.md — 在每个会话开始时读取23## 核心目标4将所有 Express 路由迁移到 ApiError 模式。56## 硬性约束(绝不违反)7- 未经人工批准,绝不触碰 src/billing/8- 绝不禁用失败的测试9- 在开启任何 PR 之前,务必运行完整的测试套件1011## 当前优先级12src/api/payments/ 中的路由 — 需要格外小心处理
自我偏好偏见
制造者给自己的作业打分。总是给自己放行。
修复:验证者子 Agent 无法访问制造者的推理过程。
明确告诉 Slate:
1验证者 Agent 不应该看到实现 Agent 的工作。2它应该只看到:原始的测试需求和测试输出。3如果测试通过 → 批准。如果测试失败 → 拒绝。除此之外没有其他意见。
Agent 懒惰
循环在部分完成时称任务"足够好了"。
尤其是在成功标准模糊的情况下。
修复:仅使用客观的停止条件。
1完成条件:npm test 返回退出码 0 并且 npm run lint 返回退出码 0。2不是"测试看起来不错"。不是"大部分测试通过"。3两个命令的退出码都是 0。这是唯一的完成标准。
真正重要的 Slate 特定技巧
一些在实践中使 Slate 有别于其他 Agent 的东西。
在工作时排队消息
Slate 正在运行一个长任务。你想到了一些重要的事情。
按下 Tab 键将消息排队——它会在当前任务完成后运行,而不是打断它。
1[Slate 正在处理迁移任务...]23你:实际上,确保新模式也能处理 userId 为 null 的情况4[Tab — 已排队]56[Slate 完成当前步骤,然后读取你排队的消息]
在运行中引导
如果 Slate 走错了方向,你不必停止它:
1[Slate 正在实现修复方案的中途...]23你:等等——不要为此添加新类。使用 src/utils/errors.ts 中现有的 BaseError4[Enter — 立即引导]56Slate:明白了,切换到使用 BaseError 的方法...
使用 /enter-mode-next 在引导 / 排队 / 打断模式之间循环。直接运行 Shell 命令
在 Slate 会话中运行命令,无需切换到另一个终端:
1!npm test # 运行测试并将输出发送给 Slate2!git diff HEAD # 检查更改了什么3!git status # 查看当前状态
Slate 读取输出并在其下一个操作中使用它。
用于团队设置的服务器模式
将 Slate 作为服务器运行,并从多个终端附加到它:
1# 终端 1 — 启动服务器2slate serve --port 777734# 终端 2 — 附加 TUI5slate attach http://localhost:7777 --dir /path/to/project
适用于与 Slate 进行结对编程,或将其部署到远程机器上运行。
完整的设置清单
在运行你的第一个真正的循环之前:
1□ npm i -g @randomlabs/slate 已安装2□ AGENTS.md 已创建,包含项目概述、命令、规则3□ slate.json 已创建,包含权限和模型配置4□ 一次手动运行已完成并验证可靠5□ SKILL.md 已为你的第一个重复任务编写6□ STATE.md 已创建并在 AGENTS.md 中引用7□ loop.md 已编写,包含明确的停止条件8□ 迭代次数硬性限制(开始时最多 8 次)9□ 验证者与制造者不是同一个 Agent10□ 任何不可逆操作(PR、部署)都要有人工审查关卡
在安排任何事项之前,检查每个框。
跳过任何一个,循环要么静默失败,要么白白消耗你的费用。
更多循环灵感
一旦你理解了这种模式,瓶颈就从"如何构建一个循环"转变为"接下来应该构建什么循环"。
Forward Future Loop Library 中的循环库是一个不错的起点,可以浏览各类正在运行的循环——内容、工程、运营、研究等类别。
当你在一个地方看到 20 个正在运行的循环时,你就不会再考虑单次的提示词了。
令人不适的真相
两个构建者运行完全相同的循环,却可能得到截然相反的结果。
一个人用它来加速自己已经深刻理解的工作。
另一个人则用它来逃避理解工作本身。
循环本身并不知道两者的区别。
但你知道。
循环设计比提示词工程更难——而不是更容易。
关键不在于工作本身变简单了。
而是杠杆点发生了转移。
构建循环吧。
但要以一个意图持续担任工程师的身份去构建它。
而不是仅仅作为那个按下启动按钮的人。
而新的 GPT-5.6 并未取代这一原则。恰恰相反,它强化了这一原则。
前沿领域不再是谁能写出最巧妙的提示词。
而是谁能围绕着能力越来越强的模型设计出最佳的系统。
60 秒要点回顾
什么是循环:
→ 提示词 = 问题。循环 = 工作。
→ 发现 → 执行 → 验证 → 迭代 → 停止
四项条件测试:
→ 任务重复 / 验证可自动化 / 预算能容忍浪费 / "完成"是可客观判断的
五个设置步骤:
→ AGENTS.md → slate.json → 一次手动运行 → SKILL.md → STATE.md
然后进行封装:
→ loop.md 队列文件或 CI 中的无头 slate 运行
失败模式:
→ 过早退出 / 目标漂移(忘记约束)/ 自我偏好偏差(制造者兼做检查者)/ 智能体惰性(做得差不多就行)
Slate 的优势:
→ 每个步骤自动选择模型 → 并行子任务且相互隔离 → 长会话管理 → 你的循环,你的设计
如果这有帮助:
→ 转发分享给你认识的每一位构建者
→ 关注 @sairahul1 获取更多类似的系统
→ 收藏此文——仅设置检查清单就值得保存
订阅 theaibuilders.co 获取更多有趣的文章
我写作关于 AI、产品构建以及在你睡觉时仍在运行的系统。
提到的工具:
→ Slate 文档:docs.randomlabs.ai
→ Forward Future Loop Library:signals.forwardfuture.com/loop-library





