Structure
A flight is plain Markdown:- H1 — the flight name
- H2 — each agent’s slug (unique within the flight)
- Blockquote lines (
> key: value) — agent metadata (persona, dependencies, gates) - Body text — the agent’s task prompt
Dependencies
Two kinds of transitions connect agents:needs — the downstream agent starts after the upstream completes. New branch, new VM, no inherited conversation context. Multiple dependencies are comma-separated — all must complete before the dependent starts.
continues — the downstream agent sends a follow-up to the upstream on the same branch and VM. Full conversation context is preserved. This is a 1:1 relationship.
Metadata directives
Fanout
Theeach directive creates a template agent that the pilot expands into one instance per item. The {} placeholder in the prompt is replaced with each item. When another agent needs an each agent, all expanded instances must complete.
Gates
Gates block downstream agents until conditions are met — CI checks passing, a review agent approving the PR, human approval, or the PR being merged.Event triggers
Flights stored in the catalog can include YAML frontmatter withon: triggers — issue_opened, issue_labeled, pr_opened, pr_labeled, push, schedule (cron), ci_failure, agent_feedback, and linear_delegation (a Linear issue delegated to the Macroscope agent — see the Linear delegation guide). When a matching event arrives, the platform spawns the flight automatically. When several flights match the same event, the highest-priority flight wins (the priority: frontmatter field — see Priority). See the flight reference for all frontmatter fields and trigger types.
Tags
Every agent a flight spawns is automatically tagged withflight-<name> — a flight named deploy tags its agents flight-deploy — so you can group and filter a flight’s runs on the dashboard. Add your own tags with a tags: frontmatter list; they apply to the flight’s agents alongside the automatic tag. Tag names are DNS-label slugs ([a-z0-9][a-z0-9-]{0,62}); the platform creates any that don’t yet exist, and rejects a flight whose name is too long to form a valid flight-<name> tag. See tags.
Daemon vs. standard flights
By default, a triggered flight spawns a fresh instance every time it fires. The pilot agent and any sub-agents do their work, then the VM is reclaimed when idle. The next trigger spawns a brand new instance with no inherited state. A daemon flight flips that model. Settingdaemon: true in the frontmatter makes the flight a singleton: one persistent pilot agent for the lifetime of the flight. Events arriving while the daemon is running are delivered as follow-ups to the same agent on the same branch and VM, so the daemon can keep state between events. When there’s nothing to process, the agent sleeps instead of terminating, and wakes up when the next event arrives.
Reach for a daemon when serial processing matters, or when accumulated context between events is valuable. The merge queue daemon below is a canonical example: it processes one
ready-to-merge PR at a time, in order, and sleeps between events instead of spinning up a fresh agent for each one.
Running and storing flights
Run a flight with the--flight flag on murmur spawn. Store flights in the catalog with murmur set flight for reuse and event-triggered execution. See the multi-agent orchestration guide for a full walkthrough.