Repository navigation
fix(update): preserve the selected runtime throughout rollback - #8470
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>
loopx-agent
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Reviewer: model_agent · GPT-6 (Codex) · OpenAI · self_reported; runtime declaration unavailable (session_not_found).
动机
影响显式选择 registry/runtime 的归档安装维护者。此前显式回滚可能掉回冲突的默认目录并被误报为格式不兼容;现在规划与三个校验子进程沿用同一目录。可观察结果是指定目录的回滚能够完成,失败时显示真实阶段与有界诊断。本次不迁移存储、不重放业务请求,也不解释另一安装过程为何选择旧版本。仍待独立查明旧版本覆盖来源,并继续验收原 Bot 的延迟与未完成回复。
独立规范依据为 docs/guides/installing-loopx.md,spec_revision=335195240045fc670aed8878c100000c6b0a70c3。ROUTE-1:更新保留已选择的本地状态目录;ROUTE-2:默认目录冲突时明确拒绝隐式路由,可使用显式 registry/runtime;PLAN-1:裸 update 仍只读。随 PR 新增的双语 RFC 是实现说明,没有被用来证明自身符合既有规范。
改动思路
两个小型函数分别复用既有路由解析与参数构建,保留执行器原来的状态转换。本 PR 只修更新器的路由传递和失败读回,不增加 provider、状态或调度边界。选择目录只决定已有校验读取哪个存储,不授予迁移或恢复权限。兼容校验仍在换链接之前用 --require-current 只读执行;核心 doctor 失败仍恢复旧链接,扩展失败仍如实保留“运行时已激活但 provider 不可用”。错误文案从推测格式不兼容改为要求查看实际兼容检查读回,默认 CLI 同时展示退出码和失败输出。
具体改动
关键代码讲解
_selected_runtime_route复用 explicit_global_registry、load_registry 与 resolve_runtime_root。handle_update_command 的回滚分支在规划前解析一次;前向 apply 也复用该函数,避免两套目录选择规则。build_rollback_plan接收可选 registry_path/runtime_root,实际传给 collect_doctor。目标 release 的选择与非法 release 拒绝规则保持;直接 API 调用不提供路由时,继续使用既有隐式行为。_runtime_route_arguments由前向和回滚执行共同调用;registry 取绝对路径,参数以 argv 列表传递,含空格的路径不依赖 shell 拼接。execute_rollback_plan将同一 argv 送入兼容、核心与扩展校验。兼容失败不进入链接切换;核心失败恢复原链接;扩展失败不假装回滚整体成功。兼容退出码与各 2000 字符尾部是诊断派生信息,不是新的权威状态。render_update_plan_markdown展示已运行阶段的退出码,仅展开失败阶段的有界 stdout/stderr,并显示异常文本。三个失败场景均断言真实拒绝与诊断对维护者可见,避免 JSON 有原因而默认 CLI 仍只给笼统错误。
测试通过真实 CLI parser/dispatch,再对外部 IO 子进程做可控替身,覆盖成功、兼容拒绝、核心失败和扩展失败。额外的真实进程隔离验收在该精确提交执行了三个目标 CLI 子进程,退出码均为 0;不带显式路由的只读对照退出码为 1,默认生产启动器前后相同。测试替身不被当成实际安装或业务执行证明。
对主干的风险
风险主要是把正确目标 release 配上错误存储,或故障分支意外改变链接恢复语义。我逐段核对生产调用点并检查三个分支的调用顺序、传参、链接结果及返回码。新增四个场景在原基线全部失败,原因是规划调用缺少显式路由;修复后更新器相关 89 项通过,5 项为平台条件跳过。此前系统 Python 缺 pytest、首次完整门因 worktree 缺 TypeScript 依赖而失败,原失败记录保留;使用既有测试环境并按仓库规定 npm ci --ignore-scripts 后,最终提交的完整 native premerge 已通过,未缩小扫描或放宽预算。未查询或等待 GitHub CI。
基线重放是在 417e9fd,与当前 PR base 的被改生产文件 blob 相同;两者之间的变更属于无关 benchmark 路径。全局 LoopX check 的两个旧 Goal canonical authority 问题仍作为独立诊断保留,未声称本 PR 修复它们。隔离验收使用本地已有目标 CLI,不证明任意旧发行版的参数兼容性、Windows 自动回滚、另一安装过程选择旧版本的原因或模型行为。既有全局参数没有增加新协议,当前直接调用者和实际目标进程均已核对。
我的整体评价
未发现阻塞性问题。该变更恢复已明确选择的路由,诊断文本与实际失败一致,规模与故障代价相称。检查的入口是 update --rollback 与文本/JSON renderer,没有前端或首屏布局变化。CLI 文本诊断已验证;未测试 App 画面、版本覆盖行为或自然模型采用。当前审查结论适用于 55eda1c;安装采用与生产 Bot 的后续业务闭环分别验收,不从源码测试推导完成。
English verdict: APPROVE — selected-route propagation and rollback failure boundaries are validated at the reviewed head.
显式选择 registry/runtime 的回滚,原先会在规划与子进程校验时丢失路由;默认目录存在冲突时,路由拒绝还会被误报为权威格式不兼容。现在回滚和前向更新复用既有路由解析,将所选目录贯穿规划、只读兼容检查、核心与扩展诊断,并保留兼容检查的真实失败读回;默认 CLI 同时显示失败阶段与有界诊断输出。
四个新增 CLI 回归在基线上失败,修复后与既有更新器回归共 89 项通过、5 项平台条件跳过。真实 CLI 隔离验收的三个子进程均成功;未指定路由的只读对照保留拒绝,实际默认启动器未变。不增加迁移、权限或执行器,不代表另一安装过程选择旧版本的原因已解决。
CLI 调用与错误读回沿用既有入口;没有前端或首屏布局变化。方案与失败边界见随附的中英文 RFC。