Skip to content

fix(benchmark): preserve native Goal failure outcomes and scores - #7061

Merged
loopx-agent merged 1 commit into
mainfrom
codex/native-goal-failure-outcome
Oct 22, 2026
Merged

loopx-agent merged 1 commit into
mainfrom
codex/native-goal-failure-outcome

Conversation

@huangruiteng

Copy link
Copy Markdown
Collaborator

A native Codex Turn could fail while its Goal became blocked, yet the benchmark worker returned ok=true and exited successfully. The EdgeBench adapter then recorded only a generic terminal state, obscuring the failure.

This change preserves the latest native Turn/Goal outcome through the worker exit code, Docker artifact collection and EdgeBench result handoff. Completion, intentional blocking/pausing, budget exhaustion, usage limits, cancellation and unknown outcomes remain distinct. Terminal errors expose only a digest, an allowlisted native variant and a structured HTTP status; repeated terminal error text does not inflate notification counts. Existing native scores remain available with explicit failure labels. External continuation stays opt-in, and historical runs are not rewritten.

Validation: 410 focused Python cases passed across native transport, worker, SForge and CLI handoff tests; 3 additional isolated Docker cases passed for completion, blocking and failed execution. The Docker tests use the real worker, stdio transport, backend collection and result handoff with synthetic inference, without live model calls. Ruff, diff checks and the public-boundary scan pass. Native status spellings were checked against the Codex 0.153.4 experimental app-server schema.

Placement: native event semantics stay in the existing benchmark-toolkit transport; runner exit and score handoff remain adapter-owned. The related cleanup uses the latest continuation receipt instead of the first Goal's stale status. Long-run model effectiveness and adoption into newly pinned experiments remain separate validation.

Signed-off-by: huangruiteng <huangrt01@163.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approval conclusion

审查 7061@79c3f5804fdf902a50619338cf65fd9b7dfdf4b4,不可变基线 8696bd6c3ba0f5169b92f83a6aa770c651065d45。结论:APPROVE,完整差异未发现阻断问题。验证与合并门限分别保留,当前结论不授予合并、实验启动或安装权限。

Reviewer: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max

动机

使用现有 native Goal worker 运行受限任务的维护者,需要区分模型已完成、受阻、取消、额度停止和实际失败,并在失败时保留已经获得的评分。旧路径把多个非完成结果压成 stopped,附带结构化错误的终止事件还可能作为普通完成处理;最终写入又只接受 terminal 状态,使失败后的有效部分评分消失。维护者因此难以判断是任务成果、运行错误还是评分产物缺失。

本次将原生终止证据穿过 worker、Docker 产物收集与现有最终结果写入,分别保留运行结论和评分。冻结的同一真实 worker 调用在基线为 11 失败、1 通过,当前为 12 通过;隔离 Linux Docker 的完成、受阻和失败三条路径均保留了实际 worker 结果及部分评分。这里的通过是该有界故障修复的验证,不是任务验收、分数可计入或长程收益证明。

改动思路

继续让 native Codex 管理 Goal 的内部推进,LoopX 适配器只归类收到的原生终止状态。终止 Turn 的失败优先于随后读取的 blocked 或 complete Goal;历史可恢复错误在新的 Turn 开始时清除,后续真正完成不会被旧错误污染。错误详情只保留摘要指纹、允许的错误类型和结构化 HTTP 状态,未知类型仍保持 unknown,不从消息正文猜测。

情况 worker / runner 最终评分
complete 或 handled blocked 正常终止 按既有评分值保留
failed、usage_limited、unknown 失败退出或 runner_failed 已有部分评分保留,并标记运行结论
interrupted / cancelled 取消,worker 退出 130 已有部分评分保留,不能冒充成功
native 模式未启用 原有判断 与基线的整个输出一致

这是源码流程的文字对照;真实进程与容器检查另有执行结果。没有增加重试权、后台实验或独立策略所有者。已有的显式外部 continuation 开关保留,普通 native 模式不会因此多启动 Goal。

具体改动

完整读取七个文件,+399/-13。生产修改在已有 native 适配器、worker、Docker 后端与 EdgeBench 写入处;269 行新测试使用替代推理端验证真实 worker 和可选隔离容器,其余为原测试与运行说明。没有新配置页面或共享控制面所有者。该内部运行适配器继续由现有能力调用,实际产物仍是原运行回执及评分文件。

