v0.21.6 换了发布方式:先花两分钟确认你拿到的是什么

你刷到 Hermes Agent 又发版了,版本号 v0.21.6。点进 release 页面,正文第一段就写着:这是补丁版,把窗口里的改动收敛成一个稳定 tag,完整整理的发版说明推迟到 v0.22.0。你跑完 hermes update,终端说升级成功。然后呢——你其实说不清自己装上去的到底是什么,也不知道这次该不该马上更。这次比以往更让人犯嘀咕的地方在于:不光内容是新的,发布方式本身也换了。这篇就干两件事:说清这次发布方式变了什么,然后给你三条命令,自己确认手上的版本。
这次不一样:第一个走新稳定发布流水线的 tag
官方在正文里写得很直白:v0.21.6 是第一个由新的稳定发布流水线切出来的版本,它的形态是“一次 attempt ref、一个测过的 Docker 镜像、发布时留下一个 receipt tag”。
这句话看着抽象,翻成白话就是:以前打完 tag 之后,镜像、托管部署、Nix 包这些产物是各自去追这个 tag 的;现在反过来了——先有一次发布尝试(attempt),尝试本身带上构建和测试,测过了才把 Docker 镜像发出去,最后发布时才把这次的凭据(receipt)记到 tag 上。对你这个使用者来说,最直接的区别是:这次的 tag 背后有一个明确“被测试过”的镜像,而不是“打了 tag 你再去构建”。
正文也划清了边界:这次发的是 tag、这个 GitHub release 和 Docker 镜像三类东西;桌面端、Termux 包和 Microsoft Store 这次不动,它们跟着下一个打包版本一起走。
窗口里到底滚进了多少东西
老规矩,先看规模,数据来自官方正文,测量于提交 818c13be1dc4fd28987e1e881a9408224afd4535:
| 指标 | 数值 |
|---|---|
| 非合并提交 | 8,867 |
| 改动文件 | 8,342(+772,490 / −225,600) |
| 已合并 PR | 2,106 |
| 已关闭 issue | 3,027 |
如果你想自己核一遍文件数,命令行就能验(需要本地有完整的 git 历史):
cd ~/.hermes/hermes-agent
git fetch origin main --tags
git diff --shortstat v2026.9.24 818c13be1dc4fd28987e1e881a9408224afd4535
# 8342 files changed, 772490 insertions(+), 225600 deletions(-)
这里的 v2026.9.24 就是上一个 tag(也就是语义版本 v0.21.5)。“补丁版不写说明”不等于“没有东西”,只是这 2,106 个 PR 没有被逐个命名和分类而已——它们会在 v0.22.0 里补齐,官方承诺“一件都不会漏”。
三条命令,确认你手上是哪个版本
别凭感觉,也别只看 hermes update 那句“成功”。按安装方式走:
# 1. 版本号(git 安装会额外带上领先 tag 的距离和短提交)
hermes version
# 2. 你这次升级到底做了什么
hermes update
# 3. Docker / 托管部署:直接看镜像标签
docker pull nousresearch/hermes-agent:stable
第三种情况要特别说明:Docker 和 Hermes Cloud 的用户拿到的不是 git 工作树,而是镜像。这一版给下游的关键词是 nousresearch/hermes-agent:stable(或 :latest)。镜像用户的“我升级了吗”只有一个可信答案:镜像摘要(digest),而不是你自己记的拉取时间。
还有一条容易被忽略的线索:git 安装会在安装戳(install-stamp.json)里记录这次的更新方式(updateMechanism),hermes version 会读它。所以如果你在两台机器上看到同一个版本号、但行为不一样,先对比这个戳,别急着怀疑代码——很可能是“轻量安装”和“完整 git 安装”的差别。
顺手看一眼这次窗口里的安全修复
这次正文没有把功能讲全,但安全修复是单独列出来的,一共三组,都值得你确认自己升到了哪一边:
一、Dashboard 认证加固(PRs #133367、#133369、#133370,以及会话接管的 #130685)。四个问题由 Tenable Research 一次性报告(TRA-725 ~ TRA-728):伪造 X-Forwarded-For 可以重置密码登录限流并绕过每 IP 上限;未认证的登录请求能往审计日志里写不限量的内容;公开的 /auth/ 路由没有请求体大小上限;原生登录可以把验证码发到非回环地址,进而导致会话被接管。我们此前已经就前三个问题写过一份完整拆解,dashboard 登录加固那篇里有每一项的成因和你的部署要不要改配置;第四个(重定向)是这次发布正文里才明确点名的,两者合起来看才是完整的一轮。
二、仓库 git filter 加固(#130661)。自动执行的 git 调用(会话工作区快照、子代理 worktree、kanban、worktree 清理、hermes -w)可能被不受信任仓库自己的配置里定义的 clean / smudge / process filter 程序劫持,而且是发生在你敲第一句话之前。这件事我们早就单独写过:git config 变成 RCE 入口那篇。如果你经常 clone 陌生仓库再在里面开会话,这是必须升的理由。
三、邮件网关发件人加固(#125212、#124322)。From 头里带引号的显示名可以被构造成“看起来是允许列表里的人”,从而让攻击者的邮件绕过白名单。这项我们也在发件人身份伪造那篇里逐条分析过。
一句话总结这三组:没有一个是新功能,全都是“输入没有上限、却被当成可信”的同类错误。
现在要不要升级
判断起来其实不难:
- 你有对外暴露的 dashboard、或者你在多台机器/多个 profile 上跑网关 → 升,三组安全修复里有两组直接落在你的攻击面上。
- 你会 clone 别人的仓库并在里面让 agent 干活(尤其是团队里共享的仓库)→ 升,git filter 那条发生在你开口之前。
- 你只是本地单机自用、也没有对外端口 → 升不升都不会出事,但既然新流水线把“测过的镜像”作为产物,早一点换上更省心。
升级本身还是那一条:hermes update;Docker 用 :stable;桌面端这次不用管,它跟着下一个打包版本走。
小结
- v0.21.6 最大的变化不是某个功能,而是发布方式换了:attempt ref → 测过的 Docker 镜像 → 发布时记 receipt。
- 窗口规模:8,342 个改动文件、2,106 个已合并 PR;官方完整整理留到 v0.22.0。
- 别信“升级成功”那句话,用
hermes version和镜像 digest 确认你到底装了什么。 - 三组安全修复:dashboard 认证、git filter、邮件发件人。前两组值得你在今天就动手。
想看上个窗口里那些“已经能用但别处还没写过”的变化,可以翻我们上一版的补丁窗口自查指南;想弄清不同平台上 YOLO 和审批状态在重启后到底还剩什么,可以接着读/yolo 持久化那篇。