Codex总是改多了?用AGENTS.md和自动测试限制修改边界
一名开发者给Codex的任务只有一句话修复优惠券为空时接口报错的问题。十分钟后Bug确实修了但项目里多出了这些变化一个新的工具函数两个文件被统一格式化原有导出名称被调整测试框架配置被重写顺手升级了一个依赖与Bug无关的类型定义也被修改。每一项单独看都能解释组合在一起却让代码审查变得很难到底哪一行是必要修改哪一行只是AI认为“顺便优化一下”这类问题不能只靠一句“不要乱改”解决。更可靠的工程方法是把控制拆成四层仓库长期规则AGENTS.md当前任务边界任务提示结果正确性自动测试和静态检查修改必要性Git Diff人工审查AGENTS.md负责告诉Codex这个项目长期怎么工作任务提示负责限制这一次要做什么自动化命令负责证明代码能运行Git Diff负责确认它没有越界。一、AGENTS.md究竟解决什么问题根据Codex官方文档Codex会在开始工作前读取AGENTS.md并根据所在目录建立一条指令链。它适合保存长期有效的仓库信息例如项目使用什么运行环境安装、测试和Lint命令是什么哪些目录不能随意修改是否允许增加生产依赖公共接口能否重命名Bug修复必须补什么测试交付时需要报告哪些验证结果。AGENTS.md不是每次任务都要重新粘贴的超长提示词更像是“写给代码代理看的项目协作说明”。官方文档列出的主要加载逻辑可以概括为全局AGENTS.md↓项目根目录AGENTS.md↓当前路径中的子目录AGENTS.mdCodex从项目根目录向当前工作目录逐层查找规则。同一条规则发生冲突时更接近当前目录的文件会在合并后出现得更晚因此优先级更高。例如shop-api/├── AGENTS.md├── src/│ └── pricing.js└── services/└── payments/├── AGENTS.override.md└── refund.js根目录的AGENTS.md可以要求所有服务运行通用测试payments目录中的AGENTS.override.md则可以补充支付业务的特殊限制。但要注意AGENTS.md是行为指导不是操作系统级的权限隔离。它可以要求Codex不要修改某个目录却不能代替文件权限、沙箱、审批机制和CI检查。如果某项规则绝对不能被绕过应当通过权限、测试、Hooks或CI进行机械约束。Codex官方AGENTS.md说明https://learn.chatgpt.com/docs/agent-configuration/agents-md二、先准备一个可以复现的Bug下面使用一个不依赖第三方库的Node.js示例。项目结构codex-scope-case/├── AGENTS.md├── package.json├── src/│ └── pricing.js└── tests/└── pricing.test.jspackage.json{“name”: “codex-scope-case”,“private”: true,“scripts”: {“test”: “node --test”,“lint”: “node --check src/pricing.js node --check tests/pricing.test.js”}}原始的pricing.js“use strict”;function calculateTotal(items, coupon) {const subtotal items.reduce((sum, item) sum item.price * item.quantity,0);const percent coupon.percent;return Number((subtotal * (1 - percent / 100)).toFixed(2));}module.exports { calculateTotal };有优惠券时这段代码可以正常运行calculateTotal([{ price: 80, quantity: 1 },{ price: 60, quantity: 2 }],{ percent: 10 });// 180没有传入优惠券时calculateTotal([{ price: 80, quantity: 1 },{ price: 60, quantity: 2 }]);程序会访问undefined.percent最终抛出TypeError。问题并不复杂真正需要控制的是修复这个Bug时有没有必要重写价格模块、修改导出形式或者增加一个新的依赖答案显然是否定的。三、给项目写一份能执行的AGENTS.md可以在项目根目录创建下面这份文件Repository expectationsRuntime and commandsUse Node.js 20 or newer.Runnpm testafter behavior changes.Runnpm run lintbefore reporting completion.Change boundariesPrefer the smallest change that fixes the reproduced failure.Do not add production dependencies without explicit approval.Do not rename public exports unless the task explicitly requires it.Do not modify unrelated files or reformat the whole repository.Verification and handoffAdd or update a regression test for every bug fix.Report the root cause, changed files, commands run, results, and remaining risks.If a required command cannot run, state the exact blocker; do not claim success.这份规则不长但每一条都能对应到具体行为。写清楚真实命令“修改后请测试”太模糊。Codex可能不知道应该运行哪个测试也可能只检查代码表面是否合理。写成npm test和npm run lint后完成条件变得可以执行。写清楚不能顺手做什么“保持代码整洁”很容易被理解成允许大范围格式化和重构。“不要修改无关文件”“不要重命名公共导出”“增加生产依赖前需要明确批准”边界更加具体。要求交付证据不要只让Codex说“已经修复”。要求它列出根因、修改文件、运行命令和测试结果开发者才能快速判断这次交付是否可信。四、AGENTS.md不能替代当前任务提示AGENTS.md应该保存长期规则不适合塞入只针对某一个Bug的临时要求。这次任务可以这样写目标修复src/pricing.js在coupon未传入时抛出TypeError的问题。复现条件calculateTotal(items)不传第二个参数时失败。修改范围只修改解决该问题所需的文件。不要重构价格计算流程不要新增依赖不要修改公共导出名称。验证要求保留有优惠券时的现有行为新增“coupon缺失时返回原始小计”的回归测试运行npm test运行npm run lint检查git diff和git diff --check。交付格式说明根因、修改文件、验证结果和剩余风险。这段提示把官方推荐的四类信息都补齐了| 信息 | 本案例内容 || Goal | 修复coupon为空时的TypeError || Context | src/pricing.js及现有计算行为 || Constraints | 不重构、不加依赖、不改公共导出 || Done when | 测试、Lint、Diff检查全部完成 |模糊任务通常会迫使Codex自己补充假设。任务边界越清楚它越容易把精力放在真正需要修改的位置。五、什么叫“最小修改”针对当前Bug核心修改只需要一行修改前const percent coupon.percent;修改后const percent coupon?.percent ?? 0;完整结果“use strict”;function calculateTotal(items, coupon) {const subtotal items.reduce((sum, item) sum item.price * item.quantity,0);const percent coupon?.percent ?? 0;return Number((subtotal * (1 - percent / 100)).toFixed(2));}module.exports { calculateTotal };这个修改保留了原有结构没有创建新模块没有修改函数名称没有修改导出方式没有引入依赖没有重写金额计算逻辑没有处理任务范围外的优惠券校验规则。这里最后一点很重要。开发者可能会想到继续限制百分比必须位于0到100之间但当前需求只是修复coupon缺失。如果项目还没有定义非法百分比应该抛错、截断还是忽略Codex就不应该擅自决定业务规则。最小修改不是代码行数越少越好而是每一项修改都能直接对应已确认的需求或验证要求。六、Bug修复必须有回归测试测试文件使用Node.js内置的node:test不需要安装第三方测试框架“use strict”;const test require(“node:test”);const assert require(“node:assert/strict”);const {calculateTotal} require(“…/src/pricing”);const items [{ price: 80, quantity: 1 },{ price: 60, quantity: 2 }];test(“applies a percentage coupon”, () {assert.equal(calculateTotal(items, { percent: 10 }),180);});test(“returns the subtotal when coupon is missing”, () {assert.equal(calculateTotal(items),200);});test(“does not mutate the input array”, () {const before structuredClone(items);calculateTotal(items, { percent: 10 });assert.deepEqual(items, before);});运行测试npm test验证结果tests 3pass 3fail 0再执行语法检查npm run lint本案例中node --check会分别检查业务文件和测试文件的JavaScript语法。这组示例已在Node.js环境中实际运行3项测试全部通过Lint命令也正常完成。七、测试通过还不够必须检查Diff自动测试回答的是“已覆盖的行为有没有通过”Git Diff回答的是“究竟改了什么”。可以依次执行git status --shortgit diff --statgit diff – src/pricing.js tests/pricing.test.jsgit diff --check四个命令分别解决不同问题| 命令 | 主要用途 || git status --short | 查看哪些文件发生了变化 || git diff --stat | 快速识别修改规模是否异常 || git diff – 文件路径 | 逐行审查核心文件 || git diff --check | 检查空白错误和冲突标记等问题 |理想情况下这个任务只应该涉及M src/pricing.jsM tests/pricing.test.js如果Diff里出现package.json、锁文件、README或者其他业务模块就应该停下来追问这项修改是否解决当前Bug所必需是否属于AGENTS.md禁止的无关改动是否需要拆成另一个任务是否应该回退这部分变化Codex本身也提供代码审查能力。在Git仓库中可以使用/review检查未提交改动、指定提交或相对基础分支的差异。官方说明指出专用Review流程会报告有优先级的发现而不会直接修改工作树。官方代码审查说明https://learn.chatgpt.com/docs/code-review八、把AGENTS.md分层而不是无限加长当项目越来越大根目录AGENTS.md很容易变成几百行的规则集合最后既难维护也容易让关键约束被淹没。更合理的组织方式是shop-api/├── AGENTS.md├── src/│ ├── catalog/│ └── payments/│ ├── AGENTS.override.md│ └── refund.js└── tests/根目录保留全项目通用规则AGENTS.mdRun npm test after behavior changes.Do not add production dependencies without approval.Preserve public API compatibility.支付目录保存局部高风险规则src/payments/AGENTS.override.mdDo not change rounding behavior without a documented business decision.Never log card data, tokens, passwords, or complete payment payloads.Run npm run test:payments after changing payment logic.Every payment-state change requires a rollback or compensation-path review.这样做有两个好处第一普通模块不会被支付业务的特殊规则干扰。第二当Codex在payments目录工作时更接近该目录的规则会覆盖或补充根目录说明。官方文档还提到Codex通常在一次运行或一次TUI会话开始时建立指令链。如果修改了AGENTS.md但当前任务仍在沿用旧规则可以重新启动会话在目标目录确认加载情况。九、哪些内容不应该写进AGENTS.mdAGENTS.md很重要但并不适合承载所有信息。不要写临时任务需求“今天只修复第238号Issue”属于当前提示不是长期仓库规则。不要写无法执行的口号例如写出世界上最好的代码。始终保证百分百没有Bug。所有代码都必须完美。这些表达没有可验证标准无法帮助Codex判断完成状态。不要堆入大量格式规则格式、Lint和类型检查能够交给工具时应尽量由CI和命令执行而不是让AGENTS.md塞满几十条缩进与换行要求。不要存放敏感数据密码、Token、生产数据库地址、用户隐私和内部密钥都不应该写进AGENTS.md或任务提示。不要把规则文件当权限系统真正禁止写入的目录应通过沙箱、系统权限、审批策略或自动检查保护。提示词只能降低越界概率不能提供强制安全边界。十、把“别改多了”变成可以检查的流程一套适合真实项目的最小修改闭环可以固定为读取AGENTS.md复现问题确认根因提出最小修改计划修改必要文件添加回归测试运行最相关测试运行Lint或类型检查检查Git Diff报告结果和风险还可以在任务提示中加入下面这段通用要求先定位根因并说明最小修改计划再开始编辑。修改后运行最相关测试和项目规定的检查命令。检查git status、git diff和git diff --check。如果出现与任务无关的文件变化先停止并说明原因。最终输出根因修改文件验证命令与结果未覆盖风险。这段要求比“认真一点”“不要乱改”“帮我全部检查好”更有效因为每一步都有可观察结果。十一、工具订阅不是代码质量保证AGENTS.md、自动测试和Diff审查解决的是工程流程问题不是订阅充值问题。无论使用ChatGPT Plus、Codex、Claude Pro、Cursor还是Kiro工具都不会自动理解每个项目的业务边界更不会天然替代测试和人工Review。如果有ChatGPT Plus、Claude Pro、Grok、Gemini Advanced等会员充值需求可以通过gpt328了解。它是第三方AI会员充值平台解决的是订阅充值流程问题不是代码托管、API中转或自动测试平台。使用前应看清套餐说明、账号要求、到账说明和售后规则。真正决定AI编程结果是否可信的仍然是上下文、约束、验证和审查。十二、最终结论Codex“改得太多”通常来自四类问题仓库没有提供长期工程规则当前任务只写目标没有写修改边界测试命令没有进入完成标准交付前没有审查Git Diff。AGENTS.md可以让Codex进入仓库时先理解项目规则但它不是安全沙箱也不能替代CI。一套更稳妥的分工是| 控制层 | 解决的问题 || AGENTS.md | 项目长期如何工作 || 当前任务提示 | 这一次允许改什么 || 自动测试和Lint | 修改后是否满足已知要求 || Git Diff审查 | 是否出现无关或高风险改动 || 权限、沙箱和CI | 对关键边界进行机械约束 |当“不要改多了”被拆成明确规则、验证命令和审查步骤后Codex的修改才会从“看起来完成了”变成“可以验证、可以解释、可以交付”。

