Guided, Trusted, Commander — how much Mori may run without stopping to ask you, set by you and only you, above a hard safety floor that no level can cross.
The autonomy ladder decides how far Mori can go on shell commands before it has to stop and get your yes. There are three rungs:
This is a different, newer control from the permission levels (safe / standard / full) covered in Security & approvals. Permission levels decide *which categories of tool exist at all* for a session; the autonomy ladder decides *how much confirmation* command execution needs. Both are real and both apply at once. Shipped in 1.3.0 SOVEREIGN.
Guided · asks before anything that changes things
Trusted · runs routine work; auto-runs your whitelisted dangerous commands
Commander · full autonomy for a time-boxed window (every action ledgered)Every command that reaches a shell — whether through run_terminal_command or a terminal_run in a named session — passes one chokepoint that sorts it into three tiers. Before matching, the command is de-obfuscated so a disguise can't slip past: quotes used to split tokens are stripped, line-continuations collapsed, unresolved ${VAR} expansions blanked, and a base64 -d | sh payload is decoded and inspected for what it actually runs.
sudo, any recursive or forced rm, git push --force, git reset --hard, git clean -f, chmod 777, killall / pkill, npm uninstall / npm prune. These are what the ladder gates.How a dangerous command is treated depends on your level: Guided always confirms it; Trusted auto-runs it only if it matches one of your allow-globs; an active Commander grant runs it and records it.
Some commands are never worth the risk, so they are refused outright — at Guided, at Trusted, and even under an active Commander grant. There is no setting, glob, or mode that turns them on.
The hardline patterns are: a recursive delete of / or ~ (or $HOME), formatting or raw-overwriting a disk (mkfs, dd of=/dev/…, diskutil erasedisk), a fork bomb, a power-state change (shutdown, reboot, halt), killing Mori or its updater process, and piping a download straight into a shell (curl … | sh). If you genuinely intend one of these, Mori tells you to run it yourself in a real terminal.
This floor is the thing the ladder is built on top of. Commander removes the *prompts* on dangerous commands; it does not, and cannot, lower this line.
> terminal_run { name: "cleanup", command: "rm -rf ~" }
Blocked (hardline safety): "rm -rf ~" matches an un-bypassable
danger pattern (recursive delete of / or ~, disk format/overwrite,
fork bomb, shutdown/reboot, killing Mori/its updater, or
curl-piped-to-shell). This is never run — not even in commander
mode. Run it yourself in a real terminal if you truly intend it.You cannot drift into Commander. Reaching it takes a double opt-in: you explicitly choose Commander, then confirm in a dialog and pick how long the grant lasts. The main process refuses to elevate without that explicit confirmation, so a stray click — or anything Mori reads — can never flip it on.
/autonomy guided | trusted | commander slash command does the same. Choosing Commander either way still routes through the same confirm-and-grant dialog.Crucially, the level and the grant are set *only* from the settings UI. Tool output, web pages, memory, and message content are always treated as data — none of them can change your autonomy, no matter what they say.
Everything that runs under a Commander grant, and every hardline attempt that gets blocked, is written to an append-only ledger. It is a write-ahead record: the line is written *before* the command executes, so the trail survives even if the command crashes the process.
Each entry captures the timestamp, the action, the exact command, the backend it ran on, the autonomy level, the grant's expiry, the decision (run or blocked), and the reason. The file lives in the app's user-data folder as mori-commander-ledger.jsonl, and there is a read-only viewer for it in the app.
The ledger is data, and only data. Its path is refused at the same dispatch chokepoint every command passes through, so no tool — no write_file, edit_file, or delete_file — can touch it. Mori can never doctor its own audit trail.
{"ts":1752_,"action":"terminal_run","command":"rm -rf node_modules","backend":"local","autonomyLevel":"commander","grantExpiresAt":1752_,"decision":"run","reason":"commander grant active (dangerous)"}
{"ts":1752_,"action":"run_terminal_command","command":"rm -rf ~","backend":"local","autonomyLevel":"commander","grantExpiresAt":1752_,"decision":"blocked","reason":"hardline pattern — un-bypassable"}The ladder governs how much confirmation *command execution* needs. It has no reach into the other safety gates, so those hold at every level — including under a live Commander grant:
See Security & approvals for the permission-level system, typed remote approvals, checkpoints, and the durable audit log that sits underneath all of it.