Persona

A persona is the file that is your agent. Edit it, the agent updates. Delete it, the agent disappears. Git tracks every change.

The whole agent — name, model, schedule, system prompt — sits in one file at .agents/<slug>/persona.md. Hover the fields below to see what each one controls.

The minimum viable persona

---
name: Inbox Triager
emoji: "📥"
role: Email triage
type: specialist
model: claude-haiku-4-5
---

You read /inbox/ every weekday at 9am, tag urgency, and write a one-line summary to /briefings/today.md.

That's a working agent. Three lines of frontmatter and a system prompt. Cabinet picks up the file the next time the app boots.

Every field

FieldTypeDefaultWhat it does
namestringDisplay name in the AI team panel and @-mentions.
emojistring"🤖"Quick visual identifier in lists, mentions, and the org chart.
rolestringOne-line subtitle. Keep it ≤3 words.
type"lead" | "specialist"specialistLeads can dispatch work to other agents. Specialists do focused work.
modelstringinherits cabinet defaultDefault provider+model. Override per task or per heartbeat.
canDispatchbooleantrue for leads, false for specialistsAllow LAUNCH_TASK / SCHEDULE_JOB proposals.
heartbeatsarray[]Recurring check-ins. See Heartbeats.
memorystring | object"memory.md"Where the agent's learned context lives.
skillsstring[][]Skill slugs to attach by default. See Skills.
toolsstring[]inheritsAllow-list of tool names. Empty = inherit cabinet defaults.
visibility"all" | "cabinet" | "folder"cabinetHow far up/down the tree this agent can read.
budgetobjectinheritsToken / dollar caps per run, per day.

The body of the file (everything after the second ---) is the system prompt. Write it like you're onboarding a new hire: who they are, what they own, where their workspace is, what they should never do.

Patterns that work

A specialist who lives in a folder

---
name: Pipeline Tracker
emoji: "📈"
role: CRM keeper
type: specialist
model: gpt-4.1
visibility: folder
---

You watch /sales/pipeline.csv. Whenever a row's status changes,
write a one-line note to /sales/changelog.md with the date.

Why it works: narrow scope (visibility: folder), boring model (cheap, fast), one job, output goes to a durable page.

A lead who orchestrates

---
name: GTM Lead
emoji: "🎯"
role: Launch strategy
type: lead
model: claude-opus-4-7
canDispatch: true
heartbeats:
  - cron: "0 9 * * 1"        # Mon 9am
    prompt: "Open the launch room and report what changed."
  - cron: "0 17 * * 5"       # Fri 5pm
    prompt: "Draft Monday's launch checklist."
---

You translate positioning notes into channels, offers, and launch
risks. You always work in /marketing/. When you see a research gap,
dispatch a LAUNCH_TASK to the Research Lead.

Why it works: opinionated model (Opus for strategy), explicit dispatch permission, two heartbeats that frame the week.

A heartbeat-only agent

---
name: Stale Sweep
emoji: "🧹"
role: Weekly cleanup
type: specialist
model: claude-haiku-4-5
heartbeats:
  - cron: "0 18 * * 5"
    prompt: "Find pages in /tasks/ not touched in 30 days. Suggest archive or delete."
---

Why it works: no chat surface, no dispatch, just a Friday-evening sweeper that gets out of your way.

Memory

A persona's memory file is a markdown page the agent reads at the start of every run and writes to at the end. Think of it as their notebook.

.agents/gtm-lead/
├── persona.md       ← who they are
└── memory.md        ← what they've learned

You can read or edit memory.md like any other page. If the agent learns something wrong, just open the file and fix it.

Sharing a persona

A persona is a folder. To share one:

# Copy out a single agent
cp -r .agents/gtm-lead/ ~/Desktop/

# Or commit + push as part of a [template cabinet](../../../templates/) on cabinets.sh
git add .agents/gtm-lead/
git commit -m "Add GTM Lead persona"

When you publish a template to cabinets.sh, the personas come with it. Anyone who installs the template gets your team, ready to run.

Read on