返回教程目录OpenAI 官方参考

CODEXGUIDE / 项目理解与上下文 03

Codex 只读调查:先把项目摸清楚再改代码

面对复杂或高风险的任务,直接让 Codex 动手是最贵的做法。改错了要回滚,改多了要排查,而它本来可以先只做一件事:把项目摸清楚,把证据交给你,再由你决定改不改。

codx编辑组最后验证 2,1558 分钟
配图采集环境:macOS 15.7.5(Build 24G624);Codex/ChatGPT App 26.721.41059;2026-08-21 核验。Codex 实操部分在 Windows 环境完成,正文会单独说明。

先摸清项目,再决定改不改

面对复杂或高风险的任务,直接让 Codex 动手是最贵的做法。改错了要回滚,改多了要排查,而它本来可以先只做一件事:把项目摸清楚,把证据交给你,再由你决定改不改。

这篇文章我把一次完整的只读调查走了两遍:先在本机用只读命令手动做一遍,再把同一个调查框架交给 Codex 执行。两遍都停在批准修改之前,并且用 Git 状态证明调查期间没有产生任何改动。

只读调查总览
只读调查总览
图一 只读调查的核心:先把事实、推断和未知项分开,再决定要不要允许修改。

如果你还没区分过“让 Codex 调查”和“让 Codex 修改”,可以先阅读“Codex 从目录到入口”,再回到本文的调查步骤。

哪些任务适合先调查

不是所有任务都需要只读调查。改一行文案、加一个日志,直接做更快。值得先调查的通常是这几类:

  • 涉及多个目录或模块,影响范围一眼看不全。
  • 仓库里有历史代码、生成代码或你不熟悉的依赖。
  • 失败代价高,比如动数据库结构、构建配置或线上脚本。
  • 你对需求的理解本身还没被验证,改下去可能方向就是错的。

判断标准很简单:如果“改错了再退回来”的代价比“先花几分钟调查”高,就先调查。

先把边界写清楚

只读调查的第一步是把“不许做什么”写明白。我为本机演示整理的边界如下:允许执行的只有 git status --short --branchgit log --oneline --max-count=5rg --filesrg -nfind 这类只读命令;明确不执行的包括切换分支、同步 main、stash/merge/rebase/reset、修改演示项目以外的目录,以及提交、推送这类状态变更。

只读调查边界与结论
只读调查边界与结论
图二 调查前先把允许执行的动作和明确不执行的动作逐条写下,结论也注明当前真实状态。

注意边界不只在命令层面,也包括不伪造进度。这次调查如实记录了演示项目的订单模块还没有测试覆盖,真实状态是“待补测试”。只读调查要把看到的内容完整写下来,包括那些说明“还没做完”的证据。

调查报告要分四栏

调查最大的浪费,是产出一篇读起来很顺、但分不清哪些是事实的总结。我要求的报告格式固定分四栏:事实、推断、未知项、建议步骤。

只读调查报告四栏
只读调查报告四栏
图三 公开示例仓库的只读调查报告:事实都有命令依据,推断标注依据,未知项不猜,建议步骤停在批准修改之前。

这份针对公开示例仓库的报告里,事实栏的每一条都能对上证据:src/Main.groovy 静态导入 Sum.sum,最后一行调用 sum(programmingPoints, 3)src/Sum.groovy 定义 static int sum(int val1, val2),调查前后 git status --short 均无输出。推断栏只写“plus 显示问题的直接候选是 Main.groovy 的输出行或 Sum.groovy 的返回值”,并注明 Division、Square、Subtract 暂不相关。未知栏承认两件事:尚未执行构建或运行命令,尚未确认用户期望的最终文案。建议先让需求方确认复现输出和期望值,再安排修改。

这个顺序是有意为之的。只读调查的产出是一份能支持下一位维护者决策的报告,修改补丁要留到后续任务。

把调查框架交给 Codex

