一句话摘要
用文本文件构建 AI 工程团队
如何用一个装满文本文件的文件夹组建一支九人工程团队 2026年7月21日 · 14分钟阅读 · 查看原文 ↗ Claude AI Automation

> 两年来,从 AI 身上榨取更多产出,就意味着一个聊天窗口、一个你需要不断纠正的助手。
最优秀的构建者们已经悄悄不再这么做了。
在 **2026 年 3 月**,Andrej Karpathy 把一个 AI 工人(一个 agent)指向了他亲手调了二十年的训练代码,然后去睡觉,醒来时发现了二十处他自己漏掉的改进。Claude Code 的缔造者 Boris Cherny 已经有八个月没有亲手写过一行代码;有些早晨,他同时运行着几百个 agent。如今,一位典型的 Anthropic 工程师每天交付的代码量,大约是 2024 年的八倍。
他们谁也没有打出什么更聪明的字。他们干脆不再打字,转而开始经营团队。一个 agent 只是一个 AI 工人——你把活交给它,让它自己跑:它是一名员工,而不是一个你需要坐下来盯着伺候的聊天窗口。
这个团队就是一个装满文本文件的文件夹。一个文件就是一名工人。放进一个文件,你就等于招了一个人。
这就是全部构造:这些文件、让九名工人成本低于一名的钱,以及让它们保持诚实的两条规则。一名工人简单到今晚就能搭起来;整个团队不过是把那名工人复制一遍。如何用一个装满文本文件的文件夹组建一支九人工程团队
在开始之前,我每天都会在 X 和我的 Telegram 上发布这些实验的构建、失败和数字。两者都免费。
X - [https://x.com/Argona0x](https://x.com/Argona0x)
Telegram - [https://t.me/+r0clI4-MMC03ZjAy](https://t.me/+r0clI4-MMC03ZjAy)
## 为什么文件夹胜过框架
人们一旦决定运行不止一个 agent,就会伸手去拿一个框架:一个庞大的预建系统,有很多你需要设置并让它保持运行的部件。CrewAI。LangGraph。AutoGen。首页上有一张示意图,画着小 agent 们互相传递工作。
> 你一个都不需要。
一支 agent 团队就是一个文件夹。每名工人是里面的一个小文本文件,不需要安装任何东西,也不需要维持任何东西运行。没有需要学习的库。文件夹就是组织结构图:想看看谁在为你干活,打开它、读读文件名就行。
 — "VS Code 文件资源管理器,显示 .claude/agents 目录,其中包含 worker-1.md 到 worker-9.md、checker.md、gate.md、reviewer.md"
## 一个文件就是一名工人
招人所需的时间,大约和写下这句话一样长。
一名工人就是一个单独的文件。它有名字、它运行所用的模型,以及一段简短的工作描述。这里有一个真实的例子——一名 reviewer,它的全部工作就是读一处改动,并报告它哪里有问题:
```python
---
name: reviewer
description: Reviews a change against its job description. Reports problems only.
tools: Read, Grep, Bash
model: sonnet
---
You review one change against one job description.
List only real problems: work claimed but not done, files touched outside scope,
tests changed just to pass, errors left unhandled. Name the file and the one-line fix.
Do not praise. Do not soften.
```
Read、Grep、Bash 只是我们允许它执行的动作:查看文件、在文件里搜索、运行命令。sonnet 是我们为它选的大脑,而那三种大脑和它们的价格稍后再讲。
把它作为文件存进文件夹,你就招到了一个人。无需注册、无需服务器、无需框架来支撑它。文件就是这名工人。删掉文件,它就消失了。复制它、重命名它、改一行,你就用更便宜的模型雇到了它的双胞胎。
一个孩子都能打开那个文件夹,告诉你谁在那儿干活。这正是关键所在。六周之后,你也能做到。
## 每支团队都需要的三种文件
一支团队需要三种工人。把一名工人复制九次,你就会得到九个同样的盲点,每一个都以同样的方式漏掉同样的东西。
**worker** 负责干活。它写代码、运行命令、做出改动,又快又便宜,只对准一个小任务,别的什么都不管。快手。除此之外对别无所求。
**checker** 读 worker 做了什么,并搜寻其中哪里出了问题。它是另一个工人,有另一个任务:找出第一个工人用嘴皮子糊弄过去的漏洞。
**gate** 拥有最终决定权。gate 是一个只回答通过或不通过的 checker,除非它说通过,否则什么都不许交付。
 — "示意图:worker 跑在 haiku 上,checker 跑在 sonnet 上,gate 跑在 opus 上,从左到右依次相连"
现在说说 checker 永远不能同时也是 worker 的原因。一个刚花了一个小时砌墙的人,是最不适合去验收这堵墙的人,因为他已经相信墙是直的,目光会径直滑过他亲手砌歪的那一块砖。让一个工人检查它自己的产出,它检查的是它想要构建的东西,而从来不是它实际构建的东西。
所以你有意把工作一分为二。一个工人干活快、有点马虎。另一个慢、严格,而且拿钱就是为了不信任。一个负责制造,一个负责怀疑。
干活的那个人,恰恰是最差劲的评判者。
## 给每名工人一份自己的副本
两名工人在同一秒打开同一个文件。双方都读了它。双方都编辑了它。双方都保存了。其中一个获胜,另一个人的工作就彻底消失了,而输掉的那名工人仍然报告"完成",因为在它自己的脑子里,它确实做了工作。
这就是当九名工人共用同一份代码副本时会出现的故障。这是一场你永远听不到的崩溃。
解决办法是 git(那个保存你文件每个版本的工具)里一小块大多数人从未碰过的功能。一个 worktree 会给每名工人一份自己的工作空间副本。底下是同一栋房子,房间彼此分开,所以谁也不会把别人的活儿粉刷掉:
```
git worktree add ../repo-worker-1 -b worker-1
git worktree add ../repo-worker-2 -b worker-2
git worktree list
git worktree remove ../repo-worker-1
```
现在每名工人在磁盘上都有自己的文件夹、自己的分支、自己可以随便折腾的文件,而所有这一切底下坐着一个共享的 git 仓库,保存着一份干净的历史。合并的动作发生在稍后,发生在你能亲眼看着的明处。
 — "终端:git worktree add 命令和 git worktree list,显示每名工人各自独立的路径"
现在九名工人可以在同一秒写入,而且谁也不会悄悄丢掉自己的工作。
代价只是磁盘空间,别无其他。几个文件夹里多几份代码副本,你的笔记本电脑根本不会察觉,而换来的却是九名工人同时运行,而不是轮流排队、互相覆盖。
## 六字段的工作描述
"修复这个 bug。"三个函数坏了。它修好一个,报告完成。它没有撒谎。
这名工人确实干了真活。它找到了一个 bug 并干净地修好了。只是这个任务从未告诉它其实有三个,于是它能停下来的第一个地方就成了终点线。一个含糊的任务,等于给了诚实的工人提前收工的许可。
更长、更详细的提示词并不能弥合这个缺口。能弥合它的是别的东西:一条工人无法造假的终点线。六个字段,粘贴在你交给它的每份工作最前面:
```python
GOAL: what must WORK when you are done, not what to do
DONE WHEN: pytest tests/auth -q exits 0 and mypy src/auth reports no errors
SCOPE: src/auth/**, tests/auth/**
OUT OF SCOPE: migrations/, anything under infra/, any file outside SCOPE
ON CONFLICT: flag it and stop. Never resolve silently.
STOP: 6 turns, or $2 of spend, whichever comes first. Then report.
```
真正挑大梁的那一行是 **DONE WHEN**。用大白话说,那个例子就是在讲"运行登录检查,带着零错误回来":pytest 和 mypy 是两个小的检查程序,而 "exits 0" 是它们表达"一切正常"的方式。它指向一条工人必须真正去运行的命令,而不是一种它能靠嘴皮子说服自己的感觉。然后再来一行,把它从一种希望变成一份承诺:
```python
PROOF: paste the full output of the DONE WHEN command, word for word, exit code and all.
If you cannot run it, paste the failures and stop.
```
"测试通过就算完成"是一句愿望。"测试通过、并把结果贴在这里才算完成"是一份契约。在工人被允许打出"完成"二字之前,它现在必须把命令自身的输出逐字逐句、连同退出码一起展示给你:命令自己做出的裁决,就摆在报告里,供你亲眼阅读。
## 让九名工人比一名更便宜的那个诀窍
> 九个会让我破产。
大多数人就是在这里悄悄把这个念头搁下的。一个聊天窗口里用一个好模型,就已经是一笔实打实的账单了。一次九个,听起来就像你宁愿不要看到的数字。
这种恐惧是真诚的。但恐惧底下的算术是错的。
这是价格,按每百万词输入输出计算。共三档。Haiku 是便宜的那档,输入 $1、输出 $5,Sonnet 往上高一级,是 $3 和 $15,而 Opus 这个昂贵的家伙,则是 $5 和 $25——无论输入还是输出,都是 Haiku 价格的整整五倍。
诀窍就是几乎从不运行那个昂贵的。你的 workers 跑在 Haiku 上,因为大多数工作又小又重复,不需要沉重的推理。checker 跑在 Sonnet 上。Opus 则完全置身于工作之外,处于沉睡状态,只有当同一任务的检查连续两次报红时才会醒来。大概四十次调用里才有一次。
还有一件事能让这个数字保持低水平。当一名工人在每一轮都重读同样的规则和同样的工作时,这种重复的阅读只需花正常价格的十分之一。第一次全价,之后每一次都是十分之一。
把它们加起来看。上个月:九名工人、大约六百个任务,**总共 $186.40**。其中,那个吓人的 Opus 只花了 $22.15。

九名工人的花费,依然低于它们所取代的那一个漫长班次,而原因很无趣。当你的最贵模型被对准每一个任务时——哪怕是几百个便宜档位几秒就能搞定的小任务——账单就会一路飙升。
让模型去匹配工作。
九双手比一双手更便宜。
## 如何在不盯着的情况下让它们保持诚实
这是让你能合上笔记本走开的那部分。有两个动作,能让一名工人被单独留下时也足够安全。
你写了一条规则。你把它放进一个文件里、靠近顶部、加粗:永远不要对生产环境运行 migration(一种改变数据存储方式的改动)。工人读到了它。然后它照样运行了 migration,还给你写了一段从容的文字,解释为什么这一次情况不同。
一条躺在文本文件里的规则,就是墙上的一块告示牌。工人读这块牌子,把它和它正试图完成的所有其他事情放在一起权衡,而在足够漫长的任务里,它会认定你的牌子不过是个建议而已。
所以你把规则移到模型底下,移进那个它无法辩驳的地方。一个 hook 就是一个门卫,在命令运行之前先检查它。工人请求运行某个东西,门卫先看一眼,于是坏命令永远到不了门口。
**在 Claude Code 里**,这个门卫是一个小脚本。它在命令之前运行,退出码 2 意味着被拦截:
```python
#!/usr/bin/env bash
# guard.sh - block dangerous shell calls before they run.
# Wire as a PreToolUse hook on Bash. Exit 2 = the call is blocked.
cmd=$(jq -r '.tool_input.command // ""')
deny='(rm[[:space:]]+-rf[[:space:]]+/|drop[[:space:]]+table|--force|git[[:space:]]+push.*(main|master)|prod)'
if printf '%s' "$cmd" | grep -Eiq "$deny"; then
echo "blocked by guard.sh: '$cmd' matches a forbidden pattern" >&2
exit 2
fi
exit 0
```
你只需接线一次,它就会检查每个会话里的每条命令,无论有没有人记得它的存在:
 — "终端:git push origin main 被 guard.sh 拦截,退出码 2"
```python
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [{ "type": "command", "command": "./guard.sh" }]
}
]
}
}
```
第二个动作更安静。它讲的是如何逐步培养一名工人,直到你能放心地留它单独运行涉及资金流动的任务——方法是把信任一档一档地发出去。给每名工人一个颜色。
绿色只能提议:它可以建议任何东西,但在你亲自看过这个建议并点头同意之前,它想做的任何一件事都不会真正发生。
黄色可以写,但只能在自己的房间副本里写,暂时哪里都无关紧要。
红色是生产环境、是钱、是任何会离开这栋楼的东西,而红色总是以一个人亲口说"去吧"作为结尾。
一名工人要靠自己一步步爬上去。它从绿色起步。花上一周时间读它实际请求要做的事,每天十分钟,如果它的行动全程都和它的报告吻合,它就赢得黄色。没有人从红色起步,也没有人在你不在回路里的情况下运行红色。
## 什么时候不该这么做
你想交出去的大部分事情,其实都不该交出去,而一个过滤器能告诉你哪些该、哪些不该。
只有一个过滤器,而一切都压在它上面。只有当一条命令能检查结果、并返回一个干干净净的绿或红、中间不掺杂任何主观判断时,一个任务交给工人才是安全的。测试要么通过,要么不通过。文件要么解析成功,要么卡死。类型检查要么干净,要么不干净。如果评判这份工作的唯一方式是你自己的眼睛去读它,那这个任务就还是留给你自己。
然后是第二个问题:当它出错时,你能不能撤销它。撤销分三个层级,而且它们远非等价。
文件是完全可逆的。Git 保存着每一个版本,你可以在一秒内退回到其中任何一个。
数据库写入只有在运行之前就设置好撤销才可逆——用一个快照,或者一个你先写好回退步骤的 migration。数据库本身没有任何东西会自动往回退。
邮件、扣款、消息、帖子。这些东西一个都回不来,无论出多少钱。一封已发出的邮件,就是发出去了。
这就是为什么红色总是以一个人收尾。当事物已经离开这栋楼之后,一小时后再"你是对的"也一文不值了。
而如果你的工作没有一条能返回绿或红的命令,那上面这一切不过是一种高度有序的、不知道发生了什么的方式。没有那一条命令,你就只是把"感觉完成了"自动化了,仅此而已。
## 先复制整支团队,再从一个开始
整套班底一张卡片就能装下。截个图吧,因为上面的每一行都是一个你可以打开的文件:
1. **workers:** 跑在 Haiku 上,也就是便宜的那档,干真正的活
2. **checker:** 跑在 Sonnet 上,读每一处改动、找出哪里有问题
3. **gate:** 跑在 Opus 上,那个昂贵的模型,沉睡到某次检查连续报红两次
4. **隔离:** 每名工人一个 worktree,这样谁也不会覆盖谁
5. **律法:** 那个 hook,一个在坏命令运行之前就拦住它的门卫
6. **任务书:** 六个字段加上 PROOF,一条工人无法造假的终点线
7. **汇报路线:** 每名工人向上级汇报给一位管理者,绝不横向汇报给彼此
8. **记忆:** 一个装满笔记的文件夹,这样明天的运行就从今天停下的地方接着开始
> 现在,是那条比卡片更重要的指令。今晚不要把这九个全搭出来。
挑出那一件你反复做、最烦人、再也无法忍受再做一次的事。把你手工做它的步骤写下来,先让一次人工运行从头到尾可靠地跑通,只有到那时,才把它包进一个 worker 文件里——一份工作描述、一条它必须满足的 DONE WHEN 命令。
一名诚实的工人,就是这门手艺的全部。一旦你有了它,第九个不过是第一个复制、改个名字罢了。
开头那些构建者做了一件你今天晚上就能照抄的事。他们不再死盯着一个窗口,而是让一个文件夹去干活。
如果你想趁它还安静的时候赶上下一场构建,我在这里:
X - [https://x.com/Argona0x](https://x.com/Argona0x)
Telegram - [https://t.me/+r0clI4-MMC03ZjAy](https://t.me/+r0clI4-MMC03ZjAy)
标签:# X # Claude # AI # Automation # Guide # Sonnet
相关文章
10 个 SEO 外链 Claude 自动化,3 个月内换来 61k 次 AI 提及 外链建设就是试错。 SEO AI Claude Automation
统治本地 SEO 的指南(用 Claude 自动化) "这是我的网站:[url]。审查我的 Google Business Profile 设置。找出针对我的主关键词在本地排名前三的竞争对手,告诉我他们用的是哪些主要和次要类别,然后给我一个……" SEO AI Automation Claude
GROK BOT:如何用 10 步把日常工作交给一个机器人 你至今用过的每一个 AI 工具都在等你。你打开它、你提问、它回答、你关掉它。工作仍然握在你手里,模型只是用嘴陪你走一遍流程。 Grok Bot AI Automation Claude
原文参考:https://maxed.wiki/posts/how-to-build-a-nine-person-engineering-team-out-of-a-folder-of-text-files/ (Maxed.wiki,本页为站内中文整理)