Repository navigation
fix(benchmark): preserve native Goal failure outcomes and scores - #7061
Conversation
Signed-off-by: huangruiteng <huangrt01@163.com>
loopx-agent
left a comment
There was a problem hiding this comment.
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 和可选隔离容器,其余为原测试与运行说明。没有新配置页面或共享控制面所有者。该内部运行适配器继续由现有能力调用,实际产物仍是原运行回执及评分文件。
关键代码讲解
observe_native_goal_event/native_goal_outcome先核对原线程与 Turn,再保留终止错误并归类状态。错误消息正文不会进入公共紧凑回执;401、429、503 各自保留结构化状态,重复 error notification 不再次计数。实际本机 Codex 0.163.0-alpha.11 的生成 schema 支持这四种 HTTP 错误形状;新版本其他变体仍安全降为 unknown,不据此声称完整版本兼容。run_native_goal使用同一分类器生成顶层结果与退出码;处理多轮时取最后一次实际观测。正常预算边界仍归预算所有者。主动 Goal 到时停止时,顶层可以是 budget_exhausted,最后 Turn 的失败、HTTP 状态和 Goal 状态仍保留在嵌套证据中;ok 不能解释为任务验收通过。RecordingDockerBackend在原清理与私有产物收集路径读取保留的 worker 回执。恰好一个 native wake 才采用相应结构化字段;多份不猜最新或从终端输出推断结果。原容器执行证据继续独立保存。_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.
|
Reviewer: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max 合入后审计:失败运行被原生页面计为 done精确提交 动机使用现有 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 集成分支固定取得的源 具体改动完整读取七个文件, 关键代码讲解
规范先取自改动前 对主干的风险[P2] 失败分数文件被现用原生可视化当成已完成。 对同一已失败的运行(退出1、运行2秒、部分分数7)调用现有写入,再经正常目录发现、原生 scanner 与实际 FastAPI/Jinja 首页渲染:基线无 final 文件,显示 aborted、 原因可在固定源中直接复核:scanner 直接设置 最小修复:保留失败分数到既有诊断回执或单独的失败产物,继续保留 final_result.json 的原完成标记语义;或者先让被固定采用的原生可视化真正消费失败状态,并用同一失败样例证明不会显示 done 或计入完成数。 语义与 CI 对齐这是原有结果标记及消费者的语义变化,不是新标签命名即可隔离的诊断增强。native outcome 复用既有 provider 所有者和本地词汇;没有新增 peer、权限或通用控制面义务。普通非 native 路径的16组完整状态/评分载荷与基线完全相同,真实 plain worker 的完整回执仅新 wake 时间/随机标识不同。主动预算等待与明确受阻依然是合法停止,ok 不等于任务验收。 本次五个相关模块 494通过、1失败;原三项可选 Docker 检查另外实际运行,3失败,均在外部 Docker SDK stream.close 遇到 直接检查、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 |
A native Codex Turn could fail while its Goal became blocked, yet the benchmark worker returned
ok=trueand 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.