AI DevelopmentMethodology23 min readPublished August 22, 2026

12 CLIs · 13 rows · two confidence tiers · data as of August 22, 2026

What Coding Agents Do Without Asking: A Permission-Defaults Census

Twelve coding-agent CLIs, two questions each: when invoked headless, does the agent write files without asking, and does it run shell commands without asking. Alongside each answer: the flag that turns writes on or off, whether a real read-only mode exists, what the sandbox isolates and whether it is on by default, and how a new directory is trusted. Nine CLIs were run on one machine and checked against their own documentation; three are documented only. Every row carries its confidence tier.

DA
Digital Applied Team
Senior strategists · Published Aug 22, 2026
PublishedAug 22, 2026
Read time23 min
Sources19 vendor sources
CLIs censused
12
13 table rows · GLM-5.3 via two routes
Confidence split
10+3
rows run here + documented · rows documented only
No headless opt-out
1
Kimi Code: -p writes + runs shell, per its docs
Sandbox on by default
2
Codex (docs) · Muse Code (CLI --help)

Coding-agent permission defaults are the least documented and most consequential setting in the headless-agent toolchain. Twelve coding-agent CLIs were checked on the same two questions: invoked non-interactively, does the agent write files without asking, and does it run shell commands without asking. The answers split three ways, and two of the twelve sit at opposite ends of the range.

The reason the question matters is that the headless flag is where most automation lives. A CI job, a cron task, a fleet of agents booted in parallel: none of these has a human attached to answer a prompt. Whatever the CLI does when nobody answers is what it does in production. Some CLIs treat that case as “refuse”; some treat it as “go ahead”; one treats it as “go ahead, and there is no flag to say otherwise”.

This page is the dataset, not an argument about it. The complete table is below, every row labelled with whether the behaviour was observed on a machine or read from documentation only. The prose around it points at the rows worth reading twice and records what could not be resolved. It is a companion to the data-terms census that asked a different six questions of an overlapping set of agents.

Key takeaways
  1. 01
    Headless file-write defaults split three ways.Of 13 rows, 7 ask (or only propose) until a flag is passed, 2 refuse to write at all until flagged (Codex CLI, Qwen Code), and 4 write without asking: Kimi Code, bare ZCode for GLM-5.3, DeepSeek Harness inside its workspace root, and Grok Build as configured on the census machine.
  2. 02
    Kimi Code and Qwen Code are exact inverses.Kimi’s own docs state that -p mode uses the auto permission policy with no human approval and cannot be combined with --plan. Qwen’s headless run refuses to write anything until you pass -y; without it the run prints the code and exits 1.
  3. 03
    Only two rows run inside an OS-level sandbox with no flag.Codex CLI’s default sandbox is read-only and stays on once workspace-write is enabled (vendor docs). Muse Code’s own --help states approval and an OS sandbox are on by default. Gemini CLI is the inverse case: its sandbox turns on specifically when --yolo is chosen.
  4. 04
    Two confidence tiers, stated on every row.Nine CLIs (ten rows) were installed and run on one MacBook Pro and cross-checked against vendor docs; three rows (Cursor CLI, GitHub Copilot CLI, Gemini CLI legacy) are documented only. Three rows have no public vendor doc page located at all and say so.
  5. 05
    Two cells could not be closed and are left open.Grok’s vendor docs list three permission_mode values; no statement of the factory default was located in the pages read for this census, and the census machine’s config carries always-approve. Muse Code’s permission facts come from --help and a smoke test, not a billed model run. Both are recorded as-is rather than resolved by inference.

01What Was CountedTwo questions, asked of the headless path only.

Every coding-agent CLI has an interactive mode, and in interactive mode the permission story is easy: the agent proposes, the human approves. The census deliberately ignores that path. It looks only at each CLI’s one-shot, non-interactive invocation, the thing you would put in a script, and asks what happens when there is nobody to answer.

The two primary fields are file writes and shell execution, each scored as one of three states: refuses until a flag is passed, asks (or only proposes) and therefore stalls or fails headless, or proceeds without asking. Six secondary fields ride alongside: the flag that enables writes, whether a genuine read-only option exists, what the sandbox isolates and whether it is on by default, how a new directory is trusted, the version checked, and the invocation form actually used.

The scoring is against the CLI’s default configuration on a fresh install. Pre-approved rules, such as Claude Code’s permissions.allow list or Kimi’s static deny rules, change the picture and are noted where they do, but the table records the shipped default, because that is the state a new machine, a CI runner, or a colleague’s laptop starts from. One row is an exception it states on its face: Grok Build’s cell records the value in this machine’s config, because no vendor statement of the factory default was located.

Kimi Code · -p
Writes and runs shell, no opt-out
auto

Vendor docs: non-interactive mode uses the auto permission policy; --prompt cannot be combined with --yolo, --auto or --plan. Observed on the census machine: a file written and a shell command run with zero flags and no warning.

Documented + observed
Qwen Code · -p
Refuses to write until flagged
-y

