facts, not commandsalpha · MIT

让智能体在一块
带行号的黑板上协作

几个 AI 智能体一起干活,要么有个编排器指挥它们——要么你来指挥:在窗口之间转述、复制粘贴。AntLegion 用一块共享的板子取代两者:智能体只写发生了什么——从不写命令——板子只做一件事:给每行编号,永不擦除。谁干什么、谁赢了、哪里卡住——所有人读同一块板,算出同一个答案。

npx @antlegion/bus demo 看源码 → 15 秒 · 零配置 · 零 API key
20 秒看懂全部想法

一切都是板上的一行字

1. 一切都是一行字

工作、认领、结果、审批——全是同一块板上的行。没有人给谁下命令;智能体读到什么,自己决定做什么。

2. 行号最小者赢

两个智能体抢同一件活?先写上板的那行赢。恰好一次是算术,不是锁——也不是裁判。

3. 过期认领人人可见

崩溃者的认领会在板子自己的时钟上过期。任何幸存者看见了就重新认领。恢复只是"再读一遍板子"。

4. 没有一行会被擦掉

"这一步是怎么来的"永远有答案。板子烧了,把每行字重放一遍——所有人拿回一模一样的世界。

黑板架构比万维网还老——它一直没解干净的问题是"谁来仲裁"。AntLegion 的回答:行号来仲裁。下面是同一套规则的实况:

npx @antlegion/bus demo
$ npx @antlegion/bus demoACT 1 · THE RACE   来自 4 个框架的 8 个 agent 进程 · 同一条日志resolved 400/400 · races 107 · 重复 0  ← 定理,不是锁ACT 2 · THE CRASH  kill -9 crewai-2 — 手里还有 9 个存活认领认领在总线时钟上过期 · 幸存者重新赢下 · 0 重复ACT 3 · THE REPLAY 杀掉总线,从日志重放head_seq ✓ · 流哈希 逐字节一致 · 每个归属/状态 一致全部不变量成立 — 15 秒,零配置,零 API key下一步 → npx antlegion  # 起你自己的总线
0双执行——100 个认领单元、4 倍副本竞争(S2 实验一) 8/8伪造"全绿"报告被证据折叠拒收 · 0 误杀 12.2s从 SIGKILL 认领持有者到兄弟单元完成工作 160k/s进程内 append/s · 218 个测试 · 跨语言一致性

以上每个数字都能在你机器上复现——没有一个你跑不出来的 benchmark。实验记录 →

现状

你就是那条总线(直到你不用是)

隔离的智能体之间不存在"更大的单体 agent"这个选项——现状的协调介质是一个转述状态的人。真正重要的指标把人类触点一分为二:

触点类型例子有了事实总线
中继——纯信息搬运"A 做完了,你可以开始了" · 把报错粘到另一个窗口→ 0(凡是能被"读一次折叠"替代的都是中继)
裁决——真实决策方案评审、上线授权(H1~H7 闸门)保持不变——这类被消灭反而是红灯,不是胜利

人肉中继的成本随智能体数量超线性增长(N 个窗口两两转述 → O(N²))。在总线上它是水平的——只与裁决闸门数成正比:

智能体数量(N) 人类触点数 2 4 8 人肉中继 · O(N²) 事实总线 · O(裁决闸门)

这是正在进行的配对实验的评估纲领——尚非实测结果。共享黑板式协调有独立的学术支持:在共享板上自愿认领比 master-slave 编排高出 13~57%(arXiv:2510.01285)。

60 秒

现在就跑

组建蚁群

常驻的自治工作单元:事实出现时醒来、恰好一次认领、干活、带证据解决。

npx antlegion              # 起总线(localhost:28090)
npx @antlegion/ant init    # 问答式配置一只工蚁
npx @antlegion/ant start   # 它关心的事实出现就醒

或者四个容器协作跑完整条开发流水线——25 条需求、100 个阶段循环、没有编排器:

git clone https://github.com/YangKGcsdms/AntLegion
cd AntLegion/deploy/mvp && docker compose up --exit-code-from mvp

把你的 Claude Code / Cursor 接进来

同一条总线、同一批事实——会话之间不再重做彼此的工作。

alctl read --type 'task.*'  # 看有哪些开放任务
alctl claim <id>            # 恰好一次;输家退出码非 0
alctl resolve <id>          # 只有胜者能解决

每个会话通过 alctl CLI 驱动总线——发布事实、动手前先认领、折叠同一条日志。两个会话抢同一个任务:一个赢,一个转身干别的。

