← 工作原理 · 原文件 notes/reports/reviews/2026-10-03_codex_g45_impl.md(Markdown 源文件已渲染;链接到其他文档的会跳转,指向源码的只显示路径)
当前实现还不能放心用于正式跨环链。主要问题集中在截止收尾、多环去重和权重验收;两环正常路径的验证没有覆盖这些边界。
全程只读,未运行实验。28 个改动的 Python 文件通过 AST 解析,两项无需写文件的既有测试断言通过;另用内存对象确认了第三环去重失效和续做名额耗尽的问题。以下行号均指当前快照。
P0:会造成错误状态、错误评测结论或不真实证据,启动前应修。
- 截止时先进入 final,执行线程随后丢掉 carryover;动态截止也可能被错过。 位置:
agent/search/controller.py:1437、1585、1848、2699;agent/search/execute.py:323。 场景:执行在 cutoff 收到 SIGTERM,尚在宽限期,主线程便结束 drain 并设置phase="final"。执行线程回来时carry_on()已为 false,节点落成interrupted,不会封存或进入下一环。若 cutoff 刚被前移,执行线程尚未读取新截止,live_deadline()又因进入 final 返回硬截止,执行还可能继续占用终选资源。缓存锁、GPU/admission 等待和评分也只持有旧stop_at。 最小修复:每项工作绑定启动时的阶段;前移截止要传播至全部等待和评分路径;进入 final 前等待搜索线程完成进程回收、封存及节点结算。不能只修改共享self.phase。 - 第三环会重复续做旧版本,并把历史 resume 算进本环名额。 位置:
agent/search/archive.py:320;agent/search/controller.py:1660、1663、1687。 场景:导入只重映射parent_id,没有重映射resume_origin.imported_id。例如 B 中来源编号为 7,导入 C 后来源节点变成 10,但去重集合仍含 7,C 就会再次续做已经在 B 续过的 A 旧快照;较新的 B 快照也可能同时排队。另一方面,started统计所有导入的 resume:历史累计达到四个后,新环即使尚未启动任何续做,队列也是空的。静态调用已确认这两种结果。 最小修复:导入时重映射来源引用;用稳定的工作身份记录“已被承接”;本环名额只统计origin_run IS NULL的 resume。resume_origin.run/id应记录直接上一段,而不是混用最早 origin。 - 权重验收失败仍可打分,之后会悄悄重训。 位置:
agent/search/execute.py:377;agent/search/runenv.py:330、351、306。 场景:程序退出成功并产生预测,但声明的权重没有写出、是符号链接或超过大小上限。store_per_view()返回 problems、不给完整索引,调用方却保持status="ok",继续评分。下一个晋级/护栏 seed 再次训练,最终把不同训练结果当作冻结权重下的样本。已有索引缺少声明项时,load_per_view()也返回 miss,而不是报损坏。 最小修复:验收必须全部成功才允许评分;失败应明确结束该次评测。已存在但不完整的索引必须抛ArtifactError,不能退回训练。 - 祖先 run 后来被污染,第三环仍可能打包其被修改的轨迹。 位置:
agent/search/continuation.py:123、145;agent/search/controller.py:3780、3857;scripts/prepare_submission.py:486。 场景:A→B 后,A 的原始轨迹被改动并标记 TAINTED;C 只继续 B。启动和提交检查只验证直接来源 B,run_chain()对 A 只检查锁哈希;package 却从 A 的实时目录读取祖先轨迹。A 的锁未变时,这条路径可能放行不真实证据。 最小修复:凡实际读取其代码、轨迹或快照的祖先,都要递归验证污染状态和内容;打包时重新验证,失败则拒绝采用该证据。
P1:可后置于启动修复,但涉及可靠性或证据交付,不应当作已完成。
segments[]有清单,但没有保证每段完整证据随包交付。 位置:agent/search/controller.py:1611、1649、1711、3887。 场景:Engineer 封存只收ecalls,遗漏原 Researcher/Compliance 等轨迹;execution 封存直接传streams=[],且queries_used=0。若此前已有 Engineer handoff,还会被 execution seal 替换。resume 的真实父节点绕过被带走节点,package 因而不能靠祖先遍历补回这些会话;它也没有逐个解析segments[].run/node/snapshot。 最小修复:封存节点本段的全部角色轨迹和真实预算;package 按 segments 逐段取证、校验并报告缺失,不能只打包一个当前imported_id的快照。- 读取额度失败会把已用查询算成零。 位置:
agent/search/controller.py:2447;agent/search/carryover.py:222。 场景:最后一次 quota 请求失败,封存queries_used=None;累计函数按零处理,下一环重新获得原本已经消费的额度。 最小修复:从本 run 的评分日志恢复 counted 查询数——已有agent/scoring/service.py:465的计数口径可复用;仍无法确定时,应拒绝发放新增额度。 - 封存顺序基本正确,但不是可恢复的原子事务。 位置:
agent/search/carryover.py:125、157、165;agent/search/controller.py:1552、3557、3446。 场景:写完 SEAL、登记账本后,在 archive 变成carried_over前崩溃,recover 会把 engineering 节点改成普通 interrupted,完整快照也无法续做。重新封存还会先删除旧快照。导入同样在锁已落盘后逐步写 archive、Git、文件和 verified meta,中途失败没有恢复完成导入的流程。 最小修复:用临时目录完成封存后原子 rename;增加封存/导入事务标记,并让 recover 根据已完成的 seal 幂等补齐节点状态和元数据。 - 终选估算扩大了总预留,但内部截止仍按廉价基线留时间。 位置:
agent/search/controller.py:1229、1230;agent/search/final.py:345、455。 场景:基线 final 只需几秒,训练候选 final 需要数小时;seed/guard 阶段仍可运行到硬截止前约一分钟,候选虽过护栏却没有时间完成 final,只能返回基线。此外估算未加入 guard 的 holdout 执行,且用最短已测 rerun 估计后续任务。 最小修复:seed/guard 截止应扣除候选 final 冷启动预留;按实际 guard job 集合估算,包括 holdout、冷训练与缓存失配。它目前倾向于安全退回基线,未发现由此跳过护栏。 - 自动换 fresh seed 会让每环评测指纹不同,意外清空大部分可用节点。 位置:
agent/search/controller.py:3337;agent/search/evalspec.py:271;agent/search/continuation.py:183、202。 场景:3–7 换成 8–12,即使搜索输入和评分器完全相同,完整指纹也不同;导入会清空所有旧分数,仅重评分 top-k 和 seed,其余节点永久成为 history-only。静态检查确认,仅换护栏 seed 就改变指纹。 最小修复:区分“搜索分数可比较性指纹”和“完整终选规格”;仅护栏 seed 更新,不应使已有搜索分数失效。 - SIGTERM 宽限只等待 leader,没有给整个进程组完整宽限。 位置:
agent/search/runenv.py:819、823、679。 场景:leader 立即退出,子训练进程正在处理 SIGTERM、写检查点;proc.wait()立即返回,随后直接 SIGKILL 子进程,实际没有承诺的 60 秒。reap_group()返回仍存活 PID 的结果也被忽略,封存仍可能继续。 最小修复:宽限期等待整个进程组消失;到期再 KILL。回收未完成时不得登记权重或封存快照。 - 环境缓存键尚未覆盖执行时注入的全部训练环境。 位置:
agent/search/execute.py:109、136;agent/search/runenv.py:468。 场景:新环改变 GPU 配置或 GPUsitecustomize.py,而 solution、view、venv、freeze、modeling 不变,权重键仍可相同。对于会按这些环境调整训练行为的程序,会回放旧环境产物。 最小修复:把实际影响训练的注入环境和运行工具内容哈希纳入键;无关的排队参数无需加入。
另外,已确认的正确部分是:enforce=false 不返回杀进程判定;hung 已接入主要失败状态集合;缺基线会拒绝候选替换,有基线时先落盘;正常读取来源链时 fresh seed 会整组替换。权重键确实包含视图内容、训练 seed、额外参数和主要依赖环境,同 run 同键首跑也有 flock。
未发现本次代码把 final 的 per-view 权重回放到 proxy/X3,或向下一环直接暴露官方保留阶段真值的路径。HANDOFF 和消息节选继承本身不能据此判违规;官网允许锁前开发和新锁启动,约束的是锁后的人工干预、保留数据使用和证据真实性。官方规则 §9–10
总体结论:当前快照不适合今晚直接启动正式 T1 24 小时跨环链;至少先修复 P0,并补齐三环去重及截止收尾回归。