ARTICLE · 1063696
OpenClaw v2026.7.35(2026.09.21)新版本发布
OpenClaw 前天发了 v2026.7.35。我点开 Release 页面本来想扫一眼就关掉——七月那条长期支持线一向没什么看头,上一篇写它的时候我还说,这条线是发给不想升级的人的。
结果 Fixes 底下只有一条。
一整版,只有一个提交
本机 /opt/workspace 下有 openclaw 的完整 clone,三个 tag 都在。
| $ git rev-list --count v2026.7.34..v2026.7.35 1 $ git log --oneline v2026.7.34..v2026.7.35 0af2921e9a2 chore: prepare extended-stable 2026.7.35 (#153901) |
这个提交动了 222 个文件,听起来不少。把 package.json、npm-shrinkwrap.json、Info.plist 这些纯版本号的滤掉,剩下的是:
| CHANGELOG.md | 10 ++ extensions/matrix/CHANGELOG.md | 7 + .../plugin-registry-migration .test.ts | 46 ++-- .../plugin-registry-migration .ts | 176 ----- src/plugins/doctor-contract -registry.test.ts | 36 +++ src/plugins/doctor-contract -registry.ts | 24 ++- |
两个源文件,两个测试,两份 changelog。整版就这些。changelog 里那句话是这么写的:
preserve the complete bundled plugin inventory when Doctor creates or repairs registry state ... recovers from the partial registry written by 2026.7.34
partial registry written by 2026.7.34。上一版写了半张注册表。
体检工具把没点过名的插件全当成了无关项
我一开始猜是写盘写了一半,断电或者并发之类。翻了存储那边的代码没找着,读写都是整份覆盖。真正的地方在 7.34 的 plugin-registry-migration.ts,落盘那一步:
| const current = { ...candidateIndex, refreshReason: "migration", plugins: listMigrationRelevantPluginRecords({ index: candidateIndex, config, installRecords, ... }), }; await writePersistedInstalledPluginIndex( current, params); |
candidateIndex 是完整的插件清单,就在上面一行刚算出来。写进磁盘的不是它,是被 listMigrationRelevantPluginRecords 挑过一遍的那份。
relevant 的判定条件往下翻能看到,三样:配置里写了的 channel、配置里写了的模型 provider、显式装过的插件记录。外加一层别名展开,比如 openai 认 openai-codex。
可是 OpenClaw 自带的插件,谁会在配置文件里专门点名浏览器?
我拿本机的真实配置代进去算了一遍。~/.openclaw/plugins/installs.json 里在册 93 个插件,openclaw.json 里 channels 三个、models.providers 三个、plugins.entries 十一个。
| registry total : 93 relevant (survive) : 10 ['alibaba', 'anthropic', 'deepseek', 'feishu', 'memory-core', 'ollama', 'openai', 'openclaw-weixin', 'qwen', 'telegram'] dropped : 83 changelog-named lost: ['browser', 'canvas', 'device-pair', 'file-transfer', 'phone-control', 'talk-voice', 'bonjour'] |

本机配置代入 7.34 的入选条件,93 个在册插件剩下 10 个
changelog 点名的那七个——浏览器、画布、设备配对、传文件、手机控制、语音、局域网发现——一个不落,全在被丢掉的 83 个里。
写盘之后,后面的加载优先读这份持久化的注册表。重启,插件没了。
这活儿是 doctor 干的。那是 OpenClaw 用来查毛病、修状态的命令。
修法是让它别挑了
7.35 的改动在 doctor-contract-registry.ts,二十来行:
| resolvePluginDoctorContracts( params, { completeInventory: true }, ) // 函数内部 ...(options.completeInventory ? { preferPersisted: false, installRecords: loadInstalledPluginIndex InstallRecordsSync({ env }), } : {}) |
preferPersisted: false 是关键那行。发现状态迁移的时候不再信磁盘上那份注册表,回去读 install records 重算。既不会接着写坏的,也能从 7.34 已经写坏的那份里爬出来。
同一个提交里,plugin-registry-migration.ts 从 341 行缩到 165 行。listMigrationRelevantPluginRecords 连同配套的别名归一、channel 扫描、provider 扫描,整套删掉。
新增的测试就一条,名字起得很直白:
| it("finds state migrations omitted from a partial persisted plugin inventory", () => { |
四天,三个版本

tag 时间取自本机 git,三版的作者都是 Dallin Romney
7.33 在 09-17,75 个提交、126 个 PR 的合集。7.34 在 09-19,声称从 11198 个提交里挑出该进七月线的。7.35 在 09-20,从 1418 个提交里挑出 1 个。
顺带说两件 Release 页面上能看见、但容易划过去的事。
一是 7.33 和 7.34 压根没发 GitHub Release,所以 7.35 那一页把前两版的 changelog 都折进来了。你在 Releases 列表里翻七月线,会以为 33 和 34 不存在。
二是 7.35 的 npm 发布任务是失败的。页面上写了失败原因是 bounded registry readback expired before propagation completed,然后由 owner 人工核对签名、provenance、70 个插件的回读和 Docker digest,手动完成发布。一个 LTS 版本,最后一步是人按的。
要不要升
要。如果你停在 7.34,你的注册表大概率已经被写坏了,只是还没重启所以没露出来。
倒是想问一句:你上次跑 openclaw doctor,是主动跑的,还是出事之后才跑的?