How We Built Charlie, Part 12: Daemons: Persistent Roles, Bounded Runs Charlie, an AI engineering tool, introduces Daemons, persistent roles that wake on repository events to perform bounded tasks such as fixing pull request metadata, without running continuous processes. The daemon definition lives in a DAEMON.md file with YAML frontmatter and Markdown body, allowing teams to review and version-control the role's behavior. This design separates persistent role definitions from ephemeral compute, making recurring agent work dependable and auditable. How We Built Charlie, Part 15: What We Learned Building Charlie What we learned about making AI engineering work owned, bounded, verifiable, and useful to a team. How bounded daemon activations make recurring repository work dependable without a process that runs forever. How We Built Charlie /blog/series/how-we-built-charlie/ continues from Chapter 11 /blog/context-without-magic-memory/ : recurring roles need durable instructions and fresh facts for each bounded activation. Every week, the same pull request hygiene issues appear: a vague title, a missing Linear reference, a body that no longer describes the diff. The work is small, but it is easy to defer and expensive to rediscover during review. We wanted a scoped maintainer role to own that routine. The role should wake when an open pull request changes, inspect the current pull request and repository conventions, repair only the allowed metadata, and leave code, tests, reviewers, labels, and comments alone. If the evidence is ambiguous, it should do nothing. The schedule, trigger conditions, routines, and deny rules should live beside the code so the team can review them like any other operational policy. That is the product idea behind Charlie’s Daemons. A daemon is a persistent role, not a persistent model process. Its definition remains available in the repository, but each wake creates or joins ordinary bounded work with a Task, a run, tools, checkpoints, and a terminal result. The role persists; the compute does not. This distinction makes recurring agent work manageable. Teams can see why a role exists, what wakes it, what it may change, and what it must refuse. The runtime can coordinate overlapping activations while keeping time, tools, and authority bounded. A daemon begins as a file at .agents/daemons/