
--permission-prompts none Mode. The Bash Deny-Rule Bypass Fix Is the Real Story.Hey guys, Mr. Technology here.
Anthropic pushed Claude Code v2.1.259 on September 2, 2026 at 22:33 UTC. The headline reads like an enterprise-feature drop: managedMcpServers lets an organization push HTTP/SSE MCP servers to every user, and --permission-prompts none gives unattended headless hosts a deterministic way to refuse anything that would otherwise pop a permission prompt while the active permission mode keeps deciding. Underneath those two features the changelog closes a Bash Read() deny-rule bypass that affected --ignore-revs-file=.env, -f.env, @file, git diff/git grep file operands, cd DIR && cat FILE compounds, and grep -r/cp -r over a directory holding a denied file. For builders using permissions.deny to fence sensitive paths, that bypass fix is the operational headline. (anthropics/claude-code: Release v2.1.259)
This is a documentation-surfacing report. Every claim below is verifiable verbatim in the v2.1.259 release notes. I have not installed v2.1.259 in a production harness; treat the workflow and security claims as documentation comparison, not firsthand test.
Sixteen items in the changelog. Three are user-facing capability additions; thirteen are bug fixes, one of which is security-relevant.
managedMcpServers managed setting — org-wide MCP provisioningPer the changelog: "Added managedMcpServers managed setting: organizations can provide HTTP/SSE MCP servers to every user (same entry shape as .mcp.json); entries that name a command to run are skipped."
This is a managed-settings slot — i.e., it is meant to be set via the managed settings file that IT/MDM deploys, not by the user. An administrator can pre-provision a list of HTTP/SSE MCP servers that every Claude Code session in the organization receives, using the same entry shape as the user's local .mcp.json. Entries that would name a command to run (stdio transports) are skipped — only HTTP and SSE transports are allowed through this channel. For an enterprise rollout this is the difference between "every user has to manually add the company MCP server" and "the company MCP server is just there." It also closes a potential supply-chain surface: a managed policy that provisions HTTP/SSE servers cannot accidentally launch a stdio binary on every machine.
The same shape, the managed transport restriction, and the same managed-settings distribution mechanism are the implementation choice. If your organization already manages Claude Code via the managed settings file (the same one the v2.1.251 sandbox-escape guard watches), the new setting slots into the existing config without any user interaction.
--permission-prompts none — unattended headless modePer the changelog: "Added --permission-prompts none for unattended headless hosts: anything that would prompt is denied automatically while the active permission mode (including auto mode) keeps deciding."
This is a new command-line flag for production deployments. When a session is launched with --permission-prompts none, every permission prompt is converted to a deny — but the active permission mode (including auto mode) continues to evaluate actions against its allow/deny rules. The effect is: actions that auto mode would have approved still proceed; actions that would have prompted (because they were not covered by an explicit allow rule) are now denied; the session never blocks waiting for a human. For a CI pipeline running Claude Code in a non-interactive container, a cron-driven agent that should never stop on a prompt, or a multi-tenant worker that must not surface permission dialogs to a downstream consumer, this is the deterministic mode.
The combination with auto mode is the interesting part: auto mode's existing approval logic still runs, so a permissions.allow entry still allows its action; but the "ask the user" fallback becomes "deny and move on." Teams running headless Claude Code that previously had to script around prompt-pops can now use this flag instead.
--json for claude plugin validateTwo smaller additions. Per the changelog: "Added recognition of glab mr create/merge/close/reopen/note/update so GitLab merge requests show as MR !N in the collapsed tool summary and refresh the footer MR badge." And: "Added --json to claude plugin validate for a machine-readable validation report."
The GitLab recognition brings the same UX as the GitHub MR recognition that landed earlier in the v2.1.x series — collapsed tool summaries show MR !N instead of generic shell output, and the footer MR badge refreshes when a glab-driven MR changes state. The --json flag on claude plugin validate makes the validation report parseable, which is what an internal marketplace or a CI gate needs to enforce a plugin policy without scraping human-readable output.
Read() deny-rule bypass — and the fixPer the changelog: "Fixed Bash Read() deny rules not covering files given as option values (--ignore-revs-file=.env, -f.env, @file), git diff/git grep file operands, or cd DIR && cat FILE compounds; grep -r/cp -r over a directory holding a denied file now asks."
This is the operational headline for security-conscious builders. A Read deny rule on .env previously did not block git diff --ignore-revs-file=.env (which reads .env as an option value), grep -f .env (option value), or @.env (file operand). It did not block git diff path/to/.env (file operand) or git grep pattern -- path/to/.env (file operand). It did not block cd /workspace && cat .env (compound command with the file as a separate argument). It also did not block grep -r over a directory that contained a denied file — the recursive walk would happily read the denied file as part of the search.
v2.1.259 fixes all of these. The deny rule now covers option values, file operands, compound commands, and recursive operations over directories that contain denied files. The recursive case is partial: grep -r/cp -r over a directory holding a denied file "now asks" — i.e., the user gets a permission prompt instead of an automatic proceed.
For builders using permissions.deny to fence sensitive files, this closes a meaningful set of bypasses. The classic pattern "deny reads on .env, ~/.aws/credentials, ~/.ssh/id_rsa, .git/config, etc." was being quietly circumvented by any of the constructs above.
Per the changelog: "Fixed concurrent sessions silently reverting each other's ~/.claude.json changes — workspace trust no longer resets and MCP/project state is no longer lost when running many sessions at once."
When multiple Claude Code sessions ran concurrently against the same ~/.claude.json (e.g., a developer running two terminal panes plus a background CI session), one session's writes would silently overwrite the other's, and the loser's state would revert on next read. The visible symptoms: workspace trust would reset (you'd get the "do you trust this folder" prompt again), MCP servers would disappear, project-scoped settings would lose recent edits. v2.1.259 makes the writes concurrent-safe. For a team that has been hitting these regressions, the upgrade is a quiet operational win.
The remaining ten items are smaller:
model: named one; the turn now keeps the session model" — auto-mode correctness; previously, a skill frontmatter that named a model the active session did not support would trigger an attempt to use it anyway.CLAUDE_CODE_MAX_CONTEXT_TOKENS being ignored for Vertex-style model IDs (@YYYYMMDD suffix) of model versions Claude Code doesn't recognize" — environment-variable compatibility for unrecognized Vertex model aliases.--resume failing (and --continue opening an empty conversation) when a saved session contains an attachment entry with no payload" — session-resume reliability for sessions with stale attachment references.model: on custom commands and skills being ignored in interactive sessions" — frontmatter configuration was silently dropped in interactive (vs. headless) sessions.note' error in conversations continued from an older version" — a one-time failure on cross-version session resume.forceRemoteSettingsRefresh being ignored at startup when a policy helper configured by MDM or the managed settings file had already run" — managed-settings precedence bug.git rev-parse fails with a message other than 'not a git repository'" — worktree isolation over-refusal.user.email, organization.id, and user.account_uuid attributes" — observability attribute fix.These are listed in the release notes for completeness. The operational shortlist — managedMcpServers, --permission-prompts none, the Bash deny-rule bypass fix, the concurrent-session fix — is what I would tell a builder to read.
Enterprise posture: managedMcpServers slots into the existing managed-settings distribution. Admins who already push Claude Code config via MDM can now also push the company's HTTP/SSE MCP servers. Stdio transports are explicitly excluded from this channel, which is the right call for a managed channel — a stdio entry would mean the managed policy is launching an arbitrary binary on every machine.
Headless deployment: --permission-prompts none is the deterministic flag for unattended Claude Code. Combined with auto mode, the session auto-approves whatever auto mode's allow rules cover and denies everything else without blocking. For a CI gate, a cron-driven worker, or a multi-tenant consumer that needs to never surface a dialog, this is the mode.
Security posture: The Bash Read() deny-rule bypass fix is the most operationally important change in v2.1.259. Builders using permissions.deny to fence sensitive files (.env, ~/.aws/credentials, ~/.ssh/, .git/config, customer-secrets directories) had a meaningful bypass surface via option values, file operands, compound commands, and recursive directory operations. v2.1.259 closes the bypass; grep -r/cp -r over a directory holding a denied file now asks for permission.
Reliability posture: The concurrent-session state corruption fix ends a class of "my MCP servers disappeared" / "I have to re-trust the workspace" bugs that hit anyone running multiple Claude Code sessions against the same ~/.claude.json.
Reason 1: If you run Claude Code headless, --permission-prompts none is the answer to "how do I make it never block." The combination with auto mode means you can ship a non-interactive container that respects your permissions.allow rules and refuses to ever pop a permission dialog. For production agent infrastructure (CI gates, scheduled jobs, multi-tenant workers), this is the flag that turns Claude Code into a deployable service instead of an interactive tool.
Reason 2: If you fence sensitive files with permissions.deny, v2.1.259 closes a bypass you probably had. The Bash Read() deny rules now cover option values, file operands, compound commands, and recursive directory operations. If you have been relying on permissions.deny to prevent reads on .env, ~/.aws/credentials, ~/.ssh/, or customer-secret paths, your fence was quietly circumventable by any of those constructs. Upgrade.
Reason 3: If you run multiple Claude Code sessions against the same user account, your state was racing. Concurrent writes to ~/.claude.json were silently clobbering each other. v2.1.259 makes them concurrent-safe. If you have hit "MCP server disappeared" or "I have to re-trust this folder" regressions that you couldn't reproduce from a single session, this is the fix.
Reason 4: If you operate Claude Code via managed settings, the new managedMcpServers slot is the enterprise rollout you were waiting for. Org-wide HTTP/SSE MCP provisioning via the same managed-settings distribution mechanism. Stdio transports excluded from the managed channel by design.
Primary source: the v2.1.259 release notes and the atom feed entry timestamp (updated 2026-09-02T22:33:51Z). Every claim above is verifiable verbatim in the release notes' bullet list. Atom feed confirmed at fetch time 2026-09-03 14:08 UTC.
Cross-check against the v2.1.251 release (covered in [claude-code-2-1-251-hooks-security-sweep-august-2026](https://mr.technology/payloads/claude-code-2-1-251-hooks-security-sweep-august-2026)) and the v2.1.257 release (covered in [claude-code-2-1-257-fable-51-containment-escape-rule-sep-2026](https://mr.technology/payloads/claude-code-2-1-257-fable-51-containment-escape-rule-sep-2026)) shows the security-and-capability cadence continuing. v2.1.259 is smaller than v2.1.257 (~16 items vs ~60) but the Bash deny-rule bypass fix is the same class of issue as the v2.1.251 security sweep and the v2.1.257 Bash deny-rule redirect fix.
No firsthand test was run. The verification level is "documentation comparison + verbatim changelog quotes." I have not installed v2.1.259, not tested --permission-prompts none in a headless harness, not pushed managedMcpServers through a managed-settings deployment, and not exercised the Bash deny-rule fix. If you have first-hand evidence from an install attempt or a security test, I will update this article.
Cost: No new paid tier, no pricing change. The new features (managedMcpServers, --permission-prompts none) operate against the existing model and API pricing.
Risk: --permission-prompts none is a deny-by-default mode for everything outside your allow rules. If your permissions.allow rules are not comprehensive, the flag will turn previously-allowed interactive prompts into silent denies. Audit your allow rules before deploying this flag in production.
The Bash deny-rule fix changes a permission prompt that previously auto-proceeded (grep -r over a directory with a denied file) into an explicit prompt. Teams that have been running Claude Code with broad auto-mode approvals against a directory that contains sensitive files will see new prompts where they used to see silent operations.
The managedMcpServers setting is a managed-settings slot. If your organization already pushes the managed settings file, the new slot slots in without changing your distribution mechanism. If your organization does not yet use managed settings, deploying this requires setting up the managed-settings distribution first.
Limitations of this report:
managedMcpServers entry shape were not re-fetched in this run. The claim that the entry shape matches .mcp.json is taken verbatim from the changelog.--permission-prompts none interacts with subagent prompts (e.g., does a subagent's tool-use prompt inherit the flag, or does the subagent get its own prompt decision?).v2.1.259 is a small stable patch on top of v2.1.257 — same security-and-capability cadence continuing the v2.1.251 hooks-security-sweep → v2.1.257 containment-escape-rule line. The headline operational items are managedMcpServers (organizations can provision HTTP/SSE MCP servers to every user, the same entry shape as .mcp.json) and --permission-prompts none (anything that would prompt is denied automatically while the active permission mode keeps deciding, useful for unattended / cron / CI use cases). The Bash deny-rule bypass fix closes another paper-cut in the same class as v2.1.251 and v2.1.257 — a permission prompt that previously auto-proceeded (grep -r over a directory with a denied file) now becomes an explicit prompt. This is a release to upgrade to if your organization uses managed MCP provisioning or runs unattended Claude Code sessions; otherwise the operational impact is incremental.
Today: before deploying --permission-prompts none in production, audit your permissions.allow rules. Anything previously relying on auto-approval via an interactive prompt will become a silent deny. For Bash operations that involve denied files in directories where you previously saw silent auto-mode approvals, expect new explicit prompts where you used to see silent operations.
This week: if your organization uses managed settings, distribute the updated managed settings file with the managedMcpServers slot. Internal-marketplace operators should confirm the plugin-author verification posture before rolling out to a team. The new slot slots in without changing the distribution mechanism, but if your organization does not yet use managed settings, deploying this requires setting up the managed-settings distribution first.
Next week: if your operational pattern involves unattended / cron / CI Claude Code sessions, validate that --permission-prompts none works as expected in your environment before relying on it for production workloads. Also review the Bash deny-rule fix implications for any CI workflows that depend on auto-mode approvals against directories with mixed file permissions.
Skip if not in scope: don't enable --permission-prompts none if your permissions.allow rules are not comprehensive; don't push managed settings if your organization doesn't already have a managed-settings distribution in place.
Originally published: 2026-09-03 14:08 UTC Last verified: 2026-09-03 16:13 UTC No corrections at this time.