once@<ISO-8601> for a future-dated task — that materializes a board task and dispatches it through the same pipeline as any other task. Routines are how your team gets recurring or future-dated work done without anyone sitting at the dashboard to kick it off.
Every Routine fire is a real task dispatch: it lands on the board, gets atomically claimed, and runs with budgets, verification, approvals, and observability all applying exactly as they would for a hand-created task. There is no special “scheduled” execution path.
What Routines are (and aren’t)
Routines are Clawboo’s cron for team tasks. They are the single scheduling surface for every runtime class — native agents, Claude Code, Codex, Hermes, and OpenClaw all schedule recurring work through Routines, regardless of whether the underlying runtime has its own scheduler. Routines are not the same as a runtime’s own life-cycle scheduler. If an OpenClaw agent has a Gateway cron that wakes itself to check email, that is the agent’s private business — it appears in the Scheduler panel as a separateruntime-own-life entry and Clawboo never fires team tasks into it. The two are surfaced side by side and clearly labeled so you always know who owns what.
The Scheduler panel merges both domains into one unified view — Clawboo-owned Routines (
team-task) and runtime-owned schedules (runtime-own-life) — but the domains are never mixed. You can operate them from one place while keeping the ownership clear.Creating a Routine
Open the Scheduler panel from the dashboard sidebar. Click New Routine and fill in:| Field | Description |
|---|---|
| Schedule | A cron expression (e.g. 0 9 * * 1-5 for weekdays at 9am) or a one-shot once@2025-01-15T09:00:00Z. |
| Team | The team that owns the task. |
| Agent | The agent to assign the task to. |
| Title | The board task title materialized on each fire. |
| Description | Optional task description. |
| Worktree kind | Whether the task needs file isolation (code) or is a read-only/research task. Defaults to code. |
| Priority | Task priority on the board. |
| Cost cap | Optional per-run USD ceiling for this task. |
How Routines survive restarts
Clawboo stores every Routine’s state — next fire time, last fire time, status, last error — durably in a database table. The scheduler is a stateless actuator that reads from the database: kill the process, restart it, and every active Routine reconstructs automatically from the stored rows. You do not need to re-create or re-arm Routines after a restart. On restart, Clawboo heals any Routines that were mid-fire when the process died:- A fire that hadn’t started yet (claimed but not dispatched) is re-queued and fires immediately.
- A recurring fire that was running is re-armed at its next occurrence — the board’s own orphan reconciliation handles the half-dispatched task.
- A one-shot fire that was running moves to
errorfor human review rather than re-firing, since re-firing a one-shot risks dispatching it twice.
Pausing and deleting Routines
From the Scheduler panel, select any Routine to:- Pause — the Routine stops firing until you resume it. Already-running tasks complete normally.
- Resume — re-arm the Routine from now; it fires on its next scheduled occurrence.
- Delete — remove the Routine entirely. In-flight tasks continue to completion.
The error-halts policy
When a recurring Routine’s task fails, the Routine stops firing and waits for you. It moves to anerror state, records the failure details, and sets no next fire time. It will not retry automatically.
This is intentional. A Routine that fails on every fire and keeps retrying would spend budget, churn the board, and bury the real problem. Parking the Routine surfaces the failure clearly and stops the spending. The Scheduler panel shows the error and a Resume button — fix the underlying issue, then resume to re-arm.
A successful fire re-arms cleanly at the next cron occurrence. A one-shot fire that succeeds simply expires.
Routine status reference
| Status | Meaning | Auto-fires? |
|---|---|---|
idle | Active and waiting for its next fire time. | ✅ Yes |
queued | Due to fire; being picked up by the scheduler. | — |
claimed | Claimed by the scheduler; dispatch in progress. | — |
running | A task is currently executing. | — |
paused | Manually paused by you. | ❌ No |
error | Last fire failed; disarmed until you resume. | ❌ No |
Observability for Routines
Every Routine fire emits a sequence of events to the observability event log:routine_fired— when the scheduler claims the fireroutine_dispatched— when the task is materialized and handed to the executorroutine_completed— when the task finishes successfullyroutine_error— when the task fails and the Routine is disarmed
routine_* events on the relevant team or task.
Advanced: cron expression formats
Advanced: cron expression formats
Clawboo accepts standard 5-field cron expressions (
All times are interpreted in UTC unless your cron expression specifies otherwise.
minute hour day month weekday) and 6-field expressions with seconds (second minute hour day month weekday). Examples:| Expression | Meaning |
|---|---|
0 9 * * 1-5 | Weekdays at 9:00am |
0 0 * * 0 | Sundays at midnight |
*/15 * * * * | Every 15 minutes |
0 0 1 * * | First day of every month at midnight |
once@2025-06-01T10:00:00Z | Once at 10am UTC on June 1, 2025 |
The Board
The durable task substrate a Routine fire materializes into.
Governance
Budgets and caps that apply to every scheduled run.
Observability
The
routine_* event sequence every fire emits.Recurring Team Work Guide
A step-by-step how-to for common scheduling patterns.