Documentation Index
Fetch the complete documentation index at: https://docs.charlielabs.ai/llms.txt
Use this file to discover all available pages before exploring further.
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.
Directory structure
A daemon is a directory containing aDAEMON.md file.
Full file format
DAEMON.md must contain:
----delimited YAML frontmatter that parses to an object/map- a markdown body below the closing frontmatter delimiter
- the opening or closing
---delimiter is missing - the frontmatter is malformed YAML
- the frontmatter does not parse to an object/map
Field-by-field reference
Authored frontmatter fields
| Field | Required | Type | Meaning |
|---|---|---|---|
id | Yes | string | Canonical daemon identifier. Must exactly match the daemon path slug. |
purpose | Yes | string | One sentence describing the daemon’s intended outcome. |
watch | No | list of strings | Event conditions that wake the daemon. Natural language. |
routines | Yes | list of strings | Operations the daemon performs when activated. Natural language. |
deny | No | list of strings | Behavioral prohibitions for the daemon. Natural language. |
schedule | No | string | Timer-based wake configuration. Standard five-field cron. |
id
id is the canonical daemon identifier.
Rules:
- required
- non-empty
- must exactly match the daemon directory name
purpose
purpose is one sentence describing the daemon’s intended outcome.
Write intent, not mechanics.
watch
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
routines
routines is a list of natural-language operations the daemon performs when it wakes.
Rules:
- required
- must be a YAML list of non-empty strings
- must include at least one entry
- each entry should describe a concrete, finite operation
deny
deny is a list of things the daemon is told not to do.
Rules:
- optional
- if present, must be a YAML list of non-empty strings
schedule
schedule is timer-based wake configuration.
Rules:
- optional
- when present with meaningful text, must be a string
- blank or whitespace-only values are treated as
null - must be valid standard five-field cron
- evaluated in UTC
- standard five-field cron only
- comma-separated lists
- ranges
- stepped ranges
7in day-of-week is treated as0(Sunday)
- if both day-of-month and day-of-week are wildcard, any day matches
- if one is wildcard, the other controls
- if both are restricted, the scheduler matches
day-of-month OR day-of-week
Validation rules
These are the key authored validation rules.idis required.idmust exactly match the daemon path slug.purposeis required.routinesis required.routinesmust be a YAML list of strings and must contain at least one non-empty entry.watch, when present, must be a YAML list of non-empty strings.deny, when present, must be a YAML list of non-empty strings.schedule, when present with meaningful text, must be a string.- Blank or whitespace-only
schedulevalues are treated asnull. - At least one activation field must be present:
watchorschedule. schedulemust be a valid five-field cron expression.- Activation mode is derived from
watchandschedule; do not author it directly.
- Watch-only:
watchpresent,scheduleabsent - Schedule-only:
schedulepresent,watchabsent - Hybrid: both present
Field name disambiguation
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.
Body semantics
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. 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
Decision policy, Limits, Communication policy, and Verification and freshness are conventions, not schema.
Support tree semantics
A daemon directory may include optional subdirectories alongsideDAEMON.md:
scripts/for executable helpers or deterministic utilities the daemon can callreferences/for policy docs, templates, style guides, or other context the daemon can read but should not modify
Authoring conventions that help avoid validation issues
Use these conventions consistently:- Canonical field order. When fields are present, use this order:
Treat this order as a consistency/readability convention; parsers must not require it.
idpurposewatchroutinesdenyschedule
- Path-aligned IDs. Keep the directory name and the
idvalue exactly aligned. - Stable naming. Use only the canonical authored field names:
id,purpose,watch,routines,deny, andschedule.