名称: cron-mastery
描述: 精通 OpenClaw 的定时系统。用于安排可靠的提醒、设置定期维护(清理任务),并理解何时对时间敏感任务使用 Cron 而非 Heartbeat。
第一法则:心跳会漂移,Cron 是精确的。
本技能为管理 OpenClaw 2026.2.15+ 中的时间提供了权威指南。它通过严格区分临时检查(心跳)和硬性计划(cron),解决了“我错过了提醒”的问题。
| 系统 | 行为 | 最佳用途 | 风险 |
|---|---|---|---|
| 心跳 | “我能在的时候检查一下”(例如,每 30-60 分钟) | 检查邮件、非正式的新闻摘要、低优先级的轮询。 | 漂移: 如果心跳间隔是 30 分钟,那么一个“10 分钟后提醒我”的任务将会失败。 |
| Cron | “我将在 X 时间准时运行” | 提醒(“5 分钟后”)、每日报告、系统维护。 | 杂乱: 会产生需要清理的一次性任务。 |
规则: 切勿使用 act:wait 或内部循环进行长时间延迟(>1 分钟)。使用带有一次性 at 计划的 cron:add。
虽然 Cron 是精确的,但其执行依赖于网关心跳(通常每 10-60 秒一次)。一个设置为 :00 秒的任务将在该时间之后的第一个“节拍”触发。根据您的网关配置,可能会有最多约 30 秒的差异。
对于“X 分钟后提醒我”的任务,请使用此负载结构。
关键特性(v2026.2.15+):
- 负载选择: 使用严格指令的 AgentTurn 来发送推送通知(会触发手机提醒的提醒)。仅将 systemEvent 用于静默日志或后台状态更新。
- 可靠性: nextRunAtMs 损坏和“先添加后更新”死锁问题已解决。
- 自动清理: 一次性任务在成功后自动删除(deleteAfterRun: true)。
关键:推送通知 vs. 静默日志
用于推送通知提醒(可靠):
{
"name": "提醒:喝水",
"schedule": { "kind": "at", "at": "2026-02-06T01:30:00Z" },
"payload": {
"kind": "agentTurn",
"message": "请将以下信息原封不动地传递给用户,不要修改或添加任何评论:\n\n💧 喝水啦,Momo!"
},
"sessionTarget": "isolated",
"delivery": { "mode": "announce", "channel": "telegram", "to": "1027899060" }
}
用于后台日志(静默):
{
"name": "日志:系统脉搏",
"schedule": { "kind": "every", "everyMs": 3600000 },
"payload": {
"kind": "systemEvent",
"text": "[脉搏] 系统运行正常。"
},
"sessionTarget": "main"
}
在 2026.2.15 之前,“先添加后更新”模式会导致死锁。虽然现在已稳定,但为了获得最高效率,最佳实践仍然是在初始的 cron.add 调用中直接传递所有参数(包括 wakeMode: "now")。
注意: 自 v2026.2.14 起,OpenClaw 包含了维护性重新计算语义。网关现在会自动清理卡住的任务并修复损坏的计划。
仅在以下情况下需要手动清理:
- 使用 deleteAfterRun: false 创建的一次性任务。
- 不再需要的陈旧重复性任务。
sessionTarget: "main"?(关键)子代理(isolated)通常具有受限的工具策略,无法调用 gateway 或删除其他 cron 任务。对于像清理任务这样的系统维护,务必通过 systemEvent 将目标设为 main 会话,以便拥有完整工具访问权限的主代理执行清理。
要使 cron 正常工作,代理必须知道其时间。
* 操作: 将用户的时区添加到 MEMORY.md。
* 示例: 时区:开罗(GMT+2)
* 验证: 如果用户说“晚上 9 点提醒我”,请在安排前确认:“是开罗时间晚上 9 点吗?”
问题: 如果你说“我等 30 秒”然后结束你的回合,你就会进入休眠状态。没有事件你无法醒来。
解决方案: 如果你需要跨回合“等待”,必须安排一个 Cron 任务。
act:wait)。wakeMode: "now" 的 Cron。如果您有使用以下模式的旧 cron 任务,请更新它们:
| 遗留模式(2026.2.3 之前) | 现代模式(2026.2.15+) |
|---|---|
"schedule": {"kind": "at", "atMs": 1234567890} |
"schedule": {"kind": "at", "at": "2026-02-06T01:30:00Z"} |
负载中的 "deliver": true |
不需要 - announce 模式处理投递 |
"sessionTarget": "main" |
"sessionTarget": "isolated"(默认行为) |
| 需要手动清理幽灵任务 | 一次性任务自动删除(deleteAfterRun: true) |
cron.update 在 cron.add 之后 |
单步 cron.add 包含所有属性 |
cron:list。确认 at 时间戳是未来的(ISO 8601 格式)。确保设置了 wakeMode: "now"。cron 工具耗时过长(任务列表巨大或文件锁),会发生此错误。~/.openclaw/state/cron/jobs.json 并重启网关。agentTurn + announce 模式,以进行主动推送。"请将以下信息原封不动地传递给用户,不要修改或添加任何评论:\n\n💧 您的消息写在这里"