Repository navigation
feat(benchmark): add one settled-work handoff without changing capture cadence - #8070
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
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; model=gpt-6.1-sol; provider=OpenAI; reasoning_effort=max; runtime_reported.
REQUEST_CHANGES:两项 P2 分别涉及丢失声明后的检查点补写和原阶段到期后的额外读取。
动机 / Motivation
需要在既定研究阶段中交接当前工作状态、同时保留原有重规划频率的 benchmark 操作者。检查点是将来重建和比较工作过程的固定取样点,其价值依赖保存的是原来声明的状态。
原来同一声明只能沿原重规划节点捕获;补丁让操作者额外声明一次工作完成后的交接,但首次声明读取失败后恢复文件,当前实现仍会把后来改过的工作状态写到同一目标。
定向测试通过,独立反例仍证明错过的点可以被后来状态补写,并且原阶段到期后仍先读取声明和恢复来源。这会使同名取样点对应不同时间的证据,或把阶段结束后的准备成本漏出原边界;即使文件完整性校验通过,也不能修复取样时间错误。本 PR 不证明科学收益、付费模型效果、线上升级、完整研究恢复或新的工作与合并权限。
改动思路 / Approach
保留现有请求和捕获 owner 的设计是合理的:一个显式、不可从普通重规划推导的交接意图,交给原工作 Turn 的结算、原阶段时钟和原文件/native/controller 参与者处理。另存 checkpoint_handoff 能保留原 before_replan 观察,无需修改重规划频率、创建准备 Todo 或增加模型调用。当前 PR 的合理边界就是这一次可回滚的额外交接;修复应留在同一 adapter 和既有 attempt owner 中,不需要新服务或无关语言重写。
最强反对理由是额外交接很容易把“稍后还能拍到一份完整文件”误当作“原来那个点可以恢复”。下面按实际入口而不是字段存在与否比较:
| 状态 | 合同要求 | 当前头的观察 |
|---|---|---|
| 没有额外交接声明 | 保持原执行与捕获策略 | 两个基线/候选无 IO 对照相等 |
| 首次交接声明丢失或变更后恢复 | 保留错过的原点;另声明新点 | 后来状态仍能写入同一目标 |
| 原阶段已到期 | 不读取声明或任何来源 | 先读声明并调用恢复来源 gate,随后才返回窗口关闭 |
表格解释已执行反例的控制流,不证明完整 native 交接或科学有效性。
保留小型显式 adapter 与现有 owner,在本 PR 修复首次尝试和阶段时钟的两处顺序错误,无需增加抽象或无关重写。
当前边界是保留普通重规划的一次显式工作交接;首次尝试和阶段门仍阻断接受,完整 native/receiver 与科学资格另行验收。
具体改动 / Changes
关键代码讲解
parse_checkpoint_request把显式嵌套声明限制在fresh_replan下,并验证直接子目录和非空用途。已有声明仍可省略新字段;这不是从 provider 可用性推断激活,也不新增普通工作权限。_capture_declared_settled_handoff在原工作结束后复制已有声明,移除 trigger,交回原capture_after_wake;独立结果不会覆盖重规划前的观察。但 pending 只保留 Turn 与请求 hash,不能在文件丢失时给原目标留下首次尝试证明。_mark_completed_capture_attempt已有原 wake 证明和 artifact 侧索引,能够抵御索引权限恢复后的补点。新路径的声明读取和 hash 失败发生在调用它之前,因此尚未受到这项保证保护。capture_after_wake仍在原结算身份下复用文件、native 和 controller owner;新增 helper 的调用却排在既有原阶段检查之前。restored_capture_gate可以读取规范绑定、artifact 和 native history,其自身超时不能代替已经结束的阶段预算。
独立依据是已接受的 benchmark/README.md#inert-checkpoint-capture,spec_revision 0423908e9cf46afd7a765552323b842441bd6512,以及同版本 RFC §7.7 的首次尝试和阶段条款。按原文映射:Each destination is attempted once 与 An exhausted original phase 在当前头 not_met;Capture failures are recorded separately 已由原结果保持不变的测试和反例观察覆盖;Omitting the declaration 的无额外读取/effect 路径由不可变基线与候选的同输入对照覆盖。新增 README 不能替代这些原有约束。
8 份文件的生产改动集中在原 checkpoint adapter,其余是说明、新的局部反例与现有 inline/full/delta policy reader 的复用。没有新的通用控制面义务、并行结算 owner 或前端入口;局部请求字段和 receipt 也不构成另一套 Agent 生命周期。
对主干的风险 / Risks
[P2] 首次声明失败后仍可补写同名检查点(声明重读)。 在已经成功结算且有 pending 记录的工作结束时,删除声明文件,或者只在字节末尾加一个换行;首次 hook 都记录失败,但没有 checkpoint-completed-request.json。恢复原声明、修改候选证据并进入后来的工作 wake 后,同一目标实际捕获成功,返回 integrity_verified=true。本轮使用真实 TS 文件 probe/capture;结算和恢复来源资格是受控 fixture,故不冒称完整 native/controller 验证。最小修复是在现有首次尝试 owner 中保留原声明目标,并让这种已开始的失败保持被消费;追加“失败→修复文件→后来源码变化仍拒绝”的反例,同时保留原工作成功与原重规划结果。
[P2] 阶段到期仍先读取声明和来源(成功 wake 判断)。 budget_exhausted 不能表示所有绝对时钟到期:模型正常结束后的 session observation 或其他收尾也可能越过原 deadline。给成功 receipt 和 pending handoff 设置过去的 LOOPX_PHASE_DEADLINE_EPOCH,当前 helper 仍调用声明读取和恢复来源 gate,进入原捕获函数后才返回 capture_window_closed。应在这些操作前复用现有有限时钟检查,测试两个 IO sentinel 均未被触发,不能增加阶段时间或放宽门槛。
验证:精确头四个定向模块 99 PASS / 5 SKIP;不可变生产文件的 feature-off 与普通 replan 无额外交接对照相等、没有额外声明/effect IO;改动 Python Ruff、committed diff 与 RFC 双语 diff 检查均 PASS。最初独立脚本因导入路径错误尚未执行生产代码,改用当前 checkout 的 run_path 后才取得上述结果,失败保留而未算作产品缺陷。5 个可选平台/native 前提的 SKIP、完整 native/controller 与 ordinary/stride receiver 串接、真实模型和科学收益均保持未验证。这里没有用测试数量抵消两项已复现违反,也未查询或等待 CI。
语义与 CI 对齐
这是现有显式请求的局部扩展;问题在于原先已有的首次尝试与阶段顺序没有贯穿新路径。先修复两处顺序并加入真实入口回归,再在授权环境完成最终头的 settled_once 联合机械资格;本次 REQUEST_CHANGES 不声明 CQR、完整 premerge 或合并资格,也不要求无关改动为此让路。
我的整体评价 / Verdict
机制规模与一个明确的额外交接意图相称,保留原 owner 比更改频率或增加准备工作更合适。long_horizon 与 user_experience 当前均为 regression:操作者无法可靠保留原声明点,原阶段成本边界也会漏出;这两个结果需要在本 PR 内修复。Inspected benchmark/runtime/checkpoint.py and benchmark/README.md: internal runner declaration and artifact receipts only; no rendered presentation change.完整 native 恢复、已安装产品采用和研究收益不在本轮证据范围。
接受“小 adapter 加原 owner”的边界,不接受用后来成功的文件校验替代原时间点。重新评审需要上述两个失败分支在同一真实入口通过,原 work/periodic receipt 保持不变,并如实保留联合资格和成本验证的剩余范围。
English verdict: REQUEST_CHANGES — head 35b404daa673c9a35baeafb100deea6850cceccd can backfill a missed declared handoff with later state after request recovery, and reads declaration/restored sources after the original phase has expired. Preserve the first point and enforce the original clock before those reads.
| request, raw = read_checkpoint_request(env["LOOPX_CHECKPOINT_REQUEST"]) | ||
| if (pending.get("turn_id") != receipt.get("turn_id") | ||
| or pending.get("request_sha256") != hashlib.sha256(raw).hexdigest()): | ||
| raise ValueError("settled-work handoff request or original Turn changed") |
There was a problem hiding this comment.
[P2] 保留首次声明目标后再处理读取失败。成功且已结算的 wake 在 preflight 有 pending Turn/hash;若此时删除声明或只追加换行,本次会抛错,尚未留下原 wake/destination 的首次尝试证明。恢复原声明、修改候选文件并进入后来 wake 后,同一个 destination 实际捕获成功,形成了原本禁止的后来状态补点。现有 changed-request 测试只断言首次拒绝,未断言恢复后仍拒绝。请复用既有 attempt owner 保留并消费原目标,补上失败→恢复声明→后来状态不能补写的回归;保持原 work 和 periodic receipt 不变。
| return # No eligible completed boundary; keep the request unconsumed. | ||
| result = {"captured": False, "research_point_qualified": False, "phase": "after_settled_work"} | ||
| try: | ||
| request, raw = read_checkpoint_request(env["LOOPX_CHECKPOINT_REQUEST"]) |
There was a problem hiding this comment.
[P2] 在这里的声明/source IO 前检查原阶段时钟。budget_exhausted 只覆盖显式预算/超时分支,模型正常结束后的 session observation 等收尾仍可能跨过绝对 phase deadline。以成功 receipt、pending handoff 和已经过去的 LOOPX_PHASE_DEADLINE_EPOCH 调用实际 capture_after_wake,会先读取声明并调用 restored_capture_gate,之后递归进入原捕获函数才返回 capture_window_closed;恢复 gate 可继续读取绑定、artifact 与 native history。这违反原合同的 exhausted phase no declaration/source reads。请先复用有限原 deadline 检查,并用两个 IO sentinel 验证到期时均未调用,不能延长阶段或放宽截止。
…led-handoff-20261105 Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
APPROVE — exact head 08dbb5e7077959a644960a64fd00605df5eea98f.
Both previously reported P2s are closed:
- The declared handoff reserves the original destination with the existing wake witness before rereading a missing or modified declaration, so later work cannot backfill the missed point.
- The original finite phase deadline is checked before declaration/source reads and again after settlement observation; expired, non-finite, and expire-during-settlement cases stop without declaration or restored-source reads.
Exact-head verification: benchmark/tests/test_checkpoint_settled_once.py 19 passed; the changed checkpoint/control-plane set 42 passed, 29 platform/native opt-in skipped; changed Python files pass Ruff. Existing unrelated baseline failures remain separate from this verdict.
|
Reviewer: model_agent; model=gpt-6.1-sol; provider=OpenAI; reasoning_effort=max; runtime_reported. Post-merge audit:新增一项 P2,需要跟进修复。该 PR 已合并为 动机 / Motivation受影响的是需要在正常重规划捕获之外,显式保存一次已完成工作状态的研究者。交接点必须对应原来声明的时间边界,不能只保证最后生成的文件完整。 例如,启动器已接受一次交接声明,首次工作预检时该文件暂时丢失;工作继续完成,文件恢复后又完成了一轮工作。当前补丁仍可把第二轮的候选写到原来的交接目录,并返回完整性验证成功。 预期改善是在不改变正常重规划频率的前提下增加一次显式交接;本轮验证正常路径可用,但上述失败路径仍未保住原点。此 PR 不承担科学收益、真实模型采用、活动安装或新的执行权限。 改动思路 / Approach复用原 adapter 和首次尝试 owner 是合理边界;在声明早期失败时仍须保留原点身份。交接意图不能从普通 replan 推导,因此显式目的和目标目录有必要;结算、阶段时钟、artifact/native/controller 验证继续由原 owner 负责,无需新增服务或调整重规划策略。 当前边界是保持正常重规划捕获的一次显式交接;合并后须沿原 owner 修复首次预检失声明的补点漏洞,完整研究资格另行验收。最强反对理由仍是:文件完整不等于时间点正确。现有首次尝试机制足以承接这项约束,但 pending 身份目前只有在成功重读声明后才建立。
表格是适配器入口与真实文件 artifact 实验的结果。quota/settlement admission 和恢复来源资格受控,未冒称完整 native/controller 联合资格或真实模型结果。 具体改动 / Changes关键代码讲解
完整 PR 为 8 个路径:一个生产 adapter、一个联合资格命令的选项、五个测试/fixture 消费路径及 README。现有 policy reader 的复用避免把导航当决策正文,没有新增产品 writer、模型调用或普通捕获频率。 独立依据是 benchmark/README.md#inert-checkpoint-capture,spec_revision 对主干的风险 / Risks[P2] 首次预检失去声明后仍能补写同名交接点(215–218 行)。 启动时已通过 这与已修复的“预检成功后才丢声明”不同,违反原先失败后不得用后来状态补点的约束。最小修复是在既有启动/Host wake owner 中让已声明的一次交接目标及首次失败身份不依赖再次读到可变声明,或在这种失败后明确拒绝复用原点;新点仍用新的显式目标。不要新增执行器或要求重新批准普通工作。回归应覆盖“启动校验 → 首次预检失声明 → 原工作完成 → 恢复同字节声明 → 后来工作仍不得写原目标”,同时保留可读声明正例和独立的新目标恢复。 验证:当前头六个相关模块 112 PASS / 71 SKIP;原两 P2 的六个定向回归在不可变旧生产文件 改动 Python Ruff、diff hygiene、编译及 quick premerge 的所有直接检查和 4 项选中检查 PASS;整体仍是 语义与 CI 对齐新字段扩展的是局部 benchmark 请求,原通用 quota、Todo、调度和结算规则没有新增词表或领域义务。现有一次尝试 owner 应在首次声明失败路径继续生效;当前问题是该不变量未覆盖新增入口的更早失败点。保留当前阶段门修复及已有负例,再加入上述入口回归;无需为此放宽预算或修改研究结果。 我的整体评价 / Verdict整体机制与一次明确交接相称,原两项修复也有实际回归证据。当前 long_horizon 与 user_experience 仍为 regression:操作者修复声明后会得到“完整但属于后来工作”的同名证据,时间身份与恢复结果不可信,因此需要合并后跟进修复。 已检查 benchmark/runtime/checkpoint.py 与 benchmark/README.md;只涉及私有 runner 声明和回执,没有渲染页面变更。视觉未验证范围:无。本次没有资格化活动部署、完整 native 联合接续、真实模型采用或科学收益。重新评审需要早期失声明不再补点的真实入口反例通过,并保留原工作结果、普通频率、原阶段预算和合法新点恢复。 English verdict: REQUEST_CHANGES — post-merge audit of head |
显式的一次交接捕获现在保留正常 fresh-replan 捕获频率,并遵守原阶段截止时间。普通请求不增加捕获、模型调用、preparation Todo 或重规划频率调整;额外交接仍需显式声明,成本计入原阶段。
本次同时修复评审指出的两处 P2:首次声明丢失或字节改变后,不能用后来的工作补写同名 checkpoint;原阶段到期或截止值无效时,在读取声明和恢复来源前拒绝。
当前 head:
08dbb5e7077959a644960a64fd00605df5eea98f。分支已接入 maine7a6c8d5f09a8c7e5d6021aabce00223c9324fce;目标仍为 main。实现继续使用现有 benchmark I/O adapter、原 Turn settlement、首次尝试 witness 和 artifact/native/controller owner。preflight 保留原目标;确认原工作已结算后,先消费该目标的首次尝试,再重读声明。截止检查、声明读取、来源 gate 和实际捕获在同一原有路径执行,避免外围 helper 绕过顺序。声明目标校验由两个调用点复用,没有新增控制平面决策 owner、设置或权限。
验证:
manual_review_required,不宣称合并资格。Ruff、diff hygiene、双语 RFC diff 与 8 个公开路径扫描通过。这是原有私有 runner 声明与回执路径的修复,没有新增前端/Lark 页面或设置。原成功 work 与 before-replan 回执保持;没有原目标的旧 pending 记录保守拒绝,不能靠重读修复文件重建原点。普通捕获频率不变,省略显式交接声明即可保持原行为。