Governance
How MUON governs the crew
MUON separates two roles everywhere: an operator (you, holding an operator-tier credential) decides; an agent (any dispatched worker, or a session with MUON's MCP server attached) does. Nothing an agent holds can approve, confirm memory, or answer a gate — enforced by which token a caller presents, not by convention.
Approval gates
When an agent's work crosses a boundary that matters — an edit outside the expected surface, a network call, a merge, a dangerous command — MUON files a gate and the agent waits. A few rules hold everywhere a gate appears (desktop, TUI, CLI):
- Every field of the request has to be readable before you decide: the exact action, its scope, the consequence and the bound evidence. Truncated text can never be approved.
- A native notification can deep-link to the full review — it can never let you approve directly from the notification itself.
- A decision is bound to the exact content it was made on. If the content changes after you've seen it, the old approval cannot be reused.
- A merge gate can be graph-certified: MUON reviews the diff against the code graph and either certifies it or names specific files REVIEW BLIND (new, unindexed, or a stale index) that a human has to read directly.
Approvals from the CLI
muon approve is the terminal client of the same queue. Resolving an approval requires operator authority.
muon approve list # every pending approval muon approve review --approval-id <id> # the full merge dossier: reviewer, artifact, checks, blockers muon approve resolve --approval-id <id> --status approved # or rejected
muon approve reviewprints the whole review dossier: the reviewer of record, the exact artifact coordinates, the pull request checks, the landing state, and every blocker with the recovery that clears it. Add--routineto review the exact routine policy, or--certification-onlyfor just the graph certification. For a blocked merge it also lists each REVIEW BLIND file and the artifact digest you attest against.--remember <ttlMs>onmuon approve resolvemints a content-bound receipt so one exact action is auto-allowed until it expires (60000–3600000 ms, i.e. 1 minute to 1 hour) — never a blanket allow. It cannot be combined with a rejection.--remember-scope <once | session | always>is the graded replacement for--remember:onceremembers nothing,sessioncovers this run for one hour,alwayscovers this exact action in this chat for seven days and is revocable. The expiry is computed by the brain, and the two flags cannot be combined.--attest-review-blind <artifactDigest>is how you approve a merge over REVIEW BLIND files: aftermuon approve review, pass the 64-character artifact digest it printed to attest that every listed blind file was read. A merge or ship is never remembered, so this cannot be combined with--rememberor--remember-scope.--acknowledge-routine <recipeDigest>explicitly acknowledges a routine policy's exact recipe digest aftermuon approve review --routine.
Memory tiers
Every memory note carries exactly one of four tiers, computed by one shared rule so the desktop, TUI and CLI can never describe the same note differently.
human-confirmed
A person confirmed it. The only tier that unlocks global-scope promotion, pack export and destructive-write protection.
MUON-vouched
The crew's coordinator vouched for it on the record. Settled and durable, but not human-confirmed.
crew-auto
Crew-visible only under an operator's explicit auto-confirm posture — nobody has actually vouched for it.
pending / open
Nobody vouched and nothing is carrying it — the one tier that is a debt. A note that lapses returns here regardless of what once vouched for it.
The pre-edit gate only ever shows trusted decision text; a contested or pending proposal shows as existence-only until you explicitly ask to read it and confirm or reject it. Untrusted note text can never reach an agent through that gate as if it were a decision.
Full-auto: standing operator consent
Full-auto lets you pre-authorize approvals instead of clicking through each one — but it is consent you grant, not a mode that removes the gate.
- Scoped, not global by construction. Arm it for every lane, or for specific vendor lanes only; a request MUON cannot attribute to a resolvable lane is not covered by a partial selection.
- It cannot cover everything. Egress actions and blocked merge reviews still ask, always. A merge needing an operator attestation over REVIEW BLIND files is exactly what full-auto cannot manufacture.
- Every grant is an audited decision. Each auto-approval goes through the identical operator-tier resolve path a manual click uses, leaving a receipt naming the action and scope it covered.
- It fails back to you, visibly. If a standing grant is refused or hasn't landed within its grace window, the request drops back to an ordinary blocking prompt.
Standing consent is stored by the brain and shared by the desktop's Auto-approve lanes and the muon consent CLI:
muon consent status # every live record and per-lane coverage muon consent set --vendors all # machine-wide, never expires muon consent set --vendors codex,claude --session # one hour, kept alive until Ctrl-C muon consent clear # revoke every record
A record is honoured only while a standing approver is watching. A plain muon consent set --vendors all writes a record that never expires and leaves the watch to whichever surface holds the lease; --session writes a one-hour record and keeps the lease alive for as long as that terminal lives, then clears itself on Ctrl-C. muon consent status says whether anyone is watching.
What never happens
No vendor token custody
You log in to each coding agent with its own CLI, or use your own BYOK credential. MUON only observes readiness and, for supported BYOK setups, forwards the one selected credential variable to the one selected child process. It never stores, proxies, or logs you into a vendor account.
No hidden egress
MUON is loopback-only and local-first. Vendor model traffic remains vendor-owned: MUON adds no hop to it and does not read it. MUON itself makes a small, named set of outbound calls, each with its own trigger:
- Sign-in.
muon login(andmuon setup's first step) opens getmuon.com to authorize this install through your account — a short-lived browser flow the terminal polls. It is the one command that unlocks a locked install. See Install. - GitHub. When you connect GitHub for pull-request review or the Issues view, MUON calls GitHub's own endpoints — the device-login flow at
github.com/login/deviceand the REST API atapi.github.com— with the credential you authorize. Review and Issues requests use that connection. - Update check. The release-feed check described in Install runs only when you click it or turn it on.
- Telemetry. Anonymous usage telemetry is on by default. It sends enums, counts and timings, with one exception: MCP tool calls are captured in full, arguments and results included. Turn it off in Settings → Privacy or with
muon telemetry off;muon telemetry statusshows what is sent.
Two tokens, one gate
Everything above rests on one separation: the operator token can govern (approve, confirm memory, resize the fleet); the agent token can only do (dispatch work, propose memory, read the graph). A UI surface never holds the raw operator token itself, and an MCP server — including one attached to a session you launched — can only ever present the agent tier. There is no code path where an agent-held credential decides a gate.