Repository navigation
fix(benchmark): retain research outside native submission trees - #8198
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-astra; OpenAI; declaration_source=runtime_reported; reasoning_effort=ultra
动机 / Motivation
使用原生提交协议的实验操作者和四种 worker,需要保留研究过程,又不能让非候选笔记混入题目声明的提交目录。 原来整工作区提交可能把研究笔记一起交给评分器;现在新轮次把笔记写到工作区外的固定研究目录,原生提交仍按原声明归档,终态采集和显式 checkpoint 另行保留研究文件。 真实 Docker 测试中,相同哨兵内容在候选目录仍进入原生归档,在研究目录则只进入独立采集;新 checkpoint 可恢复研究文件,旧 checkpoint 仍完整恢复原工作区。 本次不改变评分器、提交路径选择或反馈权限,不清洗历史候选,不给运行中实验补写新状态,也不宣称评分或模型策略已经改善。
检查的是 aabce4f58198edb2ec37d021184de823a0f00ef4,对照基线 5a58635028fbef1316dc66531daf5fdb655e9b13 的 benchmark/edgebench/README.md。我采用已有章节 Feedback protocol (new-run default: native) 和 Research checkpoint storage 的约束:原生 provider 继续拥有提交/反馈/评分,研究数据仍由声明和验证过的 checkpoint 路径接续。新增位置约定不能替代这些约束,也不能反过来用本次更新的文档证明旧评分无效。
改动思路 / Approach
研究文件位置属于 SForge benchmark 适配器;完整性、接收端选择和恢复继续复用现有 TypeScript checkpoint 所有者及研究文件传输,避免新增一套快照格式或评测过滤器。 本 PR 完成交付新建目录、四种 worker 指令、单独采集及可验证的 checkpoint 接续;旧目录内容不迁移,评分器、提交选择、预算和运行中实例不变。 只改提示词会丢掉研究文件的终态留存或恢复;按扩展名删除候选文件又可能误删真实输入。这里采用位置分离,且四臂采用相同约定。它是已声明存储边界,不是隐藏内容过滤或安全沙箱;放进候选路径的文件仍由原生提交逻辑处理。
具体改动 / Changes
关键代码讲解
validate_research_scope在启动前检查工作区与显式提交根,保留原声明,冲突就拒绝;worker 安装还核对物理/tmp与工作区位置,避免悄悄覆盖已有目录。with_research_capture只在已有显式 checkpoint 请求上复制并加入保留组件。原输入不会被修改,同 id 异路径、重复或重叠声明直接失败,不引入新的快照 schema。selected_research_components只自动选择同时匹配保留 id 与路径的已验证组件。旧 checkpoint 没有这个组件时不猜测;其他外部研究数据仍需要显式选择,后续完整性、目的地冲突和恢复使用既有所有者。_install_research_directory对冷启动要求不存在的私有目录,对恢复路径保留已验证模式;_append_workspace_policy统一冷/热指令追加和完整读回,旧任务前缀保留,重复同一块幂等,冲突块拒绝而不覆盖。
我独立在 Linux 原生 SForge/Harbor 环境重跑六个相关模块:582 passed、1 skipped,包含真实 TypeScript capture/probe/verify/stage/restore 的字节、模式、旧 point、未选择组件和冲突反例。随后另外运行实际 Docker 的六个用例:6 passed,其中四种 profile 都经过原生 archive 提取和实际 collection,另外检查冷启动策略、旧 AGENTS 追加、同块重放与冲突保留。全部是合成候选和自有临时容器,没有执行模型或修改运行中的实验。
对主干的风险 / Risks
最大风险是恢复时扩张选择范围或覆盖历史:因此我重点检查精确组件身份、完整 sealed manifest、目的地排他创建和原 AGENTS 前缀,而不把“有目录”视为恢复成功。旧工作区里的笔记不会自动移走,这是证据兼容边界;新路径仍可能与特殊任务镜像冲突,此时明确拒绝启动,不能退回混合提交或删除原数据。game、restricted-feedback、直接构造默认 false 的路径维持原规则;native 非 game 的新默认已在 README 公开说明。
未启用的一个旧 Docker writer-barrier qualification 在广泛测试中跳过,本 PR 没有改写该 owner;新增目录/归档/恢复另有实际 Docker 与 TypeScript 证据。精确提交 quick premerge 的直接检查、三个 canary 和公开边界检查通过,仍保留 benchmark-sensitive 的 manual_review_required,这不是执行测试失败,也不能据此自合并。按当前契约未查询或等待远端 CI。
我的整体评价 / Verdict
APPROVE,本次没有发现阻断问题。这个切片把研究留存与原生候选提交的边界接完整,同时复用既有恢复协议,避免内容清洗和第二套快照机制。本次检查的 benchmark/edgebench 与 benchmark/runtime 路径改变 CLI 启动指令、容器目录、checkpoint 传输和终态采集,没有修改网页或产品布局,因此不适用截图验收。 未执行真实模型续跑,也未验证历史候选在新边界下的评分或长期收益。 后续应从实际新运行核查指令采用与资源成本;本结论不是收益宣告或主干合并授权。
English verdict: APPROVE the exact head aabce4f. Native submission contents remain provider-owned while research files use a separate, verified retention and restore path. Real Docker and checkpoint negative cases pass; live model adoption and score gains remain unverified, and merge authorization is separate.
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; declaration_source=runtime_reported; reasoning_effort=max
REQUEST_CHANGES:[P2] 预检遗漏 checkpoint 输出与新增研究源的重叠,已用真实 capture 做 base/head 对照复现。已有同 head 的批准保留;这个新反例使当前交付资格仍不足。
动机 / Motivation
使用 native 非 game worker、同时保留研究记录和候选提交的实验操作者。 整工作区提交原来可能把研究笔记交给评分器;新方案把笔记放在外置研究目录,并通过独立 collection 和 checkpoint 保留,候选输入仍由原生提交协议决定。 六个真实 Linux Docker 用例验证了候选归档与研究采集分离,现有 TypeScript transport 能保留研究字节、模式和旧 point。 本次不改评分、反馈权限、提交选择或运行中实验,不迁移历史笔记,也不宣称模型采用或分数收益。 输出位于新增研究源内的旧有效 checkpoint 声明仍可通过启动预检,直到真实 capture 才失败。
改动思路 / Approach
位置规则属于 SForge provider,完整性和恢复继续属于现有 TypeScript checkpoint owner;不需要内容过滤器或第二套快照权威。 保留这组存储与恢复实现;当前 PR 只需在同一 provider 预检处补齐输出/研究源重叠拒绝,再复测原生启动与 capture。 只改提示词不能保证终态留存;按扩展名清洗候选又会误删真实输入。统一四种 profile 的外置位置是合理的局部方案,cold/warm 共用具有独立 IO、冲突和读回职责的 helper 也合适。问题集中在扩展已有 capture declaration 时,尚未完整验证这次新增源与原输出的组合。
具体改动 / Changes
依据变更前 docs/reference/research-checkpoint.md 的 Prepare and capture / Complete isolated benchmark replacement,spec_revision 为 5a58635。本次映射 CP-explicit-roots 为显式目录与精确选择,implemented;CP-preserve-point 为新目的地、旧 sealed point 与重放保留,implemented;CP-receiver-bytes 为声明的研究数据确实可捕获和验证,当前因下述输出重叠而 not_met。新路径默认由本次 README 明确披露,不能拿新增文档反过来证明旧候选评分错误。
关键代码讲解
- with_research_capture 复制原声明并追加 benchmark_research;同 ID 异路径、重复和 component/source 重叠会拒绝,但没有读取 request.destination。
- selected_research_components 只自动选择匹配保留 ID 与固定路径的组件,复用既有 receiver;旧点和其他外部组件保持原选择边界。
- _install_research_directory 冷启动要求保留路径不存在,恢复时不重新 chmod 已验证模式;失败不会悄悄覆盖已有数据。
- _append_workspace_policy 合并冷/热指令追加的错误与读回职责;真实 Docker 覆盖原任务前缀、同块幂等和冲突保留。
独立验证:兼容的 Python 3.12、固定 SForge source 和 Harbor 0.20.0 下,六模块 582 PASS、1 个显式 Docker writer-barrier 用例 SKIP;另在 Linux Docker 上六个实际用例全部 PASS,覆盖四 profile 原生 archive/collection 与 cold/warm policy。native game、blind、best-only 在相同合成 CLI 输入下的完整启动指令/提交投影与 base 相等;该比较停在 observer/solver 外部边界,不证明评分或模型行为。
对主干的风险 / Risks
[P2] 在 solver 启动前拒绝捕获输出与研究目录重叠
原声明仅捕获 /task,而 destination 为 /tmp/loopx-benchmark-research/checkpoints 时,工作区与输出原本分离。新 helper 追加其父目录 /tmp/loopx-benchmark-research 作为研究源,却只遍历 components 检查源之间的重叠。在 追加分支 之前没有输出校验,真实 run.main 因此能构造 worker 并抵达外部 solver 调用边界。测试在该边界主动停止,没有调用模型。
同一原始声明和合成文件经真实 TypeScript artifact owner:base 成功 capture,随后单独 verify 返回 integrity_verified=true;head 添加研究源后 capture 失败,外层为 EffectRuntimeInternalError。未改变的 checkpoint 输出检查 明确拒绝输出位于来源内的情况。这会把不可捕获的配置留到研究执行后才暴露,不能靠 source/source 冲突测试或六个正常 Docker 用例排除。
最小修复是在同一 provider 预检校验有效 destination 与保留研究源的相等、祖先和子目录关系,包含适用的后续 capture 输出;保持原声明不变,并在 solver 之前给出可操作拒绝。补充回归:旧合法声明在 base 能 capture;head 对冲突在启动前拒绝,非重叠输出仍经过真实 capture/verify/restore。
语义与 CI 对齐
复用现有 checkpoint vocabulary;保留 ID 是 provider-local 选择,不增加 Core actor 或执行权限。Ruff 的全部 benchmark 改动文件 PASS;完整仓库 Ruff 的 F841 在未改动 test_goal_create_completion.py:184,与 base/head 完整输出相同,仍未豁免。严格 CQR 为 FAIL/invalid,benchmark-sensitive 人工门与合并权限另列。早先依赖缺失/宿主不适配的运行均保留:未装 provider 时大量跳过;一次环境缺 socksio 失败;Darwin Docker 控制通道发生 socket shutdown 错误。后续兼容依赖和 Linux 真实用例覆盖了当前对应不变量,但不将早期失败改记通过,也不认证 Darwin 控制器。未查询或等待远端 CI。
我的整体评价 / Verdict
整体放置与规模合理,保留原生提交 owner、已有状态和恢复兼容有实际价值;但当前 long_horizon/user_experience 仍存在迟发捕获失败,必须补齐同一预检再批准。这里没有要求重做整个 benchmark、增加模型试验或创建新控制面。检查了 benchmark/edgebench 与 benchmark/runtime;变更是 CLI 指令、容器目录、归档和恢复,没有网页或渲染布局,截图验收不适用。 真实模型采用、运行中实验接续和长期分数/完整成本收益未验证。 修复后应保留现有通过证据的适用性,并重测这个 base/head 反例;当前批准和本次不同结论都不应被删除来制造就绪状态。
English verdict: REQUEST_CHANGES on exact head aabce4f: preflight the new research source against every capture output before solver entry.
| research = PurePosixPath(RESEARCH_DIRECTORY) | ||
| if source.is_relative_to(research) or research.is_relative_to(source): | ||
| raise ValueError("Checkpoint component overlaps the reserved research directory") | ||
| if not present: |
There was a problem hiding this comment.
[P2] 在启动前校验捕获输出与新增研究源的重叠。原声明仅捕获 /task、destination=/tmp/loopx-benchmark-research/checkpoints 时,base 可以 capture 并独立 verify;此处追加其父目录作为研究源后,只检查 components 之间的重叠,run.main 仍能抵达外部 solver 边界,但真实 capture 被现有 artifact owner 的 output/source 检查拒绝。请在此处校验有效 destination 的相等、祖先和子目录关系(含适用后续输出),保持原声明,并增加启动前拒绝及非重叠 capture/restore 回归。验证使用合成文件,未执行模型。
When a native task submits its entire workspace, keeping research notes and local diagnostics inside that workspace also makes them candidate inputs. This change gives all native, non-game worker profiles the same external research directory and retains it through the existing collection and checkpoint transports. Required build and runtime inputs stay in the task's declared submission paths.
Behavior and compatibility
AGENTS.mdstorage instructions across all four worker profiles. Terminal collection retains the directory separately ascollected/research.benchmark_researchcomponent to a copy of an explicitly supplied checkpoint declaration. Restore it through the existing verified research-file transport; unrelated external components still require explicit selection.This stays in the benchmark SForge provider adapter and reuses the existing TypeScript checkpoint artifact owner and receiver. The shared policy append helper also keeps cold and warm installation idempotence/conflict handling consistent.
Validation
Tested head:
aabce4f58198edb2ec37d021184de823a0f00ef4, based on5a58635028fbef1316dc66531daf5fdb655e9b13.test_research_artifacts.py,test_sforge_warm_start.py,test_sforge_runtime.py,test_edgebench_prompts.py,test_edgebench_feedback.py, andtest_checkpoint_storage.py. The skipped test requires separate explicit Docker writer-barrier qualification.test_external_research_survives_collection_without_entering_native_submission, plus cold storage-policy installation and warm policy preservation/conflict handling. Native whole-workspace archives retain synthetic candidate content and exclude sidecar-only content; the real collector retains that research.git diff --checkpass. After installing repository npm development dependencies,uv run --extra test loopx canary premerge --from-git-diff --git-diff-base origin/main --tier quick --format jsonreports zero direct/run failures. Its overall gate remainsmanual_review_requiredbecause benchmark-sensitive changes need maintainer review.No live solver was resumed or benchmark rerun for this change. These checks demonstrate transport, packaging and instruction delivery; they do not establish future model adoption or a score/cost improvement. Historical results are unchanged.