Scheduled Tasks (Cron) in Hermes Agent: Complete Reference
Schedule tasks in Hermes Agent with natural language or cron expressions, with multi-platform delivery.
{
"title": "Hermes Cron: Task Scheduling Reference",
"body": "# Hermes Cron: Task Scheduling Reference\n\nThis document describes how to schedule tasks using Hermes Cron, a cronjob tool that accepts natural language or cron expressions. You can create, pause, resume, edit, trigger, and remove jobs. Each job can run in a fresh agent session with a static tool list, or in no-agent mode where a script runs on schedule and its stdout is delivered verbatim with no LLM involvement.\n\n## When to Use Cron\n\nUse Hermes Cron when you need to:\n\n- Schedule one-shot or recurring tasks\n- Pause, resume, edit, trigger, or remove scheduled jobs\n- Attach zero, one, or multiple skills to a job\n- Deliver results to origin chat, local files, or configured platform targets\n- Run in fresh agent sessions with normal static tool list\n- Run in no-agent mode (script on schedule, stdout delivered verbatim, no LLM involvement)\n- Chain jobs so the output of one job becomes context for another\n- Use a pre-run script as a gate to decide whether the agent should run\n- Pin a specific model or provider per job\n- Control which toolsets are available for a job\n- Suppress delivery silently when the agent responds with a specific marker\n\n## Prerequisites\n\nBefore using Cron, ensure these conditions are met:\n\n- The Hermes gateway daemon must be running. Install it with hermes gateway install or run it in the foreground.\n- For unattended runs, run hermes setup --portal to enable automatic OAuth refresh.\n- For delivery to platforms, configure home channels for each target (for example, TELEGRAM_HOME_CHANNEL, DISCORD_HOME_CHANNEL).\n- For Telegram cron topics, create a topic in the bot DM and set the TELEGRAM_CRON_THREAD_ID environment variable.\n- For continuable jobs, set cron.mirror_delivery: true in config.yaml or use the attach_to_session parameter per job.\n- For Slack flat continuation, set slack.cron_continuable_surface: in_channel, slack.reply_in_thread: false, and slack.require_mention: false.\n- For no-agent mode, the script must exist in $HERMES_HOME/scripts/.\n- For workdir jobs, the absolute directory must exist.\n- For context_from chaining, upstream jobs must have completed at least one run.\n- For wakeAgent gates, the script must emit valid JSON on its last stdout line.\n- For provider recovery, configure fallback_providers or a credential pool in config.yaml.\n\n## Job Storage and Output\n\nJobs are stored in ~/.hermes/cron/jobs.json with atomic file writes. Output is saved to ~/.hermes/cron/output/{job_id}/{timestamp}.md. A file lock at ~/.hermes/cron/.tick.lock prevents overlapping scheduler ticks from double-running the same job batch.\n\n## Schedule Formats\n\nThe schedule parameter accepts these formats:\n\n- Relative delay: 30m, 2h, 1d\n- Interval: every 30m, every 2h, every 1d\n- Cron expression: 0 9 * * *\n- ISO timestamp: 2026-03-15T09:00:00\n\n## Creating Scheduled Tasks\n\nYou can create tasks in chat, from the CLI, or through natural conversation.\n\n### Creating in Chat with /cron\n\nUse the /cron command:\n\n\n/cron add <schedule> \"<prompt>\" [--skill <skill>]...\n\n\nOptionally attach one or more skills with --skill flags.\n\nExamples:\n\n- One-shot reminder: /cron add 30m \"Remind me to check the build\"\n- Recurring task: /cron add \"every 2h\" \"Check server status\"\n- Skill-backed job: /cron add \"every 1h\" \"Summarize new feed items\" --skill blogwatcher\n- Multi-skill job: /cron add \"every 1h\" \"Use both skills\" --skill blogwatcher --skill maps\n\n### Creating from Standalone CLI\n\nRun:\n\n\nhermes cron create \"<schedule>\" \"<prompt>\" [--skill <skill>]... [--name <name>]\n\n\nExamples:\n\n- Basic job: hermes cron create \"every 2h\" \"Check server status\"\n- Skill-backed job: hermes cron create \"every 1h\" \"Summarize new feed items\" --skill blogwatcher\n- Named multi-skill job: hermes cron create \"every 1h\" \"Use both skills\" --skill blogwatcher --skill maps --name \"Skill combo\"\n\n### Creating through Natural Conversation\n\nAsk Hermes normally. For example:\n\n"Every morning at 9am, check Hacker News for AI news and send me a summary on Telegram."\n\nHermes uses the cronjob tool internally to create the job.\n\n### Creating with the cronjob Tool\n\nSingle skill:\n\n\ncronjob(action=\"create\", skill=\"blogwatcher\", prompt=\"...\", schedule=\"0 9 * * *\", name=\"Morning feeds\")\n\n\nMultiple skills:\n\n\ncronjob(action=\"create\", skills=[\"blogwatcher\", \"maps\"], prompt=\"...\", schedule=\"every 6h\", name=\"Local brief\")\n\n\n### Creating a Job with a Workdir\n\nFrom CLI:\n\n\nhermes cron create \"every 1d at 09:00\" \"Audit open PRs\" --workdir /home/me/projects/acme\n\n\nFrom tool:\n\n\ncronjob(action=\"create\", schedule=\"every 1d at 09:00\", workdir=\"/home/me/projects/acme\", prompt=\"...\")\n\n\nThe workdir parameter accepts an absolute path to a project directory. When set, the job loads AGENTS.md, CLAUDE.md, and .cursorrules from that directory. Terminal and file tools use this as their working directory. To clear a workdir, pass --workdir \"\" or workdir=\"\" on edit.\n\n### Creating a No-Agent (Script-Only) Job\n\nRun:\n\n\nhermes cron create \"<schedule>\" --no-agent --script <script_name> --deliver <target> --name <name>\n\n\nThe script must resolve inside $HERMES_HOME/scripts/. Script stdout (trimmed) is delivered verbatim. Empty stdout results in a silent tick. Non-zero exit or timeout delivers an error alert.\n\nExample:\n\n\nhermes cron create \"every 5m\" --no-agent --script memory-watchdog.sh --deliver telegram --name \"memory-watchdog\"\n\n\n## Editing Jobs\n\nYou can edit schedule, prompt, and skills without deleting and recreating the job.\n\n### Editing in Chat\n\nUse:\n\n\n/cron edit <job_id> [--schedule <schedule>] [--prompt <prompt>] [--skill <skill>]... [--remove-skill <skill>] [--clear-skills]\n\n\nFlag semantics:\n\n- Repeated --skill replaces the attached skill list.\n- --add-skill appends to the existing list.\n- --remove-skill removes specific attached skills.\n- --clear-skills removes all attached skills.\n\nExamples:\n\n- Edit schedule: /cron edit <job_id> --schedule \"every 4h\"\n- Edit prompt: /cron edit <job_id> --prompt \"Use the revised task\"\n- Replace skills: /cron edit <job_id> --skill blogwatcher --skill maps\n- Remove a skill: /cron edit <job_id> --remove-skill blogwatcher\n- Clear all skills: /cron edit <job_id> --clear-skills\n\n### Editing from Standalone CLI\n\nRun:\n\n\nhermes cron edit <job_id_or_name> [--schedule <schedule>] [--prompt <prompt>] [--skill <skill>]... [--add-skill <skill>] [--remove-skill <skill>] [--clear-skills]\n\n\nThe same flag semantics apply as in chat.\n\n## Lifecycle Actions\n\n### In Chat\n\n\n/cron list\n/cron pause <job_id>\n/cron resume <job_id>\n/cron run <job_id>\n/cron remove <job_id>\n\n\n### From Standalone CLI\n\n\nhermes cron list\nhermes cron pause <job_id_or_name>\nhermes cron resume <job_id_or_name>\nhermes cron run <job_id_or_name>\nhermes cron remove <job_id_or_name>\nhermes cron edit <job_id_or_name> [flags]\nhermes cron status\nhermes cron tick\n\n\n## Delivery Options\n\nThe deliver parameter accepts these targets:\n\n- origin - deliver to the chat where the job was created\n- local - save to local files only\n- telegram, discord, slack, whatsapp, signal, matrix, mattermost, email, sms, homeassistant, dingtalk, feishu, wecom, weixin, bluebubbles, qqbot\n- all - deliver to every platform with a configured home channel at fire time\n- Comma-separated list, for example telegram,discord\n- origin+all - deliver to origin plus all configured platforms\n\nWhen all is used, it expands to every platform with a configured home channel at fire time. If zero home channels exist, delivery fails upstream. all composes with explicit targets and de-duplicates by platform, chat_id, and thread_id.\n\n## Per-Job Model and Provider Pinning\n\nYou can set a per-job model pin via the dashboard, CLI, or by editing jobs.json. The cronjob tool cannot set inference pins. Similarly, per-job provider pins are set through the same channels.\n\nWhen neither a per-job pin nor cron.model is set, the job snapshots the provider and model at creation time. If the global default later changes, the job fails closed: it skips the run, makes no inference call, and alerts the user to pin explicitly.\n\n### Disabling Model/Provider Drift Guard\n\nTo let unpinned jobs track global defaults, disable the drift guard:\n\nSet cron.model_drift_guard: false in config.yaml, or run:\n\n\nhermes config set cron.model_drift_guard false\n\n\nDisabling the drift guard allows unattended unpinned jobs to immediately inherit changed global defaults, which may result in spending money on paid providers or models.\n\n### Cron-Fleet Default Model\n\nSet the cron-fleet default model independently of the chat model using cron.model and cron.model_provider in config.yaml.\n\n## Skills\n\nAttach zero, one, or multiple skills to a job. Skills are loaded before running the prompt. Use the skill parameter for a single skill or skills for multiple.\n\n## Response Wrapping\n\nResponse wrapping (header and footer) is configurable via cron.wrap_response. Set it to false to deliver raw agent output without header or footer. The default is true.\n\n## Continuable Jobs\n\nContinuable jobs allow you to reply to a cron delivery and continue the conversation.\n\n### Enabling Globally\n\nSet cron.mirror_delivery: true in config.yaml. This makes all cron deliveries continuable.\n\n### Per-Job Override\n\nUse the attach_to_session parameter in the cronjob tool to override the global setting for a specific job.\n\n### Slack Flat In-Channel Continuation\n\nFor Slack, set:\n\n\nslack.cron_continuable_surface: in_channel\nslack.reply_in_thread: false\nslack.require_mention: false\n\n\nOr add the channel to free_response_channels. When using in-channel continuation, the whole channel shares a session. Other chatter and a second continuable in-channel job join the same rolling conversation.\n\n### 1:1 DM Continuation\n\nFor continuable cron in 1:1 DMs, set slack.dm_top_level_threads_as_sessions: false. The cron_continuable_surface setting has no effect in 1:1 DMs because there is no thread-versus-timeline split.\n\n### Continuability Constraints\n\nOnly origin chat is ever made continuable. Fan-out or broadcast targets are never continuable.\n\n## Telegram Cron Topic\n\nTo route cron deliveries to a specific Telegram topic:\n\n1. In Telegram, open the bot DM and create a topic named, for example, "Cron".\n2. Long-press the topic header, then copy the link. The trailing integer is the message_thread_id.\n3. Set TELEGRAM_CRON_THREAD_ID=<that id> in your .env file.\n\nThe TELEGRAM_CRON_THREAD_ID applies only to cron deliveries. An explicit deliver=\"telegram:chat_id:thread_id\" overrides the environment variable.\n\nRoot DM is reserved as the system lobby. Replies to cron messages in the root DM are rebuffed with a lobby reminder, and the reply_to_message_id is dropped.\n\n## Silent Suppression\n\nIf the agent response contains [SILENT], delivery is suppressed. The output is still saved locally. Failed jobs always deliver regardless of the marker.\n\nExample: Prompt the agent to respond with only [SILENT] when healthy. Failed jobs always deliver.\n\n## Script Timeout\n\nThe script timeout is configurable. The default is 3600 seconds. Resolution order: environment variable HERMES_CRON_SCRIPT_TIMEOUT, then cron.script_timeout_seconds in config.yaml, then the default.\n\n## No-Agent Mode\n\nIn no-agent mode, a script runs on schedule. Stdout (trimmed) is delivered verbatim. Empty stdout results in a silent tick. Non-zero exit or timeout delivers an error alert. No tokens are consumed, no model is used, and no provider fallback occurs.\n\nScripts must resolve inside $HERMES_HOME/scripts/. Relative names, absolute paths, and ~-prefixed paths are accepted only if the resolved target stays within that directory. Paths that escape are rejected.\n\nThe subprocess environment is sanitized: provider API credentials and other Hermes-managed secrets are not inherited by cron scripts.\n\n## Chaining Jobs with context_from\n\nChain jobs by passing the output of one job as context to another.\n\n1. Create Job 1 with a prompt that produces output.\n2. Create Job 2 with context_from=\"<job1_id>\" (or context_from=[\"job_a\", \"job_b\"] for multiple upstream jobs).\n\nWhen Job 2 fires, Hermes reads Job 1's most recent output from ~/.hermes/cron/output/{job1_id}/*.md and prepends it to Job 2's prompt.\n\ncontext_from reads the most recent completed output. It does not wait for upstream jobs that are running in the same tick.\n\nExample: Job 1 collects data, Job 2 triages with context_from=job1_id, and Job 3 ships with context_from=job2_id.\n\n## wakeAgent Gate\n\nUse a script as a pre-run gate to decide whether the agent should run. The script emits a JSON object on its final stdout line.\n\n- {\"wakeAgent\": false} - skip the agent run\n- {\"wakeAgent\": true, \"context\": {...}} - wake the agent with context\n- If wakeAgent is omitted, the default is true\n\nAttach the script to the cron job via the script parameter.\n\nExamples:\n\n- File-change gate: compares file mtime to last_run_at; emits {\"wakeAgent\": false} if unchanged.\n- External-flag gate: checks for /tmp/new-data-ready file; emits {\"wakeAgent\": true} if present.\n- SQL-count gate: queries the database for new rows; emits {\"wakeAgent\": true, \"context\": {\"new_rows\": n}} if count is greater than 0.\n\n## enabled_toolsets\n\nUse the enabled_toolsets parameter to control which toolsets are available for a job. This overrides the cron platform tool config. For example, [\"web\", \"file\"].\n\n## Provider Recovery\n\nConfigure fallback providers or a credential pool in config.yaml to enable provider recovery when the primary provider fails.\n\n## Execution History\n\nInspect execution history with:\n\n\nhermes cron runs [job-id] --limit 20\n\n\nThe alias history also works.\n\nExecution attempts move through these states: claimed, running, then a terminal state (completed, failed, unknown). The unknown state occurs only when the original PID and process-start fingerprint prove the owner is gone. Unknown attempts are never automatically rerun.\n\n## Name-Based Lookup\n\nJobs can be referenced by name (case-insensitive) or by hex ID. Exact ID match takes precedence. If multiple jobs share the same name, the command refuses and prints candidate IDs. Names are not unique; this guard prevents silently mutating the wrong job when two share a name.\n\n## Prompt Requirements\n\nThe prompt must be self-contained because cron runs in a completely fresh agent session. Prompt scanning for injection and exfiltration occurs at creation and update time. Invisible Unicode tricks, SSH backdoor attempts, and secret-exfiltration payloads are blocked.\n\n## Constraints and Caveats\n\n- Cron-run sessions cannot recursively create more cron jobs. Cron management tools are disabled inside cron executions to prevent runaway scheduling loops.\n- Per-job model pin cannot be set by the cronjob tool; inference pins are user-owned.\n- When neither per-job pin nor cron.model is set, the job snapshots provider and model at creation. If the global default later changes, the job fails closed: it skips the run, makes no inference call, and alerts the user to pin explicitly.\n- Disabling drift guard allows unattended unpinned jobs to immediately inherit changed global defaults, potentially spending money on paid providers or models.\n- Jobs with a workdir run sequentially on scheduler tick, not in a parallel pool, to prevent cwd corruption.\n- The workdir path must be an absolute directory that exists. Relative paths and missing directories are rejected at create and update time.\n- Name-based lookup: exact ID match takes precedence. Ambiguous name matches (multiple jobs with the same name) are refused with candidate IDs.\n- Names are not unique; the guard prevents silently mutating the wrong job when two share a name.\n- The file lock at ~/.hermes/cron/.tick.lock prevents overlapping scheduler ticks from double-running the same job batch.\n- Execution history: attempts move through claimed, running, then terminal states (completed, failed, unknown). unknown only when the original PID and process-start fingerprint prove the owner is gone. Unknown attempts are never automatically rerun.\n- Delivery: the agent's final response is automatically delivered to the configured deliver target. The agent does not send messages itself.\n- all delivery expands to every platform with a configured home channel at fire time. Zero home channels result in delivery failure upstream.\n- all composes with explicit targets, de-duplicating by platform, chat_id, and thread_id.\n- Telegram topic mode: root DM is reserved as the system lobby. Replies there are rebuffed with a lobby reminder and reply_to_message_id is dropped.\n- TELEGRAM_CRON_THREAD_ID applies only to cron deliveries. Explicit deliver=\"telegram:chat_id:thread_id\" wins over the environment variable.\n- Continuable jobs: only origin chat is ever made continuable. Fan-out or broadcast targets are never continuable.\n- Flat in-channel continuation (Slack): the whole channel session is shared. Other chatter and a second continuable in-channel job join the same rolling conversation.\n- cron_continuable_surface is a channel setting. In 1:1 DMs, there is no thread-versus-timeline split, so the key has no effect there.\n- For continuable cron in 1:1 DM, set slack.dm_top_level_threads_as_sessions: false.\n- Silent suppression: [SILENT] in the agent response suppresses delivery. Output is still saved locally. Failed jobs always deliver regardless of the marker.\n- Script timeout default is 3600 seconds. Resolution order: environment variable, then config.yaml, then default.\n- No-agent mode: script stdout (trimmed) is delivered verbatim. Empty stdout results in a silent tick. Non-zero exit or timeout delivers an error alert. No tokens, no model, no provider fallback.\n- Scripts must resolve inside $HERMES_HOME/scripts/. Relative names, absolute paths, and ~-prefixed paths are accepted only if the resolved target stays in that directory. Paths that escape are rejected.\n- The subprocess environment is sanitized: provider API credentials and other Hermes-managed secrets are not inherited by cron scripts.\n- context_from reads the most recent completed output. It does not wait for upstream jobs running in the same tick.\n- The prompt must be self-contained. Cron runs in a completely fresh agent session.\n- Prompt scanning for injection and exfiltration occurs at creation and update time. Invisible Unicode tricks, SSH backdoor attempts, and secret-exfiltration payloads are blocked.\n- Do not query ~/.hermes/state.db from pre-run gates. Point at your own database or feed.\n- Direct edits to jobs.json can fail silently when file write safety blocks the path. Use the cronjob tool, hermes cron edit, or /cron instead.\n\n## Failure Modes\n\n- Job fails closed when the global default changes and no per-job pin or cron.model is set. The run is skipped, no inference call is made, and the user is alerted.\n- Ambiguous name match (multiple jobs with the same name) causes the command to refuse and print candidate IDs.\n- Workdir jobs run sequentially. Two workdir jobs at the same time corrupt each other's cwd.\n- Overlapping scheduler ticks are prevented by a file lock. Double-running the same job batch is avoided.\n- Abandoned attempts are marked unknown. They are never automatically rerun.\n- Delivery failure occurs if all delivery targets resolve to zero home channels.\n- Telegram replies to cron messages in the root DM are rebuffed with a lobby reminder.\n- Continuable cron in 1:1 DM fails if slack.dm_top_level_threads_as_sessions is true (the default).\n- Non-zero exit or timeout in no-agent mode delivers an error alert.\n- Scripts escaping $HERMES_HOME/scripts/ are rejected.\n- Prompt injection or exfiltration patterns are blocked at creation and update time.\n- Direct jobs.json edits can fail silently due to file write safety blocks.\n\n## Parameters Reference\n\n| Parameter | Meaning | Required |\n|-----------|---------|----------|\n| schedule | Schedule for the job: relative delay (30m, 2h, 1d), interval (every 30m, every 2h, every 1d), cron expression (0 9 * * *), or ISO timestamp (2026-03-15T09:00:00) | Yes |\n| prompt | Task instruction for the agent. Must be self-contained as cron runs in a fresh session | Yes |\n| skill / skills | One or more skills to load before running the prompt. Single skill via skill=, multiple via skills=[] | No |\n| name | Human-readable name for the job. Used for name-based lookup (case-insensitive) | No |\n| workdir | Absolute path to project directory. Loads AGENTS.md, CLAUDE.md, .cursorrules. Terminal and file tools use this as working directory | No |\n| deliver | Delivery target: origin, local, telegram, discord, slack, whatsapp, signal, matrix, mattermost, email, sms, homeassistant, dingtalk, feishu, wecom, weixin, bluebubbles, qqbot, all, comma-separated list, or origin+all | No |\n| repeat | Override default repeat behavior: number of times to run (for intervals or cron expressions) or 1 for one-shot | No |\n| no_agent | Boolean. If true, runs script-only mode (no LLM involvement) | No |\n| script | Script filename. Must resolve inside $HERMES_HOME/scripts/. Used for no-agent mode or pre-run gate | No |\n| context_from | Single job ID or name, or list of job IDs or names whose most recent output is prepended as context | No |\n| enabled_toolsets | List of toolsets to enable for this job (for example, [\"web\", \"file\"]). Overrides cron platform tool config | No |\n| attach_to_session | Boolean. Per-job override for mirror_delivery. Makes cron delivery continuable | No |\n| model | Per-job model pin. Set via dashboard, CLI, or editing jobs.json. Cannot be set by cronjob tool | No |\n| provider | Per-job provider pin. Set via dashboard, CLI, or editing jobs.json. Cannot be set by cronjob tool | No |\n| job_id | Hex ID or name (case-insensitive) of the job. Used in edit, pause, resume, run, remove actions | Yes for mutating actions |\n| action | Action for cronjob tool: create, list, update, pause, resume, run, remove | Yes |\n| cron.model_drift_guard | Boolean. If false, unpinned jobs track global model or provider changes. Default: true | No |\n| cron.wrap_response | Boolean. If false, deliver raw agent output without header or footer. Default: true | No |\n| cron.mirror_delivery | Boolean. If true, make cron deliveries continuable. Default: false | No |\n| cron.script_timeout_seconds | Timeout for pre-run scripts in seconds. Default: 3600. Environment variable HERMES_CRON_SCRIPT_TIMEOUT overrides | No |\n| slack.cron_continuable_surface | String. 'thread' (default) or 'in_channel' for Slack continuable jobs | No |\n| slack.reply_in_thread | Boolean. Required to be false when cron_continuable_surface is in_channel | No |\n| slack.require_mention | Boolean. Set false for plain reply continuation in in_channel mode | No |\n| slack.dm_top_level_threads_as_sessions | Boolean. Set false for continuable cron in 1:1 DMs. Default: true | No |\n| TELEGRAM_CRON_THREAD_ID | Environment variable. message_thread_id for Telegram cron topic | No |\n\n## Examples\n\n### Creating a One-Shot Reminder in Chat\n\n\n/cron add 30m \"Remind me to check the build\"\n\n\n### Creating a Recurring Task in Chat\n\n\n/cron add \"every 2h\" \"Check server status\"\n\n\n### Creating a Skill-Backed Job in Chat\n\n\n/cron add \"every 1h\" \"Summarize new feed items\" --skill blogwatcher\n\n\n### Creating a Multi-Skill Job in Chat\n\n\n/cron add \"every 1h\" \"Use both skills\" --skill blogwatcher --skill maps\n\n\n### Creating a Job from CLI\n\n\nhermes cron create \"every 2h\" \"Check server status\"\n\n\n### Creating a Skill-Backed Job from CLI\n\n\nhermes cron create \"every 1h\" \"Summarize new feed items\" --skill blogwatcher\n\n\n### Creating a Named Multi-Skill Job from CLI\n\n\nhermes cron create \"every 1h\" \"Use both skills\" --skill blogwatcher --skill maps --name \"Skill combo\"\n\n\n### Natural Language Creation\n\n"Every morning at 9am, check Hacker News for AI news and send me a summary on Telegram."\n\n### Single Skill via cronjob Tool\n\n\ncronjob(action=\"create\", skill=\"blogwatcher\", prompt=\"...\", schedule=\"0 9 * * *\", name=\"Morning feeds\")\n\n\n### Multiple Skills via cronjob Tool\n\n\ncronjob(action=\"create\", skills=[\"blogwatcher\", \"maps\"], prompt=\"...\", schedule=\"every 6h\", name=\"Local brief\")\n\n\n### Job with Workdir from CLI\n\n\nhermes cron create \"every 1d at 09:00\" \"Audit open PRs\" --workdir /home/me/projects/acme\n\n\n### Job with Workdir from Tool\n\n\ncronjob(action=\"create\", schedule=\"every 1d at 09:00\", workdir=\"/home/me/projects/acme\", prompt=\"...\")\n\n\n### Editing Schedule in Chat\n\n\n/cron edit <job_id> --schedule \"every 4h\"\n\n\n### Editing Prompt in Chat\n\n\n/cron edit <job_id> --prompt \"Use the revised task\"\n\n\n### Replacing Skills in Chat\n\n\n/cron edit <job_id> --skill blogwatcher --skill maps\n\n\n### Removing a Skill in Chat\n\n\n/cron edit <job_id> --remove-skill blogwatcher\n\n\n### Clearing All Skills in Chat\n\n\n/cron edit <job_id> --clear-skills\n\n\n### Pausing a Job in Chat\n\n\n/cron pause <job_id>\n\n\n### Resuming a Job in Chat\n\n\n/cron resume <job_id>\n\n\n### Triggering a Job in Chat\n\n\n/cron run <job_id>\n\n\n### Removing a Job in Chat\n\n\n/cron remove <job_id>\n\n\n### Lifecycle from CLI\n\n\nhermes cron list\nhermes cron pause <id>\nhermes cron resume <id>\nhermes cron run <id>\nhermes cron remove <id>\nhermes cron status\nhermes cron tick\n\n\n### No-Agent Job from CLI\n\n\nhermes cron create \"every 5m\" --no-agent --script memory-watchdog.sh --deliver telegram --name \"memory-watchdog\"\n\n\n### Chaining Jobs\n\nJob 1 collects data. Job 2 triages with context_from=job1_id. Job 3 ships with context_from=job2_id.\n\n### File-Change Gate Script\n\nCompares file mtime to last_run_at. Emits {\"wakeAgent\": false} if unchanged.\n\n### External-Flag Gate Script\n\nChecks for /tmp/new-data-ready file. Emits {\"wakeAgent\": true} if present.\n\n### SQL-Count Gate Script\n\nQueries the database for new rows. Emits {\"wakeAgent\": true, \"context\": {\"new_rows\": n}} if count is greater than 0.\n\n### Silent Suppression\n\nPrompt the agent to respond with only [SILENT] when healthy. Failed jobs always deliver.\n\n### Delivery to Multiple Targets\n\n\ndeliver: \"telegram,discord\"\n\n\n\ndeliver: \"origin,all\"\n"
}
Sources & References
This page was researched from 1 independent source, combined and verified for completeness.
- 1.Scheduled Tasks (Cron)Official documentation · primary source
The #1 AI Newsletter
The most important ai updates, guides, and fixes — one weekly email.
No spam, unsubscribe anytime. Privacy policy