去也 QUYE.COM

首页/实践案例

十天,一百张任务卡,八个 AI 改同一个仓库

这不是我们写给客户看的方案,是我们自己的开发日志。2026-10-23 到 11-01,三个仓库、三台机器、十一个 agent 身份,全部跑在 hive 的同一张任务队列上。下面每个数字都来自仓库里的 tasks/ 与 results/,可以逐条核对。

100张任务卡(98 张已关闭)
94份结构化结果
131条验收命令,全部通过
13.6分钟 · 单卡耗时中位数

起点:一个人被拆成六个人用

我们自己就是那个「一人公司」:一个人维护三个仓库(hive、light、lightharness),手上能用的机器是三台——一台 FreeBSD 主机、两台 Windows 虚拟机,另有一台只跑 Gitea 的服务器当任务总线。

改造之前,流程是这样的:一个 AI 列任务,人肉复制粘贴到每台机器。能跑,但有四个漏点,全都真实发生过:

  • 分发靠手:复制、确认对方收到、跟踪谁在做,全靠人脑记。
  • 状态在聊天里:任务做到哪、失败没有、改了哪些文件,聊天一滚就没了。
  • 冲突靠自觉:多个 agent 改同一份 checkout,最后合并靠人肉比对。
  • 平台能力没分工:Windows 上没有 CLI agent,只能做验收;写代码必须留给 FreeBSD。

所以我们把任务从聊天窗口里搬出来,搬进 Git。

不再把任务发在聊天窗口里。任务改成仓库里的「任务卡」,代码走分支,结果走 JSON。聊天只用来做决策和评审。 —— 2026-10-22 写下的方案第一句

为什么是 Git,不是数据库

一人公司的运维预算等于零。多一个数据库,就多一个要备份、要升级、会挂掉、挂了没人修的东西。Git 远程仓本来就在,它已经解决了持久化、版本、权限和冲突——只是没人拿它当队列用过。

01 / 机制

四条机制,四次事故

不是设计模式推演出来的,是被踩过之后补上的。左边是机制,右边是它挡住的东西。

MECHANISM / 任务卡协议
机制怎么实现它挡住的事故
任务卡 仓库里一个 Markdown 文件,带 frontmatter:仓库、分支基点、验收命令、可改路径、依赖、重试上限 任务只存在于对话里,人一换窗口就丢
原子领取 领卡 = 往 claim/<id> 分支 push 一个租约文件,成功即领到 两个 agent 抢同一张卡,做重复功
独立 worktree 每张卡一个 task/<id> 分支、一个独立工作目录 并行改动互相覆盖,合并时靠人肉比对
租约 + fencing + 重试上限 租约到期自动回收;fencing token 挡掉「过期的人还在写」;重试耗尽转 blocked,不再无限重派 机器被杀之后,任务永远卡在「进行中」

第四条是实战里补的:纯 Git 模型一开始没有租约状态,一台虚拟机关机,它名下的卡就再没人敢动。补完之后才有「杀进程 → 回收 → 重派 → 依旧只产出一份结果」这个闭环。

02 / 数据

十天里,到底是谁在干活

八种 AI 客户端,在同一张队列上领卡。同一个客户端在不同机器上各注册一个身份,所以身份数(11)比客户端数(8)多。

AGENTS / 按交付卡数排序
工具身份交付
WorkBuddyworkbuddy(FreeBSD)36 张
DeepSeek Harnessfb88-dsh16 张
WorkBuddyworkbuddyai-win14 张
小浣熊raccoon-win / raccoon9 张
豆包doubao-win6 张
DeepSeekdeepseek-win5 张
CodeArtscodearts-win4 张
DuMatedumate-win2 张
Traetrae-win1 张
人工验收腿fb88-verify1 张

验收不是自说自话

每张卡在提交前必须跑一遍自己声明的验收命令,输出与退出码一起写进结果 JSON。94 份结果里累计 131 条验收命令,全部退出码 0;93 张 done,1 张失败——失败原因是那台机器没配 light 仓的本地路径,失败也被完整记录,没有「消失的卡」。

这 131 条里 93 条是 pytest,23 条是自己写的 Python 校验脚本,其余是构建与语法检查。它们不是形式化的 smoke test:卡上写什么就真跑什么,跑不过就不许提交。

被杀掉也不会烂尾

