Short answers to what readers ask most about this topic.
01What can Claude Code do without asking permission?
In manual mode it starts read-only and runs a built-in set of read-only commands — directory listings, file reads, repository status — without asking. Everything that modifies your system prompts first. In auto mode a classifier reviews actions instead of you, while your explicit ask and deny rules still apply on top.
02Does accept-edits mode only approve file edits?
No. It auto-approves file edits plus a fixed set of filesystem Bash commands for paths in the working directory, and that set includes remove and move alongside harmless ones like mkdir and touch. Other commands and out-of-scope paths still prompt, so the mode is bounded, but wider than the name suggests.
03Why does Claude Code keep asking me to trust my home directory?
Starting Claude Code directly in your home directory holds trust for the current session only and never writes it to disk, so the prompt reappears on every launch. There is no setting to persist it — your home directory contains everything, so a permanent grant would be far larger than trusting a project. Start from a project subdirectory instead.
04Are curl and wget auto-approved in Claude Code?
No, not at any level by default. Commands that fetch content from the web prompt like any other non-read-only command in manual mode, because a fetch is the step that turns a prompt-injection payload into an outbound request. To block them entirely rather than prompt, add them to permissions.deny.
05Where does code run in Claude Code on the web versus Remote Control?
Claude Code on the web executes in an isolated Anthropic-managed VM with limited network access, scoped git credentials, pushes restricted to the working branch, and audit logging. Remote Control involves no cloud VM at all — execution and file access stay on your machine, and the web interface is only a window onto that local process.
Claude Code Security Model: Layers, Trust and Limits
Read-only by default, an asymmetric directory boundary, and an accept-edits list that quietly includes rm. Here is what actually gates an agentic session.
Claude Code in manual mode starts read-only and asks before editing files or running system-modifying commands. The working-directory boundary is asymmetric: writes are confined to the start folder and its subfolders, reads outside it prompt in manual mode but not in auto mode. Accept-edits auto-approves file edits plus a fixed set of filesystem commands.
I switched a session to accept-edits mode expecting it to auto-approve file writes, which is what the name says. It also auto-approved a remove command, on a path inside my working directory, without asking. Nothing went wrong and nothing was lost, but I had been running the mode for weeks with a mental model that was narrower than the actual behaviour.
The security model here is layered and mostly sensible, and the useful thing is knowing precisely where each layer stops. This post covers the permission architecture and what read-only actually means, the directory boundary and why it behaves differently per mode, the prompt-injection defences, the trust dialog and its home-directory quirk, and where cloud execution differs from a local session.
Read-only first, and the set that is exempt
In manual mode Claude Code starts with read-only permissions and asks before editing files, running tests, or executing commands. There is a built-in set of read-only commands it runs without asking — directory listings, file reads, repository status — and everything else prompts, with the choice of approving once or allowing it from then on.
Auto mode replaces you rather than the gate: a separate classifier model reviews actions and blocks the ones it judges unsafe. Your explicit ask and deny rules still apply on top, and an organisation can turn auto mode off entirely. Which mode a session starts in depends on your plan, the surface you started it from, and both your settings and your organisation's — which is why two people on the same team can see different default behaviour and both be configured correctly.
The boundary is asymmetric, and mode-dependent
Writes and reads are treated differently, and the difference between modes is on the read side only. This is worth internalising because a mental model of one boundary is wrong in both directions.
# The working-directory boundary is NOT symmetric, and it
# changes between permission modes.
# Manual mode
# WRITE -> only the folder Claude Code started in, and its
# subfolders. Parent directories need explicit
# permission.
# READ -> asks before Read, Grep and Glob touch a path
# outside that boundary.
# Auto mode
# READ -> reads outside the boundary WITHOUT asking.
# Widen it deliberately with additional directories, or narrow
# the broad read access that read-only Bash commands get with
# sandbox denyRead rules — which apply only when sandboxing
# is actually enabled.
What accept-edits actually approves
The name undersells it. Accept-edits auto-approves file edits and a fixed set of filesystem commands for paths in the working directory — and that set includes remove and move as well as the harmless ones. Other commands and out-of-scope paths still prompt, so the mode is genuinely bounded, but the bound is wider than the label suggests.
# What "accept edits" really auto-approves. It is not
# "everything" — it is file edits plus a FIXED set of
# filesystem Bash commands, for paths inside the working
# directory:
mkdir touch rm mv cp sed
# Anything else, and any out-of-scope path, still prompts.
#
# Worth knowing that rm and sed are on that list. "Accept
# edits" sounds narrower than it is.
# Commands that fetch from the web are NOT auto-approved by
# default at any level:
curl wget
# In manual mode they prompt like any other non-read-only
# command. To block them outright rather than prompt:
# permissions.deny: ["Bash(curl *)", "Bash(wget *)"]
Commands that fetch content from the web are deliberately not auto-approved at any level. In manual mode they prompt like any other non-read-only command, so you can approve once or add an explicit allow rule. That default exists because a fetch is the step that turns a prompt-injection payload into an outbound request — if you are going to add a blanket allow rule for anything, this is the worst candidate.
The prompt-injection defences, layer by layer
No single mechanism here is a complete answer, and Anthropic says so plainly. What they add up to is several independent chances to catch the same attack:
The permission system itself, which requires explicit approval for sensitive operations in manual mode.
An isolated context window for web fetch, so fetched content cannot inject instructions into the main conversation.
Command-injection detection, where a suspicious command requires manual approval in manual mode even if it was previously allowlisted.
Fail-closed matching — an unmatched command requires approval rather than defaulting to allowed.
Natural-language descriptions attached to complex commands, so the thing you are approving is legible rather than a wall of shell.
Trust verification, and the home-directory trap
First-time runs in a codebase and newly added MCP servers both require trust verification. Two caveats matter more than the feature. Trust verification is disabled entirely when running non-interactively with the prompt flag, which is correct — there is nobody to ask — but means an automated run does not get this layer. And starting Claude Code directly in your home directory holds trust for the current session only, never writing it to disk, so the prompt reappears on every launch.
There is no setting to persist home-directory trust, and that is deliberate rather than an oversight — your home directory contains everything, so accepting it once permanently would be a much larger grant than accepting a project. If the repeated prompt is annoying you, the fix is to start Claude Code from a project subdirectory, where trust is saved per directory. Treat the recurring prompt as the design telling you something.
Local, cloud and Remote Control are three different models
These get conflated constantly, and they have genuinely different security properties. Getting them straight matters most when someone asks where the code runs, because the honest answer differs per surface.
Three surfaces, three answers:
Surface
Where code executes
Notable controls
Local terminal or IDE
Your machine
Permissions, sandboxing, the directory boundary
Claude Code on the web
An isolated Anthropic-managed VM
Network limits, scoped git credentials, pushes restricted to the working branch, audit logging
Remote Control
Your machine, driven remotely
No cloud VM at all; short-lived scoped credentials, transcript stored to sync devices
The practices that actually reduce risk
Stripping out the generic advice, four things change the risk profile measurably:
Use project-specific permission settings for sensitive repositories rather than one global configuration, and audit them periodically with the permissions command.
Put a dev container or a VM between an untrusted repository and your machine, especially when the work involves external web services.
Never pipe untrusted content directly into Claude — that is the single highest-yield attack path and the one your permission rules cannot see.
Audit or block settings changes mid-session with a configuration-change hook, so a session cannot quietly widen its own permissions.
Credentials are stored in the operating system keychain where one is available, and protected by file permissions on Windows and Linux. That difference is worth knowing before you decide how much a compromised container matters: on macOS the keychain is a real boundary, and on a Linux CI host the protection is filesystem permissions, which is a much weaker claim in a container someone else can enter.
The model is layered rather than absolute, and every layer names its own limit if you read for it. Claude Code only has the permissions you grant it, and reviewing what you are approving is genuinely part of the design rather than a disclaimer. The two habits worth building are reading the command in the prompt rather than the shape of it, and knowing which mode you are in — because the same action gets a different amount of scrutiny depending on an answer most people stop checking after the first week.