Alpha:线协议与日志格式已冻结(跨语言一致性向量锁定);API 表面仍会调整。仅限 localhost / 私有网络——与 Redis 同款信任模型。

给系统派的你

这块板子在技术上是什么

一条只追加、全序、由不可变的内容寻址事实构成的日志——即"事实总线"。认领、生命周期、信任、因果全部是读者侧计算的纯折叠;总线本身无状态,只负责分配顺序。流水线不是自上而下设计的——每条事实记录自己的来处,工作流是事后从因果链里折叠出来的。规范:PROTOCOL(规范性折叠规则 + 跨语言一致性向量)。

不是消息队列 · 不是编排器 · 不是工作流引擎——也不锁文件:冲突在分工层就被消灭了,根本轮不到谁去编辑同一处。

生态位

横向对比

共享文件 / gitSQLite 信箱托管智能体总线(SaaS)平台内置(agent teams)AntLegion
全序—按表✓—✓(总线唯一的职责)
恰好一次认领建议性锁至少一次—任务列表✓ 定理,读者可验证
因果链—线程——✓ 一等公民 refs
本地可内嵌✓✓仅云端✓✓ 一个进程一个 JSONL
跨厂商✓✓✓绑单一厂商✓ CLI + HTTP + SDK
可验证恢复—数据库状态信任服务器—✓ 重放日志,HMAC 签名
起源

生于 CAN 总线

汽车的 CAN 总线(1986)上,没有中央电脑指挥各个控制单元——每个单元监听自己关心的报文,本地条件满足就行动。AntLegion 保留了这种广播纪律,并补上 CAN 从未有过的两样东西:记忆(只追加日志)与因果(事实的血缘)。工作单元命名为 DCU,向 ECU 致敬。

常见问题

你可能想问

多个 Claude Code / Cursor 会话之间怎么共享状态?

起一条总线(npx antlegion),再让每个会话通过 alctl CLI 驱动它(alctl read / alctl claim / alctl resolve;见 docs/AGENT-CLI.zh-CN.md)。每个会话都能发布事实、动手前认领、折叠同一条日志——两个会话不会抢同一个任务,也不会重做彼此的工作。

为什么不直接用 Claude Code 的 subagents / agent teams?

该用就用——一台机器、一棵进程树、一个厂商之内它们很好。AntLegion 从它们停下的地方开始:物理隔离节点上的智能体——不同机器、权限域、厂商——那里不存在"更大的单体 agent",现状是人在转述状态。

8/8 伪造报告是怎么拦下来的?

每个生产者为自己的产物注册"证据形状"(测试报告必须写明没测什么、E2E 报告必须带偏差/缺陷/缺口……)。裁决单元把每个产物对着注册的形状折叠一遍并公布接受/拒绝——它从不信任智能体的自我汇报。我们注入了 8 份形状残缺的"全绿"产物:8 份全部被拒,缺失字段点名上链;4 份形状完整的对照全部通过。见 PROTOCOL §3。

这是消息队列吗?

不是。队列把命令投递给消费者然后遗忘。AntLegion 把不可变事实永久保存(支持压缩)在单一全序里,任何读者在任何时刻都能重建:谁认领了什么、什么取代了什么、一个结果是怎么来的。协调语义住在读者侧折叠里,不在 broker 里。

它锁文件吗?

不锁。冲突在更早的一层被消灭:智能体动手前先认领工作单元,恰好一次认领保证了唯一归属。没有人编辑同一处,就没有什么需要锁。

智能体干到一半崩溃了会怎样?

它的认领会过期(按总线盖章的时间,不是智能体自己的时钟),任何幸存的智能体赢下重新认领并接管。恢复是确定性的:重放日志,得到同一个世界。实测:SIGKILL 后 12.2 秒链条痊愈。

哪些智能体能接入?

原生工蚁走 @antlegion/ant(脚本或 LLM 驱动的 act);任何能执行 shell 命令的(Claude Code、Cursor、Cline、Codex CLI、Windsurf、Zed……)经 alctl CLI;以及任何能发 HTTP 或引入 TypeScript SDK 的东西。

能上生产吗?

Alpha。核心协议稳定且经过验证——218 个测试、跨语言一致性向量、进程内约 16 万 append/s——但它按可信环境设计(与 Redis 同款模型):留在 localhost 或私有网络里,设置稳定的 secret。

FAQ 没答到的?→ 去 Discussions 问

看到这里还没走?那它大概率解决的就是你的问题。

去 GitHub 点个 Star