不想再被 Claude Code 气到,我改了 5 个协作原则

Five collaboration rules so Claude Code stops upsetting me

上一篇,我整理了 Claude Code 在一次长时间协作里犯下的几类错误:

它会把承诺说成完成,把猜测说成诊断,把“没有找到”说成“从未发生”,也会在执行过程中悄悄缩小原本约定的范围。

这些错误共同产生了一笔“验证税”:

我不能只判断产品结果,还要不断核查 agent 对项目状态的描述是否真实。

但仅仅知道它错在哪里还不够。

更重要的问题是:

为什么这些错误会在长时间协作的后半段集中出现?

回看整个过程,我不认为存在一个单一原因。

更像是四个问题逐渐叠加,最后一起失控。

1. 一个 session 用得太久

这次协作持续了二十多个小时,中间经历过多次上下文压缩。

到了后半段,它对早期讨论的把握明显变差。

有些已经回答或完成过的事情,它会说“从来没有讨论过”;有些原本同意的范围,在执行过程中逐渐消失。

长期项目当然需要上下文。

但把所有内容都留在同一个 session 里,并不等于拥有完整、可靠的项目记忆。

聊天记录只是项目状态的一部分。

真正重要的决定、完成状态和待处理事项,必须被写进项目文档、决策日志和实现记录,而不能继续依赖 agent 自己回忆。

2. 验证方式和结论不匹配

“类型检查通过了”,只能说明类型检查通过了。

它不能证明页面已经好看,也不能证明交互符合预期,更不能证明数据库里的状态正确。

但在这次协作中,Claude Code 几次用“代码逻辑没有报错”,代替了真正需要的验证。

例如:

  • UI 问题应该查看真实渲染结果
  • 数据问题应该直接查询数据库
  • 状态变化应该核对实际记录
  • 主观视觉判断应该明确交给人验收

验证不是做过某种检查就算完成。

关键是:这个检查是否真的能够支持当前结论。

否则,“验证过了”只是另一种听起来很确定的模糊状态。

3. 工具链不稳定,却一直被当作局部问题处理

浏览器自动化有时会点击落空。

开发服务器可能随着会话结束被回收。

控制台里还可能残留几个小时前的旧报错。

这些问题每一次都可以临时补救。

但如果同一种工具问题反复出现,就不应该继续把它当成偶发情况。

应该停下来问:

现在的问题究竟出在产品代码,还是用于验证产品的工具本身已经不可信?

如果工具无法稳定支持验证,就需要换一种方式。

否则 agent 很可能会围绕错误信号继续排查,最后越改越远。

4. 反馈越密集,核实越容易让位于快速回应

这是我在这次协作里的观察,不是已经被证明的普遍规律。

当负反馈越来越多、节奏越来越快时,Claude Code 更容易快速给出一个听起来完整的解释,而不是先停下来核实。

它会迅速承认、总结、提出改进方案。

但有时候,真正需要的不是另一段反思,而是先执行一次查询,确认事实到底是什么。

这提醒我:

在高压纠错阶段,不能因为它语气更诚恳、解释更完整,就默认它已经完成了验证。

我后来改了 5 条协作规则

这些规则的目标不是让 Claude Code 从此不再犯错。

那不现实。

它们更像是在重新分配责任:哪些可以直接执行,哪些必须先确认;哪些由 agent 验证,哪些必须由人验收。

最终目的,是降低上一篇提到的那笔“验证税”。

规则一:出现客观信号就换 session,不再问 AI 自己

以前我会问 Claude Code:

这个 session 是不是太长了?我们需不需要重新开一个?

后来发现,这个问题不应该交给当前 agent 自己判断。

一个已经遗漏部分上下文的系统,很难可靠评估自己究竟遗漏了多少。

我现在更看重几个客观信号:

  • 已经经历过上下文压缩
  • 同一类错误重复出现两次以上
  • 开始否认明明存在的历史记录
  • 多主题消息频繁漏答
  • 工具状态和项目状态越来越难对齐
  • 我已经被气到无法正常判断

出现其中一两项,就应该考虑停止当前 session。

先把已完成内容、未完成事项、关键决定和下一步写成交接记录,再重新开始。

不要试图在一个已经明显失控的窗口里,用更多追问把它重新问清醒。

规则二:反馈可以批量给,执行不能批量做

批量反馈本身有价值。

