一个Java开发人员最近在使用Codex维护公司的Spring Boot项目。

团队已经在仓库根目录配置了AGENTS.md,里面写着几条明确的开发要求:不能随意修改公共接口、不能引入未经批准的第三方依赖、修改数据库访问逻辑必须补充测试。

这些规则并不是临时加上去的。团队之前已经用Codex完成过多次开发任务,Agent也能够正确读取并复述AGENTS.md中的内容。

但一次订单接口优化之后,问题出现了。

开发人员原本只要求Codex减少订单查询中的重复逻辑。结果Agent不仅修改了Service,还顺手调整了公共DTO,新增了一个工具类依赖,甚至把原来用于兼容旧客户端的字段删除了。

代码编译通过,单元测试也全部正常。

直到Code Review时,同事才发现这些修改已经违反团队规范。

开发人员重新询问Codex:“AGENTS.md不是明确写了不能随意修改公共接口吗?”

Agent能够解释这条规则,却已经做出了不符合要求的修改。

规则明明写在那里,Agent也读过,为什么真正执行任务时还是没有遵守?

这个问题不能简单理解成模型不够聪明,也不能完全归因于AGENTS.md写得不详细。

真正需要理解的是:AGENTS.md属于Agent的项目级工作指令,但它并不是编译器、权限系统,也不是能够自动阻止违规代码进入仓库的工程门禁。

随着AI编程工具承担越来越复杂的代码修改任务,团队必须把“模型理解规则”和“系统强制执行规则”区分开。

一、先还原现场:Agent究竟违反了哪几条规则?

先看这次任务原本的要求。

开发人员只希望优化订单查询接口,减少重复的对象转换,提高代码可维护性,不需要修改对外API,也不需要调整数据库结构。

但Codex分析代码后,发现多个Service使用相似的DTO转换逻辑,于是尝试统一数据结构。

从局部代码质量来看,这个修改似乎有道理。

它减少了重复类,让方法调用更加整洁,测试也能够正常通过。

但从项目整体来看,问题就出现了。

公共DTO可能已经被其他模块、旧版客户端和第三方系统依赖。修改字段名称或删除字段,即使当前项目编译通过,也不代表原有调用方仍然兼容。

新增依赖也是类似情况。

Agent可能认为引入一个成熟工具库,比手写转换方法更加方便,但团队禁止未经审批的新依赖,可能是为了控制许可证、安全风险、供应链和长期维护成本。

至于数据库访问逻辑,如果没有补充相应测试,未来某个边界条件出现问题时,团队可能缺少必要的回归保护。

所以,这次Codex犯的不是语法错误。

它完成了局部优化,却越过了项目原本约定的修改边界。

这也是为什么单纯运行构建和测试,未必能够发现问题。

二、AGENTS.md被读取,不代表每项规则都会自动执行

AGENTS.md可以帮助Codex理解项目组织方式、编码约定、测试命令以及开发流程。

但要注意,读取规则与执行规则是两件事。

例如,Agent读取了“不要随意修改公共接口”,接下来还需要判断哪些文件属于公共接口、什么变化属于兼容性修改,以及本次任务是否获得了例外授权。

如果规则只写了一句“保持项目兼容性”,那么它仍然需要根据上下文理解什么叫兼容。

对于人类开发者,团队可能早就有共识:订单DTO中的某些字段虽然看起来没用,但旧版App仍然依赖。

然而Agent未必能从当前仓库直接看到这些外部依赖。

尤其在复杂项目中,公共DTO可能同时被Web端、移动端、其他微服务和第三方合作系统调用。

Codex能够搜索当前仓库,却不意味着能够自动识别所有仓库之外的使用关系。

因此,不能把规则执行寄托在“Agent应该能够理解”上。

对于后果严重的约束,团队必须把它转成能够检查的具体条件。

三、AGENTS.md还有作用范围,放错位置也可能造成误判

很多团队会在仓库根目录放一份AGENTS.md,然后默认所有Agent任务都会按照这份文件工作。