相关新闻

ESP32-S3驱动AMOLED电容触控屏:嵌入式GUI开发与LVGL实战指南

ESP32-S3驱动AMOLED电容触控屏:嵌入式GUI开发与LVGL实战指南

1. 项目概述:当ESP32-S3遇上电容触摸与AMOLED如果你玩过ESP32,大概率接触过那些经典的LCD屏,比如ST7789、ILI9341驱动的TFT屏。它们便宜、皮实,但总感觉差点意思:可视角度一般、色彩不够鲜艳、刷新率也有限&#xff0c…

2026/10/17 17:06:18 阅读更多 →
2026企业AI化转型白皮书:中国iPaaS市场势力强势突围

2026企业AI化转型白皮书:中国iPaaS市场势力强势突围

摘要在企业AI化转型的浪潮下,iPaaS(Integration Platform as a Service,集成平台即服务)作为企业打通“信息孤岛”、实现系统协同与流程自动化的核心工具,已成为数字化转型的必备基础设施。本报告旨在深入分析2026年中…

2026/10/19 13:59:44 阅读更多 →
Qwen-Image-Edit-Rapid-AIO完整指南:4步生成专业级AI图片的终极方案

Qwen-Image-Edit-Rapid-AIO完整指南:4步生成专业级AI图片的终极方案