Without -y the headless run prints the generated code, exits 1 and writes nothing. Vendor docs call the headless default Ask Permissions mode; YOLO mode (-y) approves all tool calls including file edits and shell.

Documented + observed
Codex CLI · exec
Default sandbox refuses writes
read-only

Vendor docs, verbatim: “By default, codex exec runs in a read-only sandbox.” Writes need -s workspace-write; unattended runs also need -a never. The sandbox stays on in workspace-write.

Documented + observed
Muse Code · exec
Approval and sandbox both on
on

The CLI’s own --help states approval and an OS sandbox are on by default. --disable-approval drops the prompt and keeps the sandbox; --yolo drops both. No public vendor docs page was located.

CLI --help + smoke test only
DeepSeek Harness · headless
Writes freely inside the workspace root
ws-write

workspace-write is the shipped preset: an unattended run can create and edit files anywhere under the root and cannot escape it. Shell is nominally ask, but headless there is nobody to answer it.

Config inspection + direct testing
Claude Code · -p
Asks until a mode is passed
Manual

Vendor docs, verbatim: “For -p, the built-in starting permission mode is Manual on every plan, so pass the permission mode you want.” --permission-mode plan is the explicit read-only mode.

Documented + observed

02MethodologyHow the table was built, and what is read versus inferred.

Methodology

What was collected. For each of 12 coding-agent CLIs (13 table rows, because GLM-5.3 is reachable through two routes with different permission models): the headless default for file writes and for shell execution, the flag that enables writes, the read-only option, the sandbox and its default state, the folder-trust gate, the version checked, and the invocation form used. Data as of August 22, 2026. That is the dataset’s as-of date, carried on the table itself and stated independently of the publish date; limitation (c) below gives the date the vendor pages were fetched.

Sources, two classes, labelled per row. Documented + observed (9 CLIs, rows 1 to 10): Claude Code, Codex CLI, Qwen Code, Kimi Code, Grok Build, Antigravity CLI, GLM-5.3 via both ZCode and Claude Code, Muse Code and DeepSeek Harness are installed on one MacBook Pro (Apple silicon) under their normal auth and were run headless in empty scratch directories using each CLI’s real one-shot flag. The observation date for folder-trust pre-seeding and zero-dialog boot is the 8-agent fleet boot of August 17, 2026; the wrapper scripts for Qwen, Muse and DeepSeek Harness were exercised separately. Every observed cell was then cross-checked against the vendor’s own documentation page, linked in the row. Documented only (3 rows, 11 to 13): Cursor CLI, GitHub Copilot CLI and Gemini CLI (legacy) are not installed here; their cells come solely from vendor documentation, with no local run.

Read versus inferred, stated plainly. The documented default for Claude Code, Codex, Antigravity, Copilot and Gemini CLI — ask, propose-only or refuse, as each row states — was read from vendor docs; Cursor’s row rests on search synthesis of its docs rather than a direct page read. Kimi’s “writes and runs with no opt-out” was read from Kimi’s docs and observed directly. Qwen’s “refuses without -y” was observed (exit 1, nothing written) and matches the documented Ask Permissions default. Three rows have no public vendor doc page located: Muse Code (facts from the CLI’s own --help and an echo-provider smoke test; not yet run against a billed model call), DeepSeek Harness (facts from its --dump-config output and direct testing) and bare ZCode for GLM-5.3 (Z.ai’s public docs cover only the desktop GUI; the yolo default is direct observation). DeepSeek Harness’s shell cell, “functions as unconditional headless”, is inferred from testing, not documented. Grok’s always-approve is the value in this machine’s config.toml, read, not a claim about the factory default: no vendor statement of that default was located in the pages fetched for this row.

Excluded, and why. Aider and OpenCode are installed or known but have no permission-default facts in this toolchain’s notes; Hermes Agent (Nous) is installed with no documented permission model. None is guessed; all three are omitted rather than filled in.

Known limitations. (a) Twelve CLIs is what one operator runs plus three widely used CLIs documented but not run; it is not a market survey. (b) Versions move fast: Claude Code alone shipped a release every day from August 17 to 21; each row states the version at check time. (c) Vendor documentation pages carry no per-page date. The vendor pages were fetched on August 23, 2026, one day after the dataset’s August 22, 2026 as-of date; cells reflect the page content as read on that fetch date. (d) Defaults are scored on a fresh install, not after a user has pre-approved rules. (e) Muse Code’s row rests on --help inspection and a smoke test only. (f) The Antigravity CLI row records the documented diff-review default and the trust-store mechanism verified at the fleet boot; artefact-path behaviour under the skip flag is outside this table’s scope.

Every row carries one of three source statuses. The difference between the second and third is the part a reader citing a single cell needs most:

Tier 1
Documented + observed
installed · run headless · cross-checked against vendor docs

The CLI is installed on the census machine, was run non-interactively in an empty directory, and every cell was compared with the vendor’s published documentation. Where docs and observation agree, the cell quotes the docs. Nine CLIs, ten rows.

Claude Code · Codex · Qwen · Kimi · Grok · Antigravity · GLM-5.3 (both routes) · Muse · DeepSeek Harness
Tier 2
Documented only
vendor docs read · no local run

