Clawdbot ToolsDocumentedScanned

cron-mastery

Master OpenClaw's timing systems.

Share:

Installation

npx clawhub@latest install cron-mastery

View the full skill documentation and source below.

Documentation

Cron Mastery

Rule #1: Heartbeats drift. Cron is precise.

This skill provides the definitive guide for managing time in OpenClaw. It solves the "I missed my reminder" problem by enforcing a strict separation between casual checks (heartbeat) and hard schedules (cron).

The Core Principle

SystemBehaviorBest ForRisk
:---:---:---:---
Heartbeat"I'll check in when I can" (e.g., every 30-60m)Email checks, casual news summaries, low-priority polling.Drift: A "remind me in 10m" task will fail if the heartbeat is 30m.
Cron"I will run at exactly X time"Reminders ("in 5 mins"), daily reports, system maintenance.Clutter: Creates one-off jobs that need cleanup.

1. Setting Reliable Reminders

Never use act:wait or internal loops for long delays (>1 min). Use cron:add with a one-shot at schedule.

Standard Reminder Pattern (JSON)

Use this payload structure for "remind me in X minutes" tasks:

{
  "name": "Remind: Drink Water",
  "schedule": {
    "kind": "at",
    "atMs": <CURRENT_MS + DELAY_MS>
  },
  "payload": {
    "kind": "agentTurn",
    "message": "⏰ Reminder: Drink water!",
    "deliver": true
  },

Note: Even with wakeMode: "next-heartbeat", the cron system forces an event injection at atMs. Use mode: "now" in the cron:wake tool if you need to force an immediate wake outside of a job payload.

⚠️ The Delivery Rule (CRITICAL)

When scheduling an agentTurn via Cron that is meant to provide an update to the user:
  • ALWAYS set "deliver": true in the payload.
  • Without "deliver": true, the sub-agent will run the task but the output will NEVER be seen by the human. It will be "talking in a dark room."

2. The Janitor (Auto-Cleanup)

One-shot cron jobs (kind: at) disable themselves after running but stay in the list as "ghosts" (enabled: false, lastStatus: ok). To prevent clutter, install the Daily Janitor.

Setup Instructions

  • Check current jobs: cron:list (includeDisabled: true)

  • Create the Janitor:

  • * Name: Daily Cron Cleanup
    * Schedule: Every 24 hours (everyMs: 86400000)
    * Payload: An agent turn that runs a specific prompt.

    The Janitor Prompt (Agent Turn)

    "Time for the 24-hour cron sweep. List all cron jobs including disabled ones. If you find any jobs that are enabled: false and have lastStatus: ok (finished one-shots), delete them to keep the list clean. Do not delete active recurring jobs. Log what you deleted."

    3. Reference: Timezone Lock

    For cron to work, the agent must know its time.

    • Action: Add the user's timezone to MEMORY.md.

    • Example: Timezone: Cairo (GMT+2)

    • Validation: If a user says "remind me at 9 PM," confirm: "9 PM Cairo time?" before scheduling.


    4. The Self-Wake Rule (Behavioral)

    Problem: If you say "I'll wait 30 seconds" and end your turn, you go to sleep. You cannot wake up without an event.
    Solution: If you need to "wait" across turns, you MUST schedule a Cron job.

    • Wait < 1 minute (interactive): Only allowed if you keep the tool loop open (using act:wait).
    • Wait > 1 minute (async): Use Cron with wakeMode: "now".
    Example Payload for "Checking back in 30s":
    {
      "schedule": { "kind": "at", "atMs": <NOW + 30000> },
      "payload": { "kind": "agentTurn", "message": "⏱️ 30s check-in. Report status." },
      "wakeMode": "now"
    }

    Troubleshooting

    • "My reminder didn't fire": Check cron:list. If the job exists but didn't fire, check the system clock vs atMs.
    • "I have 50 old jobs": Run the Janitor manually immediately.