跳转至

11. 真实任务走读:修复测试失败

本章以“修复测试失败”为例串联 Codex 智能体的运行机制。该任务从用户输入开始,经过轮次创建、上下文构造、模型采样、工具执行、权限检查、结果回填、再次采样和最终收束。

sequenceDiagram participant U as 用户 participant S as 会话 participant C as 上下文 participant M as 模型 participant P as 权限 participant T as 工具 participant H as 历史/事件 U->>S: 修复测试失败 S->>C: 创建轮次上下文 + 构造上下文 C->>M: 采样请求 M-->>S: shell 工具调用: 运行测试 S->>P: 检查命令权限 P-->>T: 允许沙箱执行 T-->>H: 测试失败输出 H->>C: 工具输出进入历史 C->>M: 后续采样 M-->>S: 读取文件 / 应用补丁 / 再验证 S->>P: 每个工具调用都检查权限 T-->>H: 工具结果与差异 H->>C: 更新历史 C->>M: 最终采样 M-->>S: 总结 S->>H: 轮次完成 + 持久化记录

输入进入轮次

用户在终端界面或一次性执行中提交“修复测试失败”。入口层将输入提交为 turn/start 请求,请求中可能同时包含当前目录、模型、权限、环境变量和输出格式等本轮配置。

会话收到请求后将其排入队列。当前没有活跃轮次时,会话创建新的轮次上下文并启动普通任务;当前存在活跃轮次时,输入可能作为待处理输入注入当前任务。

这个阶段建立任务边界。后续所有模型采样、工具调用、权限审批和事件都归属于该轮次,直到运行时发出轮次完成、失败或中断。

运行现场固定

普通任务启动后,运行时固定本轮现场。现场包括工作目录、模型、项目规则、权限边界、审批策略、沙箱、网络策略、可用工具、技能、插件和输出格式。

该现场同时影响模型上下文和工具执行。模型会看到权限和项目规则,本地工具运行时也按相同规则执行或拒绝动作。

运行现场固定后,模型不能通过文本修改权限,工具也不会从入口层重新读取临时配置。目录、权限和工具集合以轮次上下文为准,保证多轮采样期间规则一致。

模型上下文构造

轮次运行构造模型输入。模型看到当前用户目标、历史、项目规则、权限说明、环境信息、可用工具、显式触发的技能以及可能存在的长期记忆。

首次真实轮次注入完整规则,后续轮次主要注入变化。上下文构造结果进入历史和持久化记录,使后续采样、恢复和分叉保持现场连续。

上下文中包含可见工具规范,因此模型知道能够请求运行命令、读取文件或应用补丁。上下文中也包含权限说明,因此模型能够在只读或需审批环境下调整策略。

首次模型采样

模型基于上下文选择第一步。修复测试失败的常见路径是先复现失败,因此模型会请求 shell 工具运行测试命令。

模型此时只提出工具调用。命令尚未执行,本地运行时需要解析调用并进入权限链路。

工具调用会以结构化条目进入模型事件流。运行时等待完整参数到达后再解析命令,避免在参数尚未闭合时执行本地动作。

权限检查与测试执行

shell 处理器解析命令参数。权限系统结合权限配置、审批策略、执行策略和沙箱策略判断命令是否可执行。

当前策略允许时,测试命令在受控环境中执行。需要更高权限时,运行时发出审批请求或交给守护复核。审批被拒时,拒绝信息会写回模型上下文。

普通测试失败表现为命令退出码非零和错误输出,属于工具结果,不属于权限失败。

权限拒绝与测试失败的差异会影响后续模型行为。测试失败推动模型分析代码;权限拒绝推动模型请求授权、缩小操作范围或说明限制。

失败分支也会进入同一条回填链路。命令参数不合法时,工具结果会说明解析失败;沙箱阻止时,结果会说明动作被隔离层拦截;用户拒绝审批时,模型下一轮只能换成受限方案或向用户说明无法继续。这些结果不是旁路日志,而是下一次采样的正式输入。

测试输出回填

测试结束后,标准输出、标准错误、退出码和错误信息写入历史,并通过事件流展示给客户端。下一次模型采样会读取这些工具结果。

模型因此获得具体失败事实,例如失败测试名称、断言差异、编译错误、snapshot 变更或堆栈位置。后续分析基于真实执行反馈。

工具输出同时服务客户端和模型。客户端实时看到命令输出,模型在下一轮采样看到结构化工具输出。实时事件和历史记录来自同一次执行,但分别服务展示和推理。

文件读取与定位

模型根据失败输出选择读取相关文件。读文件可以通过 shell、文件查看工具、MCP 或连接器完成。读取结果进入历史,供下一次采样使用。

模型逐步建立失败与代码之间的关系:失败位置、相关实现、测试期望、最小修改范围、公共 API 影响和是否需要更新 snapshot。

读取文件可能发生多轮。模型可能先读取失败测试,再读取被测实现,再读取相关类型定义。每次读取结果都会回填历史,使模型逐步缩小修改范围。

修改生成与应用

模型定位问题后可能生成补丁。补丁进入本地安全评估,运行时检查修改路径、写入范围、权限、沙箱约束和审批要求。

评估通过后,补丁应用到工作区。应用结果、差异和相关事件写入历史与事件流。评估失败时,拒绝原因写回模型,模型需要调整方案、请求权限或说明限制。

差异事件使客户端看到工作区变化,补丁结果使模型知道修改是否成功。二者不完全相同:差异面向展示和审查,工具输出面向下一轮模型推理。

待处理输入介入

任务运行中用户可能追加限制,例如“避免修改公共 API”。该输入进入会话队列,并作为待处理输入合并到当前活跃轮次。

下一次模型采样会同时看到已有失败输出、已读文件内容、已产生的修改意图和用户新增限制。模型据此重新评估方案,避免继续执行与新约束冲突的动作。

待处理输入合并保持轮次连续性。用户追加限制不会丢弃已有工具结果,也不会默认开新任务;它改变的是当前任务下一次采样的上下文。

验证循环

修改完成后,模型通常再次请求运行目标测试。该请求重复工具调用、权限检查、沙箱执行和结果回填流程。

测试仍失败时,工具结果推动下一轮分析和修改。测试通过后,模型可能进行补充验证或输出总结。验证结果为运行时收束任务提供事实依据。

验证也会受权限系统约束。需要网络、写工作区外文件或无沙箱重试的验证命令仍会进入审批路径。通过结果只有在工具实际执行后才成为模型可用事实。

轮次收尾

模型不再请求工具并输出最终说明后,运行时确认没有未完成工具、没有待后续的工具结果、没有待处理输入,并且模型流和事件记录已经收束。

普通任务随后更新 token 用量、差异、长期记忆指标和活跃轮次状态,发送轮次完成。持久化记录和线程存储保存本次任务的关键记录,支持后续恢复、分叉和历史回放。

收尾记录包括最终助手输出、中间工具结果、上下文变化和轮次状态。后续恢复会话时,系统依赖这些记录重建模型曾经看到的事实和规则。

机制串联

“修复测试失败”任务展示了 Codex 智能体的核心协作:

用户目标
  -> 会话队列
  -> 轮次上下文
  -> 模型上下文
  -> 模型请求工具
  -> 权限和沙箱检查
  -> 本地工具执行
  -> 工具结果回填
  -> 模型继续采样
  -> 验证和总结
  -> 轮次完成
  -> 历史持久化

模型负责选择下一步,本地运行时负责执行边界,工具结果提供真实反馈,事件和持久化保证过程可观察且可恢复。