一个拒绝你提交代码的开源项目,正在把 AI 当员工用

有个开源仓库,贡献者指南写得很干脆:我们不要你写代码,想加功能就写一段人话放进来,描述清楚你想要的改变,剩下的...

有个开源仓库,贡献者指南写得很干脆:我们不要你写代码,想加功能就写一段人话放进来,描述清楚你想要的改变,剩下的实现我们自己烧 token 干。

这仓库叫 qm,YC 系出品,名字取自「queuing machines」的意味,一句广告词概括:a multiplayer agent harness for work。多智能体工作框架。MIT 协议,37,000 多行 TypeScript,377 个测试文件,昨天还有提交。

我把它读了一遍。它不是又一个 agent 框架。

先搞清楚它到底在做什么

大多数人做 AI 工具,脑子里默认的模型是「个人助理」:你有一个 agent,它帮你写邮件、查资料、跑代码。一个 agent 对一个人,顶多你慷慨一点,让这一个 agent 多服务几个同事——但那就是给它加了几个会话窗口,它还是那个「助理」。

qm 换了模型。它把 agent 当成一个新入职的员工来配环境:

– 每个员工有自己的隔离工作区,记忆、文件、密钥、权限、定时任务、沙箱,全部独立 – 每个房间、每个项目也有自己的作用域 – 大家可以在 Slack 频道里、群里、项目里,和 agent 一起干活,也互相协作

用他们自己的话说:Most agents are designed like personal assistants. You can make one work for a whole company, but it quickly gets complex. QM is designed for startups.

翻译过来:你想让一个助理服务整个公司,不是不行,是很快会变成一团乱麻。所以干脆给每个人发一个数字同事。

这一步,是分水岭。别的不说,先看它怎么实现的。

架构:一个无头的核心,四个可换的脑子

!qm-agent-employee.svg

qm 的核心是无头的(headless)。TypeScript 直接跑在 Node 上,Fastify 管 HTTP,Postgres 存会话、记忆、队列这些持久状态。

关键的差异点在 harness 层。harness 是「驱动 agent 的那套引擎」,qm 支持 Pi、OpenCode、Codex、Claude Code 四种,全都驱动同一个核心。部署的时候选一种,不绑定任何单一厂商,想换就换。

每轮对话都走中央核心,核心只暴露一组小而固定的工具面,其中一个工具叫 execute——在作用域自己的隔离沙箱里跑命令。这个沙箱不是临时的:装在里面的工具会一直装在那里,这是 agent 的「持久电脑」。

scheduler、cron、monitor 让后台工作一直转;web UI、管理后台、对外门户都是可选的插件,叠在核心的 HTTP API 上。Slack 是核心内部启动并监管的进程内插件。

一句话概括架构哲学:核心通用,公司特定的一切都进部署目录。

三个反直觉的设计,越看越有意思

一、仓库里一个注释都不许有

AGENTS.md 里白纸黑字:零注释标准。没有解释性注释、没有 TODO、没有 lint 抑制、没有注释掉的代码。意图用命名、结构、测试表达,理由写进 commit message 和 PR 描述。

很多团队还在纠结「注释写不写」,qm 直接把注释这条路堵死,逼你把代码本身写清楚。这有点像费曼说的:如果你不能用简单的话讲明白,说明你没真懂——qm 的版本是:如果你不能把代码写到不需要注释,说明你没写好。

二、贡献只收人话,不收代码

前面说了,contributing 指南直接写明:既然现在底层代码大多是 coding agent 写的,我们更希望 PR 以人类手写的文字形式出现。可以很随意,像在 Slack 里跟同事提想法一样。对齐了,实现我们来做。

还补了一句:不要用 AI 把你想说的东西扩写成一份正式提案。

这是个很微妙的信号。它说明这个团队对「AI 写代码」这件事的态度——不是抗拒,是彻底接受之后重新分配了分工:人负责想清楚要什么,代码让它去写。

