这是 Minions: Stripe’s one-shot, end-to-end coding agents—Part 2 的解读。
在 Part 1 中,Stripe 介绍了 Minions 的整体使用体验。
这里作者先更新了一组数据:
截至 Part 2 发布时,每周有超过 1300 个 Pull Request 被合并,这些 PR 完全由 Minions 生成代码,人类负责 Review,但没有人工编写的代码。
这篇文章将重点介绍 Minions 的 Stripe 专属实现,主要包括:
要想让无人值守的 Agent 在大规模工程项目中有效工作,首先需要一个可靠的云端开发环境。
Stripe 认为,这个环境至少需要满足三个条件:
Parallelizable(可并行)
人类可以同时启动多个 Agent,每个 Agent 处理一个独立任务。
不同 Agent 应该拥有相互独立的工作目录和代码修改空间。
否则就可能出现:
这种冲突不仅影响代码,还会消耗大量 Token,让 Agent 花时间解决本来不应该出现的问题。
Predictable(可预测)
每次启动 Agent,都应该获得一致的开发环境。
不能这次缺少依赖,下次又缺少某个服务。
如果环境本身不稳定,Agent 就可能把大量精力花在处理环境问题上,而不是完成开发任务。
Isolated(隔离)
Agent 必须与具有敏感权限的机器隔离。
尤其要避免 Agent 接触开发者个人的凭据、生产环境权限等。
因为无人值守意味着 Agent 不会一直有人在旁边监督。
使用 Docker 容器或者 Git Worktree 可以解决部分问题。
但要同时实现:
在本地环境中并不容易。
特别是 Agent 需要拥有足够的权限执行开发操作,但又不能拥有破坏敏感资源的权限。
这是一个比较棘手的问题。
Stripe 的 Minions 直接使用公司原本为人类工程师准备的标准开发环境:Devbox。
Devbox 本质上是一个运行在 AWS EC2 上的开发实例。
它包含:
实际上,Stripe 的人类工程师也经常通过 SSH 连接到 Devbox,再使用 IDE 进行开发。
这里有一个 DevOps 领域的概念:
Cattle, not pets(牛群,而不是宠物)。
它的意思是:
服务器应该是标准化、可替换的基础设施,而不是需要精心维护的一台特殊机器。
例如:
Stripe 的很多工程师习惯每个任务使用一个 Devbox,同时运行多个开发环境并不罕见。
Stripe 希望 Devbox 从启动到可以开发的时间控制在 10 秒以内。
为此,他们采用了预先创建和预热的 Devbox 池(Pool)。
在真正分配给工程师之前,后台已经提前完成:
因此,当工程师申请 Devbox 时,实际上是从一个已经准备好的环境池中分配实例。
10 秒之后,开发者就能获得一个基于近期 Master 代码的开发环境。
可以立即:
Stripe 的 Devbox 并不是为了 AI 专门设计的。
它早在人类工程师使用 Coding Agent 之前就已经存在。
但是,Stripe 发现:
人类工程师需要的并行性、可预测性和隔离性,同样是 AI Agent 高效工作的基础。
为人类开发者建设良好的工程基础设施,最终也会成为 AI Agent 的基础设施。
这是一个很值得思考的观点:不要只想着为 AI 重新造一套开发环境,而应该先把原本的工程环境建设好。
Stripe 的 Devbox 主要复用了原有的人类开发基础设施。
但是,Agent Harness 是 Stripe 专门为 Minions 定制的。
2024 年底,当 Coding Agent 开始在行业内兴起时,Stripe Fork 了 Block 开源的 Goose。
Goose 是较早被广泛使用的 Coding Agent 之一。
Stripe 在此基础上进行了大量定制,使其能够接入 Stripe 自己的 LLM 基础设施。
随着时间推移,Stripe 的开发重点逐渐转向 Minions 这种无人值守的使用场景。
而对于需要人类实时监督的 Coding Agent,Stripe 已经提供了 Cursor、Claude Code 等第三方工具。
这是这一节最重要的内容。
普通 Coding Agent 通常是作为开发者的助手存在的。
它们的设计假设是:
始终有一个人类开发者在旁边监督 Agent。
例如:
但是 Minions 不一样。
Minions 是完全无人值守的。
因此,它的 Harness 不能依赖这些面向人类交互的功能:
普通 Coding Agent 在执行危险操作时,往往会弹出确认框。
例如:
但是,如果 Minions 也这样做,就会出现一个问题:
没有人类监督时,谁来点击确认?
Stripe 的解决方案是:
通过 Devbox 的隔离机制来降低操作风险,而不是依赖人工确认。
每个 Agent 都在一个隔离的 Devbox 中工作。
即使 Agent 做错了操作,影响范围也被限制在当前 Devbox 内。
因此,在这个受控环境中,Minions 可以获得较完整的执行权限,并跳过大量人工确认提示。
这里不是说 Stripe 完全不需要权限控制,而是把安全边界从交互式确认转移到基础设施隔离和系统级安全控制。
由于 Minions 是针对 Stripe 的内部开发流程设计的,因此他们可以对 Agent 做很多针对性优化。
例如:
其中一个非常重要的设计,就是下一节要介绍的 Blueprints。
我认为这是整篇 Part 2 最值得研究的部分。
Stripe 在这里提出了一个概念:Blueprint(蓝图)。
它不是普通的 Prompt,也不是简单的 Agent Workflow,而是一种结合了确定性代码和 Agent 自主决策能力的任务编排机制。
在介绍 Blueprint 之前,作者先对比了两种常见模式。
第一种:Workflow(工作流)
Workflow 是通过预先定义好的流程图来组织 LLM 的执行。
例如:
1. 分析需求 【LLM 节点 1】
2. 生成代码 【LLM 节点 2】
3. 执行测试 【LLM 节点 3】
4. 生成结果
每个节点负责一个相对明确的步骤,执行路径由预先定义的流程控制。
它的特点:
缺点是灵活性不足。
如果某个步骤出现了预料之外的问题,固定流程可能无法很好地处理。
第二种:Agent(自主智能体)
Agent 通常采用一个简单的循环结构:
LLM 根据当前上下文决定下一步操作,调用工具,观察结果,然后再次决定下一步。
Agent:自主决策循环
1. LLM 思考: 根据当前任务决定下一步
2. 调用工具: 搜索代码、修改文件、运行测试
3. 观察结果: 将工具执行结果返回给 LLM
// 重复上述过程,直到 Agent 认为任务完成。
它的优点是灵活。
Agent 可以根据执行结果自主决定:
但是它也有缺点:
Agent 可能做出不必要的决策,甚至遗漏一些必须执行的工程步骤。
例如,你希望 Agent 最终一定运行 Lint。
如果只是告诉 Agent:
「修改完成后记得运行 Lint。」
它可能忘记,也可能认为没有必要。
Stripe 提出的 Blueprint,就是希望结合两者的优点。
原文的核心意思是:
Blueprint 是用代码定义的 Workflow,用来指导一次 Minion 执行过程。
它既包含确定性的流程节点,也包含可以自主决策的 Agent 节点。
换句话说:
Blueprint:混合编排模式
以下为概念示意,不是 Stripe 原图。
1. [确定性节点] 初始化开发环境(代码执行,不调用 LLM)
2. [Agent Node] Implement task: Agent 自主分析需求、搜索代码、设计方案并修改代码。
3. [确定性节点] Run configured linters: 程序强制执行 Lint
4. [Agent Node] Fix CI failures: Agent 根据测试失败信息分析原因并修复代码。
5. [确定性节点] Push changes: 程序执行 Git 操作
6. 提交 Pull Request
注意,这里有一个非常重要的区别:
Implement task 是 Agent 节点。
Agent 可以自由决定如何完成任务。
而 Run configured linters 是确定性节点。
它不需要 LLM 思考,直接由程序执行。
Stripe 发现,对于那些可以提前预测的小决策,直接用代码实现,比让 LLM 每次都重新思考更好。
例如:
「任务结束后一定要运行 Lint。」
这件事根本不需要 LLM 决策。
如果交给 LLM:
如果直接写在 Blueprint 中:
文章特别强调了一个观点: 将 LLM 放入受控的执行边界中,可以逐步累积整个系统的可靠性收益。
原文用了一个很形象的表达: Putting LLMs into contained boxes.
可以理解为:不要让 LLM 接管整个工程流程,而是把它放在职责明确、权限受控的节点中。
Blueprint 不仅能控制执行流程,还能控制每个 Agent 节点的上下文。
例如:
Implement task 节点需要:
而 Fix CI failures 节点需要:
两个节点不一定需要相同的上下文和工具。
Blueprint 可以针对不同子任务:
这其实也是 Context Engineering 的一种实践。
Stripe 还允许不同团队创建适合自身业务的 Blueprint。
例如,有些团队需要执行复杂的 LLM 辅助代码迁移。
这种迁移无法简单地通过固定的 Codemod 完成,因为代码中的情况存在一定的不确定性。
因此可以创建一个专门的 Blueprint:
这样就可以把通用的 Agent 编排能力扩展到不同的工程场景。
这一节讲的是如何让 Agent 理解大型代码仓库。
对于 Stripe 这样的大型代码库,即使 LLM 很强大,也不能保证它天然知道项目的所有开发规范。
例如:
即使有 Linter,也无法覆盖所有架构和业务规范。
因此,Stripe 使用 Agent Rule Files,让 Agent 在浏览代码目录时,自动获取相应的项目知识。
类似的文件包括:
CLAUDE.mdAGENTS.md这是一个很值得注意的设计。
Stripe 的仓库非常庞大。
如果把所有规则都放在全局配置中,那么 Agent 在真正开始工作之前,上下文窗口可能就已经被大量规则占满了。
例如:
假设我正在做的 CAD 项目有:
src/
├── command/
│ └── AGENTS.md
├── transaction/
│ └── AGENTS.md
├── document/
│ └── AGENTS.md
├── rendering/
│ └── AGENTS.md
└── geometry/
└── AGENTS.md
如果 Agent 修改 Rendering 模块:
它应该优先读取 Rendering 对应的规则,而不是把 Command、Transaction、Geometry 等所有规则都加载进来。
Stripe 几乎只使用作用于特定子目录或文件模式的规则。
规则会随着 Agent 遍历文件系统而自动附加。
这样做有三个好处:
Stripe 不希望为 Minions、Cursor、Claude Code 分别维护三套不同的规则。
因为这样会导致:
因此,Stripe 选择了 Cursor 的规则格式作为统一基础,并修改 Harness,使 Minions 也能够读取这些规则。
同时,他们还将 Cursor Rules 同步为 Claude Code 能够读取的格式。
这样,三种 Coding Agent 就能够共享同一套代码库知识。
核心思想:规则应该属于代码仓库,而不是某一个 AI 工具。
原文:Context gathering: MCP
这一节与上一节有明显区别。
上一节解决的是静态上下文问题。
这一节解决的是动态上下文问题。
Agent 读取文件系统,可以了解:
但实际开发任务通常还需要动态获取外部信息。
例如:
这些内容不能仅靠读取本地文件获取。
因此,Stripe 接入了 MCP(Model Context Protocol)。
MCP 让 Agent 能够通过标准化的工具调用方式获取外部信息。
Stripe 内部有很多不同类型的 Agent:
这些 Agent 都需要访问内部工具。
如果每个 Agent 都单独开发一套工具,就会造成大量重复工作。
因此,Stripe 构建了一个统一的内部 MCP Server:
Toolshed
Toolshed 是 Stripe 的公共工具能力层。
它的设计目标是:
文章发布时,Toolshed 已经包含接近 500 个 MCP 工具,覆盖 Stripe 的内部系统和使用的 SaaS 平台。
这里有一个很有意思的设计。
虽然 Toolshed 有接近 500 个工具,但 Stripe 并不会默认把全部工具提供给每个 Agent。
原因是:
Agent 的工具越多,不一定越好。
工具太多可能造成:
因此,Stripe 会为不同 Agent 精心选择一组与任务相关的工具。
例如:
| Agent 类型 | 可能需要的工具 |
|---|---|
| Coding Agent | 代码搜索、文档、CI |
| Issue Agent | Ticket、项目管理 |
| Release Agent | 发布状态、部署信息 |
| Documentation Agent | 文档搜索、知识库 |
Minions 默认也只获得一小部分工具。
不过,工程师可以根据个人需求,为自己的 Minions 增加一些按主题分组的工具集合。
既然 Minions 可以自主调用 MCP 工具,就必须防止它执行破坏性操作。
Stripe 使用了内部安全控制框架,确保 Agent 不能通过 MCP 工具执行危险操作。
此外还有第一层安全保护:
Devbox 本身运行在 QA 环境。
因此 Minions:
这里的设计思路非常清晰:
不要只依赖 Agent 自己遵守安全规则,而要在基础设施和工具权限层面限制它能做什么。
这一节讲的是 AI 自动开发过程中非常关键的一个问题:
如何让 Agent 自己发现代码中的问题,并不断修复,直到达到交付标准?
Stripe 的目标是让 Minions 一次性完成任务。
但一次性完成不代表代码第一次生成就一定正确。
Agent 仍然需要自动化反馈,才能知道自己的修改是否有效。
Stripe 已经拥有超过 300 万个测试。
这些测试可以为 Minions 提供大量反馈。
但是,Stripe 不希望所有问题都依赖 CI 才能发现。
因为 CI 的执行成本比较高。
Stripe 使用了一个软件工程领域的原则:
Shift Feedback Left(将反馈尽可能左移)。
意思是:
如果某个问题可以在本地开发环境中发现,就不要等到代码提交后才通过 CI 发现。
例如:
假设某个代码修改存在 Lint 错误。
传统方式:
这显然浪费了时间和 CI 资源。
Stripe 的做法是:
在本地 Push 之前,就通过开发环境中的自动检查发现并修复这些问题。
Stripe 使用了 Pre-push Hooks。
在开发者 Push 代码时,自动修复最常见的 Lint 问题。
另外,他们还运行一个后台 Daemon:
因此,工程师通常可以在不到一秒的时间内获得 Lint 修复结果。
Minions 也直接集成了这套机制。
这样 Agent 就不需要浪费 Token 和 CI 时间,反复处理本地就能解决的格式问题。
Stripe 将 Lint 检查作为 Blueprint 中的确定性节点。
Agent 完成代码修改后:
然后才进入 CI 阶段。
Minions 的测试反馈流程:
1. Agent 修改代码
2. 本地 Lint 检查: 确定性节点,失败则本地修复
3. Push 代码,执行 CI
4. 自动应用 CI Autofix: 能够自动修复的问题直接处理
5. [Agent Node] Fix CI failures: 无法自动修复的问题交给 Agent
6. 再次 Push,执行第二轮 CI
7. 交付人工 Review
这里需要注意,Stripe 的标准 Blueprint 允许一次修复机会:
作者专门解释了这个问题。
CI 执行需要消耗:
如果让 Agent 无限次地执行:
修改代码 → Push → CI → 修复 → 再次 CI。
理论上它可能一直尝试,但这并不意味着最终一定能解决问题。
而且随着重试次数增加,继续运行完整 CI 的边际收益会逐渐下降。
因此 Stripe 选择了有限次数的反馈循环。
这实际上是在三个因素之间做平衡:
一个成熟的 Agent 系统,不应该追求无限自动修复,而应该明确什么情况下继续尝试,什么情况下交给人类。
Stripe 认为 Minions 只是他们使用 AI 提升工程效率的一种方式。
它结合了行业通用技术:
同时也结合了 Stripe 自己多年积累的内部基础设施:
作者强调:
过去为提升人类工程师生产力所做的投资,在 Agent 时代同样会产生巨大的价值。
例如:
这些原本就是优秀软件工程团队应该建设的基础设施。
而现在,它们也成为 AI Agent 能够高效工作的基础。
结合 Blueprint 的设计,其实能够给 CAD 软件开发或者其他复杂软件开发一个很好的参考。
假设你给 Codex 一个任务:
「实现 CAD 图层管理功能,包括图层的增删改查、图层拖拽排序,以及图层内部实体的置顶和置底。」
这个任务实际上包含两种性质完全不同的工作。
第一类:需要 AI 自主决策的工作
这些工作存在不确定性,适合交给 Agent。
第二类:不需要 AI 决策的工作
这些工作本来就有确定的执行规则,应该交给程序。
根据 Stripe Blueprint 思想设计的示例,并非 Stripe 原有实现。