The CLI is not installed here. Cells come from the vendor’s own documentation pages and nothing else. The behaviour has not been reproduced, so a documentation error would propagate into the row unchallenged.

Cursor CLI · GitHub Copilot CLI · Gemini CLI (legacy)
Sub-status
No public doc located
observed · source is the CLI itself

Three Tier 1 rows have no vendor documentation page for their permission model that this pass could find. Their source cell names exactly what was read instead: the CLI’s --help, its --dump-config output, or direct testing.

Muse Code · DeepSeek Harness · ZCode (bare)

03The DatasetThe complete table: 13 rows, one claim per cell.

The table below is the asset: all 13 rows, no summary substitution. Product names link to the primary vendor page each row was scored against; rows whose source is the CLI itself say so in place of a link. The last column is the confidence tier and, for observed rows, the observation date. Data as of August 22, 2026. The table scrolls horizontally.

Coding-agent permission-defaults census, data as of August 22, 2026: 12 coding-agent CLIs in 13 rows, scored on the headless default for file writes and shell execution, the flag that enables writes, the read-only option, the sandbox and its default state, the folder-trust gate, the version checked and the invocation form. Rows 1 to 10 are documented and observed on one MacBook Pro; rows 11 to 13 (Cursor CLI, GitHub Copilot CLI, Gemini CLI legacy) are documented only with no local run.
#CLI (vendor) · sourceVersion checkedHeadless formFile writes defaultShell exec defaultFlag that enables writesRead-only optionSandbox (isolates / default)Folder-trust gateConfidence · observed
Rows 1–10 · Documented + observed on one machine (9 CLIs; GLM-5.3 in two routes)
1Claude Code (Anthropic)code.claude.com/docs/en/headlesscode.claude.com/docs/en/iamv2.1.239 (2026-08-21)claude -p "<prompt>"Asks. Docs, verbatim: “For -p, the built-in starting permission mode is Manual on every plan, so pass the permission mode you want.”Asks (same Manual default; Bash needs an allowedTools / permissions.allow entry or a mode flag)--dangerously-skip-permissions, or --permission-mode auto | acceptEdits | dontAskDefault is itself read-only until a mode is passed; --permission-mode plan is the explicit read-only modeNone built in beyond OS-level file-system rules; v2.1.236 (2026-08-19) added macOS sandbox wildcard-deny hardening for files like **/.env~/.claude.json projects[dir].hasTrustDialogAccepted. Docs, verbatim: “A -p session shows no workspace trust dialog and no per-server approval prompt.” Hooks / MCP in an untrusted folder still run under -p unless --bare is passedDocumented + observed2026-08-17 fleet boot, zero dialogs
2Codex CLI (OpenAI)learn.chatgpt.com/docs/codex/non-interactive-modelearn.chatgpt.com/docs/codex/agent-approvals-security0.149.0 (rust-v0.149.0, 2026-08-20)codex exec -s <mode> -a <policy> "<prompt>"Refuses by default. Docs, verbatim: “By default, codex exec runs in a read-only sandbox.”Refuses by default (same read-only sandbox; -a never plus -s workspace-write needed to run without asking)-s workspace-write (writes) + -a never (no prompts); --dangerously-bypass-approvals-and-sandbox for both at once-s read-only is the default; no flag neededReal OS sandbox (Seatbelt on macOS, bubblewrap on Linux); three modes: read-only (default), workspace-write, danger-full-access~/.codex/config.toml [projects."<dir>"] trust_level = "trusted"Documented + observed2026-08-17 fleet boot
3Qwen Code (Alibaba)github.com/QwenLM/qwen-code · approval-mode.md0.21.0 (2026-07-26)qwen -y -p "<prompt>"Refuses silently without -y: prints the generated code, exits 1, writes nothing. Vendor term for the headless default: Ask Permissions modeRefuses (same mode gates shell)-y / --yolo (YOLO mode: auto-approves all tool calls including file editing and shell commands)Omitting -y is itself the read-only path, though the run fails rather than completing cleanly-s / --sandbox flag exists; opt-in, not on by defaultNone observedDocumented + observed2026-08-17 fleet boot · wrapper tested repeatedly
4Kimi Code (Moonshot)moonshotai.github.io/kimi-cli · interaction guide0.29.1 (2026-07-26)kimi -p "<prompt>"Writes unconditionally, no opt-out. Docs, verbatim: “In -p mode, no human approval is requested — regular tool calls are handled under the auto permission policy, while static deny rules remain in effect.”Runs unconditionally (same auto policy covers shell)N/A: no flag; it is the unconditional default. Docs: “--prompt cannot be used with --yolo, --auto, or --plan”None for -p. Interactive --plan mode (“the AI can only use read-only tools”) is incompatible with -pNone; the only backstop is static deny rules in ~/.kimi-code/config.toml~/.kimi-code/workspace-trust/wd_<basename>_<sha256(dir)[:12]>Documented + observed2026-08-17 fleet boot · direct test wrote a file and ran a shell command with zero flags
5Grok Build, grok-cli (xAI)docs.x.ai/build/features/permissionsdocs.x.ai/build/modes-and-commandsVersion string not pinned in-window; vendor docs as current at checkgrok -p "<prompt>"Factory default not located in the fetched vendor pages. Docs list three permission_mode values: auto, ask, always-approve; the pages read for this row do not say which one a fresh install ships with. This machine’s ~/.grok/config.toml carries always-approve, so writes proceed here without askingSame permission_mode governs shell (run_command)N/A under always-approve; to tighten, set permission_mode = ask or pass --permission-mode plan--permission-mode plan; docs state plan mode is independent of the approval mode, edit tools stay limited while planning--sandbox <profile> flag exists; not on by defaultNone observed; vendor docs and local notes agree no folder-trust dialog existsDocumented + observed2026-08-17 fleet boot
6Antigravity CLI, agy (Google)antigravity.google/docs/cli/modesantigravity.google/docs/cli/usingv1.1.17 (2026-08-20, changelog)agy -p "<prompt>"Asks per file write without the skip flag. Docs, verbatim: default mode “pauses for interactive diff review before modifying or creating files.”Governed separately. Docs, verbatim: “Shell commands are governed separately from file operations… run_command still goes through your tool permission rules in every mode.”--dangerously-skip-permissions (all prompts) or --mode accept-edits (edits only; shell still gated)--mode plan--sandbox flag (terminal restrictions); combining it with --dangerously-skip-permissions has an open vendor-tracked issue (agent can bypass the sandbox)~/.gemini/antigravity-cli/settings.json trustedWorkspaces[], pre-seeded before the fleet bootDocumented + observed2026-08-17 fleet boot, folder trust
7GLM-5.3 via ZCode CLI, bare (Z.ai)zcode.z.ai/en/docs (GUI-only coverage)permission default: direct testing, no vendor doc locatedzcode bundled in ZCode.app; no independent version string; TUI package absent, headless onlyzcode -p "<prompt>"Yolo by default when called bare: direct testing, not a published vendor doc. The local wrapper overrides this to plan (read-only) as its own defaultSame yolo default covers shell--write (edit mode) or explicit --yolo; bare -p is already yoloplan mode (the wrapper’s default, not zcode’s own bare default)None observedNone observedDocumented + observed (no public doc for the default)2026-08-17
8GLM-5.3 via Claude Code (Z.ai Anthropic-compatible endpoint)docs.z.ai/devpack/tool/claudepermission model: code.claude.com/docs/en/headless (row 1)Claude Code binary (row 1) pointed at api.z.ai/api/anthropicANTHROPIC_BASE_URL=… claude -p "<prompt>" --model glm-5.3Inherits Claude Code’s model exactly: asks unless a mode or flag is passedInherits Claude Code’s modelSame as row 1Same as row 1 (--permission-mode plan)Same as row 1; no dedicated sandbox, same binary, same **/.env hardeningInherits the ~/.claude.json trust storeDocumented + observed2026-08-17 fleet boot
9Muse Code (Meta)source: CLI --help output; no public vendor docs page located0.1.0 (0.1.0-R708.1), installed 2026-08-10muse exec --disable-approval "<prompt>"Asks by default (on-request approval). Per the CLI’s own --help: approval and an OS sandbox are on by defaultSame on-request default; sandboxed even once approval is disabled--disable-approval (approval only; sandbox stays on) or --yolo (drops both; local wrapper requires a clean git tree)--disable-write / --disable-shellOn by default. --sandbox-network defaults to proxy-onlyWorkspace-trust prompt on first run in a project; --trust-workspace to pre-approveObserved via --help + echo-provider smoke test only2026-08-10 install · not yet run against a billed model call
10DeepSeek Harness, dsh (DeepSeek)github.com/deepseek-ai/deepseek-harness (MIT)permission presets: --dump-config output + direct testing; no public doc page located0.1.0-rc.6, installed 2026-08-16dsh --profile headless -p "<prompt>" (env DSH_PERMISSION_MODE=<mode>)Writes freely inside the workspace root. workspace-write is the shipped default preset and cannot escape the rootNominally ask; headless there is nobody attached to answer, so it functions as unconditional within the root (inferred from testing)N/A, workspace-write already writes; DSH_PERMISSION_MODE=danger-full-access removes the root confinementDSH_PERMISSION_MODE=read-onlyWorkspace-root confinement only, not a full OS sandbox; three presets: read-only, workspace-write (default), danger-full-accessNone observed for CLI use; the web UI’s Settings → General → Permission is the nearest analogue and is not retroactive to running sessionsDocumented + observed (no public doc for the presets)2026-08-16 install · 2026-08-17 a session found on danger-full-access and reset
Rows 11–13 · Documented only (not installed on the census machine; no local run)
11Cursor CLI, cursor-agent (Anysphere)cursor.com/docs/cli/headlesscursor.com/docs/cli/overviewNot installed; current per Cursor’s own docs at checkcursor-agent -p "<prompt>" --force (or --yolo)Proposes only, does not write, by default. Docs wording, reconstructed from two independent search retrievals that agreed, not read off the page here: “Without --force, changes are only proposed, not applied.”Same gate; /auto-run or --force / --yolo needed--force (aliased --yolo)The default is itself the propose-only path--sandbox <mode> flag; docs describe network-access tiers for command execution--force also “implicitly trusts the workspace” and “skips MCP confirmation prompts”: folder trust and tool approval share one flag. Wording via search synthesis of Cursor’s CLI docs, not a direct page readDocumented onlynot run locally
12GitHub Copilot CLI (GitHub / Microsoft)docs.github.com · copilot-cli/allowing-toolsdocs.github.com · copilot-cli/autopilotNot installed; current per GitHub Docs at checkcopilot -p "<prompt>" --allow-tool <name> (or --allow-all-tools)Asks by default, for state-changing actions only. Docs, verbatim: “Read-only operations like searching, reading files, and running read-only shell commands are allowed automatically”; write / destructive actions “require your explicit approval before Copilot can use them”Same split: read-only shell auto-allowed, destructive shell needs explicit approval--allow-tool <name> or --allow-all-tools; --allow-all / --yolo are documented aliases combining --allow-all-tools, --allow-all-paths, --allow-all-urlsThe default read-only allowance is itself the safe path; GitHub’s guidance prefers --allow-tool and --deny-tool over broad approvalsNot described as an OS sandbox in the fetched CLI docspermissions-config.json; deny rules “always take precedence… even when --allow-all is set”Documented onlynot run locally
13Gemini CLI, legacy (Google)github.com/google-gemini/gemini-cli · configuration.mdv0.57.0-preview.0 (2026-08-19, explicitly preview)gemini -p "<prompt>" --approval-mode <mode>Asks by default: the default approval mode prompts for approval on each tool callSame default mode governs shell tool calls--approval-mode auto_edit (edits only) or --approval-mode yolo / --yolo (everything)The default mode is itself ask-first; no dedicated read-only flag beyond declining promptsEnabled automatically when --yolo is used, via a pre-built gemini-cli-sandbox Docker image; the only row where the sandbox turns on because approvals turn offNot characterised in the fetched docs; superseded track (Antigravity CLI carries the trust store this machine uses)Documented onlynot run locally

