allowlists of named users who may steer regardless of tier. It also supports denylists of users who may never steer; denylists override both the tier and allowlists. An event whose author fails the policy is recorded on the agent’s timeline as BLOCKED. It produces no follow-up, checklist task, wake, or flight spawn.
A steering policy controls who may initiate agent work from outside, not what the agent may do once it is working. In the dashboard, steering policies are managed under Organization Settings → Agent configuration → Steering Policies.
Fields
Tiers
Thetier field sets the minimum GitHub author association that may steer. The tiers below run from broadest to narrowest: COLLABORATORS admits everyone MEMBERS does, plus repository collaborators.
Denylists
An actor list is a named set of usernames with no polarity of its own. The referencing field decides: naming the list underallowlists admits its actors, while naming it under denylists refuses them. This lets you keep the tier open for everyone with repository access while blocking a noisy machine account, such as a preview bot that comments on every push.
Matching is identical in both directions: provider-scoped (a GitHub login is matched in PROVIDER_GITHUB_OAUTH) and case-insensitive against the event author’s login, unioned across every list the field names.
A list may be named by allowlists or denylists, never both. Because deny would silently win, the server rejects a policy that names the same list in both fields. To subtract an actor from a list you otherwise admit, name a second, narrower list on denylists:
steering_denylist_denied, which distinguishes it from a tier or allowlist miss.
Precedence
- An agent’s own owner always steers it. A denylist never locks a developer out of their own agent: revoking a person’s authority is a role change, not a steering policy.
- Denylists beat everything else. A denied author is blocked even when the tier admits them and even when an allowlist (this policy’s own, or another applicable policy’s) names them.
- Tier, then allowlists. An author no denylist names is admitted by the tier or, failing that, by an allowlist.
How a policy is selected
A steering policy is chosen for each event based on its repository. For service-profile agents, the owning profile can also select a policy:- Per repository:
repo-config.steering_policynames a policy explicitly. When unset, the platform selects by repository visibility: public repos usemurmur-public-steering-policy, private repos usemurmur-private-steering-policy. Both are platform builtins. - Per service profile:
service-profile.steering_policynames a policy for agents running under that identity.
Events delivered by GitHub Actions
Repositories that deliver events through the GitHub Actions workflow created bymurmur install-repo prove which repository sent an event, but not who wrote it. The author, association, and labels in those events come from the workflow run, not from GitHub, so Murmur shows the author on the timeline without treating them as a verified person:
- Only
STEERING_TIER_OPENadmits these events. No other tier, no allowlist, and no ownership of the agent can admit an author Murmur cannot verify. - Denylists cannot match them either, because the author could name anyone.
- The repository visibility that selects the default policy comes from GitHub’s signed workflow token, so public repositories use
murmur-public-steering-policyand their comments do not steer agents.
Examples
Require organization membership
Allowlist-only, with trusted actors
Turn the tier check off and admit only the users named in an actor allowlist.Everyone on a private repo, except a preview bot
STEERING_TIER_OPEN admits any author, so this shape fits a private repository, where everyone who can comment was already granted access by the organization, and subtracts the machine accounts that must never steer. On a public repository, where anyone on GitHub can comment, pair denylists with a restrictive tier (STEERING_TIER_COLLABORATORS or narrower) instead.
First the actor list naming the bots:
murmur patch updates just the one field, preserving any repo-config settings the repository already has (murmur set would replace the whole resource):
Members, plus an allowlist of outside contributors
Listing steering policies
Reading a single steering policy
Errors
Related
- actor-allowlist: the named actor lists a policy admits (
allowlists) or refuses (denylists) - service-profile: references a steering policy for agents under that identity
- repo-config: references a steering policy per repository
- Events: the webhook events steering gates
murmur set: CLI command for creating and updating catalog resourcesmurmur get: CLI command for reading catalog resources