Repository navigation
fix(migration): reject protected copy previews and plan continued-work transfer - #6672
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>
…igration-20261017 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). Exact-head COMMENTED self-review; no independent GitHub approval or merge authority claimed.
动机
用户准备把正在工作的 Agent 搬到另一环境,需要先知道现有工具能否迁移当前状态。旧工具会对已受现行权威保护的源端或目标显示预览成功,真正执行时才拒绝;现在同一预览直接给出既有执行拒绝及原因,合法旧状态复制继续可用。用户能在未复制数据前识别这条不支持的路径,避免把一次成功预览误认为可以恢复 Agent 执行。本 PR 不实现现代 Agent 换机、目标执行准入或外部凭证转移。完整可携产物、目标准入、原入口继续未完成任务和相应失败恢复仍待同一产品旅程交付。这里先修正已有工具可以真实兑现的预览契约;方便迁移最终必须由目标环境继续工作来证明,不能用备份可读、文档齐全或这一处拒绝代替。
改动思路
复用既有准入 owner 并保留执行锁,是修正预览误报所需的最小行为改动;迁移产品规划单独标为提案,没有增加新执行机制。本次交付真实旧工具预览修复及完整迁移旅程提案;可携产物、目标准入、产品入口和继续工作验收仍由下一完整切片承接。预览与执行仍走同一 CLI 和同一组源/目标身份,调用已有权威检查,不增加第二套 Python 决策。执行分支保留原锁,在复制前重新读取真实 owner;预览只检查当前事实,不给未来写入许可。目标 registry 若准备切换公共 runtime,旧 runtime 的既有 Goal 也受影响,因此沿用执行端已有检查,而不是只看新目标别名。
下表概括准确 head 34d642b21ce00ac6c24a2cbe8359b496dd765d11 的已执行对照。它表示实际 CLI 结果,未把提案当成迁移实现。
| 场景 | 旧基线 | 当前 head |
|---|---|---|
| 合法历史状态复制 | 预览/执行成功 | 成功,完整目标状态可读回 |
| 受保护 source、target 或 registry 旧 runtime | 预览成功、执行拒绝 | 预览直接给出同一完整执行拒绝 |
| 预览后源端提升为现行权威 | 执行拒绝 | 仍拒绝,不替换数据 |
| 同 runtime 的无关现行 Goal,含预览后新建 | 不妨碍合法复制 | 保持合法复制及无关字节 |
| 改别名/删显示配置尝试避开 source fence | 执行拒绝 | 预览、执行均拒绝 |
| 合法旧源遇到受保护目标后选新目标 | 原目标保留、新目标可用 | 同样保留并完成实际复制 |
三份 RFC 的中英文同时把“准备源端→可携产物→目标准入→继续未完成任务→原入口验收”列为产品细化提案。必要材料、凭证重绑、旧 executor 排除和未知外部结果 hold 仍在同一旅程里;这里没有把安全门拆成用户要手拼的八套命令,也没有把灾难恢复的接受标准改绿。
具体改动
准确 head 34d642b21ce00ac6c24a2cbe8359b496dd765d11,有效 merge-base 1f829cbf35ff5b9fe5458b5581ea3b2047f6048f,9 文件 +271/-14:一个产品适配器、一个真实存储测试文件、七份文档。公开 PR base 在检查时为 5bac1c1398c72d23313caec7174635927debcde5;之后的主干差异已检查为 MCP 依赖声明及独立 runtime 测试清理,没有修改本次 CLI、guard 或其 fixture。证据绑定当前 head,不继承另一个 PR 的批准,也不把此处组合视为全 main 资格。
规范依据为 docs/architecture/rfcs/complete-state-recovery-v0.md,接受基线 1f829cbf35ff5b9fe5458b5581ea3b2047f6048f。M1 的 inert/no-admission 边界保持 implemented,既有备份检查不会因此获得执行权;M2 完整 owner/profile 资格仍 deferred;M3 目标准入和独立继续工作结果仍 deferred。新增的 planned-transfer 段落明确是提案,没有重写原接受门来迎合当前实现。总体 roadmap 与 TS RFC 只据此对齐后续顺序,backup reference 公开当前旧工具的范围和预览变化。
关键代码讲解
migrate_legacy_state,244 行 现在在两个模式下都收集相同有序 endpoint;346 行起的锁仍只用于执行,361–366 行复用既有 guard 并检查受 registry 改向影响的旧 runtime。复制 helper 和 registry 提交继续位于检查之后,没有新 fallback 或执行许可缓存。require_legacy_state_replacement_allowed,246 行 本身未改:沿用实际 promotion fence、shadow management 与 TS 原生写检查,不靠 registry 标签或字符匹配猜状态。调用位置提前使预览如实反映旧执行规则,保持完整错误和恢复提示。
测试新增六种 File/SQLite endpoint 拒绝、合法预览后 source 变化以及公开 CLI 返回/无写入检查,保留旧复制与 retired shadow lineage 用例。独立评审又用同一合成 fixture 在不可变 base/head 执行 13 个公开 CLI 场景;新预览的全部诊断与旧执行比较时只排除明确的 dry_run/execute 模式位,其余文本、字段、错误码及执行/恢复结果一致。最初比较器漏归一化 path_map 的目录键,已核对原始差异并只补目录键归一化;全部原观察保留。独立“受保护预览必须拒绝”断言在旧公开路径失败,在当前 head 通过。
对主干的风险
这是明确的默认预览变化:过去会成功的受保护复制计划现在提前失败,调用方不能再把 ok=true 当作这类计划可执行。执行契约和合法旧输入没有因此收紧,完整主干/候选对照覆盖实际执行、目标数据读回、ID 冲突优先级以及同容器无关和后来新增的 Goal;源端发生提升后,旧成功预览也不能绕开重验。预览增加的是既有只读 guard 成本,未做迁移吞吐或全平台成本资格,不能据本地通过作更大性能结论。
更大的产品风险是把这个修复与完整迁移混为一谈。现有 Settings 仍只是隔离检查;本次没有新增 UI 或 Host 会话采用,现代 Agent 的可携产物、目标准入、失败恢复和未完成任务结果都没有交付。保留旧工具有真实历史输入和独立可读回的复制用途,删掉它或直接复制现行 store 都不合理。后续工程应继续完整迁移旅程,不因该 PR 的自评而另开字段系列或宣布 P0 完成。
语义与 CI 对齐
复用既有 typed fence/replacement 语义,没有新 enum、协议字面量、字符串 denylist 或 Python 规则 owner。准入拒绝是机器强制规则;RFC 细化是提案,二者没有混称。开发 advisory、全树 semantic、公开边界和正文的中英文对应已检查。按当前策略未查询、轮询或等待 hosted CI;远端 CI 没有被称作通过。
正常源码相关 53 项和正常 wheel 安装态 13 项通过;Ruff、配置的 mypy 17 文件与改动模块检查通过。额外的非配置全传递导入 mypy 仍失败:不可变 base/head 同环境的完整 4,845 条诊断一致,改动模块零诊断,保留 exact-scope baseline attribution,未改阈值或把失败改叫通过。风险 premerge 为 5 direct、9 catalog、8 profile 和一次公开扫描,全部通过、无告警/manual hold;准确 CQR cqr_426d4c621e563008024a 有效。
我的整体评价
当前准确 head 没有阻塞发现,给出 APPROVE 自评。long_horizon 为 preserved:执行、历史状态与后续重验规则保持;user_experience 为 improved:相同输入在复制前收到真实拒绝,不增加设置或确认轮次。合法旧复制也通过实际执行和独立读回,证明这不是只增加一个 blocker。
复用既有准入 owner 并保留执行锁,是修正预览误报所需的最小行为改动;迁移产品规划单独标为提案,没有增加新执行机制。本次交付真实旧工具预览修复及完整迁移旅程提案;可携产物、目标准入、产品入口和继续工作验收仍由下一完整切片承接。代码量主要来自必要的双语规划和真实负例,运行时代价是复用检查,没有新抽象、重复知识或无调用点框架。现代迁移、目标继续工作、App/Host 及额外 provider/platform 资格仍未验证;应沿原产品整合验收推进。独立 GitHub 审批、精确合并就绪与维护者合并授权保持各自边界,本条 COMMENTED 自评不替代它们。
English verdict: APPROVE — exact head 34d642b21ce00ac6c24a2cbe8359b496dd765d11 (author-owned COMMENTED self-review). The existing legacy-copy preview now returns the complete native refusal already enforced by execution; legal copying, unrelated Goals and recovery retain their contract through paired real CLI and installed tests. Complete modern Agent transfer remains a proposed, unimplemented product journey; no merge authority is claimed.
The useful migration outcome is moving an Agent's work to another environment and continuing its unfinished task. Align the bilingual recovery, overall-roadmap and TypeScript RFCs around a proposed reachable-source transfer through destination continuation, with the required context, materials, identity admission and product entry. Existing unavailable-source recovery and default qualification gates remain in place; the complete transfer is still unimplemented.
Fix a misleading existing entry:
migrate-statedry-run could report success for a canonical source or protected destination even though execution already refused it. Preview now invokes the same existing authority/fence guard, including an existing target registry's previous runtime. Execution retains its locked recheck. Eligible legacy copies keep their existing behavior. The backup reference discloses this preview behavior change and the tool's retained legacy scope.Validation on head
34d642b21ce00ac6c24a2cbe8359b496dd765d11:The next product delivery remains the prepared transfer, destination admission and separately accepted continued-work result through the initiating entry, including interruption/retry. This PR adds no transfer runtime or activation authority. Future-facing refactor: reuse one existing guard and endpoint collection; no additional wrapper, provider or parallel decision rule.