.jobs/<slug>.yaml schema
Routines are YAML files in .jobs/. The filename becomes the routine slug.
For the conceptual story see Routines. This page is the field-by-field reference.
Minimal valid job
schedule: "0 9 * * 1"
ownerAgent: ops-coordinator
title: "Monday triage"
prompt: "Read /inbox/. Group by urgency. Write /briefings/$DATE.md."
Every field
Trigger
| Field | Type | Required | Default | What it does |
|---|
schedule | cron string | "manual" | yes | — | Standard 5-field cron, or "manual" for run-on-button. |
timezone | IANA tz | no | system | E.g., "America/New_York". |
enabled | boolean | no | true | Off without deleting. |
jitterMinutes | integer | no | 0 | Random delay added per run to avoid thundering herd on cron-aligned beats. |
Identity
| Field | Type | Required | Default | What it does |
|---|
title | string | yes | — | Shown in the schedule UI and approval logs. |
description | string | no | "" | One-line summary. |
tags | string[] | no | [] | Free-form tags for filtering. |
Execution
| Field | Type | Required | Default | What it does |
|---|
ownerAgent | agent slug | yes | — | Which persona runs this routine. Inherits its tools and memory. |
prompt | string | yes | — | The instruction. Variables get interpolated (see below). |
model | string | no | agent's default | Override the agent's model for this routine. |
effort | "low" | "medium" | "high" | no | agent's default | Override reasoning effort. |
tools | string[] | no | agent's default | Allow-list of tool names for this routine. |
requiresApproval | boolean | no | false | If true, the result queues for review before landing. |
Budget
| Field | Type | Required | Default | What it does |
|---|
budget.maxTokens | integer | no | inherits | Token cap per run. |
budget.maxCostUsd | number | no | inherits | Dollar cap per run. |
Outputs
| Field | Type | Required | Default | What it does |
|---|
outputs | array | no | [] | Hint Cabinet which files this routine writes. Powers link-checking. |
outputs[].path | path | yes | — | Path within the cabinet, with variables interpolated. |
outputs[].kind | string | no | inferred | E.g., "page", "data", "asset". |
Dependencies
| Field | Type | Required | Default | What it does |
|---|
reads | path[] | no | [] | Files the routine declares it'll read. Used for impact analysis. |
after | string[] | no | [] | Slugs of jobs that must complete first. |
Variable interpolation
Available in prompt, outputs[].path, and any string field:
| Variable | Expands to |
|---|
$DATE | YYYY-MM-DD |
$TIME | HH:MM |
$YYYY-WW | ISO week, e.g. 2026-W18 |
$WEEK | alias for $YYYY-WW |
$MONTH | YYYY-MM |
$AGENT | owner agent's slug |
$CABINET | current cabinet's id |
$RUN_ID | unique id for this run, e.g. r_42a8 |
Complete example
schedule: "0 17 * * 5"
timezone: "America/Los_Angeles"
enabled: true
title: "Friday investor update packet"
description: "Compile the weekly metrics + cover narrative for investor.update@."
tags: [investors, weekly]
ownerAgent: revenue-analyst
prompt: |
Compile this week's metrics into /investors/${YYYY-WW}/.
Pull from /metrics/, /sales/pipeline.csv, /support/tickets.csv.
End with a 3-sentence narrative for the cover email.
model: claude-opus-4-7
effort: high
budget:
maxTokens: 80000
maxCostUsd: 2.50
reads:
- "/metrics/**"
- "/sales/pipeline.csv"
- "/support/tickets.csv"
outputs:
- path: "investors/${YYYY-WW}/packet.md"
kind: page
- path: "investors/${YYYY-WW}/cover.md"
kind: page
requiresApproval: true
Manual routines
Set schedule: "manual" for a button-driven routine. The body of the YAML is unchanged; the routine just doesn't fire on a clock.
schedule: "manual"
ownerAgent: research-lead
title: "Brief 10 competitors"
prompt: |
Take the company name from the trigger context.
Produce one /research/competitors/<slug>.md per competitor.
When you click Run in the UI, you can pass arguments which become available in the trigger context.
Validation
A bad job file fails at boot with exit code 6 and a precise error.
Read on