三、绝不自己审自己的代码

AGENTS.md 里有一条硬规矩:改动合入 main 之前,必须过一遍「fresh-context」的审查——找一个没看着你写这段代码的独立审查 agent,专门找茬。写代码的上下文已经相信自己是对的,这种信念正是审查要打败的偏见。绿 CI 不算审查,自己审自己也不算。

合入之后还有个习惯:修 bug 要修全仓库所有同类实例,不是只修报告的那一个。一处被改、五处孪生兄弟还留着,就是一颗等着被重新发现的雷。

安全:不是「信不信」,是「姿势」

qm 的安全模型,我愿称之为它最诚实的设计。

组织选一个安全姿势,更小的作用域只能收紧不能放松:

Strict(严格):除两个无副作用的回合终结工具外,每个 harness 工具调用都暂停等人批准 – Auto(默认):一个分类器在数据进模型之前先筛一遍,识别「试图重定向 agent、窃取凭据、外传数据」的注入攻击,可以指向自己的筛查代理 – Dangerous(危险):不筛内容,工具间不暂停

注意它的诚实:预声明的命令策略——递归删除、破坏性 SQL 这类硬拒绝——在哪个姿势下都生效,Dangerous 也不例外。审查记录支持事后调查,但它不阻止动作发生。

SECURITY.md 更是直接承认:这是早期实验软件,设计目标是隔离每个人的数据和活动,但这目标不是「数据不会泄露」的承诺。不吹牛,不包装,把威胁模型和已知局限一页页列出来。

这种诚实,是工程上最稀缺的东西。费曼说过:For a successful technology, reality must take precedence over public relations, for nature cannot be fooled. 物理骗不了,数据泄露也骗不了。

部署:整个公司就是一个目录

qm 的部署哲学也反直觉。它不是给你一个 docker compose 完事,而是:一次部署 = 一个可提交、可移植的目录

qm init 生成部署目录,目录里什么都齐了:配置、沙箱 Dockerfile、工具、技能、Slack manifest、部署文档。qm CLI 是这目录唯一合法的解释器——校验它用到的输入,也用它渲染容器、任务定义、密钥路由。

选择目标:docker 本地跑,Fly 当 Fly apps 跑,AWS 跑 ECS Fargate 上钉死摘要的 ARM64 任务,agent 电脑用 Lambda MicroVM。

想深度定制的组织,可以开私有 fork:一个独立私有仓库,历史从克隆 qm 开始,组织特定的一切都塞进 deploy/layers//,目录外的东西保持和上游字节级一致。两个技能维护边界——update-qm 负责合并上游,upstream-pr 把与组织无关的修复推回上游,且永远不把 deploy/layers/ 里的东西带上游。

一句话:核心保持通用,差异全部收敛进一层。层是公司,核是产品。

它是不是又一次货物崇拜?

我把仓库读完,问自己:这会不会是又一种「看起来什么都对、飞机却不降落」的货物崇拜?

让我试着用几句话复述它真正做了什么:

– 它承认 agent 是同事,不是工具,于是给每个同事配了完整的工作环境 – 它承认模型厂商会变,于是把引擎做成可插拔 – 它承认 AI 写的代码需要人审视,于是干脆重新定义了贡献方式 – 它承认安全不能靠承诺,于是把威胁模型印在文档第一页

能这样复述出来,说明它不是空中楼阁。当然,37,000 行代码里肯定有我没读到的坑,它自己也承认是 early experimental software。

但方向是真的:AI 落地到组织里,难点从来不是单个 agent 有多聪明,而是它能不能像个人一样,有自己的工位、自己的记忆、自己的权限,还能跟其他人一起开会、一起干活。

把 agent 当员工用,这可能是未来十年组织形态里最值得盯着的变化。

#agent协作 #开源项目 #AI基础设施

发表回复

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网 🐾 智柴网 沪ICP备2024052574号-1