Three conventions keep the cells citable. Where a vendor doc states the default, the cell quotes it. Where the default was observed but no doc states it (rows 7, 9, 10), the cell says “direct testing” or names the CLI output it came from. Where neither a doc nor a test resolves the question (Grok’s factory default, Muse under a billed call), the cell records the gap instead of a guess.

04One ChartFile writes against shell execution, all 13 rows on one grid.

The grid plots the two primary columns of the table against each other. Columns are the headless file-write default; rows are the headless shell default. Each CLI sits in exactly one cell. Six of the nine cells are empty, which is itself a finding: no CLI in the set asks about writes but runs shell freely, or the reverse. The two behaviours travel together.

Headless file-write default against headless shell-execution default for 13 coding-agent CLI rows, data as of August 22, 2026Three by three grid. Refuses writes and refuses shell: Codex CLI, Qwen Code (2 rows). Asks on writes and asks on shell: Claude Code, Antigravity CLI, GLM-5.3 via Claude Code, Muse Code, Cursor CLI, GitHub Copilot CLI, Gemini CLI legacy (7 rows). Writes without asking and runs shell without asking: Kimi Code, GLM-5.3 via bare ZCode, DeepSeek Harness within its workspace root, Grok Build as configured on the census machine (4 rows). All other cells are empty.HEADLESS DEFAULTS · FILE WRITES × SHELL EXECUTION · 13 ROWSData as of 2026-08-22 · † documented only · * see footnoteSHELL EXECUTION DEFAULTFILE-WRITE DEFAULTRuns without askingAsksRefuses until flaggedRefuses until flaggedAsks / proposes onlyWrites without asking0 rows0 rows0 rows0 rows0 rows0 rows2 ROWSCodex CLIQwen Code7 ROWSClaude CodeAntigravity CLIGLM-5.3 via Claude CodeMuse CodeCursor CLI †GitHub Copilot CLI †Gemini CLI (legacy) †4 ROWSKimi Code (no opt-out)GLM-5.3 via bare ZCodeDeepSeek Harness *Grok Build *
Rendered from the File writes and Shell exec columns of the table above. Data as of August 22, 2026. † documented only, not run here. * DeepSeek Harness writes and, in practice, runs shell only inside its workspace root (shell is nominally ask; unenforced headless). * Grok Build is plotted as configured on the census machine (always-approve); no vendor statement of the factory default was located for this row. Source: Digital Applied, coding-agent permission-defaults census.