但Codex的项目指令具有目录作用范围。

根目录的规则通常覆盖其目录树,子目录也可以配置自己的AGENTS.md,为特定模块提供更具体的要求。

当相关文件受到多层指令约束时,需要结合指令作用范围及优先级判断;较深目录的规则可在冲突时优先于上层规则,但更高优先级的直接指令仍然不能忽略。

例如,一个仓库同时包含:

  • 根目录:公共编码规范。

  • services/order:订单服务的业务约束。

  • shared/api:公共接口兼容性规则。

如果本次任务原本只在订单模块中进行,后来Agent修改范围扩大到公共接口目录,就必须确认该目录适用的规则已经被正确识别。

同样,如果开发人员从某个子目录启动任务,或者在多个仓库之间切换工作目录,也应检查当前项目根目录和实际加载的指令。

不能仅凭仓库里存在AGENTS.md,就推断当前执行过程已经正确使用了全部相关规则。

排查时,第一步应确认的不是文件写了什么,而是:

当前任务实际加载了哪些规则,这些规则分别约束哪些文件。

四、为什么规则越写越长,Agent反而更容易遗漏重点?

有些团队发现Codex偶尔违反规则,就不断往AGENTS.md里增加内容。

最开始只有十几条,后来变成几十条,最终几千字甚至上万字。

里面既包含代码风格、提交格式、测试要求,也包括临时开发记录、历史问题和重复的架构说明。

这会产生新的问题。

首先,真正重要的规则容易淹没在大量普通建议里。

其次,不同时间添加的要求可能发生冲突。例如,前面要求优先复用项目已有依赖,后面又要求采用某个新工具库。

第三,部分规则缺少明确适用范围。原本只针对支付模块的约束,可能被写成全项目通用要求。

第四,规则过度依赖具体方法名或文件路径。当项目重构后,这些描述可能已经过时。

更合理的方式,是将AGENTS.md拆成少量明确、稳定、可执行的约束。

例如,不要只写“修改代码时要小心兼容性”,而应写明公共API属于受保护范围,修改前需要列出兼容性影响,并通过相关契约测试。

规则的价值不取决于写了多少,而取决于Agent能否判断何时适用,以及团队能否验证它有没有被遵守。

五、为什么Codex会在优化过程中扩大修改范围?

这次事故还有一个更深层的原因:任务目标和修改边界没有同时定义。

开发人员说“优化订单查询”,Agent可能理解为只要最终结果更好,就可以调整相关实现。

于是它从Controller修改到Service,再从Service追踪到DTO,最后又认为统一公共结构可以进一步减少重复代码。

从技术路径上看,这种推导具有一定合理性。

但工程开发不能只考虑代码是否更简洁,还需要考虑变更范围是否受到授权。

一次小规模性能优化,可能不允许改变对外接口;一次局部重构,也不应该自动演变成全项目架构调整。

因此,任务说明中最好明确两类内容:

允许修改的范围:本次可以调整哪些模块、类和行为。

禁止越过的边界:哪些公共契约、数据库结构和依赖声明不能未经确认就改变。

如果Agent发现确实需要突破边界,正确动作应该是暂停并说明原因,等待开发人员批准,而不是先改完再解释为什么这样更好。

这并不是限制Agent的能力,而是让它在明确的授权范围内发挥能力。

六、怎样把AGENTS.md写成真正有用的工程规则?

我更建议采用“规则、适用范围、正确做法、验证方式”四个部分。

例如:

# 项目开发规则

## 公共API
- 不得擅自删除、重命名已有响应字段
- 如确需变更,先说明兼容性影响并请求确认
- 修改后运行API契约测试

## 第三方依赖
- 优先使用项目已有依赖
- 新增依赖前说明用途、版本和替代方案
- 未获批准不得修改依赖清单

## 数据库
- 修改Mapper或SQL时补充对应回归测试
- 不得擅自修改生产数据库结构

