Codex 与 Claude Code 的对比,与其说是为了找出一个放之四海皆准的赢家,不如说是为了选择一种你能每天信赖的工作方式。. 这两款产品都能检查代码库、编辑多个文件、运行命令、执行测试以及解释补丁。它们之间的实质性差异体现在:工作分配的方式、对代理的干预频率、可查阅的证据量,以及每款工具与您现有开发环境的契合程度。.
在我们进行的四项任务受控仓库测试中,Codex 得分 98/100,而 Claude Code 得分 99/100。 两者均完成了核心工作。Claude Code 展现出更广泛的审查范围和边界情况覆盖,而 Codex 在我们的测试环境中往往以更小的范围就达到了所需结果,并产生了更强有力的运行级证据。在一个小型 Python 测试用例上仅有一分的差距,尚不足以宣布全球胜者。.
不希望工作流的其他部分被绑定到某个特定编码代理的开发者,可以将 GlobalGPT 作为独立的多模型和多模态层进行集成。 GlobalGPT 将 100 多个顶级模型(如 GPT 5.6、Claude Opus 5 和 GPT Image 2)整合到一个仪表盘中。此外,该 GlobalGPT CLI, MCP 和 Skill 路径可通过 Codex 或 Claude Code 用于寻求第二意见、规划、文档编制或其他受支持的模型,而原生编码主机则继续控制代码库的编辑和测试。.
该对比综合了官方计划信息、实际的代码库操作、完整且可扩展的输出结果,以及标注清晰的社区使用体验。其目的是帮助独立开发者选择主要编码工具,同时避免因订阅访问权限、额外积分和API计费等问题而感到困惑。.
Codex 与 Claude 代码一览
| 决策因素 | 《法典》 | 克劳德代码 |
|---|---|---|
| 核心代码库相关工作 | 可在受支持的 Codex 界面上读取、编辑、执行命令并验证更改 | 用于阅读、编辑、执行命令以及验证更改的对话式终端代理 |
| 我们在测试中观察到的风格 | 在部分实现和错误修复方面更加精简 | 在代码库分析、测试和代码审查的广度方面更为全面 |
| 对代码库的理解 | 关于“冻结任务”的功能性关联 | |
| 代码审查 | 发现并修复了两个有效的、严重程度较高的缺陷 | 报告了更多可重现的问题,并将问题数量从19/20降至18/20 |
| 观测速度 | 结果参差不齐;各赛区的环境差异较大,难以产生一名绝对的冠军 | |
| 消费级入门产品 | 每月$20,通过相关的ChatGPT计划 | Claude Pro:在美国每月$20 |
| 使用量较高的等级 | $100 和 $200 等级 | 在 $100 时最大 5 倍,在 $200 时最大 20 倍 |
该表格描述的是一个购买决策,而非模型排名榜。不同的模型设置、代码仓库、权限配置或任务规范都可能导致结果发生变化。如果您已经在使用某款产品,最合适的对比方式是使用您自己代码库中一个具有相同成功命令且不进行质量重试的限定任务。.
受控测试配置文件
第一个有效结果,采用相同的固定评分标准。各条柱状图均按每项任务的满分进行了归一化处理。.
该图表展示了这一分之差的来源;它并不能将一场小比赛转化为一项综合排名。.
“Codex”和“Claude”代码究竟是什么
Codex 和 Claude Code 是代理产品,而不仅仅是型号名称。其底层 用于编码的AI模型 虽然模型很重要,但周围的框架也决定了代理能够查看哪些文件、可以执行哪些命令、审批机制如何运作、上下文如何保留,以及任务完成后哪些证据会被保留。如果仅比较模型的声誉,就会忽略开发者所获得的大部分使用体验。.
Codex 涵盖了命令行、IDE、桌面和云端工作流。这种广泛的应用范围使其既适合直接的本地协作,也适合范围更有限的任务委派。Claude Code 以对话式终端工作流为核心,支持多种集成,并提供丰富的自定义功能;这 Claude编码使用指南 对该工作流进行了更全面的介绍。对于一些开发者来说,在终端中观察代理程序的工作过程会让他们感到安心。而对另一些开发者而言,重要的成果是最终的差异报告、测试结果和审计日志,而非持续的交互过程。.
这一区别还解释了为什么两个使用名义上同样强大的模型的测试,其表现却可能不同。测试平台决定了指令的呈现方式、工具的调用方式,以及何时需要人工批准某项操作。如果社区比较时忽略了测试平台,就可能将产品层面的行为误认为是模型层面的真实情况。.
- 模式 提供了推理和生成能力。.
- 代理线束 管理文件、命令、上下文、审批和恢复。.
- 用户的任务合同 确定作用范围、成功判定以及代理何时应停止。.

工作流程与管控:授权还是持续引导?
关于 Codex 与 Claude 代码风格的讨论中,最有价值的问题往往不是“哪种能写出更好的代码?”,而是“我希望如何使用它?” 对于明确且范围有限的任务,可以将其委派出去,并设定精确的目标、允许的范围以及验证指令。而对于模糊的重构任务,则需要通过讨论、阶段性审查,并在代理进行过多更改之前及时调整其方向,才能取得更好的效果。.
当需求不断演变或架构决策仍在协商中时,持续指导具有重要价值。但当代理反复要求做出本可通过存储库指令解决的决策时,这种指导就会变成一种成本。当任务契约保持稳定时,自主执行具有重要价值。但当代理做出未经核实的假设,或在没有明确回滚路径的情况下扩大范围时,自主执行就会带来风险。.
2026年4月13日发布的一篇详细的Reddit报告描述了在某个包含约80,000行Python和TypeScript代码、约2,800个测试用例的项目中,使用Claude Code大约花费了100小时,而使用Codex则花费了20小时。 作者认为,Claude 速度更快、交互性更强,但需要更多人工干预;而 Codex 则速度较慢,但操作更稳妥。该报告之所以特别有价值,是因为它包含了项目背景和经验背景,但它仍然仅代表了一位开发者的工作流程。.

