Persona schema

persona.md schema

A persona is a markdown file at .agents/<slug>/persona.md. The frontmatter (between the two --- lines) is structured. The body is the agent's system prompt.

For the conceptual story see Persona. This page is the field-by-field reference.

Minimal valid persona

---
name: Inbox Triager
role: Email triage
type: specialist
---

You read /inbox/ every weekday at 9am, tag urgency, write to /briefings/today.md.

Frontmatter fields

Identity

FieldTypeRequiredDefaultWhat it does
namestringyesDisplay name. Shown in mentions, sidebar, org chart.
emojistringno"🤖"Single emoji or short string. The agent's avatar in compact lists.
rolestringyesOne-line subtitle. ≤3 words is the convention.
type"lead" | "specialist"yesLeads can dispatch. Specialists do focused work.

Model & dispatch

FieldTypeRequiredDefaultWhat it does
modelstringnoinheritsProvider+model. Examples: claude-opus-4-7, gpt-4.1, gemini-2.5-pro, ollama/llama-3.3-70b.
effort"low" | "medium" | "high"no"medium"Default reasoning effort for this agent.
canDispatchbooleannotrue for leads, false for specialistsAllow LAUNCH_TASK / SCHEDULE_JOB proposals.
toolsstring[]noinheritsAllow-list of tool names. Empty = inherit cabinet defaults.
visibility"folder" | "cabinet" | "all"no"cabinet"How far the agent can read.

Heartbeats

FieldTypeRequiredDefaultWhat it does
heartbeatsarrayno[]Recurring check-ins. See subfields below.
heartbeats[].croncron stringyesStandard 5-field cron expression.
heartbeats[].labelstringnoderivedShown in the schedule UI.
heartbeats[].promptstringyesPrompt the agent receives when this beat fires.
heartbeats[].modelstringnopersona's modelOverride per heartbeat.
heartbeats[].effortstringnopersona's effortOverride per heartbeat.
heartbeats[].enabledbooleannotrueDisable without removing.

Memory & skills

FieldTypeRequiredDefaultWhat it does
memorystring | objectno"memory.md"Path to the agent's memory file, relative to the persona folder.
memory.maxLinesintegerno2000Soft cap before Cabinet suggests a memory compaction.
skillsstring[]no[]Skill slugs to attach by default. See Skills.

Budget

FieldTypeRequiredDefaultWhat it does
budget.daily.maxCostUsdnumbernoinheritsHard cap per agent per day.
budget.perRun.maxCostUsdnumbernoinheritsHard cap per individual run.
budget.perRun.maxTokensintegernoinheritsToken cap per run.

Display

FieldTypeRequiredDefaultWhat it does
colorstringnoderivedHex or token name. Used for sidebar dot and chat bubbles.
orderintegernoalphaLower numbers sort first in lists.

Body — the system prompt

Everything after the closing --- is the system prompt the agent gets at the start of every run. Treat it like an onboarding doc:

  • Who they are — title, scope, personality if any.
  • What they own — folders, files, recurring outputs.
  • What they should never do — forbidden tools, forbidden folders, escalation rules.
  • How they hand off — when to dispatch, when to write, when to stay quiet.

Use markdown freely. The whole body is sent verbatim. Shorter is usually better.

Example: a complete lead

---
name: GTM Lead
emoji: "🎯"
role: Launch strategy
type: lead
model: claude-opus-4-7
effort: high
canDispatch: true
visibility: cabinet
heartbeats:
  - cron: "0 9 * * 1"
    label: "Monday standup"
    prompt: "Open /marketing/launches/. Report what changed since Friday."
  - cron: "0 17 * * 5"
    label: "Friday wrap"
    model: claude-sonnet-4-6
    prompt: "Draft Monday's launch checklist."
skills: [competitor-brief, launch-checklist]
budget:
  daily:
    maxCostUsd: 10
---

You are the GTM Lead.

## Workspace
You always work in /marketing/. Outputs land in /marketing/launches/<launch-slug>/.

## What you own
- Positioning, channels, offers, launch risk register.
- Weekly launch room state.

## How you delegate
- Research gaps → LAUNCH_TASK to Research Lead with the question and the deadline.
- Draft polish → LAUNCH_TASK to Launch Editor with the draft path.
- Recurring posts → SCHEDULE_JOB to LinkedIn Operator (weekly, Friday 5pm).

## Tone
Direct, concrete, ≤3 sentences per recommendation.

Validation

Bad fields fail at boot with a precise error and exit code 6:

Error: .agents/gtm-lead/persona.md
  heartbeats[1].cron: invalid cron expression "every monday"
  Use a 5-field cron string. Try crontab.guru.

Read on