Skip to main content
Every turn, Murmur adds a system prompt behind the task you give the agent: where the repositories are checked out, how to open pull requests, how structured output and tasks work, and so on. The prompt is an ordered list of sections. Each section is a Go text/template. A persona’s systemPrompt frontmatter field changes that list: inherit, replace, or remove any section Murmur provides, and add sections of your own. This page is the reference for systemPrompt. See agent-persona for the rest of the persona’s fields, and Agent personas for the concept overview.

How the prompt is built

Murmur renders the system prompt as it prepares each turn, from the persona the agent runs, so a change to Murmur’s default templates reaches a running agent on its next turn. It is rendered section by section, in a fixed order, and the non-empty results are joined with a blank line. A section that renders to nothing — because it doesn’t apply to this turn, this harness, or this model — simply disappears; it never leaves a blank heading or an empty bullet behind. When every section renders to nothing, Murmur adds no system prompt at all and the harness runs on its own, exactly as it would outside Murmur. A persona gets there by removing every section, or by replacing every section with an empty template, on a turn where neither the requester nor the spawn supplied a system prompt of their own. The order is:
  1. The platform sections below, in the order listed — each inherited from Murmur’s default, replaced with your own template, or removed.
  2. Your persona’s extensions, in the order you list them.
  3. The requester’s own system prompt, then the spawn’s appended prompt, including flight prompts. A persona cannot replace or remove either: whatever the persona does, this text reaches the turn and has the last word.

Platform sections

systemPrompt.platform has one key per section, camelCase, in render order. Leave a key unset to inherit Murmur’s template for that section. Set replace to supply your own template, or remove: true to drop the section entirely.

Inherit, replace, remove

Every key you omit is inherited unchanged. Set exactly one of replace or remove on a key you list. An empty replace renders the section to nothing, just like remove: true. remove: false is rejected when the persona is saved; leave the key unset to inherit the section.

Extensions

systemPrompt.extensions is a list of sections you invent. Unlike platform sections, an extension doesn’t override anything, so its name never collides with a section Murmur adds later.
  • id must be unique within the persona and match a lowercase letter followed by up to 62 lowercase letters, digits, or underscores: [a-z][a-z0-9_]{0,62}.
  • template must not be empty.
  • Extensions render in list order, after every platform section and before the requester’s system prompt and the spawn’s appended prompt.

Variable reference

A section’s template renders against a fixed set of variables. A template that names a variable not listed here fails to render, and fails the turn; see Render errors.

Top-level

.Repos[]

One entry per checked-out repository.

.Tasks[]

One entry per checklist task.

.FlightMessages[]

One entry per registered flight-message field of the structured-output envelope.

.Knowledge

.Persona

Function reference

Every text/template builtin is available: and, or, not, eq, ne, lt, le, gt, ge, len, index, print, printf, and so on. Murmur adds:

Render errors

Templates render with standard text/template rules. A template that names a variable not in the reference, indexes past the end of a list, or calls a function with the wrong arguments fails to render. The turn then fails before the agent starts, and its error names the persona and the section:
Fix the persona with murmur set, then send the agent a follow-up to run the turn again. To guard against an empty list, test it first: {{if .Repos}}{{(index .Repos 0).Name}}{{end}}.

Validation

Validation runs when the persona is saved. A persona that fails validation is rejected and not written. Validation checks:
  • Every section’s template (platform replace values and extension template values) parses as a valid Go template using the function set above.
  • A platform section override sets exactly one of replace or remove; neither set is rejected.
  • remove is not set to false. Leave the key unset to inherit the section instead.
  • Every extension id matches [a-z][a-z0-9_]{0,62} and is unique within the persona.
  • Every extension template is not an empty string.
  • Every key under systemPrompt, systemPrompt.platform, and each extension is a recognized key — a misspelled key (e.g. replce instead of replace) fails to save rather than being silently ignored.
Validation cannot see a turn’s variables, so a template that parses but names a variable that doesn’t exist is saved, and fails the first turn it renders on; see Render errors.

Examples

Replace, remove, and a gated extension

This persona replaces the workspace section with a one-line summary, removes the waiver section entirely, and adds an extension that only renders for Codex.

Minimal persona

This persona removes every platform section, one key each, so the entire platform portion of the prompt is the one extension above; the requester’s system prompt and the spawn’s appended prompt still follow it if either is set. Without the extension, and on a turn with neither of those, Murmur adds no system prompt at all.

Extension branching on the model

This extension always renders a model-family line (“unknown” when .ModelFamily is empty) and adds extra guidance only for the haiku family.