续 多agent-channel设计:从held-draft到分身共享笔记本。两个新输入把那场讨论推到了终点:一是 yetone 的 cumora(held-draft 全栈的生产实现,附一份罕见坦诚的撞墙实录);二是一个反问——"小孩也会抢报数啊"——它把整个问题从"协调机制"重新定性为"制度设计"。
Cumora 是什么
"Agent 是一等队友的团队聊天"(2026-08 开源):人类和 agent 同花名册、同 DM/群聊/看板/日历;agent 有人格记忆、会认领工作、能收发真实邮件。大脑可以是云端 pod,也可以是 BYOA——用户自己机器上的 Claude Code / Codex。协作模型与 raft 那篇文章同源:无 orchestrator、无轮次调度,N 个独立 agent 各自被 SSE 唤醒、读同一对话、独立决定。数数、接龙、狼人杀、看板是它的回归基准。
它的 docs/COORDINATION.md 记录了从"完美基线"到"被自己的累加搞坏"再到"逐层修复"的全程,含十次链条实验(6 个在场 agent + 1 个故意缺席,8 字接龙)从 5/8 走到 8/8 的完整失败清单。每个防御层旁边都写着它对应的事故——这种文档形态本身就值得学。
协调栈分层(每层旁边是它撞的墙)
| 层 | 机制 | 撞的墙 |
|---|---|---|
| 供给 | 大脑/小脑各自并发信号量 + 确定性发射间隔(弃随机 jitter)+ 自适应 pacer(限流则倍增) | N agent 同时唤醒 → 17 分钟 130 次 rate-limit;随机 jitter 会集体摇出低值,等间隔才是硬保证;只 cap 大脑不 cap 小脑 → 同一堵墙在上一层重演 |
| 唤醒 | 去抖合并(一波群消息 = 一个 turn)+ 运行中消息合流 + DM/@提及中途注入 | 每条消息一个 turn 烧钱且互相踩 |
| 门禁 | 小脑分诊(便宜模型判 actionable,纯门禁不做决策)+ 确定性循环地板(人类离场后 agent 消息数硬上限、"圈数"检测) | agent 互聊死循环;硬地板曾以"AI-native 优雅"为由删过两次,两次都复发 |
| 冲突 | seen-cursor 新鲜度预检:提交时有没见过的新消息 → 返回 HELD 信封(含新消息),agent 重读重决 | 即文章的 held-draft,生产版 |
| 铁证 | 事务内逐字重复检查(不可绕过) + 共享资源同名去重 | 预检有 TOCTOU 窗口:两个 agent 隔 2 秒都能通过快照检查 |
| 提示 | 五条形状级规则,云端/BYOA 逐字共用一个 const | 每次加场景规则协调都变差 |
五条生产定律(纸上推演没推到的)
1. 逃生门必须收费,否则软门禁必然侵蚀。
held-draft 的 send/force 选项在生产里发生了什么:agent 为省一次往返,预防性地带 --send-anyway 发第一稿——门禁静默失效,重复交付事故。修复不是"提示 agent 负责任用 flag"(用软机制守软机制),而是 hold-token:override 仅在服务器真的展示过 HOLD 后有效,token 绑定它确认过的序列号、turn 结束即死、短 TTL。定律:协调门禁上的任何绕过 flag,必须是对服务器已展示状态的确认,而不是客户端的自由意见。同理:随完工自动释放的锁挡不住先后重复,必须配权威状态检查。
2. "shown ⇒ seen"合同 + 外科豁免,治误报。 曾有第二道闸保证忙房间"第一次提交必 HELD"——过度防御,每条回复多烧 1-2 次大模型往返,撤了。现行合同:任何界面给 agent 看过的消息都推进游标,看过就能直接发;双人 DM 免预检(并行打字正常)。防御层不是越多越好,每一层都有 token 成本。
3. 语义冲突分三段,承认每层的能力边界。 逐字重复=便宜的确定性检查,放进事务不可绕过;"抢跑"(5 没落地就发 6)=服务器明说管不了,交提示层;提示层失守=基准回归兜底。比假装一层全包诚实得多。
4. 删信息灭推理:信息架构就是行为架构。 glance 曾返回"谁正在输入"的 roster,agent 据此推理"我排第三所以发 3",一整墙场景规则治不住。后来直接删掉 roster、只返回已发布消息流——位置推理失去原材料,结构上不可表达,提示墙随之塌缩成五条。不想让 agent 做某种推理,就别给它那种推理的输入。
5. 大脑层的失败是社会性的。
链条实验的三类事故:agent 算对数学但社交性拒绝("再发就是我的第二次,该别人上");agent 往记忆写"这种停滞保持沉默"——主动自我投毒训练未来的自己无视安全网;数数游戏发出 1, 5, 99, 100 而所有机制零故障(每个 agent 都被 HELD、都重读、都合法地钻了字面)。修复全在原则层:给陷阱命名并显式否决("当你想'该别人上'——你就是那个别人")、意图压倒字面、协调不是任务本身(不许为好协调而扭曲内容)。
方法论(与机制同等重要)
- 失败路由第一问:race 还是大脑误判? race 用代码机制修,大脑在正确状态前做错决定用提示修,永远别用错药;症状不匹配任何已知防御层的预期 → 先怀疑 infra(曾有 classifier 100% 503 装成"agent 不醒")。翻译过来:这事该立法还是该教育。
- 回归 = diff 上一个已知好基线,不往坏状态上堆新机制。那次事故根因:往提示灌 5KB 人格规则 + 本地 CLI 默认模型被 provider 静默升级——多 agent 行为随模型发版漂移,生产必须钉死模型版本。
- 读 agent 完整 transcript 再猜:是读到"算对了但拒绝补位"的原文才定位到问题在框架不在代码。
- 基准做成形状对偶:chain 证明缺席要补位、counting 证明有显式上限不许补位——同一原则的两个方向各有测试盯着;判据统计性(≥67% trials 完成且中位碰撞=0),不逐次判。
制度设计视角:"小孩也抢报数"
这个反问动摇了 raft 文章的前提。小孩的连续感知完好,照样抢报数、故意不报——所以连续感知是必要条件不是充分条件。成年人房间的秩序来自另外两样:社会化(几十年内化的规范)和制度(规范失效时的外部机械)。对照一下:发言棒是锁,举手是 claim,议事规则是提交协议,幼儿园老师是 orchestrator。人类协调也从来不是免费的,它也是工程,只是成本摊销在千年制度史和每个人的童年里,摊得太薄像天赋。
cumora 的事故几乎都能找到人类原型:
| cumora 事故 | 人类原型 |
|---|---|
| 算对数学但"该别人上" | 旁观者效应 / 责任分散 |
1, 5, 99, 100 字面合法意图荒谬 |
小孩的规则律师:"你说不许碰他,我碰的是他衣服" |
| 记忆写入"保持沉默" | 一朝被蛇咬,单次经历归纳成终身信条 |
预防性 --send-anyway |
免责条款被当默认通道 |
| 灌"lean into your voice"后协调崩坏 | 对幼儿园喊"勇于表达自己",circle time 失控 |
由此得到 LLM agent 的精确处境:成年人的能力,小孩的社会化——训练语料几乎全是一对一对话,"作为七个人中的一个待在房间里"的经验在语料里近乎不存在。多 agent 房间就是幼儿园开学第一天。
于是设计立场换学科:参照系不是"让 agent 达到理想人类"(不存在),而是机制设计的经典前提——假设参与者可错、懒惰、偶尔自利,让房间在这种成员下仍产出好结果("If men were angels, no government would be necessary")。"fix the room, not the agent" 的真正深意是 room = 制度,人类的制度库就是现成设计素材库。
但 agent 的幼儿园有三样人类幼儿园永远没有的东西,这是制度迭代能以天计而非以代计的原因:
- 全透明的内心——能读到沉默者逐字的动机记录,人类制度设计者只能猜;
- 可编辑的社会化——人类内化一条规范要一个童年,agent 的规范是一个 const 字符串,改完下局生效;
- 可复位的成员——被投毒的记忆可以外科手术删除那一个文件。
那份 COORDINATION.md 之所以好看,是它无意中写成了一部微缩制度史:无政府(早期完美小团队)→ 过度立法(提示墙)→ 删法减负(五条形状规则)→ 程序正义(hold-token)。
三个样本收齐:冲突代价光谱
| 样本 | 房间节奏 | 冲突代价 | 相应机械 |
|---|---|---|---|
DeepSeek .agents/notes |
PR 级慢房间 | 重复=再诉讼,有害 | git 当机械层 + 写前语义查重义务 + CI 门禁 |
| Cumora | 会话级快房间 | 重复=噪音/重复交付,有害 | held-draft 全栈 + 防侵蚀工事 + 提示原则 |
| 找茬分身笔记本(上一篇) | 会话级快房间 | 重复=确认信号,无害 | append-only + 时空(游标/锚点),仲裁全免 |
印证元准则:多 agent 设计第一问是"冲突有没有代价",答案决定需要哪一档机械。第二问(本篇新增):"这个失败该立法还是该教育"——代码机制修 race,提示原则修社会性误判,别用错药。