Skip to main content
Jobs are scheduled tasks defined as markdown files with YAML frontmatter. Each job lives at ~/.operator/jobs/<name>/JOB.md.

Job Format

---
name: daily-summary
description: Summarize today's activity
schedule: "0 9 * * *"
agent: operator
model: "anthropic/claude-sonnet-4-6"
hooks:
  prerun: scripts/check.sh
  postrun: scripts/notify.sh
enabled: true
---

Summarize the key events from the last 24 hours.
Post a one-line teaser to #general, then reply in a thread with the full summary.
The markdown body after the frontmatter is the prompt sent to the agent.

Model Override

Set model in the frontmatter to override the agent’s configured model for this job. Uses LiteLLM format (provider/model-name). When omitted, the agent’s model chain from operator.yaml is used. This is useful for running cheaper models on simple recurring tasks:
---
name: link-check
schedule: "0 */6 * * *"
model: "anthropic/claude-haiku-4-5"
---

Check all links in the docs site and report any 404s.

Hooks

HookDescription
prerunGate script — non-zero exit skips LLM execution.
postrunReceives model output on stdin.
Hook scripts receive these environment variables:
VariableDescription
JOB_NAMEName of the job being executed
OPERATOR_AGENTAgent running the job
OPERATOR_HOMEPath to ~/.operator
OPERATOR_DBPath to the SQLite database

Posting Results

The agent uses send_message to post results to Slack channels. The prompt body should include posting instructions (which channels, whether to thread, etc.). If there’s nothing to post, simply don’t call send_message.

Job Counters

Each job tracks four counters in SQLite:
CounterIncremented when
run_countLLM actually executed (success or error)
error_countLLM ran but threw an exception
gate_countprerun hook returned non-zero (job skipped)
skip_countCron fired but the previous run was still in progress

Managing Jobs

Use the CLI to list, inspect, enable/disable, and manually trigger jobs.