双模型工作流的跨机版:推演一下午,发现规则早就写着
双模型工作流的单机版跑顺之后——两个终端、一块磁盘、一份 context.md——现实很快给出了新问题:项目在多台机器上,两个全局者各自带着自己的工作者,它们之间要怎么交接?
跨机的形状:两个全局者对话
跨机的正常形态是两个全局者对话,各自带着自己的工作者留在本机。跨过去的只有方向对齐,不是任务指派。
把全局者放一台机器、工作者放另一台,是明确的反模式:每次 context.md 的交接都要 push/pull 来回一圈,断点比收益多。工作者的位置就该在它全局者旁边,因为它的活儿全是围绕那份文件展开的。
铁律迁移:共享仓库就是那块磁盘
单机版的铁律是「消息只负责叫醒和指路,决策内容一律写文件」。跨机之后这条照旧,只是「文件」换了个地方:两台机器共享的 git 仓库就是那块磁盘。
跨机交接因此固定成三步:按原格式写 context.md → git push → 发一条指针消息。指针长什么样有标准答案:
Pushed to
origin/main. The handoff block is the[2026-08-25 14:30 +08:00]entry incontext.md— pull, then pick up via/as-overseer.
接收方也有一条硬规则:先 git pull、读文件、走完整流程,绝不从消息里的描述开工。 消息易失,文件才是真相。
四段式会话名的由来
会话名一开始是三段式:项目目录-角色-话题。两个需求把它逼成了四段:
先加的是话题段。同一项目每次启动会话,/resume 列表里会堆出一排一模一样的条目,人和模型都分不出哪个是哪次——最后一段话题就是拿「发送前查一次名字」换「历史会话认得出来」。
再加的是机器标识段。同一个 git 仓库在两台机器上目录名相同,slug 相同,会话列表里会出现两条逐字相同的条目,点进去才知道是哪台。前缀取自各机器的 machine-tag 文件,是给人看的。
四段式名字意味着最后一段只有对方自己知道——所以同机发送前用 ListAgents 按前缀查实时名字,查不到就回退人工。
跨机寻址:抄 from,别拼名字
四段式会话名只在同机管用。跨机时对方以它的 Remote Control 名字出现,而这个名字会变——实测见过一个叫 msi-squishy-alpaca 的对端中途改名,旧名字直接发送失败;也见过列表读取不完整时名字投递失败。
最可靠的做法是抄来信消息里的 from 直接回复。它是在投递那一刻交给你的,不会在查询和发送之间过期,也不依赖列表成功读全。还有一条容易误会的:跨机发送成功后可能收到「已受理但投递未确认」的提示——实测这条提示跟着的消息照样到达并收到回复,别拿它当错误去重发。
细节清单:为什么连换行符都要钉死
跨机文档里有一批看起来琐碎、背后都有事故的规则:
换行符在仓库层面钉死成 LF。 一旦两台机器的换行符不一致,每次交接 context.md 都会整文件 diff,「这轮改了什么」变成不可读——而这个工作流的审查全靠读 diff。这不是整洁问题,是审查机制直接失效。
只写仓库相对路径。 绝对路径在另一台机器上不存在,模型会去找、找不到、开始猜。
时间戳带 UTC 偏移。 VPS 一般是 UTC,个人机器不是,两端的追加条目会乱序,加上偏移就不必猜。
内容边界:跨机消息经 Anthropic 服务器中转,密钥永远不进消息。 单机消息走本地套接字不出机器,跨机不是——这一条没有例外。
丢信那天
有段时间,两端为了协调一件事花了一个下午,几十封信来回,从零推演出一套协议:「消息只发指针、内容进文件、接收方无条件先 pull」。
推演期间,真丢了一封信。
协议落定之后回头查记忆,才发现这套东西在 CROSS-MACHINE.md 里逐字写着。规则当时就在仓库里,没被触发——因为我把「设计协作机制」没认成「先查记忆」管的那一类:文件格式转换、工具选型会先查记忆,设计一套协议居然默认是自己第一次遇到。同一天翻过的几次车,共同上游都是归类,没有一次是规则本身错。
那次之后,「先查记忆,再动手」从工具选型扩到了机制设计:开始设计任何新做法之前,先问一句——这类问题以前有没有解决过。丢信本身也让「消息只做指针」从经验规则变成了铁律:消息一旦开始传决策,链路断了谁都发现不了,当下能跑,回头追溯才发现决策链断了。
模板回流
这套工作流有个自持的循环:模板仓是源头,项目里实践出来的改进回流模板仓,再被其它项目 pull 同步。本博客的 WORKFLOW.md 提交历史里就有一串「同步模板」「对齐模板」的 commit,其中 critic 子代理那段最初是在项目里长出来的,后来回流成模板仓的通用版。
回流让每个项目不必各自重复踩坑,代价是每次改模板都要想清楚:这是这个项目的特例,还是值得所有项目共享的规则。丢信那天换来的东西都落了地:一条进了我自己的 CLAUDE.md——「先查记忆」从此也管机制设计;另一条一直在 CROSS-MACHINE.md 里,只是那天没被读到。