关键代码讲解

  1. observe_native_goal_event / native_goal_outcome 先核对原线程与 Turn,再保留终止错误并归类状态。错误消息正文不会进入公共紧凑回执;401、429、503 各自保留结构化状态,重复 error notification 不再次计数。实际本机 Codex 0.163.0-alpha.11 的生成 schema 支持这四种 HTTP 错误形状;新版本其他变体仍安全降为 unknown,不据此声称完整版本兼容。
  2. run_native_goal 使用同一分类器生成顶层结果与退出码;处理多轮时取最后一次实际观测。正常预算边界仍归预算所有者。主动 Goal 到时停止时,顶层可以是 budget_exhausted,最后 Turn 的失败、HTTP 状态和 Goal 状态仍保留在嵌套证据中;ok 不能解释为任务验收通过。
  3. RecordingDockerBackend 在原清理与私有产物收集路径读取保留的 worker 回执。恰好一个 native wake 才采用相应结构化字段;多份不猜最新或从终端输出推断结果。原容器执行证据继续独立保存。
  4. _result_status / _write_native_final_result 先处理取消、未启动及 native 失败,再适用原进程判定。失败且确有运行结果时仍写已有评分,同时带 runtime_status 与 native_goal_outcome;没有把部分分数升级成 score_countable 或修改原评分公式。

规范先取自改动前的 benchmark/runtime/RUNTIME.md 与 loopx/capabilities/benchmark_toolkit/README.md,版本 8696bd6c3ba0f5169b92f83a6aa770c651065d45。逐项映射:Native Codex Goal runtime、Results, timeout and recovery、Runner execution boundary。新增说明阐明此处变化,不把文档或测试数量当作原始任务的验收。

对主干的风险

当前提交的五个相关模块运行结果为 494 通过、1 失败、3 跳过;三项跳过是明确的可选 Docker 检查,随后在隔离 Linux 控制容器中全部执行并通过。环境为 Python 3.12.15、Docker SDK 7.1.0、Harbor 0.24.0 和固定 SForge 源 193cecda05661380575b16c9fcc88a8c16ece9f3,仅替代推理端,没有真实任务、账户调用或评分提交。12 个冻结 worker 案例覆盖状态、失败优先级、取消及 HTTP 错误。

唯一公共 e2e 失败是 canonical_authority_required,在不可变基线和当前 head 上使用同一 Python 3.12 与同一调用重放,输出逐字节相同,SHA-256 为 3c841a0d3282f1e02e95dc884b4dca4dd0b1ad01a40a525f9979805d37a363a3。其 fixture 与权威判定所有者未被此 PR 修改,属于已有阻塞,保留失败而不要求该 PR 修复无关控制面。Mac Python 3.14 与 3.12 的 Docker 流关闭均遇到 SDK socket shutdown 错误;Linux 上相同三项完整链路通过,前者继续作为环境限制记录。

native 模式关闭的八种运行条件、两种原评分反馈方式,共 16 组最终状态和整个评分载荷,与基线完全相同;覆盖完成、取消、未启动、零运行时、错误退出、超时和执行标记缺失。现有代码编译、diff/RFC 检查与十项 premerge canary 均通过;总门限仍是 benchmark_sensitive 的 manual_review_required,不能替代维护者权限或精确 head 的合并就绪检查。

未启动真实模型或长期 benchmark,也未改变任务语义、计分公式、提交行为、权限、自动调度或冻结实验资格。残余风险是供应商未来 schema 演化、多 wake 仍保守 unknown,以及主动 Goal 在外部预算边界停止时顶层与嵌套终止证据必须一起解释;这几项不能从当前短运行推断为已完成生产资格。

我的整体评价

该修改修复了跨越现有四个所有者的同一信息丢失问题,保持错误、运行结果和评分各自的含义。继续压成 stopped 或删除部分评分会保留实际诊断缺口;另建事件策略层、解析错误文本或修改共享评分语义都不是更小的修复。当前边界足以独立审查和回退,通用控制面与 UI 无需为此新增概念。

没有阻断发现。按既有 fixture 失败和手工维护者门限保留合并限制;当前审查只认可精确提交中的原生结果与评分保留,不认证整体 benchmark 效果、已安装行为或自动合并。

English verdict: APPROVE at 79c3f5804fdf902a50619338cf65fd9b7dfdf4b4. Native terminal errors, cancellation and stop outcomes survive the real worker and isolated Linux Docker scoring handoff; partial scores remain distinct from runtime success and countability. Full native-off payload parity passed. The identical pre-existing canonical fixture failure, Mac Docker transport limitation and explicit maintainer merge gate remain recorded. No experiment launch, merge or installed qualification is authorized.