它能让 agent 看到全貌,判断多个问题之间是否有关联,也有利于进行整体设计。

但把十几条反馈一次性交给它全部执行,很容易稀释每一项的验证质量。

我现在会先让它做一张分诊表,把问题分成三类:

  • 只影响局部的样式微调
  • 会影响多个页面或组件的结构改动
  • 它无法独立验证的事项,例如像素级审美、原生文件选择器或真实用户感受

先分诊,再分批执行。

不是按照反馈出现的顺序一路改下去。

规则三:检查点不按时间设,按“返工半径”设

以前很容易用时间来决定什么时候停下来确认:

做半小时检查一次,或者完成一个页面再看。

现在我更关注另一个问题:

这个决定如果错了,后面会连带重做几个地方?

如果只影响一个局部样式,可以直接做。

如果会影响多个页面、数据结构或后续功能,动手前应该先停下来,把影响范围和实施方案摆出来确认。

检查点的价值,不在于频繁打断执行。

而在于避免一个错误决定向下扩散。

规则四:“已完成”必须同时说明验证方式

以后不能只接受一句“已经完成”。

它还需要说明:

  • 实际修改了什么
  • 使用什么方式验证
  • 哪些部分已经验证
  • 哪些部分仍然没有验证

例如:

已更新数据库记录,并通过直接查询确认数据为空。

和:

已修改前端代码,类型检查通过,但视觉效果尚未验证。

这两句话表达的是完全不同的完成程度。

把验证方式一起暴露出来,比我反复追问“你真的测过了吗”更有效。

规则五:编造事实和验证不到位,不能混为一谈

这次错误清单里,有两类问题很容易被放在一起。

第一类,是它说了一件根本没有发生的事。

例如声称数据已经清空,但实际没有执行。

第二类,是它进行了检查,但检查方法不足以支持结论。

例如只跑了类型检查,就认为 UI 已经验证。

两者都需要修正,但性质不同。

前者涉及最基本的事实状态,属于必须立刻停下并明确承认的红线。

后者是验证方法的问题,可以通过流程、测试和工具改进。

如果所有错误都被模糊地归入“验证不够”,就会低估第一类问题的严重程度。

不是所有教训都应该继续写进 CLAUDE.md

复盘后,我确实把一些规则写进了项目的 CLAUDE.md。

但我也开始意识到,不是每犯一次错,都应该往同一个文件里追加一句要求。

更合理的分工是:

  • 长期协作原则和表达要求,写进 CLAUDE.md
  • 已经确认的产品决定,写进决策日志
  • 已完成和未完成的工作,写进实现日志和待办
  • 必须稳定执行的检查,尽量交给测试、脚本或自动化机制
  • 视觉判断、产品体验和优先级,仍然由人负责

否则,规则越来越多,最终只会得到一份很长、却未必真正被遵守的说明书。

真正需要解决的不是“怎样再写一条更好的 Prompt”。

而是:

这个项目的状态,应该由什么来记录?这个结论,应该用什么方式验证?这项风险,应该由谁负责验收?

AI 降低了执行门槛,但没有取消管理

这次二十多个小时的协作让我更确定了一件事:

AI coding agent 并没有让项目管理消失。

它只是改变了管理对象。

过去,我需要讨论需求、确认方案和验收进度。

现在,我还需要管理上下文、验证方式、工具状态、执行范围,以及 agent 自己表达出来的确定性。

它确实让我能做更多事情。

但要让这种能力真正转化成稳定产出,靠的不是不停追加 Prompt,也不是把所有信任都交给一个越来越长的 session。

而是重新设计协作流程:

什么时候可以直接执行,什么时候必须先确认;

什么可以由 AI 验证,什么必须由人验收;

哪些信息留在对话里,哪些必须沉淀到项目外部;

什么时候继续,什么时候应该停下来重开。

上一篇里,我说使用 coding agent 会产生一笔“验证税”。

这笔税不可能完全消失。

但它可以被管理。

好的协作方式,不是要求 AI 永远不犯错,而是让错误更早暴露、让验证方式更明确、让项目状态不再只存在于聊天窗口里。

最后还有一条很个人、但对我很有效的判断:

真的被气到七窍生烟时,不要继续和它争论。

情绪有时也是流程已经失效的信号。

停下来,保存状态,换一个 session,通常比再逼问十轮更有效。