Qwen-Image-Edit-Rapid-AIO完整指南:4步生成专业级AI图片的终极方案 【免费下载链接】Qwen-Image-Edit-Rapid-AIO 项目地址: https://ai.gitcode.com/hf_mirrors/Phr00t/Qwen-Image-Edit-Rapid-AIO Qwen-Image-Edit-Rapid-AIO是一个革命性的AI图像编辑工具包…

2026/10/16 15:22:40 阅读更多 →

最新新闻

车载Android音频HAL Server启动全流程拆解:从init到AudioFlinger

车载Android音频HAL Server启动全流程拆解:从init到AudioFlinger

车载Android项目里,音频问题占了启动阶段很大一部分工作量。一开机没声音、开机声音卡顿、语音助手唤醒失败、电话切音区不生效,追到最底层,几乎都会汇聚到一个进程:Audio HAL Server。很多同学知道有这么一个vendor进程&#xff…

2026/10/20 23:15:44 阅读更多 →
diagram-design 实战:用约束型规范让技术图会说话

diagram-design 实战:用约束型规范让技术图会说话

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次看到 “diagram-design” 这个标题,很多人会以为它只是教你怎么把图画得好看一点。但真正做过技术方案、写过设计文档、给团队讲过架构的人都知道,画图这件事从来不只是“美…