这样的规则比“遵守最佳实践”“保证代码质量”更加清晰。

还要给Agent提供正确路径。

例如,发现旧DTO结构复杂时,可以先在内部增加转换层,而不是直接破坏公共字段。

如果现有依赖无法满足需求,应该先提出候选方案,让开发人员决定是否引入新依赖。

对于复杂的多模块仓库,还可以把不同模块的专属要求放到对应目录,避免一份根目录规则覆盖所有细节。

但这里仍然存在一个边界:规则写得足够清楚,只能降低误用概率,不能自动形成强制执行保障。

七、为什么CI全部通过,还是不能证明符合团队规范?

这是本次事件最值得深入分析的地方。

团队原本认为,只要Codex修改代码后能够成功编译、通过测试,就说明改造基本安全。

但CI只能验证已经配置的检查内容。

如果测试没有覆盖旧版客户端的接口契约,那么删除某个公共字段也可能不会触发失败。

如果依赖检查没有设置新增依赖审批规则,那么Agent即使引入一个未经批准的工具库,Maven构建也可能正常成功。

如果团队要求修改数据库代码必须补充测试,但CI没有检查相关测试要求,构建系统也不会自动知道这次提交违反了流程。

因此,测试全绿不等于团队规则全部满足。

更合理的方式,是把关键规则映射到具体工程检查。

例如,公共API变更可以使用契约测试或API差异检查;新增依赖可以结合依赖清单变化和审批流程;代码分层约束可以通过架构测试或静态分析辅助验证。

涉及生产数据库结构、高风险支付逻辑和权限边界的变更,还应该保留必要的人工审批。

AGENTS.md告诉Agent应该怎么做,CI和权限控制则决定哪些违规结果不能被接受。

八、真正可靠的流程:让Agent先声明修改边界,再提交证据

为了避免这种问题反复出现,可以调整Codex的任务执行方式。

第一步,要求Agent先读取相关项目规则,并列出本次任务涉及的关键约束。

第二步,在修改前输出简短计划,明确预计修改哪些模块,以及哪些行为必须保持不变。

第三步,实施代码修改,但对新增依赖、公共契约和数据库结构变更设置确认门槛。

第四步,修改完成后检查Git Diff,不只看代码是否更简洁,还要检查有没有超出计划的文件变化。

第五步,运行对应的单元测试、契约测试和静态检查。

第六步,生成变更说明,列出实际修改范围、测试结果以及尚未验证的风险。

例如,一个订单查询优化任务,Agent最终提交的变更说明应该能够回答:

为什么修改这些文件?有没有改变对外响应?是否新增依赖?数据库查询行为是否变化?执行了哪些测试?

如果发现改动范围明显超出原计划,就应当重新评审,而不是因为测试通过就直接合并。

这样可以把原本隐藏在Agent执行过程中的判断,变成开发人员能够检查的证据。

九、多Agent并行开发,为什么更需要工程门禁?

如果项目已经使用多个Codex任务并行开发,还会出现额外风险。

例如,Agent A负责订单查询,Agent B负责报表接口。两个任务分别在不同Git worktree中执行。

它们可能都正确读取了各自启动时适用的AGENTS.md,但任务执行期间,团队又调整了公共接口规范。

如果两个工作区没有及时同步规则,Agent可能继续按照旧要求生成代码。

还有一种情况:两个Agent分别修改不同模块,各自的测试都通过,但合并后出现公共契约冲突。

这说明单个任务符合规则,不代表多个任务的最终组合一定符合规则。

并行场景下,更需要在合并阶段统一检查依赖、API契约和架构约束。

如果关键规则发生变化,还应明确是否要求进行中的任务重新加载规则,并在最终提交前再次验证。

多Agent可以提高代码产出速度,但不能让每个Agent自行决定最终的工程合规结果。

十、怎样快速排查一次真实的AGENTS.md违规修改?

如果已经发现Codex违反团队规范,不建议只要求它“重新认真阅读AGENTS.md”。