Read the grid as a distribution, not a league table. Seven of 13 rows, a clear majority, ask and therefore stall or fail when nobody answers. Two refuse outright until flagged, which for an unattended job is the same outcome with a cleaner exit. Four proceed. Of those four, one has no flag that changes the behaviour under -p(Kimi Code), one is a bare binary the local wrapper never calls without a mode (ZCode), one is confined to a directory by design (DeepSeek Harness), and one is a configured value rather than a shipped one (Grok Build).

05The OutliersKimi and Qwen chose opposite answers to the same question.

Two CLIs in the same rough category, bulk and mechanical coding agents sold on prepaid quota, answer the headless question in exactly opposite ways. Kimi Code’s -p mode writes files and runs shell commands with no approval step, and the vendor documentation is explicit that the flags which would tighten it cannot be combined with --prompt. On the census machine, a headless Kimi run wrote a file and executed a shell command with zero flags and no warning, which matches the docs exactly. It is the only row in the table where the read-only column says “none”.

"In -p mode, no human approval is requested — regular tool calls are handled under the auto permission policy, while static deny rules remain in effect."— Kimi Code CLI documentation, interaction guide

Qwen Code does the reverse. Invoked with -p and no other flag, it generates the code, prints it, exits with status 1 and writes nothing. The vendor calls the headless default Ask Permissions mode; because there is nobody to ask, the practical effect is refusal. Passing -y switches to YOLO mode, which the docs describe as automatically approving all operations including file editing and shell commands. The failure mode is worth naming: a Qwen job that forgot -y does not damage anything, but it also reports failure for work it visibly completed in stdout, which is a confusing signal to debug.