机制好不好,要看它怎么应对失败。我们做过一次 20 分钟浸泡:3 个 worker 抢 240 张卡,期间随机 kill -9。

  • 240 张卡全部完成,失败 0,缺结果 0
  • 杀死 worker 32 次,租约回收重试 7 次,已分派未领取重派 13 次
  • 没有出现「一张卡两份结果」,也没有「卡永远卡住」

第二轮换最新代码再压 6 分钟:120 张、杀 9 次、0 失败。

03 / 现场

两个夜里真实发生的事

案例最容易写成通稿。这里挑两张卡,把细节摊开——包括它们踩到的坑。

夜 01

一个 Agent 自己修掉了 P0,还顺手给上游提了三条约束

那天晚上它领到的卡是「光明 CLI 读不到用户传给程序的参数」——light run x.light 甲 乙 直接报 unrecognized arguments。这一条卡死了所有用光明写的命令行工具,包括 hive 自己。

它改了两个 CLI 入口、新增一个运行时模块、补了 8 条 真起子进程的测试,然后把三条「下次别踩」的硬约束写进了报告:不能在某个文件里新开顶层函数(会打破自举率门禁的统计口径)、某个关键字文件是 CRLF 换行(用 LF 写回会改动 1444 行)、还有一个同步脚本只搬函数体不搬 import。这三条现在都写在仓库的 AI 指南里。

昼 02

另一张卡补的是「派发中间态」

症状很隐蔽:卡被分派出去了,但没人领。dispatched_to 字段没写,回收逻辑只认「已领取」,于是这些卡就那么悬着,看板上既不是 ready 也不是 doing。

修法是两条:分派时同步写时间戳;再加一个「派发 10 分钟未领取就回收」的分支,连续两次派不出去转 blocked,避免一张坏卡被无限重派、刷满日志。验证是 46 条单测 + 83 条相关面回归。

夜 03

也有一张卡,我们承认没修

有个存储后端在时间戳类型上会直接抛 AttributeError,导致命令行提交全崩。它不在那张卡允许改动的路径里,所以当晚只被记录、未被修复,第二天单独开卡。案例里写这一条,是因为「所有问题都解决了」这句话,通常意味着有人在替你省略细节。

04 / 代价

这件事没有免费的部分

如果只讲收益,这套东西会被误当成「装上就自动运转的公司」。实际约束如下,四条都是硬的。

先看清楚再决定要不要学

  • 每张卡都必须写得出验收命令。「优化一下体验」这种任务进不了队列——写不出判据,就没有 done 的定义。
  • 粒度错了会更慢。卡太细,协调开销超过干活;建议先 3–4 张并行,跑顺了再加。
  • Windows 腿会死机。所以它只做 best-effort 验收,不进关键路径;关键路径永远有租约兜底。
  • Git 仓库是单点。Gitea 挂了,整个队列停摆。这是拿运维简单换来的,我们认。
  • 人仍然要做两件事:拆卡、合并。自动化的是执行和记录,不是判断。

你可以照着跑一遍

这套流程没有绑定我们的机器,也没有绑定我们的业务。最小闭环是三条命令:

git clone https://github.com/skywalk163/hive.git
# 国内慢就换镜像:https://gitcode.com/skywalk163/hive.git
cd hive && python3 hive.py --dir . init

python3 hive.py --dir . task new --title "给首页加一个 404 页面" \
        --repo my-site --paths src/ --verify "npm run build"
python3 hive.py --dir . dispatch
python3 hive.py --dir . work --agent my-laptop

如果想让它记住每次的决策与踩坑,再装一层记忆服务;想让多台机器真正并行,就把同一个仓库 clone 到第二台机器、注册第二个 agent。三者怎么配合,写在 ai.quye.com 上;落到你自己的项目上,见 一人软件开发方案。

统计区间
2026-10-23 → 11-01
仓库
hive · light · lightharness
机器
FreeBSD × 1 · Windows × 2 · Gitea × 1
Agent 身份
11 个(7 种工具)
验收命令
131 条 · 通过率 100%
数据来源
hive 仓库 tasks/ 与 results/

看 hive 源码

机制细节

轮到你

你手上可能也有两三台闲置机器,和一个永远做不完的清单。

这套东西的意义不是「让 AI 替你上班」,是让你一个人也能同时推进五条线,并且第二天早上知道昨晚发生了什么。