这里我特别强调第⑤步。
CAD 的业务正确性不能只通过代码测试来判断。
例如,图层拖拽排序:
这些才是真正的业务验收。
最好把这些操作转化成自动化测试,而不是仅仅让 Agent 根据代码逻辑判断自己是否完成。
这是我认为在建设 AI Coding 工程体系时,最需要明确的边界。
| 技术 | 职责 | CAD 项目示例 |
|---|---|---|
| AGENTS.md | 提供项目规则 | Transaction 使用规范 |
| Skill | 封装专业知识和任务方法 | CAD 图层功能开发指南 |
| MCP | 提供外部工具和数据 | 代码搜索、CI 查询 |
| Blueprint | 编排整个任务流程 | 分析 → 开发 → 测试 → 修复 |
| Harness | 提供完整工程运行和约束体系 | 环境、工具、规则、反馈、安全 |
它们不是相互替代的关系。
例如:
当 Blueprint 执行到 Implement Feature 节点时:
当执行到 Static Checks 节点时:
不需要再让 LLM 自己决定是否执行。
最后,把两篇文章放在一起看:
| 对比 | Part 1 | Part 2 |
|---|---|---|
| 重点 | Minions 的整体使用体验 | Minions 的内部实现 |
| 核心内容 | Slack、PR、自动开发 | Devbox、Blueprint、MCP |
| Agent | 如何使用 | 如何编排和约束 |
| 上下文 | 如何获取 | Rule Files、MCP |
| 测试 | 自动反馈 | Feedback Left、有限重试 |
| 工程基础 | 端到端开发 | 隔离、预热、确定性执行 |
我认为两篇文章最值得记住的三个观点是:
对于这种复杂 CAD 软件,我尤其推荐研究 Blueprint。
因为 CAD 的开发不是简单的 CRUD,很多任务涉及模型状态、事务、几何算法、渲染和交互之间的联动。完全依赖 Agent 自主探索,容易产生不可控的修改;完全使用固定 Workflow,又很难处理复杂的代码分析和实现。
Blueprint 恰好提供了一种折中方案:把工程流程固定下来,把不确定的技术决策交给 AI。
这也是我认为 Stripe 这两篇文章中最有价值的工程思想。