Neither default is wrong in the abstract. Kimi’s position is that a non-interactive call is by definition an unattended one, and its backstop is the static deny list in config.toml, which the docs say remains in effect. Qwen’s position is that unattended should mean inert unless told otherwise. The census records both without ranking them; what it does insist on is that the two positions are a full spectrum apart and that a team moving work between the two CLIs needs to know which end it is standing on. The rest of what Kimi K3 does well, including its 1M-token context and video input, is covered in the K3 capabilities guide; this page is only about the permission default.

06IsolationThe sandbox-on-by-default club has two members.

A permission prompt and a sandbox are different controls. The prompt decides whether an action is attempted; the sandbox decides what the action can reach if it runs. Most of the table has the first and not the second. Only two rows run headless writes and shell inside a real OS-level sandbox with no flag passed: Codex CLI, whose default sandbox is read-only and which stays sandboxed once workspace-write is enabled (Seatbelt on macOS, bubblewrap on Linux, per OpenAI’s docs), and Muse Code, whose own --help states that approval and an OS sandbox are both on by default.

Sandbox posture by row · 13 rows

Source: Sandbox column of the census table · data as of August 22, 2026 · percentages are row counts over 13
Real OS sandbox on by defaultCodex CLI · Muse Code
2 of 13
Conditional: sandbox turns on with --yoloGemini CLI (legacy)
1 of 13
Workspace-root confinement onlyDeepSeek Harness (workspace-write preset)
1 of 13
Sandbox flag exists, off by defaultQwen Code · Grok Build · Antigravity CLI · Cursor CLI
4 of 13
None, or OS-level file rules onlyClaude Code · GLM-5.3 via Claude Code · Kimi Code · bare ZCode
4 of 13
Not described as an OS sandbox in fetched docsGitHub Copilot CLI
1 of 13

Gemini CLI (legacy) is the interesting third case and the one most likely to be misread. Its configuration reference states that the sandbox is enabled when --yolo or --approval-mode yolo is used, running inside a pre-built gemini-cli-sandbox Docker image. That is the inverse coupling of every other row: the isolation arrives precisely when the approvals leave. It is a documented-only row, so the behaviour has not been reproduced here, and the track is explicitly a preview release on a product Google has steered users away from since June 2026.

Two negative findings belong in this section. Claude Code has no built-in sandbox beyond OS-level file rules; what changed in the window is narrower than a sandbox: v2.1.236 (August 19) added macOS sandbox wildcard-deny hardening for files like **/.env, and v2.1.234 (August 17) closed the remaining pre-approval file accesses against the NTLM credential-leak vector, both per the changelog and covered in the operator-changes post. And Antigravity CLI’s --sandbox flag, combined with --dangerously-skip-permissions, carries an open vendor-tracked issue in which the agent can bypass the sandbox. A sandbox flag that exists is not the same as a sandbox that holds; the general escape patterns are catalogued in the sandbox-escapes reference, and the isolation models themselves in the sandboxing patterns guide.

Codex: the approval policy is a separate dial
Codex CLI’s sandbox and its approval policy are independent settings, which is why row 2 needs two flags to run unattended: -s workspace-write to permit writes inside the sandbox and -a never so that denied operations fail and return to the model instead of prompting. --dangerously-bypass-approvals-and-sandbox collapses both at once. The full profile and config-file system is walked through in the Codex CLI deep dive.

07Folder TrustSix different answers to “is this directory trusted?”

Folder trust is the gate most automation hits first and documents least. An agent booted in a directory it has never seen either prompts, refuses, or proceeds, and in a headless pane a prompt is indistinguishable from a hang. The fleet boot of August 17 was specifically a zero-dialog boot: every trust store was pre-seeded before the agents started, which is how the mechanisms in this column were verified. They differ more than the permission modes do.