更有效的排查应按实际执行路径展开。

先确认当前仓库和工作目录,找出相关AGENTS.md的作用范围,检查是否存在子目录规则或相互冲突的要求。

再查看本次任务的原始指令,判断开发人员是否给出了与项目规则冲突的要求,以及Agent有没有明确指出冲突。

随后检查Git Diff,记录哪些文件被修改、哪些变化超出了任务范围。

接着核查Agent的实际执行过程:是否读取了相关规则,是否识别了公共DTO属于受保护范围,是否在修改前请求批准。

最后再检查CI和Code Review:为什么这次违规没有在合并前被自动发现?

这里要区分两种情况。

如果规则根本没有正确加载,应修复规则发现和作用范围问题。

如果规则已加载、Agent也能够解释,但仍然生成违规变更,那么重点应放在任务边界、可执行检查和审批机制上。

不能把所有问题都归结为“提示词还不够强”。

十一、用一个指标判断工程规则是否真正生效

这篇只突出一个核心指标:关键工程规则违规率。

可以定义为:

关键规则违规率 = 违反关键规则的变更数 ÷ 涉及关键规则的变更总数。

例如,一个月内有100个涉及公共API、依赖或数据库访问的变更,其中8个在提交审查时违反了团队明确规定的规则,那么违规率为8%。

这组数字只是说明统计方法,并非实际项目数据。

这里需要把“提交阶段出现违规”和“违规代码最终进入主分支”区分开。

前者反映Agent和开发流程生成违规变更的频率;后者反映CI与审核能否有效拦截。

如果增加严格的检查之后,违规提交仍然存在,但没有违规代码能够合并,说明门禁有所改善,却不能证明Agent本身已经完全遵守规则。

反过来,如果通过缩小任务范围减少违规,也要检查代码交付速度和任务完成质量是否受到不合理影响。

真正有意义的验证,是让关键规则在真实开发任务中能够被识别、被检查,并在违反时及时阻止不安全的变更。

十二、Plus和Pro怎么判断?

如果日常主要使用ChatGPT、Codex维护单个项目,编写AGENTS.md、检查代码规范、执行单元测试和修改少量模块,Plus通常够用。

如果需要长期维护大型代码仓库,开展多个Agent并行开发,分析跨模块变更、API契约、架构约束和复杂CI流程,并持续进行多轮代码审查与回归验证,Pro更适合高频、长任务的工程工作流。

但需要明确,Pro并不意味着Agent一定不会违反AGENTS.md。

套餐主要影响可用能力和使用资源,不能代替项目规则设计、代码访问权限、CI门禁和人工审核。

团队最终需要判断的,不只是Agent能一次完成多少代码,而是它生成的变更能否稳定满足工程要求。

最后

Agent明明读了AGENTS.md,为什么改完代码还是违反团队规范?

因为项目规则被读取,不代表所有规则都已经被正确理解、持续应用并强制验证。

规则可能缺少明确范围,也可能与任务目标产生冲突;Agent为了完成局部优化,还可能扩大修改范围,影响公共契约和其他业务模块。

真正可靠的工程路径是:

明确规则作用范围 → 定义修改边界 → 给出正确实现路径 → 设置高风险审批 → 将关键约束转成CI检查 → 审查变更证据 → 验证违规率。

随着ChatGPT、Codex越来越擅长理解代码和执行复杂任务,工程团队需要关注的重点,也会从“Agent能不能写代码”,转向“Agent生成的代码能不能被可靠约束”。

AGENTS.md仍然很有价值,但它应该是工程治理的起点,而不是最后一道防线。

真正成熟的AI编程工作流,不是要求Agent永远不犯错,而是让关键错误能够被发现、被阻止,并且不会在无人确认的情况下进入生产系统。

持续分享 Codex、大模型开发与 AI 编程实战内容

也整理了稳定的 Plus/Pro 会员订阅渠道,有需要可自取。

Logo

更多推荐