ARTICLE · 995056
OpenClaw 发布了 v2026.9.3,看不见的字符,吃掉 AI 半条记忆
OpenClaw 昨晚发了 v2026.9.3。这种版本号我一般扫一眼 Highlights 就关,这次卡在了 Changes 区第一条,一句很不寻常的话:
Upgrade Node before OpenClaw to prevent SQLite text truncation. 先升级 Node,再升级 OpenClaw,以防 SQLite 文本被截断。
截断?我第一反应是数据库文件损坏那类事故,翻了半天 release 页也没找到哪个 issue 说库坏了。后来在它的安装文档里才看明白:库没坏,坏的是 Node。Node 内置的 node:sqlite 模块,读 TEXT 字段时遇到 NUL 字符就停,后面的内容直接扔掉,不报错,不警告。
NUL 就是编号为 0 的那个字符,肉眼看不见。SQLite 自己存它没有任何问题,问题出在读的这一侧。
我顺手看了眼自己网关机器上的 Node:v22.23.1。文档里的问题版本名单上,正好有 22.23.x。
三行代码就能复现
不信邪,我写了个最小脚本:往内存库里插一条中间带 NUL 的文本,马上读回来。
import { DatabaseSync } from "node:sqlite"; const db = new DatabaseSync(":memory:"); db.exec("CREATE TABLE t (v TEXT)"); db.prepare("INSERT INTO t VALUES (?)").run("前半段\u0000后半段还在吗"); const row = db.prepare("SELECT v FROM t").get(); console.log(process.version, "读回来:", JSON.stringify(row.v));同一个脚本,用我机器上现成的几个 Node 各跑一遍:
v22.21.1 | 读回来: "前半段" v22.23.1 | 读回来: "前半段" v24.15.0 | 读回来: "前半段" v24.18.0 | 读回来: "前半段\u0000后半段还在吗"「后半段还在吗」六个字,在前三个版本里凭空消失。连 22.21 这种更老的版本也一样,说明这毛病一直都在,只是最近才在 24.16.0 和 26.1.0 里修掉。修好之前,node:sqlite 读文本用的其实是 C 字符串那套逻辑:见到 0 就当结束。
真正吓人的是写回
只读丢还算好的,盘上数据毕竟完整。我又试了一步:模拟一次很常见的表迁移,用坏版本把这行读出来、原样写回去。
$ node step1_write.mjs # 用 24.18.0 写入 v24.18.0 写入完成,落盘字节数: 61 $ node step2_migrate.mjs # 用 22.23.1 读出再写回 v22.23.1 迁移进程读到: "工具输出片段" 已按读到的内容写回(模拟一次表迁移/整理) $ node step3_check.mjs # 再用 24.18.0 检查 v24.18.0 落盘字节数: 18 | 内容: "工具输出片段"61 字节变 18 字节。这时候再换回修好的 Node 也救不回来了,丢失落盘,成了永久的。
你可能会想,谁的文本里会有 NUL 这种怪东西?普通业务确实少见。但 agent 的数据库里存的是会话记录和工具输出,AI 天天在里面跑 shell 命令、读各种文件,输出里混进什么字节都不奇怪。混进一个 NUL,那条记录从此就只剩前半截。
全程没有一行报错。
OpenClaw 的做法:直接锁门
bug 在 Node 身上,OpenClaw 改不了别人的解码器,它这版选的办法是把门锁死。我在隔离目录装了个干净的 2026.9.3(330 个包,34 秒),故意用坏版本启动:
$ node node_modules/.bin/openclaw --version openclaw: Node.js >=24.16.0 <25, or >=26.1.0 is required (current: v24.15.0). If you use nvm, run: nvm install 26 nvm use 26 nvm alias default 26版本对了还不算完。启动时它会真的开一个内存库查 sqlite_version(),确认链接到的 SQLite 库没踩另一个 WAL 损坏 bug,专门防那种发行版 Node 挂系统共享库的情况。查出来不安全,同样拒绝跑。
这个处理我喜欢。悄悄吞数据和大大方方罢工之间,罢工是对用户负责的那个。
代价也是实打实的:Node 22、23、25 全线踢出支持名单,macOS 11 到 13.4 和 Linux ARMv7 的安装通道跟着 Node 24 的门槛一起退场。还有那个顺序问题,现在你应该能看懂了:老版本 OpenClaw 没有这道门,配上坏 Node 照样能跑,每一次读库都在丢字。所以是先换 Node,再升 OpenClaw,别反过来。
这版还有什么
9.2 到 9.3 隔了两天,中间挤了将近 1900 个提交。除了 Node 这件事,值得知道的都在这张图里:

v2026.9.3 主要改动速览
更新彩排那条跟 Node 门槛是配套的:新改动先在隔离状态里试跑一遍,过了验证才切换,失败能修复或者回滚。折腾数据库的事,这版明显是集中还债了。
我那台 22.23.1 的网关还跑着七月份的旧版 OpenClaw,也就是说过去一个多月它每次读库都可能在丢字,写完这篇就去升。顺便说一句,node:sqlite 到今天还标着 experimental,可拿它当正经存储用的工具已经一大把了。
你机器上 node -v 打出来是多少?在 24.16 之前的,评论区说一声,看看有多少人和我一样在坑里。