Claude Code
JSON trust store, bypassed under -p
~/.claude.json → projects[dir].hasTrustDialogAccepted

Docs, verbatim: “A -p session shows no workspace trust dialog and no per-server approval prompt.” The consequence is that hooks and MCP servers in an untrusted folder still run under -p unless --bare is passed. GLM-5.3 via Claude Code inherits the same store.

Documented + observed · rows 1 and 8
Codex CLI
Per-project TOML trust level
~/.codex/config.toml → [projects.dir] trust_level

Trust is a keyed entry per directory path in the user config. Pre-seeding it is a one-line TOML addition per project, which is what the fleet boot did.

Documented + observed · row 2
Kimi Code
Hashed marker file per workspace
~/.kimi-code/workspace-trust/wd_<basename>_<sha256(dir)[:12]>

Trust is recorded as a file whose name is derived from the directory basename and the first twelve hex characters of the SHA-256 of the full path. Moving the directory changes the hash and drops the trust.

Documented + observed · row 4
Antigravity CLI
trustedWorkspaces array in settings
~/.gemini/antigravity-cli/settings.json → trustedWorkspaces[]

A JSON array of trusted paths, pre-seeded before the fleet boot. Gemini CLI (legacy) is not characterised on this point in the fetched docs; Antigravity is the actively maintained successor and carries the store this machine uses.

Documented + observed · row 6
Muse Code
First-run prompt, or --trust-workspace
interactive prompt on first run in a project

The CLI prompts on the first run in a new project; --trust-workspace pre-approves. --yolo bundles trusting the workspace with disabling approval and sandbox. Source is the CLI’s own --help.

CLI --help · row 9
Cursor CLI
One flag for trust and approval
--force implicitly trusts the workspace

Cursor’s CLI docs state that --force also “implicitly trusts the workspace” and “skips MCP confirmation prompts” — wording reached via search synthesis rather than a direct page read. Folder trust, tool approval and MCP confirmation are not separate gates for Cursor; the flag that enables writes enables all three.

Documented only · row 11

Three rows record no folder-trust gate at all: Qwen Code, Grok Build and bare ZCode (“none observed”). DeepSeek Harness has none for CLI use; the nearest analogue is the web UI’s permission setting, which is not retroactive to sessions already running. That last detail came from a direct finding on August 17, when a web-UI session was discovered set to danger-full-access and reset to workspace-write; the reset applied only to new sessions.

08Documented OnlyThree rows read, not run, and the cells that stayed open.

Cursor CLI, GitHub Copilot CLI and Gemini CLI (legacy) are in the table because a permission census of coding agents that omitted them would be incomplete, and they are marked documented-only because none is installed on the census machine. Their cells carry the vendor’s wording and nothing else. A documentation error in any of the three would propagate into the row unchallenged, which is the precise reason the tier is labelled rather than blended into the observed rows.

Two facts adjacent to the Copilot CLI row are deliberately kept out of it. GitHub’s changelog dated August 18 describes enterprise managed settings for Copilot in JetBrains, including permission-mode controls that can disable “Bypass Approvals” and “Autopilot” server-side. That is a control surface for the JetBrains plugin under enterprise administration, not the standalone CLI’s own default, so it is recorded here as its own fact. Separately, GitHub Copilot in Slack and in Microsoft Teams entered public preview on August 21 and run PR work in what GitHub describes as a cloud sandbox; that is a hosted product with its own billing and eligibility wording, not a local permission model, and it is covered in its own post.

What could not be closed

Grok Build’s factory default. xAI’s permissions page lists three permission_mode values, auto, ask and always-approve. No statement of which one a fresh install ships with was located in the pages fetched for this row. The census machine’s config carries always-approve. The row therefore says “factory default not located in the fetched vendor pages” and records this machine’s always-approve alongside it, and this post does not say Grok defaults to always-approve out of the box.

Muse Code under a billed call. Muse Code entered beta on August 5 and was added to this toolchain on August 10. Its permission facts come from the CLI’s own --help and an echo-provider smoke test. It had not yet been run against a billed model call at the as-of date, so the row’s observation claim is limited to exactly that and the table says so.

No public doc page for three rows. Muse Code, DeepSeek Harness’s permission presets, and bare ZCode’s headless default have no vendor documentation page this pass could locate. The source cell for each names the CLI output or test the fact came from instead of implying a page exists.

09Using the TableHow to read a row, and how to cite one.

The table is designed to be cited cell by cell. The file-write and shell columns answer the two headline questions; the flag column tells you what to add to an unattended invocation; the read-only column tells you whether a genuinely inert mode exists, which for Kimi under -p it does not. The last column is the part to quote alongside any cell: a documented-only row is a claim about documentation, and an observed row is a claim about one machine on one date.

The trend the table makes visible is that the industry has not converged. In August 2026 the headless default for the same action, writing a file, ranges from “exit 1 and write nothing” to “write it, run the build, and there is no flag to stop me”. The projection is that the spread narrows from the permissive end: the in-window change that touched file access on an observed row (Anthropic’s **/.env wildcard deny and the NTLM pre-approval closure) was made at the file level rather than by changing the mode, and Claude Code’s own auto-mode classifier, covered in the auto-mode shift post, is a move toward deciding per action rather than per session. Whether the permissive rows follow is what the next refresh of this page will record.

