Repository navigation
Preserve regular build files through Docker checkpoint transport - #8189
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
Exact head: 8189@79511afe1fd64491993f333acd40185834a66738
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
使用 Docker worker 捕获研究文件的操作者,可能在普通构建产物含有多个同 inode 文件名时无法生成 checkpoint。 Docker 把同一普通文件的第二个名字编码为 tar hardlink;旧传输层把它当成不支持的链接而在封存前拒绝,新传输层从同一完整归档内已验证的普通成员复制内容,导出为两个独立文件。
真实 Docker、原生 HTTP controller 与既有 typed artifact owner 的链路已经验证,导出的两个文件内容相同且 inode 不同;原先无 hardlink 的相同 fixture 在 base/head 均保持通过。 本次只修复文件传输,不保存进程内存、不授予执行或 receiver admission 权限,也不补写历史失败点或宣称完整研究恢复已经合格。 原生会话继续、完整研究点资格、模型采用及长程净收益仍由现有独立验收负责;全量 Ruff 的三处既有 F811 和严格质量 hold 没有被本 PR 修复。
改动思路 / Approach
归档表示差异由现有 Docker IO 适配层消化,普通文件的 witness、封存与发布仍由既有 TypeScript owner 负责;无需第二个状态或权限 owner。当前 PR 仅修复明确请求的 Docker 文件传输并扩展已有验证,不改变默认捕获、native 预算或完整恢复资格。先建立完整成员索引,再检查 hardlink 的目标,因此前向引用也能处理,任何目标不合法时都在提取之前失败。
| 输入 | base | 当前 head |
|---|---|---|
| 同一真实 CLI fixture,含两个同 inode 的普通文件名 | _archive 拒绝,未完成封存 |
两份独立文件成功封存 |
| 同一原有 CLI fixture,无新增 hardlink | PASS | PASS |
| 外部、缺失、目录、自引用或链接目标 | 拒绝 | 继续拒绝 |
这是已执行的路径对照;没有新增操作步骤或确认轮次,也没有把 Docker 可用当成捕获授权。
具体改动 / Changes
关键代码讲解
_archive:113:全量索引继续拒绝越界、重复、symlink 和特殊成员;hardlink 只能指向索引中的普通文件。复制目标的 TarInfo 后只替换 alias 的名称和 mode,仍由data_filter提取,既不创建 host hardlink,也不跟随链接链。capture_worker:252:实际调用者仍负责原有 writer barrier、native point 和 clock;异常、取消、超时的 response 关闭与自有 writer 释放路径保留。新文件现在可以到达既有封存链路。checkpointArtifacts:230:这个未修改的 typed owner 按普通文件路径、bytes、mode、digest 复制与验证;研究点合格和执行授权标记仍为 false。传输层适配复用了该语义,没有再建一套状态或封存策略。
规范依据 docs/reference/research-checkpoint.md,spec_revision df97c78693417137fcb1cb961fb840062311f7e3:L47-L52 → implemented(完整 inventory、原 deadline 与身份);L54-L63 → implemented(声明根、静止源、捕获 bytes 验证);L65-L77 → implemented(没有改写 frozen run、旧捕获或 capture-disabled guidance)。这些是原文行地址,没有杜撰 RFC 验收编号。完整 diff 为三个文件 +72/-6,生产增量集中在现有归档函数,其余扩展原有测试。
对主干的风险 / Risks
PASS:兼容的 Linux Python 3.12、现有 Docker 镜像与固定 native source 下,archive/worker 两个测试模块共 65 passed,覆盖前后向引用、内容与权限独立性、非法目标先拒绝、SQLite WAL、原始 phase/cooldown、超时和 writer 清理。相同新增 CLI fixture 在 base 以原始拒绝错误失败、在 head 通过;相同旧 fixture 两端通过。HTTP provider、Docker archive/pause 与 typed artifact backend 为真实路径,任务和 grader 为合成;没有运行模型或正式实验。
FAIL:完整仓库 Ruff 在两端逐字相同地报告 chat history 三处 F811,位置为 14/53/105;本 PR 没有改该文件、导入或 Ruff 规则。改动路径 Ruff 与严格 mypy(17 files)通过。严格 CQR cqr_b7cdfca695705e28f6c4 为 fail,包含 required Ruff 与原始 Mac/root 环境失败记录;native quick premerge 的 5 项直接检查和 3 项选定执行通过,但 gate 为 quality_invalid_receipt,另有 benchmark manual hold。代码 APPROVE 不豁免这些门槛;已有 #8188 是独立的相关修复。
Linux 初次以 root 运行得到 64 passed/1 failed,失败点是未改动的 ordinary-controller 非 root 前置条件;随后以普通用户完整重跑通过,原失败保留。最初的 Mac 广泛试跑为 base 33 fail/68 pass/3 skip、head 33 fail/75 pass/3 skip,完整失败保留。文件系统资格检查明确拒绝大小写合并,另外三项 grading 失败未完成定因;后续 Linux 验证只证明本次必要链路,不宣称这些旧失败已修复。完整 long-horizon qualification、已安装版本与远端 CI 均不据此推断。
语义与 CI 对齐
本次有意扩展 external tar input,复用既有普通文件表示,不新增共享 vocabulary、工作义务或执行权限。非法链接仍 fail closed,关闭捕获的 prompt/配置无改动。未查询、轮询或等待 CI;三处既有静态失败与必要本地路径验证已分开记录。
我的整体评价 / Verdict
这是完整可用的文件传输增量,未发现本次修改引入的阻塞性问题。long_horizon=preserved:保持原 native 机会、身份、phase 与恢复责任,完整净收益未测量;user_experience=improved:普通构建文件可以沿同一显式捕获步骤导出,没有增加用户准备或确认轮次。视觉检查不适用:三个文件只涉及归档适配及测试,无 renderer、页面或布局变化。unverified_scope:已安装 App、完整研究恢复和真实模型行为。架构继续由 Docker adapter 处理 wire 表示、typed owner 处理完整性;现有 required lint/CQR hold 与合并授权仍是独立约束。
English verdict: APPROVE — the real Docker capture path preserves ordinary hardlinked file names as independent files; existing required-lint and quality holds remain separate.
Docker encodes multiple names for one regular file as hardlink entries. The checkpoint artifact owner accepts those files, but the Docker transport rejected the archive before sealing, so ordinary build outputs could prevent a recovery point.
This change materializes a hardlink from the bytes of an already inventoried regular archive member. The exported files remain independent, matching the existing artifact contract. No filesystem link is created or followed; external/missing targets, link chains, symlinks, special files, duplicates and traversal remain rejected before extraction. The existing writer barrier, source witness, native evaluation state and phase clock are unchanged.
Validation:
This repairs the file-transport boundary. It does not reconstruct previously failed captures or claim that every historical capture failure had this cause. Full research-point and native-session continuation retain their existing qualification.