合并前的"盲重放":agent 补丁只有能在干净环境里重现才可合入
一个只在某次长聊天会话里存在过的 agent 补丁,不是可评审的变更。对话中隐含的约束永远不会进入仓库、失败的测试或下一位评审者的视野。作者在 dev.to 提出一套配对编程协议:让配对产生持久成果,就应该只保留"第二个无记忆环境能重现的 diff"——简报(brief)而非完整对话记录,成为重现的真源。
核心立场:聊天窗口里的隐藏上下文是污染
聊天窗口会悄悄存放被拒绝的文件、私有服务名和只说了一半的架构,后来的读者永远不会看到。资深结对伙伴应把这些隐藏上下文当作污染,而不是模型"额外有用的记忆"。
协议的场景:一个已知失败的测试(HTTP 服务的就绪探针在已有测试下仍返回 503),驱动者想让助手改健康处理器快速推进,资深者要的是一个"别人能从仓库重新生成、不需要原始对话"的变更。双方只有能用文件级术语描述完成态,工作才开始。在那份描述出现在代码旁之前,每个生成的 diff 都留在一次性分支上,不做合并讨论。把第一次尝试的速度当作可选,把第二次尝试的可重现性当作必须——这个区分就是整个方法。
资深者写下的问题
资深者不追求更聪明的 prompt 或更长的系统消息,而是要求陌生人能照着执行的答案,并把答案写进仓库:
- 完全不依赖之前对话轮次,命名这个任务完成的文件级结果;
- 命名今天已经失败的测试,以及补丁落地后必须保持绿色的测试;
- 命名禁止 agent 触碰的每条路径,包括设置、锁文件和生成目录;
- 命名"第二个环境从未收到第一个会话及其 cookie"的验证方式。
这些要求看起来沉重,直到第一个补丁依赖了模型只在口头听过的文件名。那次失误之后,书面答案就成为配对契约。
三个走过的死胡同
让原会话总结需求给新会话。总结仍夹带昵称、漏掉确切错误码、干脆没有测试命令。只收到总结的第二个环境产出的是大重构而不是就绪修复。教训:模型写的复述仍是受污染线程的一部分。
导出完整对话记录当简报。记录包含被拒绝的方案,许多模型把它们当额外需求而非已丢弃历史。干净环境重建了资深者早就扔掉的路。
用肉眼在编辑器里对比两个补丁。对聊天的视觉记忆隐藏了多余文件、重命名测试和没人批准的锁文件升级。需要不依赖任何人记忆的机械门。
活下来的决策
补丁只有在如下情况才可合并:给一个干净环境仓库加一份简短简报,它产生的变更被现有测试接受。仅存在于聊天里的 diff 永远留在可丢弃分支,即使看起来和重放结果几乎一样。相似性不等于可重现性。
三个工件
书面简报 brief.md:命名结果、命令和停止条件,语言是陌生人能执行的。例如:让 GET /health/ready 在进程能服务流量时返回 200;当前失败 pytest tests/test_ready.py::test_ready_ok(HTTP 503);允许路径 app/health.py、tests/test_ready.py;禁止 app/settings.py 和 migrations/ 下所有文件;完成当 pytest tests/test_ready.py -q 退出码 0 且 git diff --stat 只显示允许路径;当模型提议改禁止路径、或同一测试命令两次失败且回溯相同则停止。它不复述配对的闲聊、被拒文件名或资深者的旁白。
重放清单 replay_manifest.yaml:故意做小,会话中不滚动长篇政策就能读。冻结测试命令和路径契约,记录 max_model_rounds(3)和 require_clean_worktree。轮数上限放这里,因为干净环境也可能重试出一条不同架构——达到记录的轮数就停,即使助手要求再来一次。
机械门 replay_gate.py:对比工作树与路径契约,再运行冻结的测试命令。工作树改动超出允许路径或触到禁止 glob 返回 2;测试失败返回测试码;全部通过返回 0。零退出码是资深者愿意谈合并的最早时刻;非零退出码让配对回到简报,而不是回到原会话讨价还价。
编号的配对工作流
- 一起写出 brief.md,直到资深者无需任何聊天滚动条就能执行;
- 邀请模型之前,把失败测试命令和路径契约冻结进 replay_manifest.yaml;
- 让第一个环境在一次性分支上提出补丁,停在那里不合并;
- 开第二个环境:有仓库、简报、清单,完全没有对话记录;
- 允许至多记录的模型轮数,然后停止;
- 在第二环境工作树上运行 replay_gate.py 并保留退出码;
- 门通过就保留第二个补丁;否则修订简报并重跑干净环境,而不是翻隐藏聊天。
第一个环境允许混乱、探索、充满被拒文件。第二个环境才是唯一赢得合并讨论的那个,因为它从没见过污染。如果两个补丁不一致,说明简报写得不够精确——配对改简报,而不是手动平均两个 diff。
局限与适用边界
这个协议不证明架构品味或产品判断:两个环境可能就一个笨拙补丁达成一致,尤其当测试很薄时。第一会话里生成的测试必须重放前扔掉,否则第二次运行只证明自洽。门也看不见漏进简报的密钥。免费共享环境永远是别人的电脑,不适合专有代码、客户数据或凭证。轮数限制阻止无限重试,但阻止不了一个符合路径契约的错误方向。评审者仍要像读人写的 diff 一样读第二个补丁——门检查的是契约,不是意图。
团队如果已经要求人工写补丁、模型只用于评论,不需要第二个环境;受监管代码库禁止第三方执行的团队应留在批准的机器上;指望重放替代代码评审的人会失望——通过的门不是设计评审。
来源:Blind Replay Before Merge: Keep Only the Agent Diff a Clean Environment Recreates - DEV Community