This slug is stable and the dataset is refreshed in place; the modified date in the page metadata is the refresh marker, and the as-of date travels with the table. For teams standardising an agent toolchain across several of these CLIs at once, the fleet-boot procedure that produced the observed rows is part of our AI transformation work; the table itself is free to use with attribution.

Cite this
Digital Applied, “What Coding Agents Do Without Asking: A Permission-Defaults Census,” Digital Applied Blog, August 22, 2026, https://www.digitalapplied.com/blog/coding-agent-permission-defaults-censusData as of August 22, 2026. Nine CLIs observed on one MacBook Pro (Apple silicon) and cross-checked against vendor documentation; three rows documented only. If you re-run a headless invocation later and a cell has changed, the change is the finding; cite the as-of date alongside the cell.

10ConclusionThe default is the production setting.

Permission defaults, August 2026

Twelve CLIs, two questions, three answers, and two cells left honestly open.

Asked what they do when nobody answers, 13 rows of coding-agent CLIs split into seven that ask, two that refuse, and four that proceed. One of the four has no flag that changes it. Two rows run inside a real OS sandbox without being told to; one turns its sandbox on only when approvals are turned off. Folder trust is implemented six different ways. None of this is in any single vendor’s documentation, because each vendor documents only itself.

The table carries its own uncertainty. Nine CLIs were run on one machine and checked against their docs; three were read and not run; three have no public doc page for their permission model at all, and their source cells say what was read instead. Grok’s factory default and Muse’s behaviour under a billed call are recorded as not resolved rather than guessed. A cell that says “unknown” is more useful to a reader than a cell that is confidently wrong.

The practical reading is short. Before an agent CLI goes into a script, read its row, add the flag the flag column names, and decide whether the sandbox column is acceptable for the directory it will run in. Then check the as-of date, because several of these tools ship weekly and this page is refreshed monthly.

Agent toolchains with the defaults set on purpose

Know what each agent does before it runs unattended.

We stand up multi-agent coding toolchains with the permission defaults, trust stores and sandboxes set deliberately per CLI, documented in a runbook your team can reproduce.

Free consultationExpert guidanceTailored solutions
What we work on

Agent-fleet engagements

  • Headless permission and trust-store baselines per CLI
  • Zero-dialog fleet boots for parallel agent runs
  • Sandbox policy for CI and unattended jobs
  • Cross-model review pipelines with read-only enforcement
  • Monthly re-verification as CLIs ship new defaults
FAQ · Permission-defaults census

Questions a reader citing a cell will ask.

Four of the 13 rows proceed with writes under their headless default, as of August 22, 2026: Kimi Code (its -p mode uses the auto permission policy and, per Kimi’s docs, cannot be combined with --plan, --auto or --yolo), GLM-5.3 through a bare ZCode call (yolo by default, observed directly, with no vendor doc page located), DeepSeek Harness (the shipped workspace-write preset writes anywhere under the workspace root and cannot escape it), and Grok Build as configured on the census machine, where config.toml carries always-approve. No vendor statement of Grok’s factory default was located for this census, so that row is a configured value rather than a shipped one. Every other row either asks, proposes without applying, or refuses until a flag is passed.
Related dispatches

Continue with agent tooling and sandboxes.

AI Development

Two Agent CLIs Shipped. Here Is What Actually Changed

Claude Code v2.1.234 hardened the remaining pre-approval NTLM path accesses. Codex CLI 0.148.0 added Bedrock and session forking. What changed for operators.

August 18, 2026 · 14 minRead
AI Development

Eight Headless Coding Agents, One Task: Tokens and Cost

One fixed Python task, run twice through eight headless coding-agent CLIs, with tokens, wall-clock time and list-price cost measured for every run.

August 22, 2026 · 22 minRead
AI Development

Claude Code Desktop Adds a Sandboxed Browser for Agents

Claude Code's desktop app now ships an in-app sandboxed browser. What agent-driven browsing, OAuth testing, and UI checks mean for dev teams in 2026.

July 12, 2026 · 10 minRead
AI Development

Effort Ladders for Every AI CLI and API: The Reference Table

Rung names, counts, defaults and whether reasoning can be switched off, across 18 coding-CLI and model-API surfaces, gaps and unresolved cells included.

August 22, 2026 · 21 minRead
AI Development

A Proxy Stripped One Header and Claude Code Paid Twice

Claude Code v2.1.239 fixed what its changelog calls silently doubled billed API calls: behind a proxy stripping Content-Type, it re-ran turns non-streaming.

August 21, 2026 · 18 minRead
AI Development

Google AI Plans: Free vs Plus vs Pro vs Ultra 2026

Google's AI subscription tiers after I/O 2026 — AI Plus $7.99, AI Pro $19.99, AI Ultra $100 (new), AI Ultra $200 (was $250). Feature matrix and decision tree.

May 23, 2026 · 14 minRead