手动流程验证过之后,我把同一个框架写成指令交给 Codex,调查对象是一个涉及 srctestnotes 多个目录的测试项目。指令里写死四条禁令:不修改任何文件,不安装依赖,不运行删除、覆盖、迁移或其他破坏性命令,不提交、不切换分支。调查顺序固定为六步:当前 Git 状态、项目目录和技术栈、需求相关入口、约束和风险、未知项、建议的下一步。输出必须分成四部分:已确认事实、基于证据的推断、仍需人工确认的未知项、可以执行但尚未执行的修改计划,每一项都附文件路径、命令结果或其他证据。

Codex 只读调查报告
Codex 只读调查报告
图四 Codex 的只读调查报告开头:Git 状态和项目结构逐条附命令与结果,耗时 1 分 2 秒。

报告的事实栏完全按证据组织。Git 状态部分写明用了 git status --branch --short,结果是 ## maingit status --porcelain=v1 无输出,说明工作区和暂存区干净;当前提交是 c574445git remote -v 无输出,未执行切换、提交、推送或拉取。项目结构部分列出 README.mdnotes/需求说明.mdsrc/Main.groovysrc/Sum.groovysrc/Report.groovytest/SumTest.groovy,并根据 .groovy 文件和 README 判断这是 Groovy 示例项目,同时注明没有发现 package.json、Gradle/Maven 配置、构建脚本或 CI 配置。

每一条事实都自带“怎么知道的”。这样的报告你可以抽查任意一行,而不是只能整体信任或整体怀疑。

如果你希望这类禁令和调查顺序不用每次重写,可以把稳定的部分沉淀成项目规则,具体写法见《别再重复提醒 Codex:用 AGENTS.md 让它读项目先读规则》。

调查结束后,先证明它没动过

只读调查最容易被跳过的一步,是验收“只读”本身。报告写得再规矩,也可能有意外改动混在里面。我的做法是让 Codex 在调查结束后再次执行 git status --short,和调查开始前的状态并列对比:两次一致就明确说明“调查期间没有发现新增或意外修改”,不一致就逐项解释变化来源,不要自行清理。

调查前后 Git 状态确认
调查前后 Git 状态确认
图五 调查开始前和结束后的 Git 状态对照:两次均无文件变更,确认没有新增或意外修改。

这次验收的结果是两次输出一致,调查期间没有新增或意外修改。指令里特意写了“不要自行清理”。如果发现意外改动,应报告来源并保留现场,才能知道调查过程碰过什么。

这一步成本只有几十秒,但它把“我相信它没改”变成“有证据证明它没改”。高风险任务里,这个区别就是敢不敢授权下一步的区别。

从调查报告到下一轮任务

只读调查最终要形成可执行的修改计划。报告第四栏“可以执行但尚未执行的修改计划”就是下一轮的输入,其中列出要改的文件、理由、关联证据和验证方式。你批准之后,Codex 进入修改流程时不需要重新调查。

交接时建议保留三样东西:报告原文、调查前后的 Git 状态对照、你批准或否决的决定。批准了,报告就是修改任务的上下文;否决了,报告是下次讨论的依据。两种情况下调查都不算浪费。

更多关于“批准后怎么把修改范围管住”的做法,可以看《第一次让 Codex 改项目,我建议你先从这个小任务开始》。

小结

只读调查的完整动作是:先判断是否值得调查,再写清允许和禁止的边界,然后按现状、入口、约束、风险、未知项、建议步骤的顺序收集证据,输出时把事实、推断、未知项和未执行的修改计划分开,最后用 Git 状态对照证明调查期间没有改动。

它不能替代的部分也要说清楚:调查结论里的推断仍需人来确认,修改计划仍需人来批准。Codex 负责把项目摸清楚,决定权留在你手里。

只读调查结束后,把事实、推断、未知项和未执行的计划分别记录,下一轮任务就能直接从这份报告开始。