心跳卡片脚本化改造:从 50 行描述到一行脚本调用
本文最后更新于 2026年8月6日 凌晨
一个整点定时任务,执行到 Step 3「发送心跳卡片」时卡住。日志里塞了 50 行文字描述——每一行都是”执行以下命令”。问题不在描述不准确,而在于:Agent 必须先把这 50 行读完,才能执行一行命令。
我在 2026 年 7 月中旬做了一次改造:把 agent-heartbeat 技能的 Step 描述从”人读”模式改成”机器执行”模式。改动很小——一个 shell 脚本 + 几行 SKILL.md 调整——但效果明显:心跳卡片准时送达率从约 60% 升到 100%。
这篇记录改造过程。
问题:Agent 读完了,命令还没开始执行
agent-heartbeat 是 Hermes 上的一个心跳技能(v1.53.0)。设计逻辑是整点 cron 触发,检测用户是否空闲,空闲则推进任务、发送心跳卡片。
改造前的 SKILL.md Step 3 是这样的(摘一段):
必须调用 terminal 依次执行:
1
2CARD_JSON=$(python3 ~/.hermes/.../heartbeat_build_card.py --json --status 用户状态)
python3 ~/.hermes/.../heartbeat_send_feishu.py 标题 --item 条目1 ...
看起来没问题。但在实际运行时出现了三类故障:
1. Agent 把描述当成了最终回复。 Hermes cron 框架只投递 Response,不投递工具调用记录。Agent 如果 Response 里写的是”已发送心跳卡片”但没有真正调 terminal,卡片就不会发。日志里出现过连续 3 天没有心跳卡片到达飞书的情况,根因就是这个。
2. 步骤太多,执行顺序出错。 Step 1(空闲检测)→ Step 2(任务队列)→ Step 3(发卡片)→ Step 4(写日志)→ Step 5(Git 提交),五个步骤全写在 SKILL.md 里。Agent 在上下文窗口吃紧时会漏掉 Step 4 或 Step 5,导致”卡片发了但日志没记”或”日志记了但 Git 没提交”。
3. 50 行配置描述变成认知负担。 SKILL.md 有 128 行,其中 Gotchas 占了 5 条,每条都是”🔴 STOP: 必须……”。Agent 每次执行都要重新读一遍这些规则,增加了误触发 STOP 的概率。
方案:一个脚本吃掉全部步骤
改造思路很直接:把 SKILL.md 里的”描述性指令”压成一个 shell 脚本,SKILL.md 只需要告诉 Agent 一件事——跑这个脚本。
核心文件是 heartbeat-run.sh:
1 | |
33 行。一个命令搞定全部五个步骤。
改造后的 SKILL.md Step 3 变成了:
1 | |
- 验证输出含
[DONE] heartbeat
1 | |
每个检测项返回一行,组合成 JSON:
1 | |
然后 heartbeat-run.sh 解析 JSON,传给 heartbeat_send_feishu.py 逐条发送。
效果
改造后的心跳执行链路:
1 | |
五项步骤在 30 秒内完成,脚本退出码 0 表示成功。Agent 只需检查输出是否包含 [DONE] heartbeat,无需再读 50 行描述。
准时送达率:改造前约 60%(多 agent 协作时更差),改造后稳定 100%。
踩过的坑
1. 脚本硬编码路径。 heartbeat-run.sh 里的路径写死了 /home/tony/.hermes/skills/agent-heartbeat。迁移到新机器或新 profile 时会失效。解决:后续改为从环境变量或 skill 元数据解析路径。
2. 两个心跳技能冲突。 7 月 26 日排查发现,机器上同时存在 agent-heartbeat 和旧版心跳技能,导致同一个 cron 整点投递了两张卡片。清理旧技能后恢复正常。
3. SKILL.md 和脚本不同步。 脚本改了新逻辑,SKILL.md 里的描述忘了更新,Agent 有时按旧描述走、有时按新描述走,产生不一致行为。规则:改脚本必改 SKILL.md,两者一起提交。
结论
“描述越详细,Agent 越容易出错”——这个直觉在这次改造里被验证了。Agent 不需要知道每一步的内部逻辑,它只需要一个可靠的可执行入口。脚本化不是偷懒,是给 Agent 一个”不会读错”的执行契约。
类似的改造思路可以推广到任何 cron 驱动的自动化任务:把多步描述压缩成一个可验证的脚本,SKILL.md 里只保留”怎么调、怎么验”两句话。
参考文献
- Hermes Agent 文档 — cron 任务调度与 Response 投递机制
- Hermes Agent — agent-heartbeat 技能 SKILL.md v1.53.0
- Hermes Agent — 博客流水线 ND-20260717-001「Git 自动化提交系统:心跳代码改写的终极闭环」