Job schema

.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

FieldTypeRequiredDefaultWhat it does
schedulecron string | "manual"yesStandard 5-field cron, or "manual" for run-on-button.
timezoneIANA tznosystemE.g., "America/New_York".
enabledbooleannotrueOff without deleting.
jitterMinutesintegerno0Random delay added per run to avoid thundering herd on cron-aligned beats.

Identity

FieldTypeRequiredDefaultWhat it does
titlestringyesShown in the schedule UI and approval logs.
descriptionstringno""One-line summary.
tagsstring[]no[]Free-form tags for filtering.

Execution

FieldTypeRequiredDefaultWhat it does
ownerAgentagent slugyesWhich persona runs this routine. Inherits its tools and memory.
promptstringyesThe instruction. Variables get interpolated (see below).
modelstringnoagent's defaultOverride the agent's model for this routine.
effort"low" | "medium" | "high"noagent's defaultOverride reasoning effort.
toolsstring[]noagent's defaultAllow-list of tool names for this routine.
requiresApprovalbooleannofalseIf true, the result queues for review before landing.

Budget

FieldTypeRequiredDefaultWhat it does
budget.maxTokensintegernoinheritsToken cap per run.
budget.maxCostUsdnumbernoinheritsDollar cap per run.

Outputs

FieldTypeRequiredDefaultWhat it does
outputsarrayno[]Hint Cabinet which files this routine writes. Powers link-checking.
outputs[].pathpathyesPath within the cabinet, with variables interpolated.
outputs[].kindstringnoinferredE.g., "page", "data", "asset".

Dependencies

FieldTypeRequiredDefaultWhat it does
readspath[]no[]Files the routine declares it'll read. Used for impact analysis.
afterstring[]no[]Slugs of jobs that must complete first.

Variable interpolation

Available in prompt, outputs[].path, and any string field:

VariableExpands to
$DATEYYYY-MM-DD
$TIMEHH:MM
$YYYY-WWISO week, e.g. 2026-W18
$WEEKalias for $YYYY-WW
$MONTHYYYY-MM
$AGENTowner agent's slug
$CABINETcurrent cabinet's id
$RUN_IDunique 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