我们自己的测试结果并未得出一个明确的赢家。Claude在前两项任务中完成得更快,而Codex在后两项任务中完成得更快。此外,当Claude的CLI身份验证路径不可用时,它启用了子代理作为备用方案,因此两者的执行路径并不完全等同于实验室环境。 合理的结论是:速度取决于任务、所选模型、工作量设置、上下文以及主机——而非某款产品总是更快。.
对存储库的理解与上下文管理
对代码库的理解远不止于给文件夹命名。一个有用的分析工具必须能够追踪数据在文件之间的流动路径,识别限制变更的契约,定位测试用例,区分症状与其可能的根源,并说明编辑错误层级所带来的风险。详尽的映射图可以揭示隐藏的不一致之处;而简洁的映射图则能帮助开发者更快地做出安全的实现决策。.
在我们的只读 T1 任务中,两个代理均取得了 20/20 的满分,且其答案均有据可查。Claude Code 的分析更为全面,发现了更多合同不一致之处;Codex 的表达更为简洁,但仍能准确识别出相关文件、风险及实施方案。这两种风格均无绝对优劣之分。 在处理不熟悉的迁移和审计时,详尽性更有帮助;而当开发人员已经了解架构并希望获得针对性的变更计划时,简洁性则更具优势。.
T1 · 受控存储库测试
在修改一个不熟悉的代码库之前,先对其进行了解
绘制架构图、追踪数据流、识别优先级功能的风险,且不修改任何文件。.
架构:模型、存储库、服务以及一个未连接的时间实用程序。 主要风险:优先级语义未定义、兼容性、排序、验证以及作用域不匹配。.
评论者观点: 简洁、以文件为依据,且足以支持该冻结决定。.
三层架构加一个孤立模块。无循环;依赖注入极少。 此外,还暴露出标识符分配、非对称错误契约以及测试覆盖率不足等问题。.
评论者观点: 更全面,同时仍满足相同的只读约定。.
查看完整的Codex输出结果
完整的、经过安全处理的、首次有效的输出
## 架构
这是一个仅使用标准库的小型 Python 包,包含四个功能层:
- **数据模型:** [`Job`]() 是一个不可变的数据类,包含 `identifier`、`name` 和 `owner`。`Job.to_dict()` 通过 `dataclasses.asdict()` 对其进行序列化。
- **存储库:** [`JobRepository`]() 将任务存储在内存字典中,以标识符作为键。该实现不使用数据库,也不提供持久化存储。
- **服务:** [`SchedulerService`]() 负责标识符分配、输入规范化、任务创建、列出及删除。
- **时间实用函数:** [`next_daily_run()`]() 用于计算下一次运行时间,但没有任何代码将其导入或与 `Job`、`SchedulerService` 或 `JobRepository` 关联。
- **公共 API:** [`scheduler.__init__`]() 仅导出 `SchedulerService`。
尽管仓库名称如此,但任务目前并不包含调度信息,且不存在执行队列。 因此,优先级虽然会影响存储的元数据和列表排序,但在不大幅扩展系统的情况下,无法影响实际任务的执行。
## 创建与列出的数据流
通过 `SchedulerService.create_job(name, owner)` 进行创建:
1. [`create_job()`]() 会拒绝仅由空格组成的名称。
2. 它会截取 `name` 和 `owner`,然后使用服务的 `_next_identifier` 构建一个不可变的 `Job` 对象。
3. [`JobRepository.save()`]() 将该对象写入 `_jobs[job.identifier]`。
4. 该服务将 `_next_identifier` 递增,并返回相同的 `Job` 对象。
通过 `SchedulerService.list_jobs()` 列出任务:
1. [`list_jobs()`]() 直接委托给 `repository.all()`。
2. [`JobRepository.all()`]() 按字典键的数值对结果进行排序。
3. 因此,任务按标识符/创建时间的升序返回,而非按计划时间或优先级排序。
## 可能受任务优先级影响的文件
必修:
- [`scheduler/models.py`]():添加 priority 字段及其默认值。 由于 `to_dict()` 使用 `asdict()`,因此会自动包含该字段。
- [`scheduler/service.py`]():接受、验证并将优先级传递给 `Job`。
- [`tests/test_scheduler.py`]():测试默认、显式、无效、序列化和排序行为。
条件性修改:
- [`scheduler/repository.py`]():仅当优先级用于控制列表排序时,才修改 `all()`。应使用 `identifier` 等确定性辅助键来处理并列情况。
- [`scheduler/__init__.py`]():仅当优先级成为公开枚举或值对象时才进行更新。
- [`README.md`]():记录允许的值、默认值以及排序语义。
可能不受影响:
- `scheduler/time_rules.py`,因为其唯一的符号仅对传入的日期时间进行操作,与任务或列表无关。
## 主要风险
- **语义未定义:** 代码中未提供任何先例说明数值越大还是越小代表优先级越高、哪些数值是有效的,以及优先级是否会影响列表排序。
- **兼容性:** 向 `Job` 或 `create_job()` 添加必填参数将导致现有调用者失效,例如当前测试中的 `create_job("Daily report", "Alex")`。设置默认值可保持该调用的兼容性。
- **基于位置的构造函数问题:** 当前在 `SchedulerService.create_job()` 中,`Job` 是通过基于位置的方式构造的。字段位置以及未来的基于位置的调用可能会在无提示的情况下赋错值;使用关键字构造会更安全。
- **顺序变更:** 替换 `JobRepository.all()` 中的标识符顺序会改变既定行为。优先级相等的任务需要一个稳定的决胜规则。
- **验证模糊性:** 不受限制的 Python 值可能包含字符串、布尔值或任意整数,难以进行一致的比较。
- **执行作用域不匹配:** 当前不存在调度器或运行队列。声称优先级会改变哪个作业先执行,这一行为目前没有任何符号支持。
- **内存限制:** 与其他所有作业字段一样,优先级在进程结束时会消失,因为 `_jobs` 仅是一个实例字典。
## 实现与验证计划
1. 首先定义契约:表示形式、允许的值、默认值、优先级方向、平局决胜规则,以及是否会改变列表排序。
2. 向 `Job` 添加 `priority` 字段,最好采用向后兼容的默认值。
3. 扩展 `SchedulerService.create_job()`,添加带默认值的优先级参数,对其进行验证,并使用关键字参数构建 `Job`。
4. 如果列表排序考虑优先级,则将 `JobRepository.all()` 修改为先按优先级排序,再按标识符排序。否则保持存储库排序不变。
5. 添加以下测试:
- 现有的两个参数创建方式。
- 显式优先级的保留。
- 默认优先级。
- 类型无效和值超出范围的情况。
- `Job.to_dict()` 的输出。
- 多优先级列表的排序顺序。
- 优先级相同时的稳定排序。
- 现有空名称的行为。
6. 更新 README,明确说明公共接口。
7. 使用 `python3 -m unittest discover -s tests -v` 运行完整的离线测试套件。
## 已执行验证
- 基线测试套件:**2 个测试通过**。
- 确认全仓库符号搜索结果:`next_daily_run()` 已断开连接,且不存在现有的优先级符号。
- 文件变更:**无**。
- 功能实现:**未执行**,符合要求。
> **结论 + 决策**
>
> 如果优先级仅作为元数据或列表排序使用,则变更范围较小:主要涉及 `models.py`、`service.py`、`repository.py` 以及测试用例。在实施之前,需要决定的是:优先级是仅用于描述任务,还是会改变 `list_jobs()` 的排序顺序,此外还需确定其数值范围、默认值、方向以及平局决胜规则。.查看完整的 Claude 代码输出
完整的交接记录,包括首次有效的输出原文
# T1 运行记录 — 陌生存储库理解
## 执行参数
| 字段 | 值 |
| --- | --- |
| 任务 | `T1` |
| 冻结提示词 | `01-prompts/T1.md` |
| 冻结提示词 SHA-256 | `a571ff15c2502ec29b172ae2e77dd9ab0caca2869b91f9468d47571434d16c17` |
| 执行单元 | 隔离的 Claude 子代理,`通用型`,全新上下文 |
| 隔离方法 | **子代理回退**(已记录的降级操作 — 参见 `results/isolation-decision.md`) |
| 分配的干净副本 | `runtime/workspaces/T1` |
| Claude 代码版本 | `2.1.220` |
| 模型设置 | `claude-opus-5` |
| start_utc | `2026-07-28T10:27:31Z` |
| end_utc | `2026-07-28T10:28:32Z` |
| 持续时间 | 61 秒(与 T2–T4 同时进行;非纯延迟测量) |
| 尝试次数 | 1 |
| 状态 | `有效` |
| 人工干预 | 无 |
## 安全工具摘要
`date`、`find`、`ls`、`wc`、`stat`、`grep`、对 7 个工作区文件的 `Read` 操作、`python3 -V`、
`python3 -m unittest discover -s tests -v`。所有读取操作均限制在指定工作区内。
无网络连接、无软件安装、无写入操作。
## 离线检查结果
`python3 -m unittest discover -s tests -v` → 2 个测试,通过(退出代码 0)。 由
协调员在工作区外部重新验证:参见 `results/checks/T1-public.txt`。
## 补丁
无。`results/T1/patch.diff` 为空,且 `diff -ru 02-fixture runtime/workspaces/T1`
未返回任何差异。该任务仅需检查而无需修改文件;此结论
经确认而非通过断言得出。
## 已处理的错误
一个可恢复的 shell 错误:初始 `grep` 命令使用了未加引号的 `--include=*.py` 模式,
导致 shell 尝试进行通配符匹配;在模式加引号后重新运行,操作成功。对检查结果无影响。
## 可见输出(原样)
### 1. 该仓库的用途
一个名为 `local-scheduler-1.0.0`(`fixture-manifest.json`)的自包含 Python 标准库测试套件,采用 MIT 许可证,无网络或生产环境依赖(`README.md`,`"network_required": false`)。 该库非常小:包含 8 个源代码/文档文件以及清单文件,共计 103 行。内置解释器为 **Python 3.9.6**。 该项目不包含 `pyproject.toml`、`setup.py`、CI 配置、代码检查器或类型检查器配置——唯一声明的工作流是 `python3 -m unittest discover -s tests -v`(`README.md`)。
### 2. 架构
三层结构加一个孤立模块,全部位于 `scheduler/` 目录下:
| 层级 | 文件 | 符号 | 职责 |
|---|---|---|---|
| 包门面 | `scheduler/__init__.py` | `__all__ = ["SchedulerService"]` | 仅重新导出 `SchedulerService`;`Job`、`JobRepository` 和 `time_rules` 不属于公共接口 |
| 领域模型 | `scheduler/models.py` | `Job` (`@dataclass(frozen=True)`) | 不可变值对象,包含字段 `identifier: int`、`name: str`、`owner: str`,并实现 `to_dict()` 方法(通过 `asdict(self)` 实现) |
| 持久化 | `scheduler/repository.py` | `JobRepository` | 以 identifier 为键的内存中 `dict`;提供 `save`、`get`、`all`、`delete` 方法 |
| 应用服务 | `scheduler/service.py` | `SchedulerService` | 验证、标识符分配、协调:`create_job`、`list_jobs`、`delete_job` |
| 孤立模块 | `scheduler/time_rules.py` | `next_daily_run` | 周期性计算 — **未被任何模块导入** |
依赖关系方向清晰且单向:`service.py` 从 `.models` 和 `.repository` 导入;`repository.py` 从 `.models` 导入;`models.py` 仅导入 `dataclasses`。无循环依赖。 虽然存在依赖注入,但程度极低——`SchedulerService.__init__(self, repository=None)` 执行 `self.repository = repository or JobRepository()`,因此可在测试中替换为模拟的仓库。
请注意,`scheduler/time_rules.py` 目前已是死代码。 我使用 grep 命令在整个代码树中搜索了 `time_rules` 和 `next_daily_run`;唯一匹配的结果是其自身的定义以及在 `fixture-manifest.json` 的 `expected_files` 中的列出。该文件虽已打包,但未被调用。
### 3. 数据流
**创建任务** — `SchedulerService.create_job(name, owner)`:
1. 守护条件:`if not name.strip(): raise ValueError('name is required")`。 这是系统中*唯一的*验证——`owner`从未被检查,因此接受空的拥有者。
2. 构造:`Job(self._next_identifier, name.strip(), owner.strip())` —— 按位置构造,且两个字符串均通过去除前缀进行规范化处理。
3. 持久化:`self.repository.save(job)`,该操作执行 `self._jobs[job.identifier] = job` 并返回该任务。
4. 递增计数器:`self._next_identifier += 1` —— 该操作发生在 `save` 之后,因此若抛出异常,计数器将保持未消耗状态。
5. 返回 `Job` 实例(该服务返回其自身的本地 `job`,而非存储库的返回值)。
标识符的分配由**服务**负责,而非存储库(在 `SchedulerService.__init__` 中执行 `self._next_identifier = 1`)。这是一个重要的接口点:如果注入的存储库中已经包含任务,新服务会从 1 开始重新编号,从而无声地覆盖原有任务。
**列出任务** — `SchedulerService.list_jobs()` 直接转发给 `JobRepository.all()`,后者返回 `[self._jobs[key] for key in sorted(self._jobs)]`。 因此,排序方式是**按整数标识符升序**,这目前与插入顺序一致。每次调用都会构建一个新的列表,但 `Job` 对象是共享引用——之所以安全,仅仅是因为 `Job` 类已被冻结。
**删除** — `SchedulerService.delete_job(identifier)` 委托给 `JobRepository.delete`,该方法即 `self._jobs.pop(identifier)`,且无默认值,因此当 ID 不存在时会引发 `KeyError`。 这与 `JobRepository.get` 不一致,后者在相同条件下会返回 `None`。
**这些路径的测试覆盖率** — `tests/test_scheduler.py` 恰好包含两个测试用例:`test_create_and_list_jobs`(断言 `job.identifier == 1` 且 `[job] == service.list_jobs()`)和 `test_blank_name_is_rejected`。 这两个用例在当前代码树中均通过。
### 4. 添加任务优先级可能影响的文件
按确定性从高到低排序:
1. **`scheduler/models.py`** —— 确定。`Job` 需要一个 `priority` 字段。由于该数据类设置了 `frozen=True` 且字段为位置参数,新字段必须带有默认值(例如 `priority: int = 0`),否则必须将其置于现有三个字段之后,否则所有现有的位置参数构造都会失效。`to_dict()` 无需修改——`asdict(self)` 会自动识别该字段,这属于序列化契约的无声变更,而非代码变更。
2. **`scheduler/service.py`** —— 确定。`create_job` 需要一个 `priority` 参数,并必须将其传递给第 13 行处的 `Job(...)` 位置参数构造函数。 如果需要对优先级进行验证(范围、枚举成员资格),则该验证条件应置于现有的 `name.strip()` 检查之后。如果列表必须按优先级排序,且希望该存储库保持为"哑存储',则排序策略应置于 `list_jobs` 中。
3. **`scheduler/repository.py`** — 可能性较大。`JobRepository.all()` 中的 `sorted(self._jobs)` 是按字典 *键*(即标识符)排序的。 要实现按优先级排序的列表,需要将此处修改为按键值(如 `(-job.priority, job.identifier)`)对字典进行排序,或者添加一个单独的有序访问器。不要将平局决胜规则留作隐式处理:字典的插入顺序并非可依赖的稳定契约。
4. **`tests/test_scheduler.py`** — 确定。新增了针对默认优先级、显式优先级、排序以及无效优先级拒绝的测试用例。 请注意,现有的 `assertEqual([job], service.list_jobs())` 比较的是*同一个*对象,因此即使添加了字段也能通过验证;但如果它比较的是一个新构建的 `Job` 字面量,则无法通过验证。
5. **`README.md`** — 可能需要,如果优先级语义(范围两端哪个优先、默认值)需要在任何地方说明的话。
6. **`scheduler/__init__.py`** —— 仅当需要与 `SchedulerService` 一起导出优先级枚举或常量时才需修改。
7. **`fixture-manifest.json`** —— 仅当您添加新模块文件时才需修改;其 `expected_files` 数组是显式的清单,内容可能会发生变化。
8. **`scheduler/time_rules.py`** — 切勿修改。优先级与重复性互不相关,且该模块未被调用。
### 5. 主要风险
- **排序语义属于隐式行为变更。** `JobRepository.all()` 目前保证按标识符升序排列,而 `list_jobs` 继承了这一特性。任何依赖该保证的调用方,其行为都会因重新排序而失效。 需明确决定:是让 `list_jobs()` 的含义发生改变,还是在它旁边新增一个 `list_jobs_by_priority()`?前者风险更高,且现有的测试 `test_create_and_list_jobs` 过于简单,无法捕获回归问题(单元素列表)。
- **排序方向确实存在歧义。** 在某些系统中,"优先级 1"通常表示 *最高*,而在其他系统中则表示 *最低*。本仓库中没有任何内容——无论是注释、文档字符串还是 README 中的说明——能对此作出明确规定。 请选定一种约定,在 `models.py` 中进行文档化,并在测试中编码至少三个不同的优先级,以确保排序方向被明确固定。
- **排序平局处理不稳定。** 如果两个任务具有相同的优先级,结果仍必须是确定性的。Python 的 `sorted` 函数是稳定的,但这种稳定性只有在输入顺序本身已定义时才有意义。请务必将 `identifier` 作为显式的二级键包含在内。
- **Frozen-dataclass 字段排序。** `Job` 采用 `@dataclass(frozen=True)` 定义,包含三个位置字段,且 `service.py:13` 通过位置参数对其进行构造。若将 `priority` 插入到最后一个字段之外的位置,或未设置默认值,则会构成破坏性变更,而现有的两个测试可能无法明显揭示此问题。
- **`to_dict()` 契约扩展。** `asdict(self)` 会反映所有字段。添加 `priority` 会改变每个序列化负载,而 `models.py` 中的方法体却没有可见的修改。任何基于精确字典结构进行断言的代码都会失效。
- **Python 3.9.6 的限制。** 不支持 `@dataclass(slots=True)`(3.10+),不支持 `kw_only=True`(3.10+),且若未使用 `from __future__ import annotations`,PEP 604 中的 `int | None` 注解将在运行时报错。 如果将优先级建模为枚举类型,`enum.StrEnum` 属于 3.11 及以上版本的功能,当前不可用。上述任何一种情况都会导致该解释器上的 fixture 无法运行。
- **标识符分配位于错误的层级。** `SchedulerService._next_identifier` 意味着服务负责 ID 生成,而存储库负责存储。如果优先级相关的工作促使实现第二个存储库或预加载测试数据,这种分离将导致 ID 冲突和任务被覆盖。
- **错误处理约定不一致。** `JobRepository.get` 在查找失败时返回 `None`,而 `JobRepository.delete` 会引发 `KeyError`。任何与优先级相关的新查找操作都应有意识地选择一种约定,而非无意中继承这种不一致性。
- **验证缺失的先例。** `create_job` 会验证 `name` 但不验证 `owner`。请勿将这种宽松做法复制到 `priority` 上——未经验证的优先级会传播到排序键中,并可能在 `sorted` 函数的深处(例如将 `int` 与 `None` 进行比较)引发 `TypeError`,而非在调用处触发。
- **死代码陷阱。** `scheduler/time_rules.py` 看似包含调度逻辑,因此容易吸引修改。但该文件未被任何地方导入,且其自身的文档字符串也承认了该缺陷:它会增加 24 小时的 UTC 经过时间,并'在夏令时转换期间调整本地墙钟时间"。 修改它对被测系统没有任何可观察到的影响,因此在此处投入的精力是浪费的,且针对它编写的任何测试都无法验证最终发布的代码。
- **薄弱的安全网。** 仅有两个测试,没有持续集成(CI)、没有代码检查工具(linter)、没有类型检查。除了你自己编写的代码外,没有任何东西能捕获回归问题。 应将现有测试套件视为覆盖率不足的基准,而非通过门槛。
### 6. 实施计划(未执行)
1. **首先以书面形式明确语义。** 优先级类型(`int` 与枚举),有效范围,现有/未指定任务的默认值,以及排序方向。将其作为 `scheduler/models.py` 中 `Job` 的文档字符串记录下来——这是所有层级目前唯一依赖的位置。
2. **扩展模型。** 在 `scheduler/models.py` 中将 `priority: int = 0` 作为 `Job` 的 *最后* 一个字段添加,同时保持与 `service.py:13` 的位置兼容性,且不修改 `to_dict()`。
3. **将其贯穿到服务中。** 在 `SchedulerService.create_job` 中添加一个默认值为 `0` 的 `priority` 参数,在现有的 `name.strip()` 验证条件旁对其进行验证(抛出 `ValueError`,与已建立的错误类型匹配),并将其传递给 `Job` 构造函数。
4. **明确确定列表接口规范。** 首选的低风险方案:保留 `JobRepository.all()` 作为按标识符排序的原始方法,并添加一个单独的按优先级排序的访问器。如果 `list_jobs()` 必须改变含义,则修改 `JobRepository.all()` 的列表推导式,使其按包含 `identifier`(作为平局决胜条件)的显式复合键对值进行排序,并在 `README.md` 中注明此变更。
5. **仅当引入了公共枚举或常量时,才需保持 `scheduler/__init__.py` 与之同步**。
6. **请勿修改 `scheduler/time_rules.py`**,除非在同一变更中更新了 `fixture-manifest.json` 中的 `expected_files`,否则请勿添加文件。
### 7. 验证计划
- **先验证基线。**在进行任何编辑之前,运行 `python3 -m unittest discover -s tests -v` 并确认有 2 个测试通过。我已经执行过此操作——测试全部通过。
- **回归检查。** 两个现有测试在未修改的情况下必须仍能通过。如果 `test_create_and_list_jobs` 需要编辑,这表明该更改导致了回归,而不是编辑该测试的理由。
- **`tests/test_scheduler.py` 中的新测试用例:**
- 当使用旧版双参数签名调用 `create_job` 时的默认优先级(用于验证向后兼容性)。
- 通过 `create_job` → `list_jobs` 显式验证优先级的往返行为。
- 包含 **三个或更多** 不同优先级的排序,验证完整列表——这正是确定排序方向的关键。
- 平局处理:优先级相等的两个任务按标识符升序返回。
- 无效优先级会引发 `ValueError`,与名称为空的情况一致。
- `to_dict()` 包含 `priority` 字段及其预期值。
- 注入的仓库路径:`SchedulerService(repository=fake)` 仍能正确分配优先级,验证了 `repository 或 JobRepository()` 缝合机制。
- **兼容性检查。** 确认所有内容均在 Python 3.9.6 环境下运行——不使用 `slots=`、不使用 `kw_only=`、不使用裸 PEP 604 联合类型、不使用 `StrEnum`。
- **清单检查。** 重新读取 `fixture-manifest.json`,并确认磁盘上的文件集仍与 `expected_files` 匹配。
- **确定性。** 运行该测试套件两到三次;涉及字典迭代顺序的排序错误可能会间歇性出现。
- **代码整洁度。** 使用 `PYTHONDONTWRITEBYTECODE=1` 运行,以避免 `__pycache__` 目录作为未被追踪的偏差出现在清单中。.
环境限制:这是一个小型离线 Python 代码库。Claude 在 CLI OAuth 过期后使用了子代理作为备用方案,因此隔离性和令牌可见性并不完全一致。.
该结果并不能证明该工具在大规模单仓库或为期一周的自主运行中的表现。本次测试环境是刻意设计得规模较小且受控的。若要进行实际评估,请从只读提示开始:在允许编辑之前,要求每款工具绘制调用路径、列出将要修改的文件、识别测试用例,并列出未解决的假设。.
实现方式、补丁范围和错误修复
多文件功能操作
相同的通过结果可能源于不同的工程设计选择。在 T2 测试中,两款产品均获得 30/30 的评分,并通过了“冻结隐藏验证器”测试。Claude Code 在多个边界处设置了验证,并增加了更全面的直接模型和阈值测试。Codex 采用了一种规模较小、以服务为中心的实现方案,同样满足了合约要求。.
对于独立开发者而言,这确实是一个权衡取舍的问题。当对象通过多种路径创建时,更广泛的验证可以保护不变量;而当某个服务是预期的入口点时,较小的补丁可以减少回归风险并缩短代码审查时间。正确的答案取决于代码库的所有权规则,而不是孤立地统计修改的行数或测试数量。.
T2 · 受控存储库测试
在多个文件中实现优先级功能
添加冻结行为,保持兼容性,并通过公共和隐藏检查。.
为不可变模型添加了优先级,在服务边界处对其进行了验证,并在存储库中保持了顺序。 全部七个公开测试以及冻结的隐藏验证器均通过。.
评论者观点: 一个规模较小、以服务为中心的实现方案,满足了所有冻结行为。.
已在服务边界和不可变模型两处验证了优先级,保留了仓库过滤功能,并添加了阈值覆盖率。 十四项公开测试和隐藏验证器均通过。.
评论者观点: 直接模型和阈值模型的覆盖范围更广,但在功能评分方面并无优势。.
查看完整的Codex输出结果
完整的、经过安全处理的、首次有效的输出
实现了定时任务优先级功能。 修改的文件: - [scheduler/models.py](./scheduler/models.py:5) — 添加了序列化字段 `priority`,默认值为 `0`。 - [scheduler/service.py](./scheduler/service.py:11) — 添加了验证、存储以及 `list_jobs(min_priority=0)` 过滤功能,同时保持标识符的顺序。 - [tests/test_scheduler.py](./tests/test_scheduler.py:16) — 增加了对默认值、序列化、存储、边界条件、无效值以及过滤操作的代码覆盖率测试。 已运行的测试: ```text python3 -m unittest discover -s tests -v 已运行 7 个测试 — OK ``` **结论:** 该冻结任务已完成并经过验证。 **需做出的决策:** 无。.
查看完整的 Claude 代码输出
完整的交接记录,包括首次有效的输出原文
# T2 运行记录 — 多文件优先级功能 ## 执行参数 | 字段 | 值 | | --- | --- | | 任务 | `T2` | | 冻结提示词 | `01-prompts/T2.md` | | 冻结提示词 SHA-256 | `8476a56034c4e719b97ee4081b32b4c73efd45feafe1bda9d477c83cb8fdb698` | | 执行单元 | 隔离的 Claude 子代理,`通用型`,全新上下文 | | 隔离方法 | **子代理回退**(已记录的降级操作 — 参见 `results/isolation-decision.md`) | | 分配的干净副本 | `runtime/workspaces/T2` | | Claude 代码版本 | `2.1.220` | | 模型设置 | `claude-opus-5` | | start_utc | `2026-07-28T10:27:52Z` | | end_utc | `2026-07-28T10:29:33Z` | | 持续时间 | 101 秒(与 T1、T3、T4 同时进行;非纯延迟测量) | | 尝试次数 | 1 | | 状态 | `有效` | | 人工干预 | 无 | ## 安全工具摘要 `date`、仅在指定工作区内进行`读取`/`编辑`/`写入`、`grep`、 `python3 -m unittest discover`、`python3 -m compileall`、内联 `python3 -c` 烟雾测试。 无网络,无安装,仅使用标准库。 ## 已修改的文件 `scheduler/models.py`、`scheduler/repository.py`、`scheduler/service.py`、 `tests/test_scheduler.py`。 未添加或删除任何文件,因此 `fixture-manifest.json` 保持 准确。完整补丁:`results/T2/patch.diff`。 ## 离线检查结果 任务运行器报告: | 检查 | 结果 | | --- | --- | | `python3 -m unittest discover -s tests -v`(基线,变更前) | 2 通过,0 失败 | | `python3 -m compileall -q scheduler tests` | 无错误 | | 内联烟雾测试(旧版 3 参数构造、关键字/位置阈值、`to_dict`) | 通过 | | `python3 -m unittest discover -s tests -v`(最终) | **14 个通过,0 个失败** | 由协调员在工作区外部独立重新验证: | 检查项 | 退出状态 | 结果 | | --- | --- | --- | | 公共测试套件(`results/checks/T2-public.txt`) | 0 | 14 个测试,通过 | | 隐藏验证器 `03-checks/test_t2_hidden.py` (`results/checks/T2-hidden.txt`) | 0 | 2 个测试,通过 | 隐藏验证器在原始测试数据副本上失败(退出代码 1),这证实了通过结果具有 实际意义。参见 `results/checks/validator-controls.md`。 ## 黄金映射行为覆盖率 `03-checks/gold-map.json` 中所有五个必备行为均已满足: | 必备行为 | 证据 | | --- | --- | | 优先级默认值为 0 | `Job.priority: int = MIN_PRIORITY`; `create_job(..., priority=MIN_PRIORITY)`; `test_priority_defaults_to_zero` | | 整数范围 0 至 9 | `validate_priority` 会拒绝非整数和超出范围的值; `test_out_of_range_priority_is_rejected`、`test_non_integer_priority_is_rejected` | | 序列化优先级 | 通过 `asdict` 调用 `to_dict()`; `test_priority_appears_in_serialized_output` 断言序列化输出中包含确切的字典 | | 最低优先级过滤 | `list_jobs(min_priority=0)` → `JobRepository.all(min_priority)`; `test_filter_is_inclusive_of_the_threshold` | | 标识符排序 | 在现有的 `sorted(self._jobs)` 理解式内部应用过滤器;`test_filter_preserves_ascending_identifier_order` | ## 已清理的错误 无。测试运行产生的 `__pycache__` 残留文件已被任务运行器移除;协调器 清理操作确认工作区已清理完毕。 ## 可见输出(原样) 在本地调度器测试 fixture 的模型、存储库和服务层中,为已排程任务添加了整型 `priority` 字段,并在过滤后的列表中显示。 **`scheduler/models.py`** — 添加了模块常量 `MIN_PRIORITY = 0` / `MAX_PRIORITY = 9`,以及可重用的 `validate_priority(priority)` 函数,该函数会对非整数以及超出 0–9(含 0 和 9)范围的值抛出 `ValueError`。 尽管 `bool` 是 `int` 的子类,但会被明确拒绝,因此 `True` 无法作为优先级 1 混入。 冻结的 `Job` 数据类新增了带有默认值的尾部字段 `priority: int = MIN_PRIORITY`,这确保了现有的三参数构造函数仍可正常工作;同时新增了 `__post_init__` 方法,该方法会调用验证器,从而确保无论通过何种路径都无法构造出无效的优先级。 `to_dict()` 仍保留为 `asdict(self)`,因此优先级会自动按字段顺序出现在序列化输出中。 **`scheduler/repository.py`** — `JobRepository.all()` 接受可选的 `min_priority` 参数,并在现有的 `sorted(self._jobs)` 列表推导式中进行过滤,因此通过原本就已保证升序标识符排序的同一代码路径来维持该排序,而非在过滤后重新建立排序。 默认参数保留了针对现有调用者的无参数行为。存储本身无需更改:存储库存储完整的 `Job` 实例,因此优先级得以保留,并在 `save`/`get`/`all` 操作中保持一致。 **`scheduler/service.py`** — `create_job` 接受一个可选的尾随 `priority` 参数(默认值为 0),并在构建 `Job` 之前对其进行验证,因此错误会在服务边界处抛出,其 `ValueError` 契约与现有的空名称检查一致。 `list_jobs(min_priority=0)` 将调用委托给存储库。排序和过滤功能集中在一个地方,而非重复实现。 **关于 `min_priority` 验证的设计说明:** 虽然它作为整数进行类型检查,但刻意*未*将其范围限制在 0–9 之间。 0–9 规则限制了任务可能存储的值;阈值是查询参数,如果拒绝例如 `min_priority=10`,会将一个合法的"无匹配项"查询转化为错误。 当没有任务优先级为 9 时,`list_jobs(min_priority=9)` 返回 `[]` 的情况已在测试中覆盖。 已阅读 `scheduler/time_rules.py` 但未作修改——其文档中记载的夏令时调整属于预先存在的默认行为,超出本次任务范围,且修改该行为将导致无关的行为变更。 未添加或删除任何文件,因此 `fixture-manifest.json` 仍保持准确(已通过程序验证)。 ### 增加了测试覆盖率 默认值为 0;通过 `JobRepository` 进行存储往返操作;`to_dict()` 输出中的优先级;接受边界值 0 和 9;拒绝超出范围的 −1/10/100; 非整数 `"3"`/`3.5`/`None`/`True` 被拒绝;直接在模型级别进行验证;未过滤的列表顺序;过滤后的列表保留标识符升序;包含阈值;空结果;非整数 `min_priority` 被拒绝。.
环境限制:这是一个小型离线 Python 代码库。Claude 在 CLI OAuth 过期后使用了子代理作为备用方案,因此隔离性和令牌可见性并不完全一致。.
边缘情况下的错误修复
T3 测试了夏令时调度缺陷。两个代理均获得 30/30 分,并通过了相同的春季和秋季隐藏检查。Claude 代码针对模棱两可和被跳过的本地时间、简单粗暴的输入以及多日滚动情况增加了显式覆盖。Codex 对日历日进行了更细微的调整,并通过了冻结合同测试。.
当库被广泛重用或调度错误的代价很高时,更全面的边界情况测试能增强信心。当缺陷已被很好地隔离,且团队希望将行为变更降至最低时,局部修改就显得很有吸引力。 实际的审查问题并非“谁写的代码更多?”,而是该补丁是否修复了所述的根本原因、是否保留了周边的契约,以及是否验证了高风险边界。.
T3 · 受控存储库测试
修复夏令时转换期间的每日排程
在春季和秋季过渡期间,保持所要求的纽约挂钟时间。.
根本原因:该实现增加了 24 个 UTC 小时。 修复方案:将时间向前推进一个本地日历日。春季和秋季的冻结检查均通过。.
评论者观点: 范围较窄的修正案通过了该份已完全敲定的合同。.
已涵盖春季、秋季、遗漏及不明确的本地时间、简单粗放的输入,以及多日滚动处理。 在扩大回归测试覆盖范围后,两项冻结的隐藏检查均通过。.
评论者观点: 更全面的边界情况覆盖;在“冻结”评分标准下,功能评分保持不变。.
查看完整的Codex输出结果
完整的、经过安全处理的、首次有效的输出
已实现夏令时修复。 已修改的文件: - [scheduler/time_rules.py](./scheduler/time_rules.py) - [tests/test_time_rules.py](./tests/test_time_rules.py) 变更内容: - 时间向前调整一个本地日历日,而非 24 个 UTC 小时。 - 添加了纽约夏令时开始和结束的回归测试。 - 验证了 UTC 时间间隔分别为 23 小时和 25 小时。 检查结果: - 单元测试:4 个通过。 - 内存语法检查:7 个 Python 文件通过。 - 字节码编译被阻止,因为 Python 将其缓存重定向到了指定工作区之外;未写入任何外部文件。 **结论:** `next_daily_run` 现已在夏令时转换期间保留了请求的实际时间小时。无需做出任何决策。.
查看完整的 Claude 代码输出
完整的交接记录,包括首次有效的输出原文
# T3 运行记录 — DST 错误修复
## 执行参数
| 字段 | 值 |
| --- | --- |
| 任务 | `T3` |
| 冻结提示 | `01-prompts/T3.md` |
| 冻结提示词 SHA-256 | `3fee50d0230f27f8d6dd7f12e050fa3f0b7f5fb77d9559361fee96e5f1a47307` |
| 执行单元 | 隔离的 Claude 子代理,`通用型`,全新上下文 |
| 隔离方法 | **子代理回退**(已记录的降级操作 — 参见 `results/isolation-decision.md`) |
| 分配的干净副本 | `runtime/workspaces/T3` |
| Claude 代码版本 | `2.1.220` |
| 模型设置 | `claude-opus-5` |
| start_utc | `2026-07-28T10:28:05Z` |
| end_utc | `2026-07-28T10:30:03Z` |
| 持续时间 | 118 秒(与 T1、T2、T4 同时进行;非纯延迟测量) |
| 尝试次数 | 1 |
| 状态 | `有效` |
| 人工干预 | 无 |
## Safe 工具摘要
仅在指定工作区内部使用 `date`、`Read`/`Edit`,`python3 -m unittest discover`,
`python3 -m compileall`,一次内存中的阴性对照运行,一次清单完整性检查。
仅使用标准库(`datetime`、`zoneinfo`、`unittest`)。无网络连接,无安装操作。
## 文件变更
`scheduler/time_rules.py`(修复内容——仅修改了 `next_daily_run` 的主体和文档字符串),
`tests/test_scheduler.py`(添加了 `NextDailyRunTests`,8 个测试,以及一个 `_elapsed` 辅助函数;
现有测试未修改)。未修改其他模块,未添加文件。完整补丁:
`results/T3/patch.diff`。
## 离线检查结果
由任务运行器报告:
| 检查项 | 结果 |
| --- | --- |
| `python3 -m unittest discover -s tests -v` | **10 通过,0 失败**(2 个原有测试 + 8 个新测试) |
| `python3 -m compileall -q scheduler tests` | 通过 |
| 清单完整性与 `fixture-manifest.json` 对比 | 0 个缺失,0 个异常 |
| 阴性对照:内存中修补的种子实现,仅限 `NextDailyRunTests` | 运行了 8 个,**5 个按预期失败**,包括两个夏令时测试 |
由协调员在工作区外部独立重新验证:
| 检查项 | 退出状态 | 结果 |
| --- | --- | --- |
| 公共测试套件(`results/checks/T3-public.txt`) | 0 | 10 个测试,通过 |
| 隐藏验证器 `03-checks/test_t3_hidden.py`(`results/checks/T3-hidden.txt`) | 0 | 2 个测试,通过 |
隐藏验证器在原始测试数据副本上失败(退出代码 1)。参见
`results/checks/validator-controls.md`。
## 黄金映射行为覆盖率
`03-checks/gold-map.json` 中所有四个必备行为均已满足:
| 必备行为 | 证据 |
| --- | --- |
| 墙钟小时保持不变 | 对原始本地墙钟应用增量,时区重新关联;在每个夏令时测试中均已验证 |
| 春季过渡已覆盖 | `test_spring_forward_keeps_requested_hour` — 保持 09:30,时区偏移 `-04:00`,耗时 23 小时 |
| 涵盖秋季转换 | `test_fall_back_keeps_requested_hour` — 保持 09:30 时,时区偏移量 `-05:00`,经过 25 小时 |
| 使用 IANA 时区 | 来自标准库的 `ZoneInfo("America/New_York")` |
除了必测用例外,测试运行器还覆盖了 PEP 495 的两个边界情况——因"春令时"调整而被跳过的
墙钟时间,以及“秋令时”回调期间的模棱两可的墙钟时间——此外还包括跨越每次时区转换的七天滚动
测试,以及“朴素输入”行为。
## 已修正的错误
两个自酿的测试断言失败:对两个共享同一
`tzinfo` 的日期时间进行 `following - previous` 运算时,会减去原始墙钟时间,因此经过时间断言显示为 1 天并失败。
实现是正确的,而断言有误;通过一个名为 `_elapsed`
的辅助函数进行了修正,该函数会先将两个操作数都转换为 UTC。没有工具、导入或环境错误。
运行后已移除 `__pycache__` 残留文件。
## 可见输出 (原文照录)
**重现步骤**
在 2024 年夏令时转换的两个时间点,分别使用 `America/New_York` 时区的时间戳调用 `scheduler/time_rules.py::next_daily_run`:
```
2024-03-09T09:30:00-05:00 -> 2024-03-10T10:30:00-04:00 # 时差漂移 +1
2024-11-02T09:30:00-04:00 -> 2024-11-03T08:30:00-05:00 # 小时漂移 -1
```
一个要求在当地时间09:30执行的任务,在夏令时开始后于10:30触发,在冬令时开始后于08:30触发。
**根本原因**
初始实现将“daily”视为一个固定的绝对时长:
```python
elapsed = previous_run.astimezone(timezone.utc) + timedelta(hours=24)
return elapsed.astimezone(previous_run.tzinfo)
```
先转换为 UTC 会导致 `timedelta(hours=24)` 的实际耗时恰好为 24 小时。 但在 IANA 时区中,当地日历日于夏令时开始日为 23 小时,于冬令时开始日为 25 小时,因此恒定的 24 小时偏移量必然会导致结果与请求的实际时间相差一小时。
**修复方案**(`scheduler/time_rules.py`)
每日重复属于日历规则,因此现在将增量应用于原始本地墙钟时间,随后再重新附加时区信息:
```python
tzinfo = previous_run.tzinfo
naive_next = previous_run.replace(tzinfo=None) + timedelta(days=1)
if tzinfo is None:
return naive_next
candidate = naive_next.replace(tzinfo=tzinfo, fold=0)
return candidate.astimezone(timezone.utc).astimezone(tzinfo)
```
为什么这样做是正确的:
- 对原始值进行的墙钟运算与时区偏移无关,因此请求的小时:分钟值在构造过程中得以保留; 随后 `zoneinfo` 会提供新日期生效的 UTC 偏移量(已验证:夏令时开始后为 `-04:00`,夏令时结束后为 `-05:00`,实际经过时间分别为 23 小时和 25 小时)。
- `fold=0` 结合 UTC 往返处理机制,可处理纯墙钟运算中未明确定义的两个边界情况。根据 PEP 495,一个被*跳过*的墙钟时间 (2024-03-10 02:30)在 `fold=0` 时采用过渡前的偏移量,因此往返处理将其规范化为实际时刻 03:30 EDT,而非返回一个未指定具体时刻的 datetime 对象。 一个*模棱两可*的墙钟时间(2024-11-03 01:30)会确定性地解析为其首次出现的时间(EDT),而非任意结果。
- 简单输入保留其原有含义(单纯增加 1 个日历日)——不会对调用方施加新的 `tzinfo` 要求。
变更范围保持较小:仅修改了 `next_daily_run` 的主体代码和文档字符串。 `service.py`、`models.py`、`repository.py` 和 `__init__.py` 均未修改,未添加新文件,且测试 fixture 清单仍完全匹配(无缺失或意外文件)。仅使用标准库(`datetime`、`zoneinfo`、`unittest`)。
**回归测试**(`tests/test_scheduler.py`, 新的 `NextDailyRunTests`,共 8 个测试)涵盖:普通日稳定性、夏令时开始(时差 + 23 小时已过)、冬令时开始(时差 + 25 小时已过)、跨越每次时令转换的七天滚动周期、跳过的实际时间、模糊的实际时间以及简单输入。
有两点值得注意。首先,我最初的经过时间断言使用了 `following - previous`;Python 会忽略共享的 `tzinfo` 并直接减去原始墙钟时间,因此两者都返回了 1 天并导致测试失败。 实现是正确的,而断言有误——通过一个将两个操作数都转换为 UTC 的 `_elapsed` 辅助函数进行了修复。 其次,我通过在内存中对已初始化的实现副本重新运行 `NextDailyRunTests`,验证了这些测试确实能捕获原始缺陷:8 个测试中有 5 个失败,包括两个夏令时测试。 在存在缺陷的版本中通过测试的三个案例(普通日、跳过、模糊情况)更多是记录行为而非捕获回归——跳过/模糊情况之所以结果一致,只是因为 +24 小时的绝对偏移恰好落在了同一个标准化时刻上。.
环境限制:这是一个小型离线 Python 代码库。Claude 在 CLI OAuth 过期后使用了子代理作为备用方案,因此隔离性和令牌可见性并不完全一致。.
代码审查质量与人工核验
代码审查任务所体现的技能与功能实现有所不同。一名优秀的代码审查者必须能够发现可复现的问题,评估其影响程度,准确指出代码路径,并区分真正的缺陷与推测性的警告。修复问题还需通过另一项测试:补丁不得引入新的回归问题。.
在T4测试中,Claude Code表现出了最明显的优势。 该团队报告了五项可独立复现的发现,其中包括两个预设的审查目标,得分19/20。Codex团队报告并修复了两个有效的较高严重级别的缺陷,但未提及那对预设缺陷,得分18/20。Codex团队的发现并非误报;两者之间的差异在于检测范围的广度,而非基本正确性。.
T4 · 受控存储库测试
查找可重现的缺陷,并修复可信度最高的问题
审查测试用例,重现实际缺陷,应用允许的修复方案,并证明回归测试能有效约束该行为。.
1. 高 — 现有任务可能会被悄然覆盖。 2. 中 — 每日任务的运行时间在夏令时转换期间出现偏差。 验证结果:4 个测试通过,0 个失败。.
评论者观点: 虽然发现了有价值的高严重性问题并进行了针对性修复,但未能达到两个预设的审查目标。.
D1 DST 漂移 · 高 D2 简单时区获取 · 中 D3 标识符冲突 · 高 D4 删除操作缺失会引发 KeyError · 中 D5 所有者未经验证 · 低
评论者观点: 审查范围更广,且未出现任何重复的假阳性结果;其中两项与合同相关的发现未予修正。.
查看完整的Codex输出结果
完整的、经过安全处理的、首次有效的输出
## 需采取行动的发现 1. **高 — 现有任务可能会被无提示地覆盖** - 证据:[service.py](./scheduler/service.py:8) 中的标识符初始化,结合 [repository.py](./scheduler/repository.py:9) 中的字典替换。 - 影响:使用现有存储库创建服务时,可能会复用标识符 `1`,从而替换已存储的任务并导致数据丢失。 - 最小复现步骤:保存 `Job(1, ...)`,构建 `SchedulerService(repository)`,然后创建另一个任务。在修复之前,仅保留新任务。 - 修复方案:从存储库中现有的最高标识符开始初始化下一个标识符。 - 回归测试:[test_scheduler.py](./tests/test_scheduler.py:22)。 2. **中等 — 每日任务在夏令时转换期间出现时间偏差** - 证据:在 [time_rules.py](./scheduler/time_rules.py:4) 中修正了计算逻辑。 - 影响:一个计划于 09:00 运行的每日任务,在春季夏令时转换后于 10:00 运行。 - 最小重现步骤:计算 `2026-03-07 09:00 America/New_York` 之后的下次运行时间。 修复前,结果为 `2026-03-08 10:00`。 - 修复方案:增加一个本地日历日,而非 24 个已过去的 UTC 小时。 - 回归测试:[test_scheduler.py](./tests/test_scheduler.py:33)。 ## 已修改的文件 - [scheduler/service.py](./scheduler/service.py) - [scheduler/time_rules.py](./scheduler/time_rules.py) - [tests/test_scheduler.py](./tests/test_scheduler.py) ## 验证 - 在修复之前,观察到两项回归测试均失败。 - 每项测试在相应的修复后均通过。 - `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v` - 结果:**4 个测试通过,0 个失败**。 - 没有残留的生成的 Python 缓存文件。 ## 结论与决策 - **结论:** 两个已确认的缺陷均已修复,并由针对性的回归测试覆盖。 - **需做出的决策:** 无。.
查看完整的 Claude 代码输出
完整的交接记录,包括首次有效的输出原文
# T4 运行记录 — 测试与代码审查
## 执行参数
| 字段 | 值 |
| --- | --- |
| 任务 | `T4` |
| 冻结提示词 | `01-prompts/T4.md` |
| 冻结提示词 SHA-256 | `5e69546007ea776f40b3d334ddb75671ff684c151c77551bad27de3b0fdce640` |
| 执行单元 | 隔离的 Claude 子代理,`通用型`,全新上下文 |
| 隔离方法 | **子代理回退**(已记录的降级操作 — 参见 `results/isolation-decision.md`) |
| 分配的干净副本 | `runtime/workspaces/T4` |
| Claude 代码版本 | `2.1.220` |
| 模型设置 | `claude-opus-5` |
| start_utc | `2026-07-28T10:28:22Z` |
| end_utc | `2026-07-28T10:32:17Z` |
| 持续时间 | 235 秒(与 T1–T3 同时进行;非纯延迟测量) |
| 尝试次数 | 1 |
| 状态 | `有效` |
| 人工干预 | 无 |
冻结提示中的条件——"如果冻结的运行配置允许
进行修复,则进行修复"——由协调器根据 `00-control/run-config.json` 和
`00-control/safety-policy.json` 进行解析,这两份文件允许写入隔离的测试用例副本。 运行器被
告知允许进行修复。未向其展示任何控制文件。
## 安全工具摘要
`date`、仅在分配的工作区内进行`Read`/`Edit`/`Write`操作、`grep`、
`python3 -m unittest discover`、`python3 -m compileall`、一次临时副本的空运行、一次
清单存在性检查。无网络连接,无安装操作,仅使用标准库。
## 已修改的文件
`scheduler/time_rules.py`(已修改)、`scheduler/service.py`(已修改)、
`tests/test_scheduler.py`(已修改,+2 个测试用例),`tests/test_time_rules.py`(已添加,5 个测试用例)。
完整补丁:`results/T4/patch.diff`。
## 离线检查结果
由任务运行器报告:
| 检查项 | 结果 |
| --- | --- |
| `python3 -m unittest discover -s tests -v` | **9 通过,0 失败,0 跳过**(基线 2) |
| `python3 -m compileall -q scheduler tests` | 通过 |
| 清单文件存在性检查(与 `expected_files` 对比) | 8 个文件均存在 |
| 针对恢复后的原始实现运行 vacuity 检查 | 5 个失败,4 个通过,符合预期 |
由协调员在工作区外部独立重新验证:
| 检查项 | 退出状态 | 结果 |
| --- | --- | --- |
| 公共测试套件(`results/checks/T4-public.txt`) | 0 | 9 个测试,通过 |
信息性交叉检查,不计分:T3隐藏验证器在此
工作区中也通过(退出代码 0),因为 T4 已独立修复了相同的 `next_daily_run` 缺陷。参见
`results/checks/validator-controls.md`。
## Gold-map 缺陷覆盖率
`03-checks/gold-map.json` 为 T4 评分设置了两个缺陷。均已检测到:
| 设置的缺陷 | 已检测到 | 报告状态 |
| --- | --- | --- |
| 空白所有者已接受 | 是 | **D5**,`scheduler/service.py:11,13`,严重程度低,已报告且故意未修复 |
| 删除缺失的标识符引发 `KeyError` | 是 | **D4**,`scheduler/repository.py:19` → `service.py:22`,严重程度为中等,已上报且故意未修复 |
除预设缺陷集外,还报告了另外三项发现。均非误报:
- **D1** — `next_daily_run` 中存在夏令时漂移。这是
`03-checks/seeded-defects.md` 中列出的第三个缺陷(其评分归类于 T3 而非 T4,但确实是一个真实的预设缺陷)。
- **D2** — `next_daily_run` 中的简单输入会无提示地获取主机时区,并返回一个
已考虑时区的 datetime 对象。该问题真实存在且与主机相关;协调员已通过测试用例源代码进行了验证。
- **D3** — 服务与注入或共享的存储库之间发生标识符冲突,导致
无提示覆盖。真实缺陷:`SchedulerService._next_identifier` 始终从 1 开始,而
`JobRepository.save` 是一个未受保护的字典赋值。 T1 独立地从原始测试用例中识别出了相同的
漏洞点。
误报数量:**0**。测试运行器还正确报告未发现安全问题,并指出
该测试用例不存在网络、I/O、反序列化、子进程或凭据暴露风险。
## 值得记录的偏差
固定提示要求针对"置信度最高的两个缺陷"进行测试和修复。 该
测试人员选择了 D1/D2(一个修复,同一函数)和 D3,而非黄金地图中预设的
两个缺陷 D4 和 D5。其给出的理由是合理的:D4 和 D5 都取决于未明确指定的 API
契约,因此修复它们将纯属猜测。 缺陷检测成绩不受影响——两个预设缺陷
均已被发现,并记录了文件、行号、严重程度、影响及重现步骤。所应用的修复针对的是真实
缺陷,并经过了空值检查的验证。
## 已清理的错误
因使用共享 `tzinfo` 的日期时间时,将"墙钟时间"与"绝对时间"相减导致两次自发测试失败;
已更正并重新验证。无工具或环境错误。运行后已移除 `__pycache__`
残留文件。
## 可见输出(原样)
### 缺陷报告
**D1 — `scheduler/time_rules.py:10-11` — 夏令时期间每日计划出现一小时偏差 — 严重程度:高**
`next_daily_run` 通过 UTC 往返方式增加了 24 个*实际*小时,而非推进日历日期。 由于每日任务由实际时间定义,因此从夏令时转换日开始,夏令时时区内的每个任务都会在不知不觉中提前或推迟一小时执行,且该错误会持续存在(每次运行都会从偏移后的时间重新初始化)。文档字符串本身也承认了这种行为。
```
prev = datetime(2024, 3, 9, 9, 0, tzinfo=ZoneInfo('America/New_York'))
next_daily_run(prev) # -> 2024-03-10 10:00:00-04:00,预期结果为 09:00-04:00
prev = datetime(2024, 11, 2, 9, 0, tzinfo=ZoneInfo("America/New_York"))
next_daily_run(prev) # -> 2024-11-03 08:00:00-05:00,预期 09:00-05:00
```
**D2 — `scheduler/time_rules.py:10-11` — 简单输入会默认采用机器的本地时区 — 严重性:中等**
同为两行代码。对"无时区意识"的 datetime 对象调用 `.astimezone(timezone.utc)` 时,会默认采用系统本地时区;而 `.astimezone(None)` 则会返回一个"具有时区意识"的 datetime 对象。 以"未感知"形式传入的调用会返回'感知'形式的输出,因此结果无法与调用方其他'未感知'的值进行比较(比较时会引发 `TypeError`),且结果取决于主机的 `TZ`。
```
next_daily_run(datetime(2024, 1, 1, 9, 0))
# -> datetime(2024, 1, 2, 9, 0, tzinfo=timezone(timedelta(hours=8), "CST")) # 取决于主机
```
**D3 — `scheduler/service.py:8,13,15`(前缀)— 标识符冲突会悄无声息地销毁已存储的任务 — 严重性:高**
ID 计数器是按 `SchedulerService` 实例单独维护的,且始终从 1 开始,忽略注入的存储库内容。任何第二个使用共享存储库的服务,或任何使用预填充存储库的服务,都会重新分配 ID 1; 由于 `JobRepository.save` 是字典赋值操作,因此会覆盖现有任务且不会报错。导致数据丢失。
```
repo = JobRepository()
SchedulerService(repo).create_job("Nightly backup", 'Alex') # 再次生成 ID 1
SchedulerService(repo).create_job('工资单导出', 'Blake') # 再次生成 id 1
repo.all() # -> [Job(1, '工资单导出', 'Blake')] — Alex 的任务不见了
```
**D4 — `scheduler/repository.py:19` → `scheduler/service.py:22` — `delete_job` 因未知 ID 引发 `KeyError` — 严重程度:中等**
`delete` 方法在调用 `dict.pop` 时未设置默认值,而其同级方法 `get` (第 13 行)在未找到时返回 `None`。这种不一致导致原始 `KeyError` 通过 `SchedulerService.delete_job` 泄露出来,调用方很难捕获到该异常。重现步骤:`SchedulerService().delete_job(999)` → `KeyError: 999`。 修复方案可采用 `pop(identifier, None)` 或显式抛出领域异常——此处故意未修复,因为正确的接口约定(无声无操作 vs. 类型化错误)应由所有者通过 API 决策决定。
**D5 — `scheduler/service.py:11,13` — “owner”字段未经过有效性验证 — 严重程度:低**
`name` 会检查是否为空,但 `owner` 不会:`create_job("ok", " ")` 会将 `owner=''` 存储进去。 这两个参数还都在未加保护的情况下调用了 `.strip()`,因此 `None` 会引发 `AttributeError: 'NoneType' object has no attribute 'strip'`,而非 API 通常用于处理错误输入的 `ValueError`。未修复——该测试用例中任何地方均未明确说明预期所有者契约。
**安全性:**未发现问题。该测试 fixture 不涉及网络、I/O、反序列化、子进程或凭据接口;存储采用进程内字典。
**覆盖率缺口:**在本次运行之前,`scheduler/time_rules.py` 和 `scheduler/repository.py` 的测试覆盖率为零;两个预设测试仅验证了服务的正常流程。
### 已应用的测试与修复
信心度最高的两个缺陷是 **D1/D2**(同一函数,一个修复)和 **D3**。
**修复 1 — `scheduler/time_rules.py`:** 将 UTC 往返计算替换为 `previous_run + timedelta(days=1)`。 Python 对“aware datetimes”执行实际时间运算,而 `zoneinfo` 会根据新的实际时间懒加载地重新解析 UTC 偏移量——因此 09:00 仍保持为 09:00,而偏移量会正确地从 `-05:00` 变为 `-04:00`。 这同时修复了 D1 和 D2:原始输入现在保持原始状态,且绝不会推断本地时区。关于“不可达”与“模糊”的过渡小时情况,文档中说明将遵循 tzinfo 的折叠规则。
**修复 2 — `scheduler/service.py`:** 移除了每个实例的 `_next_identifier` 计数器;现在在创建时,标识符会从存储库状态中按 `max(现有 ID, 默认值=0) + 1` 的方式分配。这对于共享存储库和预填充存储库均正确。 权衡:每次创建操作的时间复杂度从 O(1) 变为 O(n),对于基于字典的内存存储而言尚可接受,且比使用无法“看到”其写入目标存储的计数器更保证正确性。
**测试 — `tests/test_time_rules.py`(新增,5 个测试):** 春进和秋回时钟时间保持、这些过渡期间的绝对经过时间为 23 小时/25 小时、UTC 偏移量重新解析、简单模式保持简单模式,以及纯 UTC 日期提前。若不存在 IANA 数据库,则干净地跳过。
**测试 — `tests/test_scheduler.py`(扩展,新增 2 个测试):** 共享同一存储库的两个服务必须生成不同的 ID 并保留两个任务;对于预先填充了 ID 1 和 7 的存储库,服务必须生成 ID 8 并保持现有任务不变。
**空值检查:**我在一个临时副本中恢复了两个原始实现,并重新运行了测试套件——所有 5 个新测试均失败(`FAILED (failures=5)`),而针对修复后的代码,所有测试均通过。这些测试确实锁定了缺陷。
运行过程中进行了一处修正:我的初稿将夏令时(DST)经过时间断言为 `result - previous`,当两个操作数共享同一 tzinfo 时,Python 会将其视为墙钟时间运算,因此结果被解读为 `24h`,导致测试失败。现在的断言在减法运算前会先转换为 UTC 时间。 失败原因出在我的测试中,而非修复代码本身。
### 给负责人的备注
`fixture-manifest.json` 未被修改,因此 `tests/test_time_rules.py` 是 `expected_files` 中未列出的有效新文件——如果检查要求精确匹配文件集,请更新清单。 此外,D4/D5 虽已报告但故意未修复:两者均取决于 API 契约的决策(删除时的缺失语义、所有者验证规则),而这些在测试 fixture 中任何地方均未明确规定,因此选择其中一个方案将只是猜测而非真正的修复。.
环境限制:这是一个小型离线 Python 代码库。Claude 在 CLI OAuth 过期后使用了子代理作为备用方案,因此隔离性和令牌可见性并不完全一致。.
无论哪种评分方式,都无法取代人工审查。在任一代理完成修复后,请检查已更改的接口、意外的文件作用域、缺失的负向测试、权限或命令历史记录,以及回滚路径。有说服力的解释不能替代可重现的测试。.
权限、沙箱和运行安全
编码代理可以读取私有代码、执行shell命令、修改大量文件,并调用外部工具。因此,权限设计已成为产品品质的重要组成部分。相关的问题包括:哪些操作需要审批、代理默认可以访问哪些内容、它对高风险操作的预览是否足够清晰,以及开发人员能否检查由此产生的更改。.
不要认为审批提示越少就越好。在没有凭据或生产环境连接的孤立环境中,低摩擦确实很有用。但在连接了部署脚本、真实客户数据或广泛云权限的代码库中,同样的行为可能会带来风险。反之,过多的审批可能会使安全的自动化变得不切实际,并导致用户在未仔细阅读请求内容的情况下就予以批准。.
我们的测试使用了全新的本地副本,未涉及生产系统、部署过程,也未进行有效运行的人工干预。因此,该测试评估的是在安全条件下任务的完成情况,而非两款产品的相对安全性。 在将任何一款工具用于重要工作之前,请先以只读权限开始,定义允许访问的目录和命令,审查差异报告,并在可恢复的环境中进行客观性检查。.
- 从只读架构开始,否则将面临风险。.
- 请仅批准那些您了解其作用范围和后果的命令。.
- 请将凭据、生产数据和部署访问权限保留在试用范围之外。.
- 在接受结果之前,必须提供差异报告、测试结果以及明确的回滚路径。.
MCP、技能、项目指南和自定义设置
这两种生态系统均可进行扩展,但“扩展”这一术语不应被视为同义词。项目说明会指导代理在存储库中如何行为。可重用技能将可重复的工作流或专业知识打包成包。MCP 将主机与外部工具或数据连接起来。钩子和命令可自动化开发循环中的特定环节。 一款产品可以在某一层面上表现出色,而无需在另一层面上逐一匹配相应功能。.
采购时需要考虑的问题并非是否存在集成徽标,而是该连接能否在您实际使用的宿主机上完成安装、身份验证、审批并投入使用。此外,它还需要具备易于理解的故障模式。 一台在交互式会话中能正常运行,但在无人值守会话中需要等待批准的 MCP 服务器虽然仍有用处,但不应被描述为“无摩擦自动化”。.
可复用指令也存在类似的注意事项。冗长的指令文件并不能保证合规性,而过于复杂的规则集可能会忽略上下文或导致矛盾。请确保代码库指南简明扼要、可测试,并紧贴代码。明确规定必要的验证命令、受保护区域、风格规则,以及代理何时必须暂停并寻求确认。.
- 项目说明: 针对特定仓库的规则和验证命令。.
- 技能: 可重用程序或专业知识包。.
- MCP: 与外部工具和数据的连接。.
- 钩子和命令: 围绕预定义的工作流事件进行的自动化。.
Codex 与 Claude 代码的定价及使用限制
“Clean Consumer”套餐的起价为每月 $20。通过相应的 $20 ChatGPT 套餐可使用 Codex 服务,而 Claude Pro 套餐在美国的月费为 $20,并包含 Claude Code 服务。 两者均提供$100和$200两个高用量消费级套餐。标价相近并不意味着容量完全相同。.
Claude Max 5x 的月费为 $100,Max 20x 的月费为 $200。 “5x”和“20x”的命名描述的是相对于 Pro 版本的单次会话使用量,而非保证的编码任务数量。Claude 和 Claude Code 共享会话和每周配额。上下文长度、附件、模型选择以及功能使用情况都会影响配额的消耗速度。.

