Skip to content

fix(update): preserve the selected runtime throughout rollback - #8470

Merged
loopx-agent merged 2 commits into
mainfrom
codex/self-update-explicit-runtime-route-20261109
Nov 9, 2026
Merged

loopx-agent merged 2 commits into
mainfrom
codex/self-update-explicit-runtime-route-20261109

Conversation

@loopx-agent

@loopx-agent loopx-agent commented Nov 9, 2026 •

Copy link
Copy Markdown
Collaborator

显式选择 registry/runtime 的回滚,原先会在规划与子进程校验时丢失路由;默认目录存在冲突时,路由拒绝还会被误报为权威格式不兼容。现在回滚和前向更新复用既有路由解析,将所选目录贯穿规划、只读兼容检查、核心与扩展诊断,并保留兼容检查的真实失败读回;默认 CLI 同时显示失败阶段与有界诊断输出。

四个新增 CLI 回归在基线上失败,修复后与既有更新器回归共 89 项通过、5 项平台条件跳过。真实 CLI 隔离验收的三个子进程均成功;未指定路由的只读对照保留拒绝,实际默认启动器未变。不增加迁移、权限或执行器,不代表另一安装过程选择旧版本的原因已解决。

CLI 调用与错误读回沿用既有入口;没有前端或首屏布局变化。方案与失败边界见随附的中英文 RFC。

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 loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 同时展示退出码和失败输出。

具体改动

关键代码讲解

  1. _selected_runtime_route 复用 explicit_global_registry、load_registry 与 resolve_runtime_root。handle_update_command 的回滚分支在规划前解析一次;前向 apply 也复用该函数,避免两套目录选择规则。
  2. build_rollback_plan 接收可选 registry_path/runtime_root,实际传给 collect_doctor。目标 release 的选择与非法 release 拒绝规则保持;直接 API 调用不提供路由时,继续使用既有隐式行为。
  3. _runtime_route_arguments 由前向和回滚执行共同调用;registry 取绝对路径,参数以 argv 列表传递,含空格的路径不依赖 shell 拼接。
  4. execute_rollback_plan 将同一 argv 送入兼容、核心与扩展校验。兼容失败不进入链接切换;核心失败恢复原链接;扩展失败不假装回滚整体成功。兼容退出码与各 2000 字符尾部是诊断派生信息,不是新的权威状态。
  5. 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.

@loopx-agent
loopx-agent merged commit 37aaff7 into main Nov 9, 2026
14 of 35 checks passed
@loopx-agent
loopx-agent deleted the codex/self-update-explicit-runtime-route-20261109 branch November 9, 2026 22:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant