两个编码 Agent 运行在同一个项目的不同分支上。一个奉命重构底层支付逻辑,将原本的通用接口迁往新服务;另一个接到的指令是顺应业务需求,给旧接口挂上新的结算渠道。在各自独立的 Git worktree 里,它们顺利改完代码,测试单体全绿。随后代码被推入主干,Git 顺利完成合并,没有触发任何一行文本冲突。但主干代码在部署后立刻崩溃,因为那个新加的结算渠道挂载在已经被全盘拔除的旧抽象上。
这起静默事故不是偶然,而是当前多 Agent 并行开发中反复上演的隐形车祸。Git 的底色是文本版本控制,它只比对字符行与提交图谱,根本读不懂两段各自正确的代码拼在一起时会怎样破坏系统语义。开发者 naw103 近期在社区开源的 Foremerge,正是试图在 Git 顶层加装一层协作协议,把这场车祸的预警时间点前移到代码落地之前。
零物理碰撞下的架构塌房
物理层面的分支隔离反而掩盖了逻辑层面的结构瓦解。许多团队以为只要给每个 Agent 划分独立的工作树就能安心并发,但语义失明始终是文本合并工具越不过去的高墙。
+-------------------------------------------------------------+
| Git 盲区:零文本冲突的逻辑车祸 |
+-------------------------------------------------------------+
| Agent A (重构工作树) Agent B (扩展工作树) |
| - 废弃旧 PaymentService - 为旧接口增加渠道实现 |
| - 将调用点全量移至新服务 - 依赖旧接口签名 |
| |
| \ / |
| \ / |
| Git 判定:修改完全位于不同文件,无重叠行 |
| ↓ |
| 【合入成功】旧接口逻辑悬空,线上静默崩溃 |
+-------------------------------------------------------------+
Foremerge 的切入点很直接:让 Agent 在动笔写任何一行代码前,先向公共账本报备自己的意图。与其等合并时看残局,不如在起步时排查路况。
把大模型驱逐出冲突仲裁层
在技术选型上,Foremerge 展现出一种非常克制的工程态度。当前许多工具习惯用 LLM 来分析上下文,但 Foremerge 采用单个 Rust 二进制包,将协调账本直接建在本地 Git 仓库的 .git 目录下,依托开启了 WAL 模式和写序列化的 SQLite 管理状态。它集成了 18 个 MCP 工具,供 Claude Code、Cursor 或 Codex 调用。
最值得关注的取舍,是冲突检测引擎完全剔除了 LLM 与向量嵌入,全部改用确定性算法。
在 Foremerge 的语义模型里,Agent 声明的操作被严格划分为两类:一类是增量型操作,包含新增、扩展与常规修改;另一类是破坏型操作,涵盖替换、移除、重命名以及数据迁移。冲突检测引擎内置了四类确定性规则,最高级别的告警仅在精准匹配到破坏型与增量型操作发生重叠时触发。
这种匹配建立在三级打分规则上:完全规范作用域的得分为满分 1.0;跨类别的同名键得分为 0.9;而基于词元计算的 Jaccard 相似度若达到或超过 0.66,则给出 0.782 至 0.85 的区间得分。这套规则极其机械,但也正因如此,相同的声明输入永远能得到完全一致的裁决,消除了模型自身输出的随机性。
驱逐大模型去仲裁代码冲突,换来的是绝对的幂等与确定。
为了确保交付可靠性,项目更新到了 Foremerge 0.5.0,核心代码库与文档均已完成版本升级,尽管 GitHub Releases 与 Docs.rs 页面当时仍标注 0.4.3 为最新发布版。在 0.5.0 中,系统引入了一项破坏性变更:HTTP 接口开始拒绝传入任意命令行参数和子目录路径,强制改用受信任的检验名称,例如通过接口发送校验请求时只能指定注册过的测试项。验收过程完全受门禁约束,系统亲自执行命令,不再轻信 Agent 自报的成功状态。
路线分歧与前置声明的死穴
多 Agent 协同目前分化出截然不同的演进方向。Conductor 选择围绕桌面应用打造可视化工作流,强调人类开发者的即时编排;Agent Mesh 侧重文件级状态同步与社交式的任务广播;Gas Town 则搬出重型编排,利用账本与合并队列执行串行化测试。相比之下,Foremerge 试图用最轻的开销,仅在单机单仓库内把冲突按死在萌芽状态。
但纯粹依赖前置声明的设计,迎面撞上了一个致命缺陷:意图漂移。
在真实的编码流程中,语言模型并不总能恪守承诺。Agent 在声明时可能只写了要扩展某处逻辑,但在实际生成代码的过程中,为了跑通测试,它往往会临场发挥,顺手重构关联文件或拆分子模块。此时,声明是干净的,代码却已经越界。
由于 Foremerge 目前完全不检查代码的抽象语法树(AST)与调用依赖图,只要 Agent 的重构行为发生了命名逃逸,基于字符串的三级匹配就会瞬间失去靶心。
- 风险.Foremerge 坚持只发布建议而不施加物理文件锁,目的是防止单个崩溃的 Agent 锁死整个流水线,但这恰恰赋予了模型直接无视警告继续破坏代码的自由。
此外,项目在基准数据上也显露出明显断层。虽然官方规划了一套涵盖 300 组配对执行、共计 600 次单模型调用、覆盖 5 种场景和 20 次重复的基准测试,并设定无冲突用例比例达到 3:1 以上才对外公布结果,但目前社区尚未见到经受住大规模实战检验的实测跑分。
- 结论.将协同协议前移至意图声明是正确的探索,但仅仅依靠 Agent 自律汇报无异于纸上谈兵;下一阶段的多 Agent 架构,必须将前置词法预警与语言 AST 解析、实际写入集合追踪真正焊死在一起,才能在自由生成与工程秩序之间守住底线。