启用 Claude 的可选使用额度后,在包含的使用量用尽后,符合条件的工作仍可继续进行,且这些额度将按标准 API 费率单独计费。API 密钥认证是另一条独立的计费途径。若将任一途径称为“无限”,则会掩盖其实际的边际成本。.

Codex 同样将包含在用户套餐内的使用量、符合条件的已购积分以及 API 计费区分开来。本地消息和云端聊天共享一个五小时的时段,此外可能还受每周限额的限制。CLI 日志中的令牌字段无法直接转换为五小时使用量的百分比、订阅积分金额或 API 账单金额。.
对于偶尔进行的单人编码工作,无论选择哪一侧的 $20 层级,都是合理的起点。 日常涉及长上下文的仓库工作或许需要更高使用层级,但这必须在观察到实际重置情况和任务消耗之后才能确定。高强度并行工作则需要更加谨慎:即使付费升级到更高层级,也依然需要控制上下文、拆分任务,并将高成本的推理能力保留给需要高度判断力的工作。.
我们对Codex与Claude代码进行的对照测试结果
在两个智能体开始运行之前,我们预先锁定了四个英语提示、一个公开的 Python 测试集、客观检查项、评分标准以及“首次有效结果”规则。任务涵盖了陌生代码库的理解、多文件功能、DST 漏洞修复以及带修复方案的代码审查。 有效结果无需人工干预,而那些虽然较弱但有效的输出结果则无法重新运行以获得更高的分数。.
Codex 运行了独立的 CLI 进程,其中保留了原始 JSONL 以及 CLI 生成的令牌字段。由于该同事的 Claude CLI OAuth 会话已过期,因此 Claude Code 使用了一个带有全新子代理上下文的协调器。 我们在干净的审计副本中重构了 Claude 的补丁,并重新运行了公开和隐藏的检查。这产生了可信的实际证据,但隔离环境和模型控制面并不完全相同。.
| 任务 | 《法典》 | 克劳德代码 | 有界解释 |
|---|---|---|---|
| T1:对代码库的理解 | 20/20 | 20/20 | 平局;紧凑型与穷举型 |
| T2:多文件功能 | 30/30 | 30/30 | 功能性关联;不同的验证和测试范围 |
| T3:DST修复 | 30/30 | 30/30 | 两者均通过;较窄的修补区域与较宽的边缘覆盖范围 |
| T4:检查与维修 | 18/20 | 19/20 | Claude 代码显示出更广泛的审查范围 |
受控测试 · 固定评分标准
Codex 98/100 与 Claude Code 99/100
1分的差距并非放之四海皆准的获胜信号。有意义的差异取决于具体任务。.
| 决策区域 | 观测结果 | 实用阅读 |
|---|---|---|
| 对代码库的理解 | 平局 · 各20/20 | Claude 更全面;Codex 则更简洁。. |
| 多文件功能 | 平局 · 各30/30 | 两者均通过了隐式检查;Claude 增加了更全面的测试。. |
| 夏令时(DST)错误修复 | 平局 · 各30/30 | Claude 覆盖的边缘更多;Codex 则采用了较窄的补丁。. |
| 检查与维修 | Claude 19/20;Codex 18/20 | Claude 发现了更多可重现的缺陷。. |
| 观测速度 | 混合型 | Claude 领跑 T1/T2;Codex 领跑 T3/T4。. |
披露: 提示和测试环境相同,但隔离路径不同。请勿将此小型测试的结果推广到每个存储库、模型层或独立会话。.
该测试框架规模过小,无法评估其在大型代码库、所有编程语言、所有模型层级或长时间自主运行场景下的性能。这一总分差距最好理解为“两者均成功,但审查范围存在差异”,而非一种普适性的排名。.
真实用户的反馈——以及该相信多少
当社区反馈包含项目、任务、模型、工作场景和时间范围时,这类反馈才具有价值。如果某条帖子仅表示某个产品“感觉更智能”或“速度快得多”,那么该反馈的参考价值就较低。不同用户会比较不同的代码库、订阅等级、提示词、扩展程序以及监督程度。.
上文提到的Reddit实例表明,交互存在一种权衡:快速且对话式的交互可能需要更多注意力,而经过深思熟虑的执行虽然感觉较慢,但需要更少的修正。 我们的受控测试与该账号的情况仅部分重合。测试结果显示,在有效的运行中,速度表现参差不齐且未发现人工干预,因此无法验证“人工看护”的说法。这正是为何应将社区证据与受控证据并列展示,而不能将两者混为一谈。.
关于X型设计的那条评论还提出了一个有用的观点:编码结果属于整个系统,而不仅仅是模型标签。这两篇帖子都不应被视为调查数据。应利用它们来确定自己试验中需要关注的问题——干预次数、差异大小、测试质量以及从错误假设中恢复的情况。.
通过 GlobalGPT 扩展 Codex 和 Claude 代码
GlobalGPT 是一种 多模型、多模态工作区, ,并非用于替代原生代码库代理。其实际作用是扩展现有主机功能:利用另一种可用的代理模型进行二次审核、方案审查、文档核查或生成专用输出,而Codex或Claude Code仍负责代码库访问、shell命令、测试和审批。.
GlobalGPT 发布了针对以下内容的官方 CLI 指南: 《法典》 和 克劳德代码, ,以及 Cursor。在我们的 T5 安全集成测试中,CLI 在两种对比环境中均成功完成了同一项冻结任务。在 Codex 中,我们还验证了一个只读的 MCP 模型列表调用,并安装、加载并使用了 GlobalGPT 技能。.
GlobalGPT 整合 · 不计入编码分数
CLI 已在两个工作流中均通过验证;MCP 和 Skill 已在 Codex 中通过验证
这衡量的是整合路径,而非GlobalGPT是否取代了任一原生编码因子。.
| 路径 | Codex 环境 | Claude 同事跑团 |
|---|---|---|
| GlobalGPT CLI | 已通过 gpt-5.6-sol 和 gpt-5.6-luna 验证 | 已使用相同的冻结任务进行验证 |
| MCP | 已验证交互式只读模型列表 | 运行期间未连接 |
| 技能 | 已安装、已加载并已测试 | 已安装但未用于处理冻结呼叫 |
| 无人值守的 MCP | 观察到批准限制 | 未经过测试 |
查看完整的整合证据
# GlobalGPT 集成测试摘要 # # 范围 T5 用于评估 GlobalGPT 的集成情况,不计入原生 Codex 编码分数。未使用 Yukie。 ## 模型锁定与就绪状态 - 模型 A:`gpt-5.6-sol` - 模型 B:`gpt-5.6-luna` - 两个模型均出现在在线模型列表中。 - 两个轻量级就绪性探针均返回了有效且可解析的文本。 - 在正式调用 T5A 和 T5B 输出之前,模型已处于锁定状态。 ## 正式 CLI 结果 | 任务 | 模型 | 状态 | 耗时 | 提示词令牌数 | 完成词令牌数 | 所需标题数 | |---|---|---|---:|---:|---:|---:| | T5A | gpt-5.6-sol | 有效 | 27 秒 | 2,116 | 1,207 | 6/6 | | T5B | gpt-5.6-luna | 有效 | 14 秒 | 2,116 | 1,441 | 6/6 | 这两次正式调用均通过 `glbgpt exec` 使用了相同的冻结版英语产品规划任务,返回了仅显示英语的可见输出,且未暴露任何凭据。未进行质量重跑。 ## MCP 结果 - `codex mcp list` 显示 `globalgpt` 已启用。 - 一个非交互式 Codex 会话检测到并尝试调用 `mcp__globalgpt__glbgpt_list_models`,但由于无法获得无人值守的 MCP 批准,该调用被取消。未放宽任何安全设置。 - 当前活动的交互式 Codex 会话成功调用了相同的只读 GlobalGPT MCP 工具,并获取了九个聊天模型。 - 结果:已验证交互式 MCP 访问;无人值守的非交互式 MCP 执行仍受审批限制。 ## 技能结果 - 通过链接到捆绑的 CLI 技能包,已在 Codex 技能目录中安装了 GlobalGPT 和 GlobalGPT 编码技能。 - 加载了 GlobalGPT 技能,并对其进行了配置会话检查、实时模型选择、就绪性验证、信用安全选项配置以及故障处理的测试。 - 结果:已在活跃的 Codex 工作流中安装并运行。 ## 有限结论 本次运行验证了 GlobalGPT CLI 调用的有效性、从 Codex 发起的交互式 GlobalGPT MCP 只读调用,以及已安装并使用的 GlobalGPT 技能路径。 它并未证明每个模型、媒体工具、主机、账户或无人值守的 MCP 配置均能正常工作。它未对 Yukie 进行测试,也不支持“GlobalGPT 取代 Codex 或 Claude Code”的说法。.
已验证范围:特定的 CLI 调用、一次交互式 MCP 读取操作,以及一条已安装/正在使用的技能路径。这并不意味着已验证所有模型、媒体工具、主机或无人值守配置。.
边界很重要。该同事的 Claude 运行验证的是 CLI 路径,而非 Claude 侧的 MCP。该技能虽已安装在该处,但并未用于处理冻结的呼叫。 即使尝试使用无人值守的 Codex MCP,仍需人工批准。模型的可用性和积分也取决于当前的 GlobalGPT 套餐,因此开发人员应查看实时列表,而非假设所有模型均包含在内。.
GlobalGPT 还涵盖了图像、视频、音频以及带引导的 Agent 工作流。 Yukie 的幻灯片、文档和图片条目则属于另一类:它们为非编码任务提供了明确的模板和分步浏览器指导。与打开编码命令行界面(CLI)来制作演示文稿或结构化文档相比,这种方式可能更简单,但并不能替代代码库查阅、测试执行或代码审查。.
不同的工作流类别
Yukie 指导的浏览器代理测试
适用于特定任务的 Web 工作流;尚未经过测试,无法替代代码仓库中的编码代理。.
| 工作流程 | 已满足标准 | 首个有效结果 |
|---|---|---|
| 幻灯片 | 5/6 | 已生成包含五张幻灯片的演示文稿;无法验证讲者备注。. |
| 文档 | 6/6 | 结构化的研究简报,附带导出功能和版本历史记录。. |
| 图片 + 图注 | 5/6 | 醒目的方形视觉元素;应有的图注缺失。. |
合理的结论:明确的切入点和引导式多模式工作流。缺乏依据的结论:无限制使用、确切价格,或完全替代 Codex/Claude Code。.
独立开发者应该选择哪种编码工具?
- 选择 Codex 当紧凑有界执行、其可用表面的组合,或您当前配置中可用的运行证据符合您的工作方式时。.
- 选择 Claude 代码 当出现对话终端循环时,您已验证的自定义功能,或是像我们在测试用例中观察到的那种更广泛的审查行为,会显得更为重要。.
- 对于不熟悉的仓库,请使用其中任意一种 只有在通过只读架构和风险评估后,这两款工具都很好地完成了这项任务。.
- 有选择地同时使用这两者 在何种情况下,由第二方代理进行审核所产生的额外订阅和协调成本是值得的。应要求第二款工具对差异或计划提出质疑,而不是盲目地重复该任务。.
- 添加 GlobalGPT 当多模型路由或多模式处理是缺失的一环时,请将原生存储库操作保留在编码主机中。.
为期七天的试用比排行榜更能提供有价值的信息。 选择一个真实但非生产环境中的功能、缺陷和代码审查。固定提示语和成功指令。记录第一个有效的差异、通过的测试、耗时、人工干预、意外范围,以及该工作对可用配额的影响。更好的产品,是那种你能发现其错误且能维持其工作流的产品。.
Codex 与 Claude 代码常见问题解答
Codex 比 Claude Code 更好吗?
并非完全如此。两者都完成了我们测试套件中的四项任务。在代码审查范围方面,Claude Code 更胜一筹,而在部分实现和错误修复方面,Codex 则更为精简。.
对于大型代码库来说,哪种更好?
我们这个小工具无法回答这个问题。在允许进行更改之前,请先在您自己的代码库中,针对只读架构任务对两者进行评估。.
哪种编码剂对监护的要求较低?
这取决于任务的清晰度、模型设置、仓库说明以及期望的交互方式。一位Reddit用户报告了不同的监督模式,但这种个人体验并不代表整个产品的通用规则。.
哪一个更便宜?
主要消费层级分别为每月 $20、$100 和 $200,但所包含的容量和限额机制各不相同。可选积分和 API 计费是分开的。.
Claude 和 Claude 的代码共享使用限制是否相同?
是的。在已连接的 Pro 或 Max 套餐中,Claude 和 Claude Code 采用共享会话和每周限额机制。.
Codex 的本地任务和云端任务是否共享配额?
本地消息和云端聊天均受五小时时限的限制,此外可能还存在每周限额。.
GlobalGPT 能否替代 Codex 或 Claude Code?
不。它可以通过添加额外的模型、命令行界面(CLI)、MCP、技能和多模态工具来扩展任一工作流,但代码库访问权限和编码代理的行为仍由主机控制。.
我能否同时使用这两款产品中的GlobalGPT?
GlobalGPT 为这两种方式均提供了官方的命令行界面(CLI)教程。我们已在两种环境中验证了 CLI 的使用,并在 Codex 中验证了 MCP 与 Skill 的组合使用,但无人值守的 MCP 存在审批限制。.
定价、套餐规则、集成功能及来源依据均于2026年7月进行了核查。产品详情可能会有变动。.
开盘价 GlobalGPT 如果您希望在现有的编码工作流中添加多模型和多模态层。.




