| --- |
| sidebar_position: 11 |
| title: "Cron Internals" |
| description: "How Hermes stores, schedules, edits, pauses, skill-loads, and delivers cron jobs" |
| --- |
| |
| # Cron Internals |
|
|
| Hermes cron support is implemented primarily in: |
|
|
| - `cron/jobs.py` |
| - `cron/scheduler.py` |
| - `tools/cronjob_tools.py` |
| - `gateway/run.py` |
| - `hermes_cli/cron.py` |
|
|
| ## Scheduling model |
|
|
| Hermes supports: |
|
|
| - one-shot delays |
| - intervals |
| - cron expressions |
| - explicit timestamps |
|
|
| The model-facing surface is a single `cronjob` tool with action-style operations: |
|
|
| - `create` |
| - `list` |
| - `update` |
| - `pause` |
| - `resume` |
| - `run` |
| - `remove` |
|
|
| ## Job storage |
|
|
| Cron jobs are stored in Hermes-managed local state (`~/.hermes/cron/jobs.json`) with atomic write semantics. |
|
|
| Each job can carry: |
|
|
| - prompt |
| - schedule metadata |
| - repeat counters |
| - delivery target |
| - lifecycle state (`scheduled`, `paused`, `completed`, etc.) |
| - zero, one, or multiple attached skills |
|
|
| Backward compatibility is preserved for older jobs that only stored a legacy single `skill` field or none of the newer lifecycle fields. |
|
|
| ## Runtime behavior |
|
|
| The scheduler: |
|
|
| - loads jobs |
| - computes due work |
| - executes jobs in fresh agent sessions |
| - optionally injects one or more skills before the prompt |
| - handles repeat counters |
| - updates next-run metadata and state |
|
|
| In gateway mode, cron ticking is integrated into the long-running gateway loop. |
|
|
| ## Skill-backed jobs |
|
|
| A cron job may attach multiple skills. At runtime, Hermes loads those skills in order and then appends the job prompt as the task instruction. |
|
|
| This gives scheduled jobs reusable guidance without requiring the user to paste full skill bodies into the cron prompt. |
|
|
| ## Recursion guard |
|
|
| Cron-run sessions disable the `cronjob` toolset. This prevents a scheduled job from recursively creating or mutating more cron jobs and accidentally exploding token usage or scheduler load. |
|
|
| ## Delivery model |
|
|
| Cron jobs can deliver to: |
|
|
| - origin chat |
| - local files |
| - platform home channels |
| - explicit platform/chat IDs |
|
|
| ## Locking |
|
|
| Hermes uses lock-based protections so overlapping scheduler ticks do not execute the same due-job batch twice. |
|
|
| ## Related docs |
|
|
| - [Cron feature guide](../user-guide/features/cron.md) |
| - [Gateway Internals](./gateway-internals.md) |
|
|