Exact DAEMON.md authored contract, validation rules, and support-tree semantics.
Human readers: the fastest way to get started with daemons is to work directly with Charlie.Charlie can help you suggest where to start and add your first daemon. Use the prompts below to ask Charlie in Slack, GitHub, or Linear.
Explain what daemons are and how they work.
This page defines the authored DAEMON.md contract.A daemon is not a Unix daemon, cron job, GitHub Action, or generic background agent. In this system, DAEMON.md is the authored control surface for a repo-local Charlie role, while runtime metadata such as activation mode is derived rather than authored directly.Use this page when you need the exact file format, field definitions, validation rules, and support-tree semantics.For guidance on when to use a daemon, read Choosing daemons.For guidance on how to write a good daemon, read Writing and editing DAEMON.md.For concrete examples, start from the examples repo README/index.
----delimited YAML frontmatter that parses to an object/map
a markdown body below the closing frontmatter delimiter
The authored file shape is:
---id: <daemon-id>purpose: <what this daemon achieves>watch: - <event condition>routines: - <operation>deny: - <thing this daemon is told not to do>schedule: "<cron expression>"---<Markdown content: decision policy, limits, communication behavior, verification, and other guidance>
watch is a list of natural-language event conditions that can wake the daemon.Rules:
optional
if present, must be a YAML list of non-empty strings
should describe discrete, observable events
Use provider-visible event language rather than raw webhook names. Keep provider-specific examples and routing requirements in Writing and editing DAEMON.md and the relevant integration docs.Use schedule for cron-based wakes. Do not put cron timing in watch.
validate <path> checks one file. validate --all discovers .agents/daemons/**/DAEMON.md files from the current repository. Add --json when automation needs structured output.Validation checks the runtime file contract: frontmatter syntax, allowed and required fields, activation fields, cron syntax, a non-empty markdown body, and path-aligned IDs.
Use the authored field names exactly as written in this page.
Use this
Do not use
id
name
purpose
description
watch
triggers
routines
actions
deny
disallowed
name is not a valid authored field. Use id.Do not invent extra frontmatter fields.Do not add runtime-derived labels such as activation mode to frontmatter.
The markdown body below the frontmatter is freeform.It is meaningful at runtime: the body is carried into execution and interpreted as part of the daemon’s operating brief.Because the body is interpreted at runtime, do not use it for install-time setup, copy-time adaptation, or tutorial notes.Use it for operational guidance such as:
decision policy
communication policy
verification policy
freshness policy
concurrency policy
output format
limits
priority
thresholds
conventions
ignore patterns
examples
There are no required body headings.Headings such as Decision policy, Limits, Communication policy, and Verification and freshness are conventions, not schema.
scripts/ for executable helpers or deterministic utilities the daemon can call
references/ for policy docs, templates, style guides, or other context the daemon can read but should not modify
If a daemon relies on a helper script, document the required inputs, output shape, pagination or completeness expectations, and what the daemon should do when the script cannot return complete context safely.