2026/10/20 23:15:44 阅读更多 →
令牌桶算法详解:从QoS限速原理到Linux tc与双桶三色标记实战

令牌桶算法详解:从QoS限速原理到Linux tc与双桶三色标记实战

1. 从一个真实场景说起:为什么你的视频会议总是卡 你有没有遇到过这种情况:家里宽带明明是500M,测速也跑得满,但只要一开视频会议,画面就开始糊,声音断断续续,与此同时后台的下载任务还在疯狂抢…

2026/10/20 23:15:44 阅读更多 →
单相全桥逆变器Simulink仿真:从SPWM调制到LC滤波参数设计与THD分析

单相全桥逆变器Simulink仿真:从SPWM调制到LC滤波参数设计与THD分析

做电力电子这块的人,大概都有过类似经历:理论上把单相全桥逆变器背得滚瓜烂熟,四个开关管怎么换流、SPWM怎么调制,画个拓扑图加几条波形就能交差;可真到了课程设计或项目里需要看到实际电性能时,才发现手边…

2026/10/20 23:15:44 阅读更多 →
PCA人脸识别实战:从零搭建特征脸系统与避坑指南

PCA人脸识别实战:从零搭建特征脸系统与避坑指南

人脸识别这个词听起来挺唬人,但真动手做起来,最经典的那套入门方案反而没那么玄乎。我最早接触这个方向的时候,以为非得搞个深度网络、跑上几十万张图才能出效果,后来发现用PCA(主成分分析)这套老方法&…

2026/10/20 23:15:44 阅读更多 →
context-mode设计模式:如何让同一套核心逻辑适配多种运行上下文

context-mode设计模式:如何让同一套核心逻辑适配多种运行上下文

1. 从"context-mode"这个词说起:它到底在解决什么问题第一次看到"context-mode"这个标题,很多人会下意识地把它当成某个框架里的配置项,或者某个库的开关参数。但如果你真的在工程一线待过几年,就会意识到这个…

2026/10/20 23:14:43 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →