2026-10-20 | 真实故障复盘 | 附完整命令
一句话结论
升级失败不是最可怕的,最可怕的是"看起来成功了"。
我遇到的是 npm install 退出码 0、日志显示 added 7 packages, changed 409 packages,但版本号从头到尾没变。
一、故障现象
想把 OpenClaw 从 2026.9.33 升到 2026.10.5。
第一次用官方更新入口:
bash
gateway update.run
返回:
json
{
"status": "skipped",
"reason": "managed-service-handoff-started",
"handoff": { "command": "openclaw update --yes --channel extended-stable" }
}
看起来交出去了,实际上没有执行。
等了 20 分钟,检查版本:
bash
openclaw --version
# OpenClaw 2026.9.33 (5873f81) ← 一动不动
二、第一个根因:一次性计划任务早就过期了
查计划任务:
powershell
Get-ScheduledTask | Where-Object { $_.TaskName -like "*OpenClaw*" }
结果里有个 openclaw-upgrade-933,查它的触发器:
powershell
(Get-ScheduledTask -TaskName "openclaw-upgrade-933").Triggers
yaml
StartBoundary : 2026-10-15T22:28:35+08:00
这是一次性任务,设定在 4 天前,今天根本不会再触发。
更新入口把活儿交给一个已经死了的任务,然后自己报 skipped 退出。
教训:遇到 skipped + handoff,先去看它交接给了谁,那个东西还活着吗。
三、第二个坑:把网关杀了,脚本也死了
改成自己写独立 PowerShell 脚本:
powershell
# 停任务 → 杀进程 → npm install → 重启任务
结果脚本跑到 已杀进程: 46480 就断了,npm install 从未执行。
原因 :这个脚本是我通过网关的 exec 工具启动的,它是网关的子进程。杀掉网关 = 杀死自己的父进程,整棵进程树一起没了。
教训:任何需要重启网关的操作,绝不能让脚本挂在网关的进程树下面。
四、第三个坑:npm 的"假成功"
改成通过 Windows 计划任务跑(计划任务的父进程是系统服务,不会跟着网关死):
powershell
schtasks /create /tn "OpenClawUpgrade105" `
/tr "powershell.exe -NoProfile -ExecutionPolicy Bypass -File <脚本>" `
/sc once /st 23:59 /f
schtasks /run /tn "OpenClawUpgrade105"
这次 npm install 真的跑了,日志显示:
added 7 packages, removed 16 packages, and changed 409 packages in 2m
npm 退出码: 0
退码 0,看起来成功了。
但检查:
bash
npm ls -g openclaw --depth=0
# `-- openclaw@2026.9.33 ← 还是旧版
翻 npm 完整输出,找到了原因:
kotlin
npm warn install-scripts 5 packages have install scripts not yet covered by allowScripts:
esbuild@0.28.2 (postinstall: node install.js)
koffi@3.3.2 (install: node ./cnoke.cjs -P . -D src/koffi --prebuild --release)
openclaw@2026.10.5 (postinstall: node scripts/postinstall-bundled-plugins.mjs)
npm 较新版本默认不执行 postinstall 脚本。 而 openclaw 的 postinstall-bundled-plugins.mjs 正是安装内置插件的关键步骤。
没有执行 postinstall = 装了个空壳。
五、但是------真正的拦截不是这个
加 --allow-scripts 重装,这次真的升到了 2026.10.5。
然后网关起不来。日志里:
sql
Plugin openclaw-weixin cannot import openclaw/plugin-sdk/infra-runtime
(built with OpenClaw unknown; running core 2026.10.5)
查微信插件版本:
bash
npm view @tencent-weixin/openclaw-weixin version
# 2.4.x
结论:微信插件 2.4.x 不兼容 10.5 内核,而 npm 上根本没有对应 10.5 的版本。
这不是配置问题,是上游没发版。再怎么折腾也没用。
六、回滚:三个必须检查的地方
升级失败后回滚,我踩了两个坑:
坑 1:数据库 schema 版本
10.5 启动时会自动迁移数据库:
- state 库:v19 → v20
- agent 库:v24 → v25
回滚代码后,旧版本会因为 schema 版本过高而拒绝启动。
解决:把 10 个数据库全部还原到升级前的备份。
powershell
# 9 个 agent 库 + 1 个 state 库,逐个还原
Copy-Item "backup\openclaw-agent.sqlite" "agents\main\agent\" -Force
Copy-Item "backup\openclaw.sqlite" "state\" -Force
坑 2:残留的计划任务
我创建的那个 OpenClawUpgrade105 任务还留着,随时可能被再次触发,把健康的网关再打断一次。
bash
schtasks /delete /tn "OpenClawUpgrade105" /f
坑 3:配置漂移
失败的升级过程改了配置。回滚后要逐项核对:
- 模型清单
- 插件列表
- 通道配置
七、最终的体检清单(回滚后必做)
bash
# 1. 版本
openclaw --version
# 2. 网关可达
openclaw status --deep
# 3. 数据库完整性(关键)
# 日志里搜 integrity_check,必须全部通过
# 4. 插件加载
# 日志里搜 plugin,确认没有 import 失败的
# 5. 通道
openclaw status # 看 Channels 表格
我的实测结果:
makefile
版本: 2026.9.33
网关: 22ms 可达
数据库: 10 个 sqlite,integrity_check 74 张表全部 healthy
插件: 21 个加载成功
微信通道: OK
八、四条可以抄走的经验
skipped不等于"交给别人了",等于"你需要去查那个别人是谁"。- 重启网关的操作,不能跑在网关的进程树里。 用计划任务或独立服务。
- npm 退码 0 不等于装成功。 查
install-scripts警告,查版本号本身。 - 回滚不是"把代码切回去"就完事。 数据库 schema、残留任务、配置漂移,三样都要查。
九、一句话总结
升级系统最大的风险不是升级本身,是"你以为升成功了,但实际上留下了一个半新半旧的状态"。
我现在这套系统跑的是 9.33(LTS 通道),数据库完整,通道正常。在微信插件支持 10.5 之前,不升。
所有命令和日志都是真实的,可复现。