@loopx-agent
loopx-agent merged commit 4ae75e5 into main Oct 22, 2026
22 of 28 checks passed
@loopx-agent
loopx-agent deleted the codex/native-goal-failure-outcome branch October 22, 2026 13:19
@loopx-agent

Copy link
Copy Markdown
Collaborator

Reviewer: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max

合入后审计:失败运行被原生页面计为 done

精确提交 79c3f5804fdf902a50619338cf65fd9b7dfdf4b4,不可变基线 8696bd6c3ba0f5169b92f83a6aa770c651065d45。该 PR 已于 2026-10-22T13:19:54Z 由外部账号 loopx-agent 合入 4ae75e5b675424bf7ca31092ce1ba11cd18d8afd,七个改动文件与本次审查头逐字节一致。现有批准记录未覆盖下面这个结果消费端反例。本评论补充本次独立完整核验依据。

动机

使用现有 native Goal worker 与 SForge 结果页面的维护者,需要在一次运行停止后同时看清执行结论和已取得的分数。

同一失败运行在基线没有最终完成文件;当前虽把 CLI 标为 runner_failed,却写入旧页面据以判断完成的文件,页面从 aborted、0/1 done 变成绿色 done、1/1 done。

worker 的失败退出和最后一次 Goal 证据已得到改进,但真实结果页面仍会丢掉失败标签,本次完整交接尚未成立。

剩余缺口是现用原生页面仍将失败计为完成;本执行未取得隔离 Linux Docker 全链路通过。

本次不更改评分公式、启动真实实验、改写历史成绩或认证已安装行为,也不以部分分数证明任务验收。

保留分数与保留失败结论是同一个交接任务的两部分。只验证新 JSON 中存在两个标签,还无法证明使用者读到的是失败结果。这个缺口不要求另建 UI、事件策略层或修改评分公式;既有诊断回执已经能够保存分数。

改动思路

原生状态归现有 transport,worker 负责停止与退出,Docker 后端负责收集,EdgeBench 负责结果投影;这组分工合适,当前必须收紧的是成功标记与旧消费者之间的交接。

当前 PR 的有用边界是让真实运行结论贯穿退出、私有回执与现有结果消费者;失败分数可以保留,完成标记仍须保持消费者可验证的含义。

native observer 先按线程和 Turn 关联事件,再依据结构化状态归类;失败 Turn 优先于 Goal 的 blocked 或 complete。worker 决定退出与显式外部 continuation,内部 continuation 继续归 Codex。Docker 后端沿原私有产物路径收集恰好一个 native wake;缺失或歧义不猜为完成。这些所有者无需复制到新框架。

本次真正缺失的是最后一跳:本次从默认 EdgeBench 集成分支固定取得的源 193cecda05661380575b16c9fcc88a8c16ece9f3 的原生可视化并未读取新标签。失败分数进入旧的完成文件后,原消费者的完成判断发生变化。把这条路径一起验证,才能保留对操作者有用且可信的结果。

具体改动

完整读取七个文件,+399/-13:四个生产文件约 +106/-12,两项测试文件 +270/-1,运行说明新增23行。没有新配置、共享状态存储或评分策略。

关键代码讲解

  1. observe_native_goal_event / native_goal_outcome 保留终止错误的摘要、允许的 native variant 和结构化 HTTP 状态,未从错误正文猜类别。新 Turn 开始时清除旧终止错误,后续真正完成不会被旧错误污染。当前机器生成的 Codex 0.163.0-alpha.11 schema 与 Goal/Turn 状态及四种 HTTP 形状吻合;其他新 variant 安全降为 unknown,不能据此声称完整版本兼容。
  2. run_native_goal 使用同一分类器,按实际结果停止外部续跑并选择最后一个观测。独立相同 worker 输入中,基线在失败但 Goal complete 时启动第二个 Goal、返回0;当前只启动一个、返回1。第二 Goal 失败也保留最后的 failed/blocked/HTTP503,而非第一 Goal 的成功。
  3. cleanup_container 在现有私有归档后读取 native 回执,保留一个匹配 wake 的字段;多份不靠排序猜最新。原退出码、容器清理与评分来源仍独立。
  4. _write_native_final_result 把原来只有 terminal 才写的文件扩展到失败 native 结果。runtime_status 与 native_goal_outcome 在文件中正确,但原生读者忽略它们,因而形成下面的 P2。

规范先取自改动前 benchmark/runtime/RUNTIME.md,版本 8696bd6c3ba0f5169b92f83a6aa770c651065d45,逐项映射:Configure the native job 的 continuation 边界已实现;Results, timeout and recovery 的运行结果与评分区分在最终消费者处未满足;Migration and qualification 的合成验证、固定历史与真实研究资格边界保留。既有 benchmark/edgebench/README.md 还明确以失败不产生最终完成文件来保护该语义;本次新增说明不能代替消费者兼容。

对主干的风险

[P2] 失败分数文件被现用原生可视化当成已完成。 对同一已失败的运行(退出1、运行2秒、部分分数7)调用现有写入,再经正常目录发现、原生 scanner 与实际 FastAPI/Jinja 首页渲染:基线无 final 文件,显示 aborted、0/1 done;当前文件明写 runner_failed/failed,却显示绿色 done、1/1 done。健康完成对照两边均显示 done。这里实际执行了生产读者和模板,评分输入是合成数据,没有真实模型或评分服务调用。

原因可在固定源中直接复核:scanner 直接设置 has_final=True;首页 把它计入 done_count;状态模板 输出绿色 done。三个实际读取文件的 Git blob 已与该公开提交逐项校验,未把移动分支或自造消费者当证据。

最小修复:保留失败分数到既有诊断回执或单独的失败产物,继续保留 final_result.json 的原完成标记语义;或者先让被固定采用的原生可视化真正消费失败状态,并用同一失败样例证明不会显示 done 或计入完成数。

语义与 CI 对齐

这是原有结果标记及消费者的语义变化,不是新标签命名即可隔离的诊断增强。native outcome 复用既有 provider 所有者和本地词汇;没有新增 peer、权限或通用控制面义务。普通非 native 路径的16组完整状态/评分载荷与基线完全相同,真实 plain worker 的完整回执仅新 wake 时间/随机标识不同。主动预算等待与明确受阻依然是合法停止,ok 不等于任务验收。

本次五个相关模块 494通过、1失败;原三项可选 Docker 检查另外实际运行,3失败,均在外部 Docker SDK stream.close 遇到 ENOTCONN。不用 LoopX、只调用原生 SForge DockerBackend 执行 printf 的独立探针也复现同一错误,容器均已清理;本次没有继承其他评审的 Linux 通过。公共 Turn CLI e2e 的唯一失败在不可变基线和当前头按同一命令复现,完整失败 JSON 无需归一化即相同,均在 canonical authority 拒绝、Host 尚未启动处停止;实际 fixture、smoke 与 authority owner blob 相同,归为已有无关失败。

直接检查、Ruff 与十项 premerge canary 通过;整体 premerge 仍是 benchmark_sensitive 的 manual_review_required。Docker 全链路需要在支持的隔离 Linux 环境重跑;这项环境限制与上面的已复现消费者缺陷分别保留。初次命令准备或测试客户端元数据提取错误均留存,没有计作产品通过。按当前策略未读取、轮询或等待远端 CI。

我的整体评价

REQUEST_CHANGES:这是合入后修复意见,需要在后继修复中保留已验证的 worker 改进并修正结果消费端。 失败优先级、最后 Goal 读回和外部停止均有真实进程证据,属于有用且比例合适的改进;原生页面的失败读回出现实际回退,完成数也随之改变,因此当前完整用户路径不能批准。

上述 P2 可沿现有投影所有者小范围修复,不需要新增状态系统、统一事件框架或额外用户确认。复审应在后继修复的精确提交重跑同一失败/健康的普通发现与页面读回,并保留原 Docker、canonical fixture 和维护者合并门限。本次不认证长程模型效果、已安装采用或正式成绩资格。

English verdict: REQUEST_CHANGES (post-merge audit) at 79c3f5804fdf902a50619338cf65fd9b7dfdf4b4. Real worker outcome handling improves, but writing failed native scores into final_result.json makes the currently pinned SForge scanner and rendered homepage show green done and increment done_count. The matched baseline shows aborted/zero done; the healthy control stays done. Preserve failed scores without redefining the existing completion marker, or qualify and pin a failure-aware native consumer. The independent canonical fixture and Mac Docker SDK failures remain disclosed; no merge or experiment authority is implied.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants