Hermes 新命令 /loop:在会话里养一个"越等越聪明"的哨兵——与 /goal、cron 的本质区别

部署脚本跑完了,但你不敢走开——CI 会不会红?队列会不会堵?服务什么时候真正 live?于是你每隔五分钟手动刷新一次页面,像一个尽职的哨兵。
Hermes 最新的 /loop 命令,就是来顶替你当这个哨兵的:在会话里按节奏重复执行一条 prompt,每次醒来都基于最新状态干活。它是 Hermes 对 Claude Code /loop 的实现(/proactive 别名也兼容),刚刚合入 main。这篇文章把它讲透:它和 /goal、cron 到底有什么本质区别,以及怎么用它。
一句话分清三个命令
| 命令 | 驱动方式 | 生命周期 | 典型用途 |
|---|---|---|---|
/goal |
judge 驱动——每回合后由裁判模型判断“达成没有”,没达成就继续 | 单会话内,跨回合持续 | “把 src/ 下所有 lint 错误修完并验证通过” |
/loop |
timer 驱动——到点就醒来干一次,直到有人喊停 | 单会话内,跨回合 + 跨恢复 | “每 5 分钟看一次部署状态,live 了告诉我” |
| cron | 调度驱动——固定时间表,与任何会话无关 | 会话外,无人值守 | “每天早上 9 点生成日报发到群里” |
/goal 是“不停工作直到达成目标”,/loop 是“反复检查直到有人说停”,cron 是“到点执行、与对话无关”——三者完全不重叠。
两种节奏:你定时钟,或让它自己定
固定间隔:你说了算
/loop 5m check the deploy status and tell me if it's live yet
每 5 分钟(会话空闲时)注入一次真实 agent turn,基于当前状态干活——最新 CI 结果、最新队列深度、文件现在的样子。
自适应节奏:越等越聪明
不写间隔,让 Hermes 自己定节奏:
/loop keep an eye on the migration and summarize progress
机制很巧妙:从 60 秒起步,只要 agent 的回复不再变化,就指数退避(2m → 4m → 8m … 上限 15 分钟);一旦回复内容发生变化,立刻弹回 60 秒加密检查。变化检测用的是本地摘要比对(忽略时间戳),零额外 LLM 成本——等得越久说明越稳定,越稳定就越少打扰;一旦有进展,马上跟进。
一句话:外部时钟驱动工作用固定间隔,工作节奏自己变化用自适应。
停止条件:五个出口
| 条件 | 方式 |
|---|---|
| Agent 自己判断完成 | 醒来回复以 LOOP_COMPLETE 单独一行结尾 |
| 次数上限 | --times N(如 --times 30) |
| 证据条件 | --until <条件>——由 /goal 同款裁判模型判断(fail-open,裁判坏了也不会卡死循环) |
| 手动 | /loop stop(或 /loop pause 暂时挂起) |
| 预算兜底 | loops.max_ticks(默认 100,0 表示无限)——防止无人看管的会话无限烧 token |
/loop 2m poll CI --times 30
/loop 5m watch the queue --until "queue depth reaches zero"
控制与组合
/loop status看节奏与下次唤醒时间;/loop pause/resume/stop全生命周期控制(CLI 里 Ctrl+C 也会暂停,可恢复)。- 循环一条 slash 命令:
/loop 10m /recap。 - 和
/goal协作:活跃的 goal 拥有“空闲边界”——loop 的 tick 会等 goal 完成/暂停/搁置后再触发(wait barrier);而一个已搁置的 goal + loop 心跳可以自然组合。真实用户输入永远抢占两者——你一发话,两个都让路。
为什么它不掉链子:架构级设计
这是这篇博客想让你真正看懂的部分——/loop 不是简单的 while true:
- 普通 user-role turn 注入:每次 wakeup 就是一条普通用户消息,不篡改 system prompt、不换工具集、prompt 缓存保持完整——不会因为循环而破坏缓存、浪费 token。
- 状态持久化:循环状态存在
SessionDB的state_meta(loop:<session_id>),/resume恢复会话后循环自动复活,跨上下文压缩也能迁移(和/goal同款机制,已知坑提前修了)。 - 全平台覆盖:CLI、TUI、dashboard、桌面 App、以及所有 gateway 消息平台——gateway 有一个
loop_wakeup_watcher扫描持久化的循环,即使你不在聊天,它也会在空闲会话里注入唤醒。这是 Claude Code 做不到的(它的 loop 只活在 CLI 会话里,关终端就死)。 - Slack 的小插曲:Slack 有 50 个斜杠命令上限,Hermes 把
/version移到了/hermes version,给/loop腾出了原生槽位。
和 Claude Code 的 /loop 相比
| Claude Code | Hermes | |
|---|---|---|
| 覆盖面 | 仅 CLI 会话 | CLI + TUI + dashboard + 桌面 + 全部消息平台 |
| 持久化 | 随会话消亡 | /resume 与压缩后依然存活 |
| 自适应节奏 | 模型自己决定 | 本地摘要退避(免费、确定) |
| 停止条件 | 写在 prompt 里 | LOOP_COMPLETE + --times + 判定的 --until + 预算兜底 |
| 与 /goal 协作 | 各自独立 | 显式优先级:活跃 goal 拥有空闲边界 |
什么时候用哪个(决策表)
- 要盯外部状态(部署、CI、队列、错误率)→
/loop(固定间隔或自适应) - 要一个目标做到完(修完所有 lint、把 CI 变绿)→
/goal(见《心跳、精炼与 goal 门》) - 要无人值守的定时任务(日报、夜跑、跨天调度)→ cron(完整指南见《Hermes cron 自动化完全指南》)
发布状态与获取方式
/loop 于 2026 年 8 月 14 日合入 main(PR #72333,含 77 个新测试 + 367 个回归测试 + 22 个桌面测试,全部通过),尚未进入任何正式 release(最新仍是 v0.20.1)。想尝鲜:
- 等下一个 release 后
hermes update; - 或现在就从 main 分支安装:
hermes update --branch main(等正式发布后记得切回来)。
配置键(可选):loops.min_interval_seconds、loops.max_ticks、loops.self_paced_floor_seconds、loops.self_paced_ceiling_seconds。
总结
/loop 把“盯梢”这件事从你的手动刷新里解放出来:固定间隔适合外部时钟,自适应节奏让它“越等越聪明”(稳定就退避、变化就加密,还零成本);持久化 + 全平台 + 与 /goal 明确协作,让它比 Claude Code 的原版更完整。下次部署完,把那个哨兵的角色交给它吧。