最近贼Code真是如雷贯耳,事情的起因是这样的,9 月 18 日,开发者 ferstar 用一篇取证分析把智谱旗下的 AI 编程工具 ZCode 推上风口浪尖:客户端在登录状态下会把整个工作区包括完整的 .git 历史、LFS 缓存和 reflog全部打包加密后直传阿里云 OSS,解密私钥只存在云端,界面上没有任何有效的关闭开关。三天之内,智谱走完了致歉、整改、第三方审计、宣布开源的全部流程,9 月 21 日,仓库 zai-org/ZCode 在 GitHub 上线,一天之内拿到近 5000 颗 star。
从危机响应的速度看,这几乎是教科书级别。但开源 24 小时之后,社区的反应不是释然,而是更大的嘘声。到底问题出在哪?不是因为大家刻薄,而是因为这份开源交付的东西,和它被要求回答的问题,对不上。
社区真正想问的三个问题
先把争议还原清楚。这件事的性质不是"产品出了个 bug",而是用户怀疑自己的代码资产被悄悄拿走了。由此产生的核心问题其实是三个:
第一,上传机制从哪个版本开始存在,影响面有多大。第二,被打包上传的数据在删除之前,有没有人读过、用来做过什么。第三,官方第一轮回应里"上传是为了会话检查点回滚"的说法,是否属实。
注意,这三个问题都是关于过去 的问题。而开源这个动作,天然只能交付现在的快照。想用它回答过去的问题,有一个前提:你应该把历史提交记录公开出来。
这份开源实际交付了什么
打开仓库,技术社区的失望是具体的。
整个仓库只有两个 commit:一个空的 Initial commit,加一个名为 "feat: open source" 的巨型提交,一次性倒入 6973 个文件、约 103 万行代码。内部开发历史被整体压平,无法追溯上传功能是什么时候写进去的,也看不到它是怎么被移除的。讽刺之处不用多说:一个因为打包用户全量 .git 历史而翻车的产品,自己开源时的 git 历史是零。更有意思的是提交时间------代码落地的时刻换算成北京时间是 9 月 21 日凌晨五点多,可以想象是一个连夜清理的现场(辛苦删代码的小哥了)。

仓库的 Issues 功能处于关闭状态,PR 也被锁定。官方口径是"把代码交给社区监督",但社区连提一个 issue 的入口都没有。真的是太招笑了,有开发者发现,监督的热情转移到了 commit 评论区,估计智谱自己也没想到吧。

代码里还留着两处让人心里发凉的痕迹。README 专门解释了一句"CLI 源码作为普通目录随仓库一起克隆,无需初始化 submodule",把子模块摊平成裸目录,恰好抹掉了 CLI 的独立提交历史。另一处是 CodingPlanStatusActions.tsx 里的注释:"开源版不享受额度活动权益"。也就是说,你在官网下载的闭源版和仓库里的开源版并不是同一个东西,服务端靠某种方式区分它们。截至本文写作时,有用户反馈官网下载页的历史版本已不可获取,如果属实,意味着对旧版本做逆向取证的路也基本被封上了。

至于大家最关心的核心能力,比如 Computer Use,开源版里只有被挖空的占位符。据社区分析,闭源版的大量核心逻辑封装在 native 动态库(build/Release/ax_native.node)里,这部分完全没有随源码放出,而 native 库逆向分析的难度远高于 TypeScript。换句话说,开源出来的 103 万行,主要是外围的绑定和界面层。
最关键的概念混淆:开源 ≠ 可审计
ferstar 对开源代码的复核确认了上传链路已被彻底清除、检查点功能确实是纯本地 Git 这一点反而推翻了官方"检查点回滚需要上传"的最初解释。但请注意这个结论的结构:它能证明"现在的版本不偷",证明不了"过去的版本偷了什么、从什么时候开始偷"。
可审计性(auditability)才是社区要的东西,它至少需要三样:完整的提交历史、可复现构建(用源码编译出和官方分发二进制一致的结果)、以及公开的问题追踪入口。这次开源三样都没有给。给了的是代码本身------一份压平了历史、与线上版本存在差异、核心模块缺席的快照。
最后我说一句
对于这个事,你看到的就不是账本,是账本的封面。