Repository navigation
fix(runner): opt into deadline-bounded successful resumes - #64
loopx-agent wants to merge 2 commits into
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
受影响的是显式申请有限研究窗口、而 Agent 反复成功退出的现代 EdgeBench runner 调用者。旧默认在100次续跑后停止,即使还剩时间;新选项在同一容器、registration 和原会话续跑命令下继续,但只消耗第一次建立的 deadline。独立真实 Docker/HTTP fixture 达到160段、159次续跑,保持单会话及原 cooldown;默认结果与基线逐字节一致,Stop、失败和准备过期均停止。本 PR 不保证最低运行时长,不恢复跨进程 checkpoint,不升级 legacy launcher 或既有冻结运行,也不证明模型收益或补齐任何旧欠时。这里验证的是可选 runner 行为及成本边界,不把成功续跑段数换算成研究成果。
改动思路 / Approach
这是原 runner 内的显式可选策略:复用现有 Agent resume 命令、backend 和结果序列化,不新增 scheduler、外部监督循环或续跑状态 owner。当前交付限于现代 TOML/Blob runner 的单次调用内续跑、诚实成本回读和默认关闭兼容;judge 生命周期、预算提示及条件归属继续由各自现有 owner 处理。只把100改成更大数字不能解决有限窗口与失败循环的区别,外部冷启动又会破坏原身份。因此保留旧策略,显式新模式只用第一次建立的 monotonic clock;初次准备在 solver 前,后续格式化、日志和 receipt 准备消耗原窗口,并在 backend 调用前重新检查。该选择交付了真实可用的调用路径,没有为本修复增加新平台抽象。
具体改动 / Changes
完整检查 03eb81a1be8aec2ddf4f33417a7ba07c0015d6e4 对照 ba13e33842bd24e62fe0a361c5d41b2b21dd3010 的7条路径、单个 DCO commit,与远端文件范围一致;不继承作者的测试或审批结论。规范为 docs/en/guide/agents.md,spec_revision ba13e33842bd24e62fe0a361c5d41b2b21dd3010(修改前 Agent 合同):Auto-Resume 的原命令/剩余时间/默认100与短段边界,Stop-Hook 的停止权限,以及 Custom-Agents 的扩展职责分别映射到本轮验证。新 finite 选项是当前请求授权的显式扩展,不是暗改默认。
- run_agent 先拒绝隐式/无效预算、缺少原续跑命令和旧尝试,再由同一容器与 registration 开始;首次 clock 和最终 pre-dispatch 检查 只建立一次 deadline,剩余不足1秒不派发,也不虚增 resume_count。
- Agent.resume_block_reason 让特定 provider 的明确阻塞留在 Agent,默认 None;runner 仍检查结构化非零退出、超时、Stop 和短段,不从任意文字猜额度状态。
- RunResult 的新字段仅在 opt-in 时序列化;finally 回填同一 policy,文件、Python 与 CLI final_result 读到同一停止原因和成本。process、phase、完整调用及 unused 分开,不能拿 phase 直接证明最低 solver 时长。
- CLI 入口 显式启用并与 disable-auto-resume 互斥,沿原 adapter 传给现有 owner;中英文配置文档同步说明关闭、旧目录拒绝、提前结束与未资格边界。
对主干的风险 / Risks
独立 exact-head 全套 50 PASS / 1 SKIP / 4 warnings,209.97秒。真实 Docker/TCP/生产 CLI adapter 的长例为160段、159次续跑,原 session、单 container、单 registration 不变;原生只接受一次,第二次实际429,cooldown3600与原计数保留,模型请求0。实测 process180.012秒、phase180.069秒、完整调用181.124秒、unused0;这些真实收尾与调度开销原样保留,没有把数字压成精确硬实时或最低时长证明。
实际 Stop、非零失败、慢 resume format 及 format 中 Stop 均通过:过期准备不再启动第二进程;初次准备单独计成本;format 中 Stop 为0进程、0提交、next_agent仍1。另4个独立 oracle 通过:policy receipt 准备后才耗尽时间或收到 Stop 也不派发;默认 Agent 对 rc0 quota 文本仍返回未知;不完整旧 receipt 拒绝,新 identity 可取得进展而旧字节不变。后两者没有真实额度查询或模型调用。
同一默认工作负载在不可变 base/head 运行:结果 JSON SHA d7e494e7cbd0522675de52a649a073422e518ef6685fb102aef2fd1c321b0fd8、101次 timeout/append 决策、started_at 字节及 container/registration 数完全一致,新 policy 字段和文件均不存在。该比较使用控制时钟/backend,单独的真实 Docker 例验证过程,二者没有混称。真实 CLI help exit0 可见新 flag,互斥组合 exit2,在执行前拒绝。
可选 E2B 未安装而 skip;Starlette/tar deprecation 和 Docker/urllib3 HTTPResponse finalizer warning 全部保留,未屏蔽或松断言。K8s/E2B 实际运行没有由 Docker 资格覆盖;fixture 显式不执行全局网络规则清理,因此未声称网络隔离获得新资格。完整 diff hygiene、DCO、公开材料扫描与双语语义已检查。CI 按当前策略未查询或等待。
语义与 CI 对齐
新状态仅为本地 opt-in 结果诊断,继续复用原 Agent/backend/runner;receipt 的 status/reason 不授权继续工作,实际判断来自 bool、原 clock、typed execution result 和 Stop。stock rc0 quota 未识别是明确保留的边界,不是已解决的能力。#26 生命周期、#28 预算 prompt、#63 条件归属仍为独立 open PR,本 diff 未混入它们,也未宣称已交付。现代 TOML/Blob 路径不能机械替代 legacy JSON/restored-registration 接口,更不能重标旧实验机会或欠时。
我的整体评价 / Verdict
没有当前阻断 finding。long_horizon 与 CLI user_experience 的改善是同一明确预算内可用原会话继续成功工作,并以一条可选输入和诚实回读完成,不引入额外人工确认或外部监督循环。生产增量集中在原 owner,默认兼容有反事实验证,代码量与风险相称。视觉复核不适用:改动为 runner/API、CLI help 和配置参考文档,没有布局或渲染组件变化。未验证已安装产品、K8s/E2B 实际运行或真实模型采用;CLI 和真实 Docker fixture 的结果不替代这些资格。这项 approval 不提供 merge、安装或冻结实验变更权限;实际模型收益、完整研究比较和最低时长仍各自需要独立验收。
English verdict: APPROVE 03eb81a. Independent real Docker/TCP and CLI checks validate deadline-bounded same-session continuation and terminal guards; default wire behavior is identical. Minimum-duration, legacy adoption, real models and optional backend qualification remain separate.
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
本结论依据新增真实异常反例,更正此前同 head 的 approval;原测试与讨论保留,旧 approval 不能代表当前判定。
[P2] 异常入口应先结束 solver phase,再收集 history。 finally 的 phase_finished fallback 晚于 except 内的 history GET。独立真实 Docker/HTTP 反例:第一段成功约1.296秒,resume formatter 随后抛错,此时 solver 已停;真实 history GET 再耗2.149秒,新 policy 却报 phase3.517秒、30秒预算仅剩26.483秒。完整调用4.274秒仍保留,错误在分桶及 unused。在异常入口、任何 history GET 或其他收集之前冻结已开始的 phase_finished;首次 dispatch 前失败保持 phase0,已结束的 phase 不重算。总成本、原错误、Stop、机会和默认 wire 必须保留,不能为此重启或补预算。
动机 / Motivation
受影响的是显式申请有限研究窗口、而 Agent 反复成功退出的现代 EdgeBench runner 调用者。旧默认在100次续跑后停止,即使还剩时间;新选项在同一容器、registration 和原会话续跑命令下继续,但只消耗第一次建立的 deadline。独立真实 Docker/HTTP 验证了160段原会话续跑及默认兼容,但新 opt-in 的异常收尾把停工后的 history GET 时间计入 solver phase,并错误减少 unused。本 PR 不保证最低运行时长,不恢复跨进程 checkpoint,不升级 legacy launcher 或既有冻结运行,也不证明模型收益或补齐任何旧欠时。这里验证的是可选 runner 行为及成本边界,不把成功续跑段数换算成研究成果。
改动思路 / Approach
这是原 runner 内的显式可选策略:复用现有 Agent resume 命令、backend 和结果序列化,不新增 scheduler、外部监督循环或续跑状态 owner。当前交付限于现代 TOML/Blob runner 的单次调用内续跑、诚实成本回读和默认关闭兼容;judge 生命周期、预算提示及条件归属继续由各自现有 owner 处理。只把100改成更大数字不能解决有限窗口与失败循环的区别,外部冷启动又会破坏原身份。因此保留旧策略,显式新模式只用第一次建立的 monotonic clock;初次准备在 solver 前,后续格式化、日志和 receipt 准备消耗原窗口,并在 backend 调用前重新检查。该选择交付了真实可用的调用路径,没有为本修复增加新平台抽象。
具体改动 / Changes
完整检查 03eb81a1be8aec2ddf4f33417a7ba07c0015d6e4 对照 ba13e33842bd24e62fe0a361c5d41b2b21dd3010 的7条路径、单个 DCO commit,与远端文件范围一致;不继承作者的测试或审批结论。规范为 docs/en/guide/agents.md,spec_revision ba13e33842bd24e62fe0a361c5d41b2b21dd3010(修改前 Agent 合同):Auto-Resume 的原命令/剩余时间/默认100与短段边界,Stop-Hook 的停止权限,以及 Custom-Agents 的扩展职责分别映射到本轮验证。新 finite 选项是当前请求授权的显式扩展,不是暗改默认。
- run_agent 先拒绝隐式/无效预算、缺少原续跑命令和旧尝试,再由同一容器与 registration 开始;首次 clock 和最终 pre-dispatch 检查 只建立一次 deadline,剩余不足1秒不派发,也不虚增 resume_count。
- Agent.resume_block_reason 让特定 provider 的明确阻塞留在 Agent,默认 None;runner 仍检查结构化非零退出、超时、Stop 和短段,不从任意文字猜额度状态。
- RunResult 的新字段仅在 opt-in 时序列化;finally 回填同一 policy,文件、Python 与 CLI final_result 读到同一记录;传输一致并不能保证异常时分桶正确,本轮 P2 正在这条路径。process、phase、完整调用及 unused 分开,不能拿 phase 直接证明最低 solver 时长。
- CLI 入口 显式启用并与 disable-auto-resume 互斥,沿原 adapter 传给现有 owner;中英文配置文档同步说明关闭、旧目录拒绝、提前结束与未资格边界。
对主干的风险 / Risks
独立 exact-head 全套 50 PASS / 1 SKIP / 4 warnings,209.97秒。真实 Docker/TCP/生产 CLI adapter 的长例为160段、159次续跑,原 session、单 container、单 registration 不变;原生只接受一次,第二次实际429,cooldown3600与原计数保留,模型请求0。实测 process180.012秒、phase180.069秒、完整调用181.124秒、unused0;这些真实收尾与调度开销原样保留,没有把数字压成精确硬实时或最低时长证明。
实际 Stop、非零失败、慢 resume format 及 format 中 Stop 均通过:过期准备不再启动第二进程;初次准备单独计成本;format 中 Stop 为0进程、0提交、next_agent仍1。另4个独立 oracle 通过:policy receipt 准备后才耗尽时间或收到 Stop 也不派发;默认 Agent 对 rc0 quota 文本仍返回未知;不完整旧 receipt 拒绝,新 identity 可取得进展而旧字节不变。后两者没有真实额度查询或模型调用。
同一默认工作负载在不可变 base/head 运行:结果 JSON SHA d7e494e7cbd0522675de52a649a073422e518ef6685fb102aef2fd1c321b0fd8、101次 timeout/append 决策、started_at 字节及 container/registration 数完全一致,新 policy 字段和文件均不存在。该比较使用控制时钟/backend,单独的真实 Docker 例验证过程,二者没有混称。真实 CLI help exit0 可见新 flag,互斥组合 exit2,在执行前拒绝。
可选 E2B 未安装而 skip;Starlette/tar deprecation 和 Docker/urllib3 HTTPResponse finalizer warning 全部保留,未屏蔽或松断言。K8s/E2B 实际运行没有由 Docker 资格覆盖;fixture 显式不执行全局网络规则清理,因此未声称网络隔离获得新资格。完整 diff hygiene、DCO、公开材料扫描与双语语义已检查。CI 按当前策略未查询或等待。
新增真实异常对照保持同一 formatter 错误和真实 HTTP 延迟:ba13 default 与本 head default-off 都返回原有 runtime0、没有 policy;这项旧异常时长丢失明确是 preexisting。新 opt-in 已把 process runtime 保留为1.296秒,但新出现的 phase/unused 字段把 history 收尾计入 solver。这是本 PR 新路径未满足其成本合同,不是把旧问题转嫁给本 PR。独立 selected 严格 oracle 两次失败,初次7.95秒完成;基线/default控制记录原样保留。原50项中非零进程失败仍正常返回,因此能通过而漏掉跳入 except 的分支。最初尝试注入 archive collection 未触发此异常分支,未复现,亦保留为 counterevidence;随后实际 history 路径才确认。
语义与 CI 对齐
新状态仅为本地 opt-in 结果诊断,继续复用原 Agent/backend/runner;receipt 的 status/reason 不授权继续工作,实际判断来自 bool、原 clock、typed execution result 和 Stop。stock rc0 quota 未识别是明确保留的边界,不是已解决的能力。#26 生命周期、#28 预算 prompt、#63 条件归属仍为独立 open PR,本 diff 未混入它们,也未宣称已交付。现代 TOML/Blob 路径不能机械替代 legacy JSON/restored-registration 接口,更不能重标旧实验机会或欠时。
我的整体评价 / Verdict
当前 REQUEST_CHANGES,唯一新增阻断为 P2 opt-in 异常成本分桶。long_horizon 与 CLI readback 的完整资格尚未建立:续跑和默认兼容正确,但新字段会夸大 solver phase、低估 unused。架构仍适合留在原 owner;最小修复是异常入口冻结时钟,保留总成本、原错误和首次 dispatch 前 phase0,再重跑同真实反例及原 guard/default 资格。视觉复核不适用:改动为 runner/API、CLI help 和配置参考文档,没有布局或渲染组件变化。未验证已安装产品、K8s/E2B 实际运行或真实模型采用;CLI 和真实 Docker fixture 的结果不替代这些资格。 本结论不授予 merge、安装或旧实验重标权限。
English verdict: REQUEST_CHANGES 03eb81a. P2: the newly introduced opt-in phase/unused accounting includes post-failure history collection. Base and default-off retain their preexisting runtime0/no-policy behavior; same-session execution, terminal guards and default wire parity remain verified.
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
受影响的是希望在明确有限预算内继续原会话,并正确区分 solver phase 与异常收尾成本的现代 EdgeBench runner 调用者。旧默认在100次续跑后可能提前结束;初版 opt-in 虽能继续,却在 formatter 已失败、没有在途 exec 时,把随后 history 收集也算进 phase。当前修复只在这个已知边界先冻结时钟。同一真实 Docker/HTTP 反例现已通过:约1.27秒至失败,随后约2.07秒的 history 不再进入 phase,完整调用仍保留;默认 wire 与101次派发决策仍和基线一致。本 PR 不保证最低运行时长,不恢复跨进程或 legacy 原会话,不重标旧成绩、机会或欠时,也不证明模型收益或 exec/后代进程已独立排空。本次重评完整 2d7b9850a6df89677d5ffa0ff4a274d817af206c,没有把上次03eb的 approval 或作者56项通过移作当前结论。
改动思路 / Approach
有限续跑和计时仍由原 run_agent/Agent/backend owner 负责;新增的局部标记只区分 backend 调用是否已返回,不引入 scheduler、持久授权或另一套生命周期判断。当前交付是现代单次调用内的显式有限续跑、默认兼容及已知无在途异常的诚实分桶;未知 exec transport 继续保留原保守边界,不越过既有生命周期 owner 的资格。无条件在异常处冻结会把 transport error 错当成 exec 已退出,完全不冻结又会吞进已停工后的 history。当前在原 backend 调用前后记录局部事实,仅在 phase 已开始、尚未结束且没有调用在途时提前冻结;其余沿原 fallback,不重新开始时钟或补预算。
具体改动 / Changes
本 head 对照 ba13e33842bd24e62fe0a361c5d41b2b21dd3010 仍为7文件、两项 DCO commit;对 03eb81a1be8aec2ddf4f33417a7ba07c0015d6e4 的后继仅3文件、+130行,其中生产为原 runner 的9行,其余121行是回归。逐条检查完整 base→head、后继 delta 与当前调用路径;CLI、Agent、backend、judge、prompt 和双语配置说明等九个明确文件的 hash 与原头相同,证据复用有源边界。
- run_agent 仍要求显式正整数预算、原 resume 命令和 fresh attempt;同一容器/registration、原 deadline、whole-second guard、Stop/非零/短段边界保持。
- 调用返回事实 只包围实际 backend 调用,返回才清除;两个异常入口 据此冻结已知无在途的 phase。调用未确认返回时不把异常解释成进程退出;没有新增持久字段或授权 token。
- RunResult 与 finally 继续回填同一 policy;已知 formatter 失败的 collection 留在完整调用成本中,process 与 unused 未被改写成“已用满”。
- Agent hook 及 CLI 未变:成功输出中的 quota 仍需具体 Agent 判断,默认 None;flag 明确选择,与 disable-auto-resume 互斥,不自动安装、恢复或启用其他策略。
规范仍为 docs/en/guide/agents.md,spec_revision ba13e33842bd24e62fe0a361c5d41b2b21dd3010(修改前合同)。Auto-Resume 的原命令/剩余时间/默认100与短段、Stop-Hook 和 Custom-Agents 分工保持;另按原 r4516706000 评审边界 重跑已知异常分桶,不拿本 PR 新文字自证实现。
对主干的风险 / Risks
原严格真实 Docker/HTTP oracle 在当前 selected/default 两种模式均 PASS:selected process1.271秒,至 formatter 失败实测约1.271秒,policy phase1.278秒;随后 history2.067秒未进入 phase,完整调用4.223秒仍保留、unused28.722秒(预算30)。单进程、单 registration、原原生结果保留,不增加机会或新模型请求。相同默认异常仍为旧 runtime0/no-policy;这是已明确归因的 preexisting 行为,未伪称本 PR 顺手修复。03eb 的两次真实 FAIL 和 ba13/default 对照原位保留。
本轮独立 55 PASS / 1 optional E2B SKIP / 1 deselected / 3 warnings,48.80秒,含实际 OSError/KeyboardInterrupt 收尾、Stop、非零、慢 format、首次准备及未知 exec 分支。唯一未重跑的是180秒长例:其正常 deadline/循环算法未变;原03eb独立160段/159续跑、同 session/container/registration 和真实429证据以 hash/delta 保留,作者本 head 的56 PASS及161段另行记录,没有冒称本次独立全长重跑。当前 controlled cross100 与实际短预算原会话/cooldown 路径也通过。
另 6个独立 oracle PASS:receipt 准备后才过期/Stop 不派发;rc0 quota 文本仍未知;旧部分 receipt 拒绝而新 identity 可进展;首次 formatter 在 phase grant 前 OSError/KeyboardInterrupt 均为 phase0、无 started/deadline 字段,完整 setup/收集成本不丢失。未知在途的 unit 保留原较晚 fallback,不能把它当作物理停止证明。
保留一个边界反证:formatter 已完成、deadline 已 grant 后,若 running receipt IO 耗2秒失败,可以0 dispatch/process、phase2秒。这是该 phase 的控制开销,不是 solver 活动;不能把“首次 formatter 未 grant 为0”扩大成所有 pre-exec IO 为0。后续研究最低时长必须看真实 solver intervals/process evidence,不能拿 phase_seconds、resume 数或这项 approval 抵扣欠时。
同一默认工作负载在不可变 ba13/当前 head 的 JSON SHA 仍为 d7e494e7cbd0522675de52a649a073422e518ef6685fb102aef2fd1c321b0fd8,全部101次 timeout/append、started_at 字节、container/registration 数及 policy 缺省完全相同。完整 diff hygiene、DCO、7条远端范围和公开材料扫描通过;Python3.13.16 在声明范围内。E2B 缺依赖跳过,Starlette/tar 与 SDK finalizer warning 原样保留;作者全56的4条 warning 与本次3条分别记录,未屏蔽或声称修复。CI 按策略未查未等。
语义与 CI 对齐
没有新 scheduler、通用状态或平台权限。标记只说明本次 backend 调用是否返回,既不是对后代/容器执行排空的认证,也不是最低时长证明。#26 生命周期、#28 预算 prompt、#63 条件归属继续各属其 owner;现代 TOML/Blob 单次续跑不提供 legacy JSON、restored-registration 或旧会话自动恢复资格。既有 run、成本、机会和冻结协议均保留。
我的整体评价 / Verdict
当前无阻断 finding,原已知无在途 formatter 的 phase/unused P2 已由同一真实反例验证修复;未知在途没有被提前改成已停。long_horizon 与 CLI readback 在受审范围改善:可选择使用原有限窗口,并能区分已知 collection 和保留的不确定性,默认不变。修复留在原 owner,九行生产改动和有判别力回归相称。视觉复核不适用:改动为 runner/API、CLI help 和配置参考文档,没有布局或渲染组件变化。未验证已安装产品、K8s/E2B 实际运行或真实模型采用;CLI 和真实 Docker fixture 的结果不替代这些资格。实际模型收益、全量研究成本比较、物理生命周期及最低时长仍分别验收,本结论不授予 merge、部署或旧实验重标权限。
English verdict: APPROVE 2d7b985. The original real exception-accounting oracle now passes without early-closing an unconfirmed exec; default wire and terminal guards remain verified. Phase diagnostics do not certify solver activity, minimum duration, legacy restoration or physical drain.
run_agentcurrently stops after 100 resumes even when its configured timeout has substantial time left. Repeated successful exits can therefore exhaust the attempt ceiling before the intended finite research window.This adds explicit
--resume-until-timeout/resume_until_timeout=True. Successful segments retain the same container, registration and Agent resume command under one monotonic solver-phase deadline. Defaults retain the 100-resume ceiling and their result wire format. The mode preserves Stop, timeout and short-segment guards, and stops on a nonzero process exit or Agent-owned terminal blocker. It does not guarantee a minimum runtime. Stock Agents gain no classifier for quota messages in successful output.Initial command preparation stays outside solver time. Each later preparation consumes the original deadline; Stop and remaining time are checked after formatting/logging/receipt preparation immediately before dispatch. A formatter may itself return late, but that never grants a new process a stale remainder. When preparation fails or is interrupted with no exec in flight, phase timing stops before archive/history collection; whole-invocation cost still includes that collection. An exec transport failure without a confirmed process exit retains the previous conservative boundary.
resume-policy.jsonand the returned/CLIresume_policyrecord the original deadline, actual resumes, unused time, stop reason and separate process, phase and whole-invocation costs. A prior run marker or policy receipt rejects a new opted-in invocation in the same directory. This is in-process continuation, not checkpoint restoration. Scoring, submission limits and cooldown are unchanged; existing frozen protocols require an explicit new treatment declaration.Validation on final signed head
2d7b9850a6df89677d5ffa0ff4a274d817af206c:Related work remains separate: #26 owns judge/exec lifecycle, #28 owns execution-budget prompt delivery, and #63 owns evaluation-condition attribution. This proposal is based directly on current main and includes none of those PRs. It does not qualify a legacy JSON/checkpoint launcher or upgrade any existing run.
The exception-accounting follow-up addresses the independent phase-boundary finding; the original counterexample remains attributed to the prior PR head.