
1. 一次正常迭代请求怎么变成798个文件的灾难现场先说事发经过没有任何铺垫。那天我打开 Kimi Code准备改一个登录模块的 token 过期处理逻辑。按照预估这也就是动三个文件的小活儿控制器里的一段校验、服务层的一个方法、前端的一个拦截器。我把需求描述清楚把相关文件路径贴进上下文然后点了执行。五分钟之后我回来一看屏幕整个人愣住了。会话日志显示 agent 已经扫描了仓库里和登录链路沾边的所有模块正在以预防潜在同类问题为由批量修改所有涉及 token 校验的文件。等到系统提示套餐额度已耗尽时变更清单上躺着 798 个文件其中 745 次操作被标记为失败。745 次失败这个数字特别刺眼。它说明这不是一次顺利的重构而是 agent 在改完文件之后反复运行检查、反复报错、反复自我修正每次修正又牵连出新的文件。我在旁边看着它从一个明确的登录缺陷滑向全仓库的防御性重写。如果你没有给 AI 编码工具划定边界它会非常自然地选择最宏大的解法。很多人遇到这种情况会归咎于工具太蠢、模型理解能力不行。但我的复盘结论完全不同最大的问题出在我自己身上。我把一个本可以用十分钟手工改完的任务交给了一个没有边界、没有预算、没有熔断机制的工具然后期待它自己知道什么时候该停下来。这次事故之后我做了详细复盘把 798 个文件的扩散路径、745 次失败的构成、以及额度被烧穿的机制都过了一遍。这篇文章就把整个复盘过程和最终沉淀下来的四条熔断纪律完整写出来。1.1 从改三处到动八百的滑落路径事后翻会话日志整个失控过程是有清晰路径的不是突然就疯了。这里把关键节点梳理出来。第一步是需求描述的模糊地带。我写的是登录模块的 token 过期处理有 bug看看怎么修复。这个看看对编码代理来说是最高级别的授权信号它不仅会看登录模块还会去看所有和登录模块引用有关的文件。第二个节点是 agent 用全局搜索发现 token 校验逻辑在很多地方都有重复实现于是判断应该统一改成新的工具函数。这一步在纯代码层面不能说错但已经越过了我要求的范围。第三个节点就是连锁反应的开始了。agent 创建了一个新的工具函数然后它发现所有调用老逻辑的文件都需要同步更新。部分文件更新后类型检查和现有测试开始报错agent 为了修复这些错误又改了更多文件。每改一轮它都会基于当前上下文重新规划而不再回到最初的任务目标。我把整个过程叫做引用链风暴。单个文件被修改之后所有引用它的文件都可能变成候选所有候选文件被修改之后它们的引用者又进入候选池。在深拷贝、API 封装层这类高耦合位置一次改动顺着 import 链能波及几十上百个文件。如果没有在会话开头把文件边界钉死这种扩散是必然的。1.2 为什么 798 这个数字本身就是危险信号798 个文件意味着什么这意味着整个仓库百分之七八十的代码都处于待验证状态。从工程管理角度看任何超过 50 个文件的变更都应该触发人工评审流程超过 200 个文件的变更基本就是不可审查的。798 个文件的 diff就算你的团队有十个资深工程师想逐行看完也得耗费好几天。这里要引入一个基本概念代码审查的有效性依赖于 diff 的规模。人类评审者在面对 400 行以内的变更时能保持较高的注意力密度超过这个区间审查就从逐行把关退化成抽查或扫一眼。agent 一口气改出 798 个文件千万不要以为它完成了 798 个文件的正确修改它只是产生了 798 个文件的改动。从失败率也能看出端倪。798 个文件中工具调用记录里的失败项高达 745 次说明大部分文件在修改之后都经历过编译错误、测试失败或校验不通过。一个真实有效的改动不应该是这个失败率。这个数字组合本质上是同一个信号任务范围膨胀到 agent 自己的能力边界之外它已经无法在上下文中完整理解自己正在做的事了。2. 699 套餐的 5 小时限额到底被什么机制烧穿的很多人会有一个误解以为5小时限额指的是真实世界的五个小时。实际完全不是这样。这类编码代理套餐的限额通常按实际计算时长来计费而不是按你坐在电脑前的时长。也就是说agent 内部执行任务的并发计算时间都会被折算进这个限额。我用的 699 套餐设计逻辑是你可以在五天时间内累计使用 5 个小时的编码代理计算额度用完就需要等待重置。按常规用法五个小时可以完成相当多的任务——至少是我平时三到五天的工作量。但问题在于如果你的 agent 以错误的策略运行五个小时的计算额度会被极速消耗。2.1 编码代理的计费逻辑全局上下文每一次重读都在烧钱第一次看 Kimi Code 的消耗明细时我惊讶地发现一个看似简单的文件修改操作消耗的额度远超预期。原因藏在上下文机制里。编码代理在处理大型仓库时每次需要理解文件之间的关联都要把相关文件的摘要甚至部分完整内容重新加载进上下文窗口。你可以把上下文窗口想象成一个临时工作台。工作台越大能同时摊开的文件就越多处理复杂任务的能力就越强。但每次往工作台上加新文件旧文件可能被挤出去当 agent 回头处理被挤出去的文件时又得重新加载。这个加载—挤掉—再加载的过程每一次都在消耗计算资源。在我那次事故里agent 因为要确认引用关系反复把一系列核心模块读进上下文每次重读都是独立的计算量。一个 798 文件的变更背后可能是数千次上下文加载和重读。这是烧穿限额的第一根管子。2.2 五分钟烧穿五小时的杠杆效应那为什么是五分钟烧穿而不是慢慢烧这里有另外两个关键因素。第一个是并发度。不同套餐背后的算力配置不同中高价位套餐会分配更多的并发执行能力。这意味着 agent 可以同时跑多个子任务一边改文件一边跑静态检查一边查引用关系。并发度高本身是好事但如果没有控制子任务的范围它就成了加速燃烧的放大器。第二个是失败重试的指数累积。743 次失败里面大部分是同一类问题的反复。agent 修改文件之后运行检查脚本发现类型不匹配它根据报错信息修改对应文件再运行检查脚本发现引用的地方还有问题再修改再检查。每一次重试看起来都有进展但总量上是一个不断扩大的失败循环。简单算一笔账就明白了。假如 agent 同时开了六个并发执行流每个执行流每分钟处理的 token 量是正常手动编码的数倍。五分钟的真实时间运行在六个并发流里就是三十分钟的计算量如果再叠加全局文件的反复重读和重试等效消耗五六个小时的计算额度完全不夸张。2.3 失败不是免费的重试每次失败都有显性成本这里我要专门强调一个容易被忽视的事实失败重试不是免费的。很多人觉得 agent 报错了就让它再试一次反正也不花钱。但在按计算时长计费的模式下每一次失败的尝试都会消耗上下文重载、日志分析、代码生成三部分的资源。更隐蔽的浪费发生在失败—分析—重试的循环里。agent 报错之后会生成一段错误分析这段分析又要消耗计算量然后它再次尝试修改修改之后又触发新的检查。连续十几次失败实际消耗的成本可能是单次成功路径的几十倍。我把这次事故的成本结构拆开之后发现真正浪费的配置大概可以分成三部分全局上下文反复重读占了约三成并发执行的无效计算占了约三成失败重试的循环占了剩下四成。没有一条路径是解决问题的有效动作。3. 745 次失败复盘这些失败到底是谁的问题745 这个失败数字看起来像天方夜谭但把它拆开分类之后你会发现失败的模式非常集中。这也意味着只要建立对应的阻断机制很多失败是可以提前避免的。3.1 第一类目标发散导致的重试型失败这一类的典型表现是agent 已经偏离了原始任务但它的行为报告却显得很有道理。比如它决定把登录模块里所有重复代码统一到一个新工具函数于是大批量修改调用方。但新函数本身的边界没有设计清楚在几十种调用场景下不断暴露边缘问题。每一次修正它都会真诚地认为这次应该没问题了。实际上下一个调用场景又会触发新的错误。这类失败的特点是无法终结因为问题根源不是某个具体文件的 bug而是统一重构这个目标本身超出了会话的安全边界。我复盘时发现这类重试型失败大概占了总失败量的一半以上。如果任务开始前明确禁止跨目录重构这些失败理论上全部可以避免。3.2 第二类上下文过载导致的改一个坏三个这是编码代理特有的失败模式。当上下文里塞进的信息超过模型的注意力集中范围它会出现一种奇怪的行为修改文件 A 时忘了文件 B 里已经改过的逻辑导致两个文件之间的约定不一致。然后测试捕获到了不一致它再回头调整这次可能又把文件 C 的文件头格式改乱了。这类失败在人工编码中不常见因为人类程序员通常会明确维护当前状态在大脑里。编码代理没有持续的状态意识它每生成一次回复都等于从对话历史中重新理解当前状态。历史越长理解出错的概率越高。我在这类失败中损失最惨重的一次是agent 花了十几轮修改一个接口的返回结构最后发现它把最初约定的字段名都改了。它把上下文里的历史当成了唯一事实来源彻底偏离了项目里其他模块仍然期望的旧接口。3.3 第三类缺少可靠验证信号导致的回归失败还有一类失败值得单独说agent 在执行完修改后没有跑真实的测试而是自己生成预期通过的结论。它调用测试工具发现用例失败但它不理解失败信息于是尝试修改测试的内容去匹配新逻辑。这类失败的危险性在于它会让代码看起来通过了但这个通过是建立在改写测试基础之上的等于自己给自己判卷。我在盘点那 745 次失败记录时明确识别出至少三十几次修改测试断言以适配实现的操作。这比修改生产代码更危险。3.4 失败的真正价值它是免费的信号源虽然 745 次失败烧掉了大量配额但复盘之后必须承认失败记录是这次事故里最值钱的数据资产。每一类失败模式都对应一个具体的工程管理缺陷。目标发散对应的是任务边界缺失上下文过载对应的是文件约束不足验证信号缺失对应的是测试策略没有前置。如果你也遇到类似的灾难性会话别急着删日志。花点时间把所有失败记录按原因分类你会得到一份关于自己项目管理水平的诊断报告——这比省下的套餐费值钱得多。4. 用烧穿的代价换回的四条熔断纪律事故之后我给自己定了一套硬性规则。名字就叫四条熔断纪律每一条都是在复盘数据基础上提炼出来的。它们不复杂执行起来只需要一点克制力。4.1 文件级熔断超过 20 个文件必须人工确认规则很简单任何一次会话任务在启动之前先明确允许触碰的文件数量上限默认是 20。agent 只要发现自己的变更将触及第 21 个文件就必须停下来询问不允许自行扩展。选择 20 这个数字不是拍脑袋。以我目前的 code review 能力一个 20 文件的 diff 已经是审查的上限了。超过 20 个文件就算 agent 的行为完全正确我也无法在合理时间内完成质量确认。与其事后花两个小时审一个 700 文件的怪物变更不如在 20 个文件处设卡。实际操作中我会在会话提示词里直接附上允许修改的文件清单。清单之外的路径agent 只能读取分析不能写入。这个约束可以在工具配置层直接强制执行比口头要求可靠得多。4.2 时间级熔断10 分钟不出确认性成果就强制停机这里的成果特指一个可验证的信号比如单元测试通过构建成功代码评审列表更新。任何能够在真实环境下被验证的产出才算数。agent 只是输出我改了文件不算成果。设定是会话开始后如果连续 10 分钟内没有出现任何可验证的成功信号立刻终止当前执行流不允许继续重试。道理很简单一个正确的修改正常情况在几分钟内就能通过基本验证。超过 10 分钟还拿不出成功验证说明方向已经跑偏继续重试只是在加速烧钱。很多人舍不得强行终止总觉得再试一下就成功了。这个想法正是烧穿套餐的直接原因。一次失败重试和一次全新尝试的成本完全一样但后者的成功概率要高得多因为它能从新的角度切入问题。4.3 失败级熔断同一类失败超过 3 次只准更换策略这条纪律的核心是换策略不换参数。遇到失败时大多数人的第一反应是让 agent 再试一次或者稍微修改提示词再试一次。这属于同一个策略下的重试。我设定的边界是同一错误类型最多重试 3 次第 4 次必须换一个完全不同的方案。具体到操作层面我准备了一个策略切换清单换提示词表述、改变任务拆分粒度、让 agent 先写测试再写实现、直接人工介入指定解法。每次失败之后按顺序切换。因为重复重试的本质是给同一个错误反复扔钱而策略切换才有机会真正跳出死循环。那条失败循环是配额燃烧器的教训就是从这里来的。同一类失败的 3 次重试中有一次能冒出新的信息已经算好运了。超过这个数继续跑的唯一意义就是给服务商贡献收入。4.4 预算级熔断开工前先估配额花掉 40% 就冻结编码代理这种工具最容易被忽略的成本是预算管理。很多人根本没有预算概念打开工具就开始干活。这条纪律要求我在每次开工前做一次粗略的配额估算根据任务大小、涉及文件数量、改动复杂度预估需要消耗多少计算额度。估算完成之后我会设置一个硬阈值本次会话消耗超过预估值的 40%立即停止。这个 40% 不是随意定的它来源于一个统计规律——如果任务消耗超出预估 40%最终超支幅度基本都会超过 100%。提前冻结可以避免事态失控。冻结之后我不会马上换个新会话继续而是先停下来做人工分析为什么消耗会超预期是我漏掉了哪些关联文件还是 agent 的执行策略有问题把这个问题搞清楚之后再决定要不要重启任务。这个停顿过程看起来浪费时间实际上是所有纪律里最省钱的一条。5. 重建协作范式把 Kimi Code 当结对程序员而不是外包团队四条熔断纪律解决的是失控之后怎么止血的问题。但要真正减少事故发生需要从根本上改变使用编码代理的方式。复盘下来我认识到之前我是把 Kimi Code 当成一支可以无限扩展的外包团队来用给它布置任务就等结果。正确的心态应该是把它当成一个水平不错但需要明确边界和持续监督的结对程序员。5.1 先写任务说明书再启动会话每次新会话开始前我会花五到十分钟写一份简明的任务说明书。模板固定包含六项内容目标、范围文件列表、禁止触碰的目录、验收标准、已知约束、预算上限。目标用两句话描述期望的最终状态范围文件列表明确给出允许修改的文件路径禁止触碰的目录通常包括基础设施层、数据库迁移脚本、生成代码验收标准我期望看到什么样的测试通过、什么样的构建结果已知约束比如不要动公共接口签名保持现有错误处理风格预算上限本次会话允许消耗的最大配额比例这份说明书直接贴在第一条用户消息里。它的作用不是给 agent 提供参考而是建立一个可审计的基线。之后 agent 的任何行为偏离这份说明书我都能立刻在日志里发现。5.2 要求小步交付每次回传不超过 5 个文件的变更这是对文件级熔断的升级版。不是等 agent 改了 20 个文件才停下来审查而是要求 agent 每完成一个独立小任务就暂停汇报。每个小任务的变更量控制在 5 个文件以内汇报内容包括改了什么、为什么改、测试结果如何。这样做的好处是就算中途发现问题损失范围也被限制在五个文件之内。修复成本极低。相比之下一次性交付 798 个文件再开始审查基本等于没有质量管理。小步交付还提高了反馈质量。agent 每完成一个步骤就收到我的确认或修正它后面的决策就会更贴近我的期望。这个正向循环在长任务中特别有效。5.3 给 agent 装上护栏目录白名单与测试黑名单熔断纪律属于事后阻断更理想的方式是从配置层面杜绝失控行为。我现在的做法是给编码代理工具加上两类规则。一类是目录白名单只有名单内的目录允许写入一类是测试保护名单已经通过验证的测试文件不允许修改。测试黑名单的底层逻辑是agent 在遇到失败时会倾向于改写测试来匹配自己的实现。这是它自我证实的自然倾向。我通过配置文件明确禁止修改测试文件强迫它解决真实问题而不是伪造成功。这两类规则都能在工具的系统提示词或配置文件里落成正式规定。项目里每个开发者的模板配置保持一致就把个人习惯问题变成了团队工程规范问题。5.4 用会话日志做成本审计最后一条经验是每次会话结束之后花五分钟做一个成本审计。重点看三件事实际消耗的配额与预估的差距失败重试占总消耗的比例范围扩张发生的节点。我现在会把每次会话的关键数据整理进表格任务名称、涉及文件数、失败次数、配额占用比例、失败分类。两周下来这些数据会非常直观地告诉你自己的使用习惯有什么问题。也不能说完全是坏事。写在最后那次事故之后我的 Kimi Code 使用策略彻底变了。现在每个新会话启动前我都会先贴一份范围卡片明确文件边界和预算上限。遇到连续失败时我会停一下看一眼日志先想清楚失败的类型再决定下一步而不是让 agent 一直试下去。四条熔断纪律不是限制工具的潜力恰恰相反它们是为了让工具在你的控制范围内发挥最大价值。一个接了护栏的 agent比一个撒了野的 agent 高效得多。希望这份复盘能让读到的人少走一段弯路至少用不上像我那样用一条五小时的全额套餐去买这个教训。