Repository navigation
fix(benchmark): reconcile native terminal evidence before releasing slots - #8236
Conversation
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
[P1] 终态回执写入失败后保留同一次试验的恢复绑定。 求解器执行和评分记录已落盘时,最终原子写入可能在替换前失败,也可能已替换成功但报告失败。两条路径都进入普通回执的兜底写入,删掉 managed_run 和求解器摘要。存储恢复后,managed_run --execute 仍返回 2 和 ready=false,看板仍是 running,原槽位仍占用。请保留已成功替换的回执,并让替换前失败的同一次尝试能从保留的原生证据恢复。 兜底写入
动机 / Motivation
管理 EdgeBench 并发批次的操作者需要在试验结束后确认结果,并回收这次试验占用的名额。
原来要分别处理看板和并发名额。新入口把二者接到同一次试验的完成证据上。若保存这份证据时磁盘报错,当前实现会丢掉重试所需的绑定。
正常路径已验证先确认看板终态,再释放原槽位。两种终态回执故障下,重放都没有完成这一步。
评审覆盖运行器和账本的隔离执行。真实模型求解、评分、实验收益和安装运行需要各自的验证。
改动思路 / Approach
将运行器证据与账本操作分开有必要。运行器保存同一次尝试的证据,控制器核对身份和终态,再按既有顺序写看板与释放槽位。
本次可在原有运行器回执的原子写入和重放边界内修复,继续沿用看板与槽位的现有 owner。
求解器的终态记录、评分队列排空、看板终态和并发槽位释放各有证据。控制器以已准入的试验、任务、代次和时间窗为准,在锁内复核后按顺序应用。评分是否可计数仍由既有评分规则判断。 终态计划 · 应用顺序
具体改动 / Changes
依据改动前的 loopx/capabilities/benchmark_toolkit/README.md,版本 c4536ec439fa7480bbfc76d7e26a96ac956fbf2f。runtime-continuity 要求同次尝试可恢复,当前写入故障反例未满足。concurrency-envelope 的看板写入和读回先于原槽位释放,正常路径已验证。score-countability 沿用既有评分边界。 既有工具契约
关键代码讲解
run.main在 provider 完成后调用retain_managed_solver。最终写入抛错时,普通回执兜底会替换掉同一次尝试的绑定。 运行入口 · 保留终态证据publish_managed_terminal从原试验回执和 provider 文件核对时间窗、执行摘要及评分历史,再生成可供重放的证明。回执失去绑定时会在写证明之前退出。 终态证明prepareBenchmarkTerminalFollowthrough用匹配的身份和时间窗生成计划。reconcile_benchmark_terminal在现有锁和写入 owner 下先确认看板,再确认原槽位的释放。 计划 · 控制器
完整 diff 含 14 个文件,新增 1,451 行、删除 61 行。生产改动集中在证据生产、终态判断和有序写入,另外覆盖三组测试和两份操作指南。
对主干的风险 / Risks
独立入口测试得到 2 失败 / 1 通过。复现使用真实 run.main、固定 SForge 版本 476b34d17e759a7dbcf9ec36a12ff42b757b462a 的原生文件写入、实际并发准入与重放 CLI。provider 返回用确定性的试验数据构造,两处故障只注入最终回执的写入。健康对照成功读回看板终态和原槽位释放。现有终态证明写入故障测试发生在更晚一步,仍需覆盖本次复现的回执写入边界。
17 项控制器测试、16 项 provider 路径测试、13 项 TypeScript 测试及类型检查通过。基线与 head 各通过 75 项既有账本及并发回归。用相同输入比较默认 runner 回执、普通看板和槽位的 preview、执行、重放及持久化状态,归一化后的 10,381 字节完全相同。
语义与 CI 对齐
请在同一个回执 owner 处理替换前失败和替换后的确认丢失。回归从已准入试验触发两种错误,恢复存储后走公开重放与终态命令,读回同一试验和原槽位,并核对求解和准入均只发生一次。可用 pytest test_managed_final_receipt_replay.py 复验。
本地 quick premerge 的六项直接检查和四项 catalog 中三项通过。另一个 catalog 在同一 r34 基线与 head 均复现 start_goal_guided/small/markdown 输出 3,458 字符,超出 3,400 上限。该检查走既有 Goal 启动输出路径。仍需单独处理这项校验及 benchmark 人工门,远端 CI 未核验。
我的整体评价 / Verdict
终态证明和有序释放已接入实际 CLI。合入前须让同一试验在两种回执写入故障后继续完成,并验证重放只释放原槽位。检查范围是 EdgeBench 运行入口、终态重放 CLI 和控制器回执。真实求解、评分、安装运行和完整实验效果未验证。
English verdict: REQUEST_CHANGES
cd2f273 to
b72d03c
Compare
|
Hi @huangruiteng, the DCO If the log confirms a missing |
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
P1 · 终态收据两次写入失败后,存储恢复仍无法重放同一次试验。 在固定 Linux 镜像中从实际 run.main 和原生 SDK 写入路径运行同一次已准入试验,仅让终态 runtime-receipt.json 的两次写入在替换前失败。随后同目录的新原子写入成功。此时原 final_result.json 与 solver_execution.json 记录同一个 normal_exit,绑定和历史摘要匹配,原生评分确认 complete/drained 且 pending 为 0。主机的预览和 --execute 仍都返回 2 与 ready=false,没有生成证明,看板保持 running,原槽位继续占用。一次故障的同输入对照可以完成。 重放提前返回
请让已有的有界主机重放在存储恢复后使用可核验的同次尝试终态。可以核对原有主机终态记录与启动身份、原 solver 记录及评分排空,或提前保留等价的独立终态交接证据。缺失或冲突的证据继续保留槽位。回归应在解除两次写入故障后走公开重放,再读回原看板行与一次原槽位释放。
动机 / Motivation
管理并发试验的操作者需要在原生求解和评分结束后关闭同一次试验,并回收它原有的名额。原流程分别处理看板和名额,显式启用后由主机提交同次尝试的证明,控制器先确认终态行再释放原槽位。新头在替换前一次报错和已替换但确认丢失时都能保留原证据,正常路径和迟到评分均可重放。当前缺口是两次即时写入都失败后,即使存储恢复、原终态证据齐全,主机重放仍无法提交证明。当前范围是隔离 runner、重放和账本。真实求解、实际评分、安装和实验收益分别验证。
改动思路 / Approach
试验主机核对同次尝试的原生证据,控制器负责看板与准入槽位,评分资格沿用独立规则。当前 PR 边界是让已验证的终态可有界重放,并在原槽位释放前读回原看板终态。原子写入前后的单次故障已由同一收据 owner 处理。连续报错后的恢复可复用原生终态与现有 host replay,避免重新求解或增加轮询。
具体改动 / Changes
按 loopx/capabilities/benchmark_toolkit/README.md 的 17e614282c83871712614d561373720f3696d2f9 版本评审,覆盖 14 个文件,增加 1,493 行、删除 61 行。旧集成评审用于定位回执问题,本轮验证当前 main 目标的精确 head。 固定的工具契约
- runtime-continuity。证明绑定原运行来源、准入与原生事件。一次替换前错误、已替换后的确认错误和迟到评分路径通过。两次写入失败后,已保留的原生终态仍无法走公开重放。
- concurrency-envelope。控制器要求原始新准入、精确代次、唯一看板身份,先读回终态行再释放并读回原槽位。冲突及过期准入保持原槽位。
- score-countability。终态证明与释放不推导评分资格。已存在的分数、insight、countability 和后续观测继续保留。
关键代码讲解
run.main读取显式私有绑定,在启动前保留原准入和源 pin。现有 native 结果先写入原试验目录,再保留 managed solver 证据。省略标志沿普通收据路径,--m继续兼容既有调用。 入口 原结果和收据retain_managed_solver比对返回结果和盘上的原生 solver 记录。已替换就接受精确回读,仍为同一 launch 时重试一次。两次都失败会保留 starting 收据。 收据恢复publish_managed_terminal核对事件时间窗、原 solver 摘要、历史摘要和 grading drain,只创建或复用同一个证明。starting 收据在进入这些读回前返回,因此已成功写入的原终态也没有机会核验。 主机重放prepareBenchmarkTerminalFollowthrough通过已有 Effect runtime 验证精确身份、时间和准入。Python adapter 复用现有 JSONL 与 envelope writer,在两个锁内复核快照,读回看板后才释放原槽位。普通看板和 release 仍有各自入口。 类型化计划 写入与读回
对主干的风险 / Risks
- PASS。独立固定 Linux 运行 36 项 Python 测试,另有 13 项 TypeScript 通过。使用原生 SDK writer 与真实源 CLI 和隔离账本,provider 返回及故障采用可控输入。覆盖一次替换前失败、替换后确认失败、迟到评分、冲突、板行读回及单次释放。宿主缺少可选 SDK 的一次运行有 17 通过和 19 跳过,相关 19 项已在 Linux 实际运行。作者当前主干基线的 premerge 6 项直接检查、19 项定向检查通过,仍有人审门。
- FAIL。独立扩展的两次替换前故障探针为 1 失败、1 通过。单故障控制成功。双故障用例在确认存储可写、同 run/task 的原生结果、绑定和排空证据完整后,公开重放仍不生成证明。当前测试只要求两次失败后继续持有槽位,未要求后续已恢复存储时能再次推进。
- UNVERIFIED。按当前策略未查询托管 CI。测试没有运行真实模型或实际评估。
语义与 CI 对齐
控制器只接收可信主机证明,原生终态与排空仍由试验主机核验。修复后,使用同一固定 Linux 源入口复验两次故障后重放,要求无需新准入或再次求解,并读回一次原槽位释放。已丢失或矛盾的终态证据保持拒绝。
我的整体评价 / Verdict
对 47a430ae5248a91eddad3796591efc7e06ae56a1 请求修改。正常和单次写入故障路径已贯通。当前连续两次报错会使本可核验的同次尝试在存储恢复后仍占槽,可能阻塞后续试验。当前变化只涉及 benchmark CLI、后端和文档,视觉审阅不适用。
English verdict: REQUEST_CHANGES — At 47a430a, the host cannot replay the same completed attempt after two pre-replacement receipt errors and storage recovery, even though the original solver and drained grading evidence remain intact.
|
This pull request has merge conflicts with Choose the remote for the base repository, not an out-of-date fork. git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEADFor a same-repository clone whose Keep the DCO |
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
动机 / Motivation
管理并发试验的操作者需要在原生求解和评分结束后关闭同一次试验,并回收它原有的名额。原流程分别处理看板和名额,显式启用后由主机提交同次尝试的证明,控制器先确认终态行再释放原槽位。两次终态收据写入失败后,存储恢复即可凭完整原证据重放,并读回同一次试验的终态和一次原槽位释放。安装与活跃试验切换由独立授权处理。当前验证覆盖原试验的完整终态记录,真实求解、实际评分与实验收益仍待独立验证。
改动思路 / Approach
试验主机核对同次尝试的原生证据,控制器负责看板与准入槽位,评分资格沿用独立规则。当前 PR 边界是让已验证的终态可有界重放,并在原槽位释放前读回原看板终态。两次即时写入都失败时复用原 runner 已经落盘的完成结果,校验身份、原生终态、评分排空和连续性,再沿已有的一次性主机入口发布证明。
具体改动 / Changes
按 loopx/capabilities/benchmark_toolkit/README.md 的 22d8daff5b2e9e173908ccdf4a16617a2993a70f 版本评审。主干比较 14 个文件,增加 1,551 行、删除 61 行,三次提交均已签署。 固定的工具契约
- runtime-continuity。现有完成结果只在原收据仍为 starting 时参与恢复。需匹配原任务、运行、模型和 effort,且原生 solver 和评分排空独立核对。预览只读,执行发布原证明格式,保留启动收据。
- concurrency-envelope。保留原始新准入、唯一看板身份和精确代次,读回终态行后再释放并读回原槽位。同一证明可重放,跨 study、过期准入及已变更快照继续拒绝。
- score-countability。终态证明沿用现有原生结果与评分历史,原有分数、insight 和计分资格保留。
关键代码讲解
run.main显式读取私有绑定,求解前保留原准入与 pin。现有 runner 先落原生结果,retain_managed_solver在替换后错误时接受精确读回,替换前错误可重试一次。 运行入口 原生结果 收据写入_retained_completed_result与publish_managed_terminal让 starting 收据使用同次完整结果。核对原 solver 记录、准入时间、评分排空、历史摘要和启动连续性后,创建或回读同一个证明。缺失或冲突的证据保持槽位。 完成结果读取 主机重放prepareBenchmarkTerminalFollowthrough计算精确的看板与准入操作。现有 Python adapter 复用两套锁和写入 owner,复核快照,读回看板后才释放原名额。普通看板和 release 仍走既有入口。 类型化计划 有序读回
对主干的风险 / Risks
- PASS。用固定 Linux 镜像重跑原先的两次替换前写入失败。解除故障后同目录原子写入成功。精确核对原绑定、
normal_exit与完整评分历史后,公开预览返回 ready 且保持只读,执行发布证明。原 starting 收据不变。原终态看板和原槽位均读回,再次执行没有重复写入。一次故障控制也通过。 上次评审 - PASS。另有 36 项当前 head 固定 Linux 测试与 13 项 TypeScript 测试通过。覆盖两种单次写入故障、迟到评分、缺失与冲突终态、改动的 solver/history/启动 pin、跨 study 及过期准入。采用原生 SDK writer、隔离源 CLI 和真实本地账本,provider 返回与故障使用合成输入。
- PASS。主干与新 head 的普通 runner 归一化结果及收据 1,320 字节完全相同,现有看板和 release 的返回与持久内容 9,055 字节完全相同。注入普通账本替换失败时,两边原错误和持久账本一致,新实现清理了遗留的临时文件。主干目标下 6 项直接、19 项定向 premerge 检查通过,benchmark 人工门单列。
- UNVERIFIED。按当前策略未查询托管 CI。真实模型、真实评分和安装环境分别验证。
语义与 CI 对齐
已有独立完成结果才可进入 starting 恢复。未知或矛盾的结果仍然保留槽位。验收以原试验的匹配证据、两次读回和重复操作无副作用为准。
我的整体评价 / Verdict
批准 1898169559beb7505c6feff86a8cb184dabd7c7b。原写入失败可恢复为同次尝试的终态证明,控制器随后按原代次完成一次释放。当前变化只涉及 benchmark CLI、后端和文档,视觉审阅不适用。
English verdict: APPROVE — At 1898169, recovered storage lets the host replay the verified original completed attempt after two failed receipt writes, and the controller reads back the board and releases the original slot once.
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> (cherry picked from commit cd2f273) Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
…vers Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
1898169 to
c7e63ca
Compare
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
动机 / Motivation
管理并发试验的操作者需要在原生求解和评分结束后关闭同一次试验,并回收它原有的名额。原流程分别处理看板和名额,显式启用后由主机提交同次尝试的证明,控制器先确认终态行再释放原槽位。两次终态收据写入失败后,存储恢复即可凭完整原证据重放,并读回同一次试验的终态和一次原槽位释放。安装与活跃试验切换由独立授权处理。当前验证覆盖原试验的完整终态记录,真实求解、实际评分与实验收益仍待独立验证。
改动思路 / Approach
试验主机核对同次尝试的原生证据,控制器负责看板与准入槽位,评分资格沿用独立规则。当前 PR 边界是让已验证的终态可有界重放,并在原槽位释放前读回原看板终态。两次即时写入都失败时复用原 runner 已经落盘的完成结果,校验身份、原生终态、评分排空和连续性,再沿已有的一次性主机入口发布证明。变基后保留 #8229 的原生容量校验,先拒绝无效容量,再读取显式 managed 绑定。
具体改动 / Changes
按 loopx/capabilities/benchmark_toolkit/README.md 的 97a34a4b0abb5a03d003cee9eb70e834941d5e23 版本评审。主干比较 14 个文件,增加 1,551 行、删除 61 行,三次提交均已签署。核对当前主干 c3dcb92 的合成树,保留独立的 host failure handler 和本 PR 的 terminal followthrough 注册。 固定的工具契约
- runtime-continuity。现有完成结果只在原收据仍为 starting 时参与恢复。需匹配原任务、运行、模型和 effort,且原生 solver 和评分排空独立核对。预览只读,执行发布原证明格式,保留启动收据。
- concurrency-envelope。保留原始新准入、唯一看板身份和精确代次,读回终态行后再释放并读回原槽位。同一证明可重放,跨 study、过期准入及已变更快照继续拒绝。
- score-countability。终态证明沿用现有原生结果与评分历史,原有分数、insight 和计分资格保留。
关键代码讲解
run.main显式读取私有绑定,求解前保留原准入与 pin。现有 runner 先落原生结果,retain_managed_solver在替换后错误时接受精确读回,替换前错误可重试一次。 运行入口 原生结果 收据写入_retained_completed_result与publish_managed_terminal让 starting 收据使用同次完整结果。核对原 solver 记录、准入时间、评分排空、历史摘要和启动连续性后,创建或回读同一个证明。缺失或冲突的证据保持槽位。 完成结果读取 主机重放prepareBenchmarkTerminalFollowthrough计算精确的看板与准入操作。现有 Python adapter 复用两套锁和写入 owner,复核快照,读回看板后才释放原名额。普通看板和 release 仍走既有入口。 类型化计划 有序读回
对主干的风险 / Risks
- PASS。用固定 Linux 镜像在当前 head 同时传入 managed 绑定和原生容量 3。实际 SForge 构造读到 3,两次终态收据写入失败后原 solver 和 grading 记录完整。主机预览、证明执行、原看板与槽位读回通过,重复执行无额外写入。一次故障控制和无效容量在读取绑定前拒绝也通过,共 3 项。13 项 TypeScript 通过。
- PASS。作者定向矩阵 148 项通过。额外选项探针起初读取了错误的收据字段,改为核对实际 provider 设置后通过。原 managed 读取、恢复、账本及测试文件与上次已验证提交字节相同。当前变基仅组合邻接的启动校验。上次独立测试的普通运行与账本结果等价仍适用于这些共享写入路径。 此前精确评审
- PASS。最新主干的合成树同时保留两个 runtime handler。远端比较与本地 14 个路径一致,RFC 双语检查及 diff 检查通过。作者 6 项直接、19 项定向 premerge 检查通过,benchmark 人工门单列。
- UNVERIFIED。按当前策略未查询托管 CI。真实模型、评分与安装环境分别验证。
语义与 CI 对齐
已有独立完成结果才可进入 starting 恢复。未知或矛盾的结果仍然保留槽位。验收以原试验的匹配证据、两次读回和重复操作无副作用为准。
我的整体评价 / Verdict
批准 c7e63ca2fecbab9c17dcb6da40d3e5ce8318aa2b。原写入失败可恢复为同次尝试的终态证明,控制器随后按原代次完成一次释放。当前变化只涉及 benchmark CLI、后端和文档,视觉审阅不适用。
English verdict: APPROVE — At c7e63ca, recovered storage lets the host replay the verified original completed attempt after two failed receipt writes, and the controller reads back the board and releases the original slot once.
A native benchmark attempt can finish while its board row or concurrency reservation remains active. The provider and controller previously had separate operations without an exact, replayable handoff; late grading and a failed closeout write could leave the run stranded.
This adds an opt-in managed binding to the EdgeBench entrypoint. It retains launch identity and source pins, binds the original solver termination record, and qualifies the same run’s drained grading history through the existing runtime-continuity owner. A one-shot host replay handles grading that finishes later or a failed proof write. The controller forwards that proof to
benchmark terminal-reconcile, which validates the original new admission, unique run ownership and exact board identity, then writes/reads the terminal row before releasing/reading its original reservation under the existing locks.Replays preserve later scores and insights. A host transition timestamp prevents an old running shard from causing an equal-time board conflict. Cross-study run collisions, stale admissions, pending/contradictory grading, unavailable runtime and changed inputs hold the reservation. Existing unmanaged entrypoints and explicit board/release operations retain their behavior.
Validation:
Historical validation on the integration target recorded baseline failures. Both this head and the unchanged integration base reproduce the same two configured mypy errors in the existing Yardstick transport; the owning #8202 now carries the annotation correction, which is not yet incorporated into this head. Guided-start Markdown also exceeds the unchanged 3400-character ceiling: 3458 on the matched local fixture and 3488 in both native Windows CI jobs (base, head). Their CI checkout trees match the respective exact revisions. No check is waived; Windows success and successor integration still require validation. The initial missing npm development dependency was installed and the semantic check then passed.
Scope: explicit managed launches and host invocation, with fresh Goal-wide run IDs. The native grading owner still supplies authoritative late-drain evidence. This introduces no watcher or live-controller migration, changes no score qualification or duration allowance, and claims process-interruption replay rather than new power-loss guarantees. The managed runner remains an explicit opt-in for each attempt.
Main target
This proposal now targets
mainas the independent terminal reconciliation change. The earlier review recorded an atomic receipt failure finding. The two follow-ups below cover replacement boundaries and recovery after storage becomes writable. Original reviewReview follow-up
When the terminal runtime receipt write reports an error, read back the same private record. An exact terminal record completes recovery in place. A still-current launch record allows one retry of the exact write. The original managed binding remains available if storage continues to reject the update.
The earlier head lost the managed binding on both injected replacement-boundary faults. The new source passes both faults, exact replay, the persistent write failure, board readback and once-only release. Local validation passed 36 Python cases and 13 TypeScript cases. Persistent storage failure retains the launch evidence and the slot until the original terminal facts can be verified.
Recovery after storage becomes writable
The follow-up review reproduced a completed attempt with two failed terminal receipt writes. Once storage recovered, the original launch binding, final result, native solver and drained grading record were all available. The earlier replay still held the slot because the runtime receipt remained at its launch state.
Replay now verifies the runner's existing completion marker against the retained launch identity and source pins, exact native solver record and drained grading history. Preview remains read-only. Execute publishes the existing proof format without rewriting the launch receipt. The controller reads back the terminal row and releases the original slot once.
The pinned Linux runner/controller suite passed 36 cases and the TypeScript controller suite passed 13. Negative cases include missing completion, another task, a contradictory terminal status, changed solver or history and changed launch pins. This recovery uses the completed result; attempts without complete, matching evidence keep the slot reserved.
Main composition
After #8229 landed, the runner entry needed the two adjacent native child and managed binding checks in the same function. This rebase retains both checks before launch and keeps the managed replay change at its original scope. The pinned Linux suite passed 148 managed reconciliation, native child and warm-start cases. A separate runner probe exercised both options in one attempt, observed capacity 3 on the SForge agent and read back the managed terminal proof.