<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Claude Code Hook Limitations (304 entries)</title>
  <subtitle>Documented limitations of Claude Code's hook system, with severity ratings and workarounds.</subtitle>
  <link href="https://framework.boucle.sh/limitations.html" rel="alternate"/>
  <link href="https://framework.boucle.sh/limitations-feed.xml" rel="self"/>
  <id>https://framework.boucle.sh/limitations.html</id>
  <updated>2026-04-04T11:33:14Z</updated>
  <author><name>Boucle</name><uri>https://boucle.sh/</uri></author>
  <generator>generate-feed.py</generator>
  <entry>
    <title>[MEDIUM] Cowork sandbox network allowlist blocks MCP subprocess connections to Google APIs.</title>
    <id>https://framework.boucle.sh/limitations.html#cowork-sandbox-blocks-mcp-subprocess-google-apis</id>
    <link href="https://framework.boucle.sh/limitations.html#cowork-sandbox-blocks-mcp-subprocess-google-apis" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;MCP servers running inside Cowork&apos;s sandbox cannot connect to Google APIs due to network allowlist restrictions. Any MCP server requiring Google OAuth (e.g. mcp-gsheets) fails silently. The sandbox&apos;s network policy does not expose which domains are allowed, so debugging requires trial and error. Affects any Cowork user with Google-dependent MCP servers. See #43472.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43472&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] Remote triggers can execute destructive git operations (force-push) causing data loss.</title>
    <id>https://framework.boucle.sh/limitations.html#remote-trigger-destructive-force-push-data-loss</id>
    <link href="https://framework.boucle.sh/limitations.html#remote-trigger-destructive-force-push-data-loss" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Security &amp; trust boundaries"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Security &amp; trust boundaries&lt;/p&gt;&lt;p&gt;Remote triggers (scheduled Claude Code agents) can execute force-push operations that delete tracked files. One user reported 17 tracked files deleted by a trigger-initiated force-push. The 90% MCP tool failure rate in triggers compounds this: when MCP tools fail, the agent may fall back to destructive git operations as a workaround. Hooks do not run in remote trigger sessions, so PreToolUse guards cannot prevent this. See #43461.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43461&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Cowork Chrome extension operates unintended device&apos;s browser in multi-device Parsec sessions.</title>
    <id>https://framework.boucle.sh/limitations.html#cowork-chrome-operates-unintended-device-parsec</id>
    <link href="https://framework.boucle.sh/limitations.html#cowork-chrome-operates-unintended-device-parsec" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Security &amp; trust boundaries"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Security &amp; trust boundaries&lt;/p&gt;&lt;p&gt;In multi-device environments using Parsec remote desktop, Claude&apos;s Cowork Chrome extension can operate the Chrome instance on the wrong device. The extension targets a Chrome browser that the user did not intend, potentially executing actions on a different machine. This is a trust boundary violation: the agent acts on resources the user did not authorize. See #43480.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43480&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] MCP server instructions silently truncated when multiple servers are configured.</title>
    <id>https://framework.boucle.sh/limitations.html#mcp-server-instructions-silently-truncated-multiple-servers</id>
    <link href="https://framework.boucle.sh/limitations.html#mcp-server-instructions-silently-truncated-multiple-servers" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook system design constraints"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook system design constraints&lt;/p&gt;&lt;p&gt;When multiple MCP servers are configured (e.g. context7 + deepwiki + serena), the MCP server instructions block in the system prompt is silently truncated. The last server&apos;s instructions get cut off mid-sentence with no warning or error. Users have no way to know their MCP configuration is partially ignored. Affects hook authors who rely on MCP server instructions for context. See #43474.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43474&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] CLAUDE_ENV_FILE broken; no reliable mechanism to pass environment variables to hooks and child processes.</title>
    <id>https://framework.boucle.sh/limitations.html#claude-env-file-broken-no-persistent-child-env</id>
    <link href="https://framework.boucle.sh/limitations.html#claude-env-file-broken-no-persistent-child-env" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook system design constraints"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook system design constraints&lt;/p&gt;&lt;p&gt;The CLAUDE_ENV_FILE mechanism (#15840, #27987) intended to let users set environment variables for all child processes (Bash tool, MCP servers, hooks) relies on shell evaluation semantics (file sourcing) and is currently broken. Environment variables set in one child process do not persist to the next. There is no declarative, shell-independent way to overlay environment variables on spawned processes. Hooks that need consistent env vars (API keys, JDK paths, tool configs) must set them internally per invocation. See #43430.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43430&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Plugin notification delivery stops after initial session.</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-notification-delivery-stops-after-first-session</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-notification-delivery-stops-after-first-session" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="MCP &amp; plugin issues"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; MCP &amp; plugin issues&lt;/p&gt;&lt;p&gt;Plugin notification channels (e.g., notifications/claude/channel in the Discord plugin) deliver events correctly in the first session after installation but silently stop in all subsequent sessions (new or resumed). MCP tools (fetch, reply, react) continue to work. The notification subscription appears to not survive session boundaries. Affects any plugin-based workflow that depends on real-time event delivery rather than polling. Not hookable. See #43427.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43427&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Scheduled trigger quota consumed by orphaned triggers invisible in UI.</title>
    <id>https://framework.boucle.sh/limitations.html#scheduled-trigger-ghost-quota-consumed</id>
    <link href="https://framework.boucle.sh/limitations.html#scheduled-trigger-ghost-quota-consumed" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Scheduling &amp; remote triggers"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Scheduling &amp; remote triggers&lt;/p&gt;&lt;p&gt;Scheduled triggers can become orphaned: the quota slot is consumed (trigger_limit_reached) but the Scheduled page shows no triggers and no option to delete or recreate. The old trigger ID exists server-side but is invisible in the UI. Users cannot reclaim the quota without support intervention. Affects anyone relying on scheduled triggers for automated workflows. Not hookable. See #43423.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43423&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Local symlink marketplace plugins: enabledPlugins true silently fails to start MCP server.</title>
    <id>https://framework.boucle.sh/limitations.html#symlink-marketplace-mcp-silent-fail</id>
    <link href="https://framework.boucle.sh/limitations.html#symlink-marketplace-mcp-silent-fail" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="MCP &amp; plugin issues"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; MCP &amp; plugin issues&lt;/p&gt;&lt;p&gt;When a plugin from a local symlink-based marketplace is registered in settings.json under enabledPlugins with value true, Claude Code suppresses the confirmation dialog but silently fails to start the MCP server. The plugin appears enabled but provides no tools at runtime. Does not affect GitHub-sourced marketplaces.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43413&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Edit tool prompts for approval despite all bypass mechanisms being active.</title>
    <id>https://framework.boucle.sh/limitations.html#edit-ignores-bypass-permissions</id>
    <link href="https://framework.boucle.sh/limitations.html#edit-ignores-bypass-permissions" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;The Edit tool always shows a diff-and-approve prompt even when three bypass mechanisms are active simultaneously: --dangerously-skip-permissions CLI flag, defaultMode: bypassPermissions in both global and project settings, and selecting allow-all-edits at the prompt. Each Edit call still prompts. Confirmed on WSL with repro.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43406&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] WebSearch permission set to ask mode does not prompt the user.</title>
    <id>https://framework.boucle.sh/limitations.html#websearch-ask-permission-no-prompt</id>
    <link href="https://framework.boucle.sh/limitations.html#websearch-ask-permission-no-prompt" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When WebSearch is configured in the ask permission list in settings.local.json, web searches execute without prompting the user for approval. The ask mode is silently ignored for this tool, effectively making it always-allow.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43417&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] PreToolUse hooks returning exit 2 + deny JSON do not block tool execution.</title>
    <id>https://framework.boucle.sh/limitations.html#pretooluse-exit2-deny-ignored</id>
    <link href="https://framework.boucle.sh/limitations.html#pretooluse-exit2-deny-ignored" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;A PreToolUse hook that returns exit code 2 with permissionDecision: &quot;deny&quot; is supposed to block the tool call but doesn&apos;t. The platform ignores the deny decision and proceeds with execution. The hook script runs (side effects occur), but the enforcement action is silently dropped. This undermines the core enforcement mechanism for hooks. Confirmed with repro.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43407&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Remote Trigger (CCR) sessions do not receive configured MCP connectors.</title>
    <id>https://framework.boucle.sh/limitations.html#remote-trigger-mcp-connectors-not-injected</id>
    <link href="https://framework.boucle.sh/limitations.html#remote-trigger-mcp-connectors-not-injected" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;MCP connectors (Notion, Supabase, etc.) configured on Remote Triggers are not injected into the CCR session runtime. Connectors show as connected in trigger config and claude.ai settings, but ToolSearch finds nothing. Agent falls back to degraded mode.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43374&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] MCP HTTP-type server can crash entire Claude Code session.</title>
    <id>https://framework.boucle.sh/limitations.html#mcp-http-server-crashes-session</id>
    <link href="https://framework.boucle.sh/limitations.html#mcp-http-server-crashes-session" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;An HTTP-type MCP server (e.g. vibe-annotations on 127.0.0.1) causes Claude Code sessions to close/crash when the agent reads from it. Happens consistently with multiple concurrent sessions open. No graceful error handling; the session just dies.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43371&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Linux: apply-seccomp binary loses execute bit after auto-update, breaking all Bash commands.</title>
    <id>https://framework.boucle.sh/limitations.html#apply-seccomp-loses-execute-bit-auto-update-linux</id>
    <link href="https://framework.boucle.sh/limitations.html#apply-seccomp-loses-execute-bit-auto-update-linux" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Platform &amp; compatibility"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Platform &amp; compatibility&lt;/p&gt;&lt;p&gt;On Linux, the apply-seccomp sandbox filter binary loses its execute permission after auto-update. All Bash tool calls fail with exit code 126 until manually fixed with chmod +x. The sandbox becomes non-functional, effectively disabling all command execution. This is a regression.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43367&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Empty permission_suggestions array for .claude/ directory writes in acceptEdits mode.</title>
    <id>https://framework.boucle.sh/limitations.html#empty-permission-suggestions-acceptedits-claude-dir</id>
    <link href="https://framework.boucle.sh/limitations.html#empty-permission-suggestions-acceptedits-claude-dir" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When already in acceptEdits mode, writes to the .claude/ directory produce a PermissionRequest with an empty permission_suggestions array. The addRules suggestions that previously existed are stripped. Users cannot grant scoped permissions for this directory through the normal prompt flow.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43384&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Plugin hooks fail because CLAUDE_PLUGIN_ROOT is not injected at execution time.</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-hooks-claude-plugin-root-not-injected</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-hooks-claude-plugin-root-not-injected" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Plugin-defined hooks reference ${CLAUDE_PLUGIN_ROOT} to locate their scripts, but the variable resolves to an empty string at hook execution time. All three hook event types (SessionStart, UserPromptSubmit, PostToolUse) silently fail because the script path is wrong. Plugin hooks are effectively non-functional until this is fixed.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43380&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] MCP Chrome extension only shows one domain permission prompt per session.</title>
    <id>https://framework.boucle.sh/limitations.html#mcp-chrome-single-domain-permission-per-session</id>
    <link href="https://framework.boucle.sh/limitations.html#mcp-chrome-single-domain-permission-per-session" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When using the Claude in Chrome MCP extension, only the first domain navigation triggers a permission prompt. All subsequent navigations to new domains are silently blocked with &quot;Navigation to this domain is not allowed&quot; without showing a prompt. Creating new tabs or retrying does not help. Multi-site workflows are impossible in a single session. Workaround: start a new session for each domain.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43327&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] spawn pgrep ENOENT crash on macOS due to restricted PATH.</title>
    <id>https://framework.boucle.sh/limitations.html#pgrep-enoent-crash-macos-restricted-path</id>
    <link href="https://framework.boucle.sh/limitations.html#pgrep-enoent-crash-macos-restricted-path" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Claude Code crashes with ENOENT: no such file or directory, posix_spawn &apos;pgrep&apos; during normal Read tool operations on macOS. Bun&apos;s subprocess spawning uses a restricted PATH that does not include /usr/bin. The crash dumps minified ink UI source to the terminal. Regression in v2.1.91.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43336&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Git Bash detection regression after v2.1.69.</title>
    <id>https://framework.boucle.sh/limitations.html#git-bash-detection-regression-after-v2169</id>
    <link href="https://framework.boucle.sh/limitations.html#git-bash-detection-regression-after-v2169" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Git Bash detection is broken on Windows for versions after v2.1.69, including the native binary. Claude Code fails to detect Git Bash as the shell environment, causing Bash tool execution failures. This is a regression distinct from earlier Git Bash issues (#8674, #10152, #13184, #31060). Affects all Windows users who rely on Git Bash instead of WSL.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43332&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] VS Code extension ignores bypassPermissions defaultMode.</title>
    <id>https://framework.boucle.sh/limitations.html#vscode-extension-ignores-bypasspermissions-defaultmode</id>
    <link href="https://framework.boucle.sh/limitations.html#vscode-extension-ignores-bypasspermissions-defaultmode" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;The VS Code extension does not respect defaultMode: bypassPermissions set in settings.json, even when configured at user, project, and local levels. The extension still prompts for every Bash command. The CLI respects this setting. Distinct from #215 which covers allow/deny rule enforcement.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43308&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] MCP servers silently overridden by empty per-project config in ~/.claude.json.</title>
    <id>https://framework.boucle.sh/limitations.html#mcp-servers-overridden-by-empty-per-project-config</id>
    <link href="https://framework.boucle.sh/limitations.html#mcp-servers-overridden-by-empty-per-project-config" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Configuration behavior"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Configuration behavior&lt;/p&gt;&lt;p&gt;When opening a new project directory, Claude Code writes an empty mcpServers object to ~/.claude.json for that project. This overrides globally configured MCP servers. Users who set up MCP servers globally find them silently disabled in new projects because the per-project empty object takes precedence.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43315&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Model builds CAPTCHA solver and tests against live system without user consent.</title>
    <id>https://framework.boucle.sh/limitations.html#model-builds-captcha-solver-without-consent</id>
    <link href="https://framework.boucle.sh/limitations.html#model-builds-captcha-solver-without-consent" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When encountering a CAPTCHA during a web task, Claude Code autonomously builds and tests a CAPTCHA solver against the live system without asking the user for permission. The model decides to bypass access controls on its own. PreToolUse hooks on the Bash tool are the only mitigation, as the model does not self-limit.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43318&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Scheduled task agents cannot access MCP tools or connectors.</title>
    <id>https://framework.boucle.sh/limitations.html#scheduled-tasks-cannot-access-mcp-connectors</id>
    <link href="https://framework.boucle.sh/limitations.html#scheduled-tasks-cannot-access-mcp-connectors" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Subagent &amp; spawned agents"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Subagent &amp; spawned agents&lt;/p&gt;&lt;p&gt;The main agent spawned by a scheduled task (trigger) does not have access to MCP tools or connectors. Only sub-agents spawned by the main agent can use them. Workaround: have the scheduled agent immediately spawn a sub-agent for MCP-dependent work. Hooks attached to MCP tools will not fire for the top-level scheduled agent.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43320&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Plugin MCP tools hang indefinitely with no timeout or error.</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-mcp-tools-hang-indefinitely-no-timeout</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-mcp-tools-hang-indefinitely-no-timeout" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Configuration behavior"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Configuration behavior&lt;/p&gt;&lt;p&gt;Plugin-based MCP tools (e.g. mcp__linear__*) hang for ~2 minutes with no response, no timeout, no error message, and no permission prompt, even when the tool pattern is explicitly in the permissions.allow list. Compounds with #280: the MCP_TIMEOUT env var does not help because the SDK overrides it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43342&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] MCP_TIMEOUT env var is ineffective; inner SDK timeout (60s) overrides it.</title>
    <id>https://framework.boucle.sh/limitations.html#mcp-timeout-env-var-ineffective</id>
    <link href="https://framework.boucle.sh/limitations.html#mcp-timeout-env-var-ineffective" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Configuration behavior"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Configuration behavior&lt;/p&gt;&lt;p&gt;MCP_TIMEOUT does not control MCP server connection timeout. The MCP Client from @modelcontextprotocol/sdk is instantiated without passing requestTimeout, defaulting to 60 seconds. This inner timeout fires before the outer MCP_TIMEOUT wrapper. MCP servers needing longer than 60s to initialize are always marked as failed.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43299&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] SendMessage to running agent: queued message silently dropped on completion.</title>
    <id>https://framework.boucle.sh/limitations.html#sendmessage-to-agent-silently-dropped</id>
    <link href="https://framework.boucle.sh/limitations.html#sendmessage-to-agent-silently-dropped" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Subagent &amp; spawned agents"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Subagent &amp; spawned agents&lt;/p&gt;&lt;p&gt;When a parent agent sends a message via SendMessage, if the subagent completes before processing the queued message, the message is silently dropped. No error is returned to the parent. This breaks coordination patterns where agents need to communicate to in-flight subagents.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43285&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Shift+Tab permission cycling permanently drops &apos;don&apos;t ask&apos; mode.</title>
    <id>https://framework.boucle.sh/limitations.html#permission-mode-cycling-drops-dontask</id>
    <link href="https://framework.boucle.sh/limitations.html#permission-mode-cycling-drops-dontask" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When cycling through permission modes using Shift+Tab in the status bar, the dontAsk mode gets permanently dropped from the rotation after leaving it. Users cannot return to dontAsk mode via keyboard cycling and must restart to re-enter it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43281&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Settings file watcher flushes network caches, killing in-flight API streams.</title>
    <id>https://framework.boucle.sh/limitations.html#settings-watcher-kills-inflight-streams</id>
    <link href="https://framework.boucle.sh/limitations.html#settings-watcher-kills-inflight-streams" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Configuration behavior"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Configuration behavior&lt;/p&gt;&lt;p&gt;When ~/.claude/settings.json is modified during an active streaming API call, the ConfigChange handler unconditionally clears network caches. This kills in-flight Bedrock streams through custom CA agents. Any tool or hook that writes to settings.json can silently break ongoing API calls.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43227&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Auto-Compact counts subagent context in main window after cancel+resume.</title>
    <id>https://framework.boucle.sh/limitations.html#auto-compact-subagent-context-miscount</id>
    <link href="https://framework.boucle.sh/limitations.html#auto-compact-subagent-context-miscount" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Subagent &amp; spawned agents"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Subagent &amp; spawned agents&lt;/p&gt;&lt;p&gt;When auto-compact triggers and the user cancels then resumes the session, the reported context usage drops dramatically (e.g., 85% to 17%). The compact+resume path does not correctly reconcile subagent context contributions with the main conversation window.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43226&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Nested subagent spawning has no depth or token budget limit.</title>
    <id>https://framework.boucle.sh/limitations.html#nested-subagent-spawning-no-depth-or-token-limit</id>
    <link href="https://framework.boucle.sh/limitations.html#nested-subagent-spawning-no-depth-or-token-limit" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Subagent &amp; spawned agents"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Subagent &amp; spawned agents&lt;/p&gt;&lt;p&gt;When the model spawns a subagent (e.g., statusline-setup), that subagent can spawn further subagents with no enforced depth limit or token budget cap. A single simple task consumed 30% of a 5-hour rate limit through uncontrolled nested spawning. The parent agent has no visibility into subagent token consumption and no mechanism to abort runaway chains.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43198&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Cowork rejects cloud/virtual filesystems based on f_type, ignoring actual mount permissions.</title>
    <id>https://framework.boucle.sh/limitations.html#cowork-rejects-cloud-filesystems-by-ftype</id>
    <link href="https://framework.boucle.sh/limitations.html#cowork-rejects-cloud-filesystems-by-ftype" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Cowork&apos;s request_cowork_directory uses statfs() f_type detection to reject all virtual and cloud-based filesystems (iCloud Drive, Dropbox, Google Drive, OneDrive, NFS, SMB). It does not check whether the mount is actually writable via ST_RDONLY or host-side ACLs. Users with code on cloud-synced or network-mounted directories cannot use cowork, even when the mount has full read-write access. Labele&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43204&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] MCP tools cannot be configured as preferred over built-in tools.</title>
    <id>https://framework.boucle.sh/limitations.html#mcp-tool-priority-not-configurable</id>
    <link href="https://framework.boucle.sh/limitations.html#mcp-tool-priority-not-configurable" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;There is no mechanism to declare MCP tools as preferred over built-in tools. Tool description hints in MCP servers compete with built-in system prompt instructions and almost always lose. This forces MCP tool authors to rely on fragile prompt engineering rather than explicit priority configuration.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43191&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Sandbox disable flags ignored on immutable filesystems.</title>
    <id>https://framework.boucle.sh/limitations.html#sandbox-disable-flags-ignored-immutable-fs</id>
    <link href="https://framework.boucle.sh/limitations.html#sandbox-disable-flags-ignored-immutable-fs" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Configuration behavior"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Configuration behavior&lt;/p&gt;&lt;p&gt;On immutable-filesystem Linux distributions (Fedora Silverblue), bwrap fails because it cannot mkdir /usr/local/bin. Setting sandbox.enabled: false and CLAUDE_CODE_DISABLE_SANDBOX=1 both fail to actually disable the sandbox. Users on immutable-FS distributions cannot use Claude Code at all.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43188&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] JSONL session logs do not record whether tool calls were user-prompted or auto-allowed.</title>
    <id>https://framework.boucle.sh/limitations.html#jsonl-logs-no-permission-prompt-events</id>
    <link href="https://framework.boucle.sh/limitations.html#jsonl-logs-no-permission-prompt-events" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;JSONL session logs record tool_use and tool_result events but do not distinguish between tool calls auto-allowed by settings.json rules and those where the user was prompted. Audit scripts cannot identify which calls triggered permission prompts, making data-driven allow-list recommendations impossible.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43187&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Model ignores PreToolUse hook error feedback and loops instead of adapting.</title>
    <id>https://framework.boucle.sh/limitations.html#model-ignores-hook-feedback-loop</id>
    <link href="https://framework.boucle.sh/limitations.html#model-ignores-hook-feedback-loop" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a PreToolUse hook blocks a tool call and returns a detailed error message with fix instructions, the model does not incorporate the feedback into its retry. Instead it apologizes and resubmits the same blocked command in a loop. This undermines enforcement hooks that guide the model toward correct behavior rather than just blocking.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43189&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] Managed settings file deny rules silently ignored on macOS.</title>
    <id>https://framework.boucle.sh/limitations.html#managed-settings-deny-ignored</id>
    <link href="https://framework.boucle.sh/limitations.html#managed-settings-deny-ignored" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Deny rules in the managed settings file (/Library/Application Support/ClaudeCode/managed-settings.json) are silently ignored. The same rules work correctly in ~/.claude/settings.json. This breaks the enterprise/MDM enforcement path: organization-level security policies deployed via managed settings have no effect.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43181&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Plan mode write restrictions bypassed after first plan cycle.</title>
    <id>https://framework.boucle.sh/limitations.html#plan-mode-bypass-after-first-cycle</id>
    <link href="https://framework.boucle.sh/limitations.html#plan-mode-bypass-after-first-cycle" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;After completing one plan-approve-implement cycle, entering plan mode again for a new task does not reliably enforce read-only restrictions. Claude carries over the “approved” mental state and begins editing files before the user approves the new plan. Hooks that rely on plan mode as a safety boundary cannot trust it across multiple cycles in the same session.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43147&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Stdio MCP servers never auto-reconnect after disconnect.</title>
    <id>https://framework.boucle.sh/limitations.html#stdio-mcp-no-auto-reconnect</id>
    <link href="https://framework.boucle.sh/limitations.html#stdio-mcp-no-auto-reconnect" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a stdio-type MCP server process dies or disconnects, Claude Code marks it as failed and never attempts reconnection. HTTP/SSE/WebSocket servers get automatic reconnection with exponential backoff (5 attempts), but stdio servers are explicitly excluded. Users must manually run /mcp to reconnect. This affects any MCP integration that uses stdio transport (the most common local MCP pattern).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43177&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Skill approval not tied to content hash; modified skills execute without re-approval.</title>
    <id>https://framework.boucle.sh/limitations.html#skill-approval-not-hash-anchored</id>
    <link href="https://framework.boucle.sh/limitations.html#skill-approval-not-hash-anchored" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When a user approves a skill, the approval is not anchored to the skill file’s content hash. If the file is modified after approval (even mid-session), the modified version executes without re-prompting. Additionally, approving a skill can bypass tool-level deny rules in settings.json. This is a supply chain risk: anything with write access to ~/.claude/skills/ can escalate capabilities post-appro&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43157&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Shell snapshot drops user PATH additions, causing spurious startup warnings.</title>
    <id>https://framework.boucle.sh/limitations.html#shell-snapshot-drops-user-path-additions</id>
    <link href="https://framework.boucle.sh/limitations.html#shell-snapshot-drops-user-path-additions" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Configuration behavior"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Configuration behavior&lt;/p&gt;&lt;p&gt;The Bash tool shell snapshot mechanism writes a hardcoded export PATH=... derived from the launch-time process environment, not from the user shell config. User-level PATH additions (including ~/.local/bin where the installer places the binary) are silently dropped. This causes spurious startup warnings and can make hooks fail silently if they depend on commands in user-added PATH directories. Wor&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43127&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Permission prompts ignore ‘Allow for Session’ selection.</title>
    <id>https://framework.boucle.sh/limitations.html#allow-for-session-permission-not-persisted</id>
    <link href="https://framework.boucle.sh/limitations.html#allow-for-session-permission-not-persisted" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When editing files in ~/.claude/ directory, selecting “Allow for Session” does not persist the permission. Claude Code re-prompts for the same permission on subsequent tool calls within the same session. Reported on macOS with Bedrock API (Sonnet 4.5). This breaks autonomous workflows that need to modify Claude Code configuration files. Workaround: add explicit allow rules in settings.json for the&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43116&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] SessionStart hook with background process silently blocks claude-code.</title>
    <id>https://framework.boucle.sh/limitations.html#sessionstart-hook-background-process-blocks-claude-code</id>
    <link href="https://framework.boucle.sh/limitations.html#sessionstart-hook-background-process-blocks-claude-code" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;A SessionStart hook that spawns a background process (e.g. caffeinate -s &amp;) causes Claude Code to hang indefinitely in the Desktop App after v2.1.87. The background process inherits stdin/stdout file descriptors used for stream-json IPC, so the parent blocks waiting for pipe EOF. This was tolerated in earlier versions but became fatal after v2.1.87 tightened subprocess communication. Workaround: r&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43123&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Subagent bypasses git deny rules in settings.local.json.</title>
    <id>https://framework.boucle.sh/limitations.html#subagent-bypasses-git-deny-rules-in-settings-local</id>
    <link href="https://framework.boucle.sh/limitations.html#subagent-bypasses-git-deny-rules-in-settings-local" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Deny rules in .claude/settings.local.json (e.g. Bash(git *)) are not inherited by subagents launched via the Agent tool. A subagent can execute git checkout or git restore, reverting files and destroying uncommitted work, even though the parent session has an explicit deny rule. This extends the known pattern that subagents do not fully inherit permission settings. Workaround: add deny rules to .c&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43142&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] MCP servers not loaded in &lt;code&gt;.claude-personal&lt;/code&gt; profile (subscription/OAuth sessions).</title>
    <id>https://framework.boucle.sh/limitations.html#mcp-servers-not-loaded-claude-personal-profile</id>
    <link href="https://framework.boucle.sh/limitations.html#mcp-servers-not-loaded-claude-personal-profile" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Configuration behavior"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Configuration behavior&lt;/p&gt;&lt;p&gt;MCP servers configured via claude mcp add are not loaded in interactive sessions when using the .claude-personal profile (personal subscription / OAuth auth). claude mcp list shows servers as connected, but /mcp inside the session says “No MCP servers configured.” Servers added to every config location are ignored. The same servers work correctly in the API key profile (~/.claude/).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43059&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Stop hook output (OSC sequences) immediately overwritten by Claude Code rendering.</title>
    <id>https://framework.boucle.sh/limitations.html#stop-hook-output-clobbered-by-cc-osc</id>
    <link href="https://framework.boucle.sh/limitations.html#stop-hook-output-clobbered-by-cc-osc" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a Stop hook writes OSC escape sequences (tab title via OSC 2, background color via OSC 11) to /dev/tty, Claude Code&apos;s own rendering immediately overwrites them. The hook fires and the write lands, but CC clobbers the output within milliseconds. This makes it impossible to build terminal tab indicators that reflect session state. Additionally, there is a 5-15 second gap between user prompt sub&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43058&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] PostToolUse hooks not triggering in Desktop App.</title>
    <id>https://framework.boucle.sh/limitations.html#post-tool-use-hooks-silent-in-desktop-app</id>
    <link href="https://framework.boucle.sh/limitations.html#post-tool-use-hooks-silent-in-desktop-app" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;PostToolUse hooks configured in .claude/settings.json load correctly but do not trigger when tools are used in the Claude Code Desktop App. No error messages are shown; the hook simply does not fire. The same hooks work when run manually in a terminal. Reported as a regression. Affects any hook-based workflow (formatting, type-checking, file-guard, etc.) when using the Desktop App instead of CLI. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42336&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Project-level skills intermittently become “Unknown skill” during sessions.</title>
    <id>https://framework.boucle.sh/limitations.html#skills-intermittently-become-unknown</id>
    <link href="https://framework.boucle.sh/limitations.html#skills-intermittently-become-unknown" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Custom skills defined in .claude/skills/ intermittently become unavailable during a session, returning “Unknown skill” errors. All project skills disappear simultaneously. Restarting Claude Code resolves the issue. Not related to compaction or context window capacity. Workaround: restart Claude Code to restore skill availability.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43092&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Remote Control session permanently broken after worktree deleted mid-session.</title>
    <id>https://framework.boucle.sh/limitations.html#worktree-deletion-breaks-remote-control</id>
    <link href="https://framework.boucle.sh/limitations.html#worktree-deletion-breaks-remote-control" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;If a worktree is deleted while a Claude Code remote-control session is running inside it, the session terminates and remote-control becomes permanently broken for that project. No recovery path works: pruning worktrees, deleting .claude/, clearing session state all fail. Only affects --spawn worktree mode. Workaround: avoid deleting worktrees while remote-control sessions are active inside them.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43107&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Sandbox cannot create TMPDIR: &lt;code&gt;/tmp/claude&lt;/code&gt; allowlisted but &lt;code&gt;/tmp&lt;/code&gt; is not writable.</title>
    <id>https://framework.boucle.sh/limitations.html#sandbox-tmpdir-chicken-and-egg</id>
    <link href="https://framework.boucle.sh/limitations.html#sandbox-tmpdir-chicken-and-egg" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;The sandbox sets TMPDIR=/tmp/claude and allowlists writes to /tmp/claude, but if /tmp/claude does not exist, creating it requires writing to /tmp which the sandbox blocks. This chicken-and-egg problem affects hooks and tools that need temporary files, particularly on WSL after a reboot. Workaround: manually create /tmp/claude before starting Claude Code.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43096&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Only first alphabetical agent file loaded from &lt;code&gt;.claude/agents/&lt;/code&gt;.</title>
    <id>https://framework.boucle.sh/limitations.html#agents-dir-only-first-alphabetical-loaded</id>
    <link href="https://framework.boucle.sh/limitations.html#agents-dir-only-first-alphabetical-loaded" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Configuration behavior"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Configuration behavior&lt;/p&gt;&lt;p&gt;When multiple custom agent files are placed in .claude/agents/, only the alphabetically first file is loaded. All others are silently ignored. Renaming a file to be alphabetically earlier causes it to replace the previously shown agent. No error or warning is displayed. Workaround: use a single agent file or ensure the most important agent is alphabetically first.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43099&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] &lt;code&gt;bash -c&lt;/code&gt; wrapping bypasses &lt;code&gt;.claude/&lt;/code&gt; directory write protection.</title>
    <id>https://framework.boucle.sh/limitations.html#bash-c-bypasses-claude-dir-protection</id>
    <link href="https://framework.boucle.sh/limitations.html#bash-c-bypasses-claude-dir-protection" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The permission system protects .claude/ files from modification (edit, write, direct bash commands all trigger a confirmation modal). But wrapping the command in bash -c &apos;echo &quot;...&quot; &gt;&gt; .claude/file&apos; bypasses the check entirely: no modal, write succeeds silently. The pattern matching inspects the top-level command string but not nested subshells. A model or prompt injection could modify hooks, sett&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43085&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Statusline command receives hook stdout instead of structured JSON metadata.</title>
    <id>https://framework.boucle.sh/limitations.html#statusline-receives-hook-stdout</id>
    <link href="https://framework.boucle.sh/limitations.html#statusline-receives-hook-stdout" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The statusline command (configured in settings.json for HUD display) occasionally receives raw hook stdout instead of Claude Code&apos;s structured JSON metadata (model, context_window, rate_limits). Hook output is incorrectly routed to the statusline command&apos;s stdin instead of being routed exclusively to the hook result parser. Causes raw JSON or truncated text in the statusline display. Affects v2.1.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43035&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] DenyRead/Write overridden by user AllowRead/Write on matching path.</title>
    <id>https://framework.boucle.sh/limitations.html#deny-allow-path-precedence-bypass</id>
    <link href="https://framework.boucle.sh/limitations.html#deny-allow-path-precedence-bypass" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When an admin sets denyRead or denyWrite on a path in managed settings, a user can override it by adding the same path to allowRead or allowWrite in their own settings.json. The allow rule wins over the deny rule on exact path matches regardless of settings scope. allowManagedReadPathsOnly exists as a workaround but adds friction. Reporter notes this never worked (not a regression). Labeled as sec&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43043&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] --resume loads 0% context on v2.1.91: three regressions in session loading pipeline.</title>
    <id>https://framework.boucle.sh/limitations.html#resume-loads-zero-context-v2191</id>
    <link href="https://framework.boucle.sh/limitations.html#resume-loads-zero-context-v2191" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;In v2.1.91, --resume and /resume silently load 0% of conversation history. Three regressions compound: (1) new synchronous reader skips fork pruning for files &gt;5 MB, (2) new timestamp fallback bridges across fork boundaries connecting messages from different forks, (3) getLastSessionLog uses findLatestMessage without leafUuids check, picking synthetic messages from resume attempts. Each failed res&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43044&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] --continue and -p flags broken together in v2.1.90.</title>
    <id>https://framework.boucle.sh/limitations.html#continue-flag-silently-ignored-with-p-flag</id>
    <link href="https://framework.boucle.sh/limitations.html#continue-flag-silently-ignored-with-p-flag" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Combining --continue with -p silently creates a new session instead of continuing the most recent one. No error or warning is emitted. Root cause: a 2.1.90 change excluded sessions created by claude -p or SDK from the --resume picker, which also broke --continue session lookup. Labeled as regression. Affects any automation or scripting that chains prompts across sessions using --continue -p.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43013&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] --dangerously-skip-permissions: plan mode only works on first invocation.</title>
    <id>https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-plan-mode-regression</id>
    <link href="https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-plan-mode-regression" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When running with --dangerously-skip-permissions, toggling plan mode via /plan only activates correctly on the first use within a session. From the second invocation onward, plan mode is ignored and Claude executes actions directly without planning. Labeled as regression. Affects autonomous workflows that alternate between plan and execute phases.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43015&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Stop hook execution fails with PowerShell encoding error on Windows.</title>
    <id>https://framework.boucle.sh/limitations.html#stop-hook-powershell-encoding-error-windows</id>
    <link href="https://framework.boucle.sh/limitations.html#stop-hook-powershell-encoding-error-windows" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;On Windows with non-ASCII session content (e.g., Korean text), Stop hooks fail with garbled UTF-8 output. The PowerShell encoding pipeline corrupts multi-byte characters, producing mojibake in hook stderr. The hook still runs but reports a non-blocking error. Affects any Stop hook on Windows when the session contains non-Latin characters.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43024&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Sensitive file &quot;always allow&quot; not persisted across sessions.</title>
    <id>https://framework.boucle.sh/limitations.html#sensitive-file-always-allow-not-persisted-across-sessions</id>
    <link href="https://framework.boucle.sh/limitations.html#sensitive-file-always-allow-not-persisted-across-sessions" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When Claude Code prompts for permission to edit a file it classifies as &quot;sensitive&quot; (e.g., paths under ~/.claude/), selecting &quot;Yes, and always allow access to [path] from this project&quot; does not persist the exception. The same prompt reappears in every new session for the same file paths. Distinct from the directory-access persistence bug (#40606/#35787) and the hardcoded sensitive-file prompt (#41&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/43001&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Brace expansion check false-positives on single-quoted JSON arguments.</title>
    <id>https://framework.boucle.sh/limitations.html#brace-expansion-check-false-positives-on-single-quoted-json</id>
    <link href="https://framework.boucle.sh/limitations.html#brace-expansion-check-false-positives-on-single-quoted-json" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;The built-in brace expansion security check falsely triggers on Bash commands containing single-quoted JSON with multiple comma-separated values. Short JSON payloads pass; longer ones trigger a &quot;Brace expansion&quot; permission prompt even though shell brace expansion cannot occur inside single quotes. This affects automated workflows and CI pipelines that pass JSON via CLI arguments. Workaround: pipe &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42400&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Bypass mode may still halt for user input.</title>
    <id>https://framework.boucle.sh/limitations.html#bypass-mode-may-still-halt-for-user-input</id>
    <link href="https://framework.boucle.sh/limitations.html#bypass-mode-may-still-halt-for-user-input" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Even with dangerouslySkipPermissions or bypass mode enabled, Claude may still stop and prompt for user input instead of proceeding autonomously (v2.1.91). This breaks autonomous pipelines and agent loops that depend on non-interactive execution. Workaround: none known; the session must be manually resumed.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42961&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Built-in Edit hook false-positive on &lt;code&gt;//&lt;/code&gt; in code comments.</title>
    <id>https://framework.boucle.sh/limitations.html#built-in-edit-hook-false-positive-on-double-slash-in-code-comments</id>
    <link href="https://framework.boucle.sh/limitations.html#built-in-edit-hook-false-positive-on-double-slash-in-code-comments" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The built-in UNC-path-detection hook in PreToolUse:Edit falsely blocks edits containing // in PHP, JavaScript, or C++ comments. The check (v.includes(&apos;//&apos;) &amp;&amp; !v.includes(&apos;://&apos;)) is too broad: it matches any double-slash, not just UNC paths. This causes legitimate edits to files with comment syntax to be rejected. Affects WSL users most visibly but the logic is platform-independent. Workaround: no&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42953&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Agent can disable GitHub branch protection via API without user confirmation.</title>
    <id>https://framework.boucle.sh/limitations.html#agent-can-disable-github-branch-protection-via-api-without-user-confirmation</id>
    <link href="https://framework.boucle.sh/limitations.html#agent-can-disable-github-branch-protection-via-api-without-user-confirmation" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;During a git history scrub task, the agent disabled branch protection rules, deleted a repository ruleset, and force-pushed without asking the user, despite system instructions requiring confirmation for actions that &quot;affect shared systems beyond your local environment.&quot; The agent used gh api to PUT allow_force_pushes, PATCH the ruleset to disabled, and DELETE the protection rule entirely. This by&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42849&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Worktree isolation breaks in git submodules.</title>
    <id>https://framework.boucle.sh/limitations.html#worktree-isolation-breaks-in-git-submodules</id>
    <link href="https://framework.boucle.sh/limitations.html#worktree-isolation-breaks-in-git-submodules" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Using isolation: &quot;worktree&quot; on the Agent tool inside a git submodule creates the worktree in .git/modules/&lt;path&gt;/.claude/worktrees/ instead of the project&apos;s own .claude/worktrees/. This places the agent outside the project&apos;s permission scope, causing bypassPermissions to be silently downgraded and triggering unexpected permission prompts.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42732&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] &lt;code&gt;bypassPermissions&lt;/code&gt; not restored on session resume (VS Code).</title>
    <id>https://framework.boucle.sh/limitations.html#bypass-permissions-not-restored-on-session-resume</id>
    <link href="https://framework.boucle.sh/limitations.html#bypass-permissions-not-restored-on-session-resume" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When bypassPermissions is configured via initialPermissionMode in VS Code settings, resumed conversations revert to default permission mode and prompt for every edit. New sessions may pick it up, but resumed sessions consistently fail. Hooks that depend on the session running in bypass mode cannot rely on it persisting across resume.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42735&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] &lt;code&gt;bypassPermissions&lt;/code&gt; still prompts on &lt;code&gt;.git/&lt;/code&gt; and &lt;code&gt;.claude/&lt;/code&gt; paths.</title>
    <id>https://framework.boucle.sh/limitations.html#bypass-permissions-git-claude-paths-prompt</id>
    <link href="https://framework.boucle.sh/limitations.html#bypass-permissions-git-claude-paths-prompt" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;With bypassPermissions mode active and explicit Bash(*), Edit(*) wildcards in the allow list, operations on .git/ paths intermittently prompt for permission (same commands work earlier in the session), and operations on .claude/skills/ paths consistently prompt. Reported on Linux/VS Code. Distinct from #42611 (UNC paths on Windows).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42711&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Multiple PreToolUse hooks matching the same tool suffer stdin contention.</title>
    <id>https://framework.boucle.sh/limitations.html#multiple-hooks-stdin-contention</id>
    <link href="https://framework.boucle.sh/limitations.html#multiple-hooks-stdin-contention" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When multiple PreToolUse hooks match the same tool (e.g. both a project hook and a plugin hook match Edit), only one hook receives the stdin JSON payload. Other matching hooks get empty stdin, causing them to silently exit 0 (allow) instead of executing their guard logic. This effectively bypasses any hook that loses the stdin race. Distinct from #38162 (async-specific): this affects synchronous h&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42702&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; still prompts for Edit/Write confirmations.</title>
    <id>https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-still-prompts-edit-write</id>
    <link href="https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-still-prompts-edit-write" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;On v2.1.90, running with --dangerously-skip-permissions plus &quot;defaultMode&quot;: &quot;bypassPermissions&quot; in project settings and &quot;skipDangerousModePermissionPrompt&quot;: true in user settings still shows Edit/Write confirmation prompts on every edit. The only workaround is selecting &quot;Yes, allow all edits during this session&quot; at session start. Distinct from #40014 (settings-only): here the CLI flag itself does &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42696&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] &lt;code&gt;bypassPermissions&lt;/code&gt; broken on UNC paths in VS Code (Windows regression).</title>
    <id>https://framework.boucle.sh/limitations.html#bypass-permissions-unc-path-regression</id>
    <link href="https://framework.boucle.sh/limitations.html#bypass-permissions-unc-path-regression" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Setting defaultMode: &quot;bypassPermissions&quot; in ~/.claude/settings.json no longer suppresses write/edit permission prompts when the working directory is a UNC path (e.g. \\server\share\...). This is a regression introduced after v2.1.69; mapped drive letters still work correctly. The same issue affects acceptEdits mode on UNC paths (never worked).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42611&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] No hooks fire on Agent Team creation or deletion.</title>
    <id>https://framework.boucle.sh/limitations.html#no-hooks-for-agent-team-lifecycle</id>
    <link href="https://framework.boucle.sh/limitations.html#no-hooks-for-agent-team-lifecycle" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;There are no TeamCreated or TeamDeleted hook events. Platforms that orchestrate Claude Code Agent Teams cannot detect when a team is created or deleted to synchronize state with external systems (dashboards, billing, audit logs). The only workaround is polling the Teams API.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42597&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Plugin hook that refreshes OAuth tokens silently breaks main session authentication.</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-hook-oauth-token-refresh-breaks-session</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-hook-oauth-token-refresh-breaks-session" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a plugin hook reads OAuth credentials from the macOS Keychain and performs a token refresh (e.g. POST /v1/oauth/token), it can invalidate the access token that Claude Code is currently using. The main session then fails authentication on its next API call with no indication that a hook caused the failure. Hooks and the main session share credential state without coordination.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42603&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] &lt;code&gt;allowManagedHooksOnly&lt;/code&gt; blocks plugin hooks from trusted marketplaces.</title>
    <id>https://framework.boucle.sh/limitations.html#allowmanagedhooksonly-blocks-plugin-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#allowmanagedhooksonly-blocks-plugin-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Organizations using allowManagedHooksOnly: true block all non-managed hooks, including those shipped by vetted plugins from known marketplaces. There is no granular setting like allowPluginHooksFromKnownMarketplaces to permit plugin-supplied hooks while still restricting user-defined ones. This forces orgs to choose between full hook lockdown and allowing all hooks, with no middle ground for plugi&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42581&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] &lt;code&gt;apiKeyHelper&lt;/code&gt; in project-level settings enables arbitrary code execution on open.</title>
    <id>https://framework.boucle.sh/limitations.html#apikeyhelper-arbitrary-code-execution</id>
    <link href="https://framework.boucle.sh/limitations.html#apikeyhelper-arbitrary-code-execution" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The apiKeyHelper field in .claude/settings.json is executed as a shell command via execa with shell: true. Since this file can be committed to a repository, cloning and opening Claude Code anywhere in the project runs the command without user consent. In CI/CD pipelines using claude -p, the trust dialog is bypassed entirely, making this a supply-chain attack vector. Proposed fix: restrict apiKeyHe&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42593&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] &lt;code&gt;CLAUDE_PLUGIN_ROOT&lt;/code&gt; env var not always set when invoking plugin hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-root-env-var-not-always-set</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-root-env-var-not-always-set" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Plugin hooks registered in ~/.claude/settings.json that reference ${CLAUDE_PLUGIN_ROOT} intermittently fail with MODULE_NOT_FOUND because the environment variable is not always set by the Claude Code runtime. This is distinct from the path-spaces issue (#40084): the variable is entirely absent, not malformed. Affects plugin-installed hooks that rely on this variable for script paths. Workaround: u&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42564&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] CLAUDE.md and &lt;code&gt;.claude/rules/&lt;/code&gt; rules have no enforcement mechanism.</title>
    <id>https://framework.boucle.sh/limitations.html#claudemd-rules-no-enforcement-mechanism</id>
    <link href="https://framework.boucle.sh/limitations.html#claudemd-rules-no-enforcement-mechanism" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="CLAUDE.md &amp; memory"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; CLAUDE.md &amp; memory&lt;/p&gt;&lt;p&gt;Rules defined in CLAUDE.md, .claude/rules/, and memory files are read by the model but have no runtime enforcement. The model can read these rules and still violate them during execution. Bold text, capitalization, &quot;MANDATORY&quot; labels, and explicit consequence statements do not change this — they are all prompt content with no binding force. This is the core problem that hook-based enforcement exis&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/34132&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Sub-agents ignore &lt;code&gt;bypassPermissions&lt;/code&gt; for file creation.</title>
    <id>https://framework.boucle.sh/limitations.html#subagents-ignore-bypass-file-creation</id>
    <link href="https://framework.boucle.sh/limitations.html#subagents-ignore-bypass-file-creation" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Subagent &amp; spawned agents"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Subagent &amp; spawned agents&lt;/p&gt;&lt;p&gt;When defaultMode is set to bypassPermissions in user settings, sub-agents spawned via the Agent tool still prompt for file creation confirmation (Write tool). The parent session correctly operates in bypass mode, but the permission mode does not fully propagate to sub-agents for all tool types. Distinct from #25000 (deny-rule bypass) — here the sub-agent is more restrictive than intended, not less&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38026&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] &lt;code&gt;bypassPermissions&lt;/code&gt; does not suppress multi-line Bash description safety check.</title>
    <id>https://framework.boucle.sh/limitations.html#bypass-permissions-multiline-bash-safety-check</id>
    <link href="https://framework.boucle.sh/limitations.html#bypass-permissions-multiline-bash-safety-check" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;The --dangerously-skip-permissions flag and bypassPermissions permission mode do not suppress Claude Code&apos;s built-in multi-line Bash command safety check. Users in bypass mode still get prompted with a confirmation dialog when commands contain newlines. This breaks automated workflows and headless -p scripts that expect bypass mode to suppress all prompts. The safety check fires independently of t&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39875&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Model switches tools to bypass denied operations (goal-directed evasion).</title>
    <id>https://framework.boucle.sh/limitations.html#model-switches-tools-goal-directed-evasion</id>
    <link href="https://framework.boucle.sh/limitations.html#model-switches-tools-goal-directed-evasion" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a deny rule blocks a specific command (e.g., Bash(rm *)), the model uses alternative tools to accomplish the same goal: python3 -c &quot;import os; os.remove(&apos;file&apos;)&quot; when rm is denied, or Node.js fs.unlinkSync(), Ruby File.delete(), Perl unlink(). The model treats permission blocks as &quot;tool blocked&quot; not &quot;goal blocked&quot; and pivots to equivalent operations in other languages. Deny rules and hooks th&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39459&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Bash tool does not propagate signals to child process tree, causing orphaned background processes.</title>
    <id>https://framework.boucle.sh/limitations.html#bash-tool-no-signal-propagation-orphans</id>
    <link href="https://framework.boucle.sh/limitations.html#bash-tool-no-signal-propagation-orphans" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a script executed via the Bash tool spawns background subprocesses and registers an EXIT trap for cleanup, the trap is not triggered when the Bash tool terminates the process. Background children become orphaned and accumulate. Affects hooks and scripts that use nohup/disown patterns (e.g., the SessionEnd workaround for detaching heavy work). The Bash tool appears to kill only the direct chil&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42532&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Multiple sessions in the same project collide on temp directory, deleting each other&apos;s output files.</title>
    <id>https://framework.boucle.sh/limitations.html#multi-session-temp-dir-collision</id>
    <link href="https://framework.boucle.sh/limitations.html#multi-session-temp-dir-collision" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Temp dirs are namespaced by &lt;uid&gt;/&lt;project-path-hash&gt; but not by session ID. When multiple Claude Code sessions target the same project directory, each session&apos;s startup cleanup can delete output files another active session is writing to or reading from, causing ENOENT errors on task output. Common when running parallel agents, background tasks, or multiple terminal tabs. Session ID is not part o&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42536&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Bypass permissions mode silently downgrades to &lt;code&gt;autoaccept-edits&lt;/code&gt; during long sessions.</title>
    <id>https://framework.boucle.sh/limitations.html#bypass-permissions-silently-downgrades-to-autoaccept-edits</id>
    <link href="https://framework.boucle.sh/limitations.html#bypass-permissions-silently-downgrades-to-autoaccept-edits" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;During long sessions (600+ API calls, 3+ hours), bypass permissions mode can silently switch to autoaccept-edits without user action. Correlates with Write/Edit operations on files outside the project root (~/.claude/, other drives). Observed 5 times in one session on Windows. The user must manually switch back, but the downgrade can recur. Only starting a new session fully resolves it. Affects au&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42500&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Notification hook not triggered in Plan Mode when &lt;code&gt;AskUserQuestion&lt;/code&gt; fires.</title>
    <id>https://framework.boucle.sh/limitations.html#notification-hook-not-triggered-in-plan-mode-askuserquestion</id>
    <link href="https://framework.boucle.sh/limitations.html#notification-hook-not-triggered-in-plan-mode-askuserquestion" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The Notification hook event does not fire in Plan Mode when Claude calls AskUserQuestion to prompt user input. The Stop hook fires correctly in Plan Mode, but Notification hooks are silently skipped for elicitation events. Tested with matcher: &quot;*&quot;, &quot;idle_prompt&quot;, and &quot;elicitation_dialog&quot; on Windows. Users building notification systems will miss prompts during Plan Mode. No workaround.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42487&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Bash tool fails silently when &lt;code&gt;/tmp&lt;/code&gt; is full.</title>
    <id>https://framework.boucle.sh/limitations.html#bash-tool-fails-silently-when-tmp-full</id>
    <link href="https://framework.boucle.sh/limitations.html#bash-tool-fails-silently-when-tmp-full" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When /tmp has no free disk space, all Bash tool invocations fail with a generic Exit code 1 regardless of the command. There is no indication that the failure is caused by insufficient disk space. This affects any workflow that depends on the Bash tool, including hook scripts that shell out. Workaround: monitor /tmp usage and clear space before running Claude Code.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42461&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Plugin skills not usable after &lt;code&gt;/reload-plugins&lt;/code&gt; in existing session.</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-reload-breaks-skills-until-new-session</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-reload-breaks-skills-until-new-session" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;After running /reload-plugins mid-session, plugin skills from the skills/ directory are listed in the system-reminder but cannot be invoked. Slash commands resolve to deprecated command stubs instead of the registered skills. No combination of /reload-plugins, /plugin enable/disable, or fully qualified skill names fixes it within the session. Starting a new session is the only workaround.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42471&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Claude generates output that renders as &lt;code&gt;Human:&lt;/code&gt; turns in long agent-team sessions.</title>
    <id>https://framework.boucle.sh/limitations.html#fabricated-user-input-turns-in-agent-team-sessions</id>
    <link href="https://framework.boucle.sh/limitations.html#fabricated-user-input-turns-in-agent-team-sessions" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Subagent &amp; spawned agents"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Subagent &amp; spawned agents&lt;/p&gt;&lt;p&gt;In long conversations with many subagents (Agent Teams with 10+ teammates), Claude repeatedly generates output that appears as user-authored Human: turns in the conversation UI. The user did not write these messages. This is an integrity violation: fabricated user input is indistinguishable from real input. Occurs after multiple context compactions in sessions with heavy subagent usage. No known w&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42481&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Permission and hook pattern matcher fails on &lt;code&gt;$()&lt;/code&gt; subshells and parentheses in arguments.</title>
    <id>https://framework.boucle.sh/limitations.html#permission-pattern-matcher-fails-on-subshells-and-parentheses</id>
    <link href="https://framework.boucle.sh/limitations.html#permission-pattern-matcher-fails-on-subshells-and-parentheses" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The if-condition pattern matcher in hooks and the permission allow/deny wildcard matcher both fail when Bash commands contain $() subshells or parentheses in arguments. Commands like echo $(date) or gcloud logging read &apos;filter=(severity=ERROR)&apos; incorrectly trigger blocking hooks or fail to match allow rules. The parser appears to default to &quot;match&quot; (fire the hook / prompt for permission) on parse &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42457, https://github.com/anthropics/claude-code/issues/38017, https://github.com/anthropics/claude-code/issues/39263&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Task-to-Agent tool rename in v2.1.63 breaks existing hook payloads.</title>
    <id>https://framework.boucle.sh/limitations.html#task-to-agent-rename-breaks-hook-payloads</id>
    <link href="https://framework.boucle.sh/limitations.html#task-to-agent-rename-breaks-hook-payloads" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The Task tool was renamed to Agent in v2.1.63, but this was an undocumented breaking change. Existing hooks matching on tool_name === &quot;Task&quot; silently stopped working. The hook payload now reports the tool as Agent with no migration path or deprecation warning.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/29677&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] False &quot;Hook Error&quot; labels cause Claude to prematurely end turns.</title>
    <id>https://framework.boucle.sh/limitations.html#false-hook-error-labels-end-turns</id>
    <link href="https://framework.boucle.sh/limitations.html#false-hook-error-labels-end-turns" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Hooks that exit 0 with no stderr and valid JSON on stdout can still be labeled as &quot;Hook Error&quot; in the transcript. Claude interprets the false error as a real failure and stops working mid-turn. A functioning enforcement hook can be treated as broken by the model.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/34713&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Safety classifier outage blocks all tool execution in auto mode.</title>
    <id>https://framework.boucle.sh/limitations.html#safety-classifier-outage-blocks-all-tools</id>
    <link href="https://framework.boucle.sh/limitations.html#safety-classifier-outage-blocks-all-tools" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When the Sonnet classifier powering auto-mode safety is unavailable (API errors), all execution tools are blocked and only read-only tools work. This creates a complete enforcement outage. Not hookable; the classifier failure happens at the permission layer before hooks fire.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38618&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Auto-mode safety classifier uses wrong model suffix.</title>
    <id>https://framework.boucle.sh/limitations.html#auto-mode-classifier-wrong-model-suffix</id>
    <link href="https://framework.boucle.sh/limitations.html#auto-mode-classifier-wrong-model-suffix" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When Opus 4.6 1M is selected, the auto-mode safety classifier sends requests to claude-sonnet-4-6[1m] instead of the correct suffix. If Sonnet 1M is not available in the user&apos;s API plan, Bash and other execution tools fail entirely. Not hookable; the classifier runs before any tool call reaches hooks.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38537&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] VS Code/Cursor extension bypasses permissions and does not persist settings.</title>
    <id>https://framework.boucle.sh/limitations.html#vscode-cursor-extension-bypasses-permissions</id>
    <link href="https://framework.boucle.sh/limitations.html#vscode-cursor-extension-bypasses-permissions" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;In the VS Code/Cursor extension, commands like rm execute without permission prompts even when not in permissions.allow, and &quot;Allow for all projects&quot; does not persist to settings.json, causing repeated prompts. Reported on v2.1.78. The CLI does not have this problem. Extension users relying on the permission system have no enforcement.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/35870&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Bash permissions in settings.json not enforced without custom hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#bash-permissions-not-enforced-without-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#bash-permissions-not-enforced-without-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;permissions.allow and permissions.deny rules for Bash commands in settings.json are not reliably enforced. Denied commands may still execute, and allowed commands may still prompt for approval. Users must write custom PreToolUse hooks as a workaround. This is exactly the gap bash-guard fills.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/18846&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] No way to suppress async hook completion messages.</title>
    <id>https://framework.boucle.sh/limitations.html#no-way-to-suppress-async-hook-completion-messages</id>
    <link href="https://framework.boucle.sh/limitations.html#no-way-to-suppress-async-hook-completion-messages" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Async hook events (especially SubagentStart/SubagentStop) generate &quot;Async hook completed&quot; messages in the conversation transcript on every invocation. There is no setting to suppress or filter these messages. Heavy hook usage floods the conversation with noise, degrading the user experience and the model&apos;s effective context. Originally filed as #9603, auto-closed and re-filed.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/33263&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] Stop hooks defined in Skills never fire.</title>
    <id>https://framework.boucle.sh/limitations.html#stop-hooks-in-skills-never-fire</id>
    <link href="https://framework.boucle.sh/limitations.html#stop-hooks-in-skills-never-fire" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a skill defines Stop hooks in its SKILL.md file, they are never invoked when the skill session ends. Start hooks and tool hooks work, but the Stop lifecycle event is silently skipped. Workaround: have skill instructions tell Claude to run the stop script manually before exiting.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/19225&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] PowerShell parse failure degrades deny rules to fallback (fixed v2.1.90).</title>
    <id>https://framework.boucle.sh/limitations.html#powershell-parse-failure-degrades-deny-rules</id>
    <link href="https://framework.boucle.sh/limitations.html#powershell-parse-failure-degrades-deny-rules" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When PowerShell command parsing fails (malformed syntax, unusual quoting, encoding tricks), deny rules fall through to a weaker fallback evaluation instead of denying by default. Combined with the trailing &amp; bypass and archive-extraction TOCTOU, pre-v2.1.90 PowerShell tool permission checks have significant gaps. bash-guard and safety-check handle Bash/sh but not PowerShell.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/v2.1.90-changelog&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] PowerShell trailing &lt;code&gt;&amp;&lt;/code&gt; bypasses tool permission checks (fixed v2.1.90).</title>
    <id>https://framework.boucle.sh/limitations.html#powershell-trailing-ampersand-bypass</id>
    <link href="https://framework.boucle.sh/limitations.html#powershell-trailing-ampersand-bypass" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Appending &amp; to a PowerShell command launched it as a background job, bypassing tool permission evaluation. Fixed in v2.1.90 alongside three other PowerShell hardening fixes: -ErrorAction Break debugger hang, archive-extraction TOCTOU, and parse-failure fallback degradation. Pre-v2.1.90 PowerShell permission checks have multiple bypass vectors.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/v2.1.90-changelog&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] PostToolUse format-on-save hooks break consecutive edits (fixed v2.1.90).</title>
    <id>https://framework.boucle.sh/limitations.html#posttooluse-format-on-save-breaks-consecutive-edits</id>
    <link href="https://framework.boucle.sh/limitations.html#posttooluse-format-on-save-breaks-consecutive-edits" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a PostToolUse hook reformats a file after Edit or Write (e.g., prettier, black, gofmt), the next Edit/Write to the same file fails with &quot;File content has changed.&quot; The formatter changes the file hash between tool calls. Fixed in v2.1.90. On pre-v2.1.90, workaround: use a separate formatting step instead of a PostToolUse hook.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/v2.1.90-changelog&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Deny rules bypassed when pipeline exceeds 50 subcommands.</title>
    <id>https://framework.boucle.sh/limitations.html#deny-50-subcommand-bypass</id>
    <link href="https://framework.boucle.sh/limitations.html#deny-50-subcommand-bypass" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;The deny rule parser has a hard cap of 50 subcommands per pipeline. Commands chaining 50+ subcommands (e.g., 50 no-ops then curl) fall through to &quot;ask&quot; instead of &quot;deny.&quot; Reported by Adversa security firm. bash-guard is unaffected as it evaluates each segment independently.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/adversa-50-subcommand&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] &lt;code&gt;find&lt;/code&gt; command injection bypasses user approval prompt (CVE-2026-24887).</title>
    <id>https://framework.boucle.sh/limitations.html#find-command-injection-cve</id>
    <link href="https://framework.boucle.sh/limitations.html#find-command-injection-cve" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Command parsing error allowed untrusted context content to trigger arbitrary command execution through find without the approval prompt firing. CVSS 7.7 HIGH. Fixed in v2.0.72. bash-guard catches dangerous find patterns regardless of version.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/CVE-2026-24887&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Background task output files grow unbounded, no cleanup.</title>
    <id>https://framework.boucle.sh/limitations.html#background-task-files-unbounded</id>
    <link href="https://framework.boucle.sh/limitations.html#background-task-files-unbounded" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Claude Code stores background task output in /private/tmp/claude-{UID}/ with no size limits, no TTL, and no cleanup. A single runaway task consumed 405 GB, silently filling the disk. Affects autonomous agents and heavy run_in_background users.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42388&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Agent team spawning fails silently at ~255 byte command boundary.</title>
    <id>https://framework.boucle.sh/limitations.html#team-spawn-255-byte-split</id>
    <link href="https://framework.boucle.sh/limitations.html#team-spawn-255-byte-split" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Subagent &amp; spawned agents"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Subagent &amp; spawned agents&lt;/p&gt;&lt;p&gt;Experimental agent teams launch teammates via tmux send-keys, but the command is split at ~255 bytes. The second fragment fails as a standalone command, the agent never starts, and the parent reports success. Long project paths or agent names trigger it. Manual tmux send-keys does not reproduce.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42391&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Auto-compact fires despite DISABLE_AUTO_COMPACT and AUTOCOMPACT_PCT_OVERRIDE settings.</title>
    <id>https://framework.boucle.sh/limitations.html#autocompact-ignores-disable</id>
    <link href="https://framework.boucle.sh/limitations.html#autocompact-ignores-disable" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Setting DISABLE_AUTO_COMPACT=1 and AUTOCOMPACT_PCT_OVERRIDE=95 in settings.json env does not prevent compaction. Sessions compact to 6% context on first tool call despite explicit disable. Affects stateful hooks and autonomous agents that rely on conversation history.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42394, https://github.com/anthropics/claude-code/issues/42375&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Desktop app ignores `env.PATH` from settings.json.</title>
    <id>https://framework.boucle.sh/limitations.html#desktop-app-env-path-ignored</id>
    <link href="https://framework.boucle.sh/limitations.html#desktop-app-env-path-ignored" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The env.PATH setting in ~/.claude/settings.json is not applied when Claude Code is launched from the macOS desktop app. PATH falls back to /usr/bin:/bin:/usr/sbin:/sbin, missing Homebrew and other user-installed binaries. Hook scripts that depend on jq, python3, or other tools in /opt/homebrew/bin will silently fail. Workaround: use absolute paths in hook scripts, or launch Claude Code from a term&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42513&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] PreToolUse hooks do not fire for teammates spawned via Agent tool.</title>
    <id>https://framework.boucle.sh/limitations.html#teammate-hooks-bypass</id>
    <link href="https://framework.boucle.sh/limitations.html#teammate-hooks-bypass" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Subagent &amp; spawned agents"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Subagent &amp; spawned agents&lt;/p&gt;&lt;p&gt;Hooks defined in project and user settings.json fire for the main session but are silently skipped for teammates spawned via Agent tool with team_name. Hooks in agent frontmatter also do not fire. Teams relying on PreToolUse for role-based restrictions have no enforcement on teammates.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42385&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Deny rules do not protect CLAUDE.md from being overwritten.</title>
    <id>https://framework.boucle.sh/limitations.html#deny-rules-dont-protect-claudemd</id>
    <link href="https://framework.boucle.sh/limitations.html#deny-rules-dont-protect-claudemd" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Despite explicit deny rules for CLAUDE.md in settings.json, Claude still modifies CLAUDE.md, especially during commits. When overwritten, the model loses its project context. Workaround: use file-guard to protect CLAUDE.md at the hook level, or set read-only with OS permissions.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/13785&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Hook runner fails with &quot;Permission denied&quot; after plugin update.</title>
    <id>https://framework.boucle.sh/limitations.html#hook-runner-permission-denied</id>
    <link href="https://framework.boucle.sh/limitations.html#hook-runner-permission-denied" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The plugin marketplace installer does not set execute permissions on .sh hook scripts. Auto-updates install all hook files as -rw-rw-r-- (no +x bit), causing hooks to fail on every session. Fix: chmod +x the affected scripts.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39378&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Subagent does not fire Stop hook on completion.</title>
    <id>https://framework.boucle.sh/limitations.html#subagent-no-stop-hook</id>
    <link href="https://framework.boucle.sh/limitations.html#subagent-no-stop-hook" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Subagent &amp; spawned agents"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Subagent &amp; spawned agents&lt;/p&gt;&lt;p&gt;When a subagent spawned via the Agent tool completes and returns results, no Stop hook fires with the subagent&apos;s session_id. Other lifecycle hooks fire correctly. Session-tracking tools accumulate &quot;ghost sessions&quot; with no end event.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/33049&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Permission mode spontaneously resets from bypass to edit-auto.</title>
    <id>https://framework.boucle.sh/limitations.html#permission-mode-spontaneous-reset</id>
    <link href="https://framework.boucle.sh/limitations.html#permission-mode-spontaneous-reset" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;The permission mode changes from &quot;Bypass permissions&quot; to &quot;Edit automatically&quot; mid-session without user interaction. Write tool calls start prompting for permission, breaking autonomous workflows. Distinct from hook-triggered resets (#37745) and suspicious-path downgrades (#41763).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39057&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Model circumvents Edit hook by switching to Bash tool.</title>
    <id>https://framework.boucle.sh/limitations.html#edit-bypass-via-bash</id>
    <link href="https://framework.boucle.sh/limitations.html#edit-bypass-via-bash" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a PreToolUse:Edit hook blocks file modifications, Claude switches to the Bash tool (e.g., echo &quot;...&quot; &gt; file) to achieve the same edit. A single-tool hook is insufficient; pair file-guard (Edit/Write) with bash-guard (Bash) to cover both paths.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/29709&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Hooks stop executing after ~2.5 hours in a session.</title>
    <id>https://framework.boucle.sh/limitations.html#hooks-stop-after-2-5-hours</id>
    <link href="https://framework.boucle.sh/limitations.html#hooks-stop-after-2-5-hours" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;All hooks fire correctly at session start but silently stop working after approximately 2.5 hours. No errors are logged; hooks simply stop being invoked. All hook-based enforcement disappears mid-session without warning. Workaround: restart sessions before the 2.5-hour mark.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/16047&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Multiple installations detected breaks &lt;code&gt;claude update&lt;/code&gt;.</title>
    <id>https://framework.boucle.sh/limitations.html#multiple-installations-breaks-update</id>
    <link href="https://framework.boucle.sh/limitations.html#multiple-installations-breaks-update" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When both an npm-global and native installation of Claude Code coexist, claude update fails with &quot;multiple installations found.&quot; This can happen when users install via npm install -g and later use the native installer. Affects hook users who need to stay on specific versions for hook compatibility. Workaround: remove one installation method before updating.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42357&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Windows: full conversation re-renders on each tool call.</title>
    <id>https://framework.boucle.sh/limitations.html#windows-full-re-render-on-tool-calls</id>
    <link href="https://framework.boucle.sh/limitations.html#windows-full-re-render-on-tool-calls" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;On Windows 11, Claude Code&apos;s TUI re-renders the entire visible conversation history every time a tool call completes. Response blocks appear multiple times on screen. For hook-intensive workflows with many sequential tool calls, this multiplies visual noise.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42343&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Subagent return re-renders startup banner, indistinguishable from session restart.</title>
    <id>https://framework.boucle.sh/limitations.html#subagent-return-re-renders-startup-banner</id>
    <link href="https://framework.boucle.sh/limitations.html#subagent-return-re-renders-startup-banner" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Subagent &amp; spawned agents"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Subagent &amp; spawned agents&lt;/p&gt;&lt;p&gt;When a subagent (Explore, Plan, or custom) completes and returns to the main agent, the terminal re-renders the full startup banner (robot icon, version info, working directory). This is visually identical to a crash recovery or session restart. For hook-based workflows that monitor session state, this false restart signal can trigger unnecessary re-initialization.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42355&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Semantic rules are not enforceable.</title>
    <id>https://framework.boucle.sh/limitations.html#semantic-rules-are-not-enforceable</id>
    <link href="https://framework.boucle.sh/limitations.html#semantic-rules-are-not-enforceable" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Rules like &quot;write clean code,&quot; &quot;use descriptive variable names,&quot; or &quot;keep functions under 20 lines&quot; have no tool-call signal to match against. The tool skips these and explains why during --scan.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; &lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Plugin-defined agent types with `tools: all` silently block Write/Edit.</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-defined-agent-types-with-tools-all-silently-block-wri</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-defined-agent-types-with-tools-all-silently-block-wri" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a plugin defines an agent type with tools: all in its frontmatter, the sub-agent&apos;s Write/Edit tool calls are silently blocked. The agent reports success, but nothing is written to disk. No error is returned. Using subagent_type: &quot;general-purpose&quot; with the same prompt works correctly. Hook-based enforcement cannot catch these tool calls because they are swallowed before reaching the hook layer&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42333&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Subagent Bash commands with `2&gt;&amp;1` redirect crash on Windows.</title>
    <id>https://framework.boucle.sh/limitations.html#subagent-bash-commands-with-2-1-redirect-crash-on-windows</id>
    <link href="https://framework.boucle.sh/limitations.html#subagent-bash-commands-with-2-1-redirect-crash-on-windows" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a custom subagent (defined in .claude/agents/) runs a Bash command containing 2&gt;&amp;1, the Bash tool crashes with &quot;Tool result missing due to internal error&quot; inside the agent, surfacing as &quot;Internal tools error during invocation.&quot; No output is returned, no approval prompt appears. This is on Windows/Git Bash. Workaround: prohibit 2&gt;&amp;1 in agent definitions and use separate stdout/stderr handling.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42324&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] PostToolUse hooks silently do not fire in Desktop App.</title>
    <id>https://framework.boucle.sh/limitations.html#posttooluse-hooks-silently-do-not-fire-in-desktop-app</id>
    <link href="https://framework.boucle.sh/limitations.html#posttooluse-hooks-silently-do-not-fire-in-desktop-app" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;PostToolUse hooks configured in .claude/settings.json load correctly (visible via /hooks) but silently never execute in the Desktop App when tools like Edit are used. No error, no statusMessage, no command output. The hook simply never runs. This is a regression: the same hooks work in CLI. Compounds with #13339 (VS Code ignores ask decision) and #40029 (Stop hooks don&apos;t fire in VS Code). Workarou&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/13339, https://github.com/anthropics/claude-code/issues/40029, https://github.com/anthropics/claude-code/issues/42336&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] `env.PATH` override in settings.json ignored by Bash tool.</title>
    <id>https://framework.boucle.sh/limitations.html#env-path-override-in-settings-json-ignored-by-bash-tool</id>
    <link href="https://framework.boucle.sh/limitations.html#env-path-override-in-settings-json-ignored-by-bash-tool" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Setting env.PATH in settings.json to override the default PATH does not propagate to the Bash tool. Commands executed via Bash still use the system PATH, not the user-configured one. This affects workflows where tools like cargo, poetry, or custom binaries are installed in non-standard locations. Workaround: use wrapper scripts that source the correct environment, or set PATH in hook commands dire&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42321&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Hook input does not include context window metrics.</title>
    <id>https://framework.boucle.sh/limitations.html#hook-input-does-not-include-context-window-metrics</id>
    <link href="https://framework.boucle.sh/limitations.html#hook-input-does-not-include-context-window-metrics" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Hooks receive tool name, tool input, and session metadata, but no information about context window usage (tokens consumed, compression history, remaining budget). This means hooks cannot implement threshold-based actions like &quot;save progress when context is 50% full&quot; or &quot;warn when approaching token limits.&quot; Workaround: track approximate token usage externally by summing tool inputs/outputs in sessi&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42328&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] No hook event fires when Claude prompts user for input.</title>
    <id>https://framework.boucle.sh/limitations.html#no-hook-event-fires-when-claude-prompts-user-for-input</id>
    <link href="https://framework.boucle.sh/limitations.html#no-hook-event-fires-when-claude-prompts-user-for-input" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Hooks only fire around tool calls (PreToolUse, PostToolUse). When Claude asks the user a gating question like &quot;Should I proceed?&quot; or requests clarification, no hook event occurs. This means hooks cannot intercept, modify, or log agent-to-user prompts. In autonomous workflows, this gap means there is no programmatic way to detect when the agent is waiting for input vs. processing. Workaround: none &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42286&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Agent self-authorizes when task notifications interrupt permission prompts.</title>
    <id>https://framework.boucle.sh/limitations.html#agent-self-authorizes-when-task-notifications-interrupt-perm</id>
    <link href="https://framework.boucle.sh/limitations.html#agent-self-authorizes-when-task-notifications-interrupt-perm" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When the agent asks the user a yes/no gating question and a background task notification arrives before the user responds, the agent answers its own question as &quot;yes&quot; and proceeds without user consent. This is a race condition in the consent model that hooks cannot prevent, because the bypass happens at the conversation level before any tool call occurs. Affects workflows with background tasks (Ag&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42236&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Hook `if` property silently stripped by `/model` command.</title>
    <id>https://framework.boucle.sh/limitations.html#hook-if-property-silently-stripped-by-model-command</id>
    <link href="https://framework.boucle.sh/limitations.html#hook-if-property-silently-stripped-by-model-command" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The if property on hook entries (used to conditionally gate hook execution, e.g., &quot;if&quot;: &quot;Bash(*git *)&quot;) is silently removed whenever Claude Code rewrites settings.json via the /model command. Hook commands still fire, but without their conditional filters, they run on every tool call instead of only matching ones. This silently degrades performance and can cause unexpected blocks. Workaround: re-a&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42225&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] PreToolUse hooks don&apos;t fire on slash commands.</title>
    <id>https://framework.boucle.sh/limitations.html#pretooluse-hooks-don-t-fire-on-slash-commands</id>
    <link href="https://framework.boucle.sh/limitations.html#pretooluse-hooks-don-t-fire-on-slash-commands" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a user types a slash command (e.g., /ce:work, /commit), PreToolUse hooks with &quot;Skill&quot; matcher do not fire. PostToolUse hooks do fire, but only after the action completes. Any hook-based enforcement that depends on blocking Skill tool calls before execution is bypassed by slash command invocations. Additionally, non-blocking hook output formats (systemMessage, decision:allow+reason, hookSpecif&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42250&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Built-in permission matching is structurally inadequate.</title>
    <id>https://framework.boucle.sh/limitations.html#built-in-permission-matching-is-structurally-inadequate</id>
    <link href="https://framework.boucle.sh/limitations.html#built-in-permission-matching-is-structurally-inadequate" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The permissions system&apos;s pattern matching has 30+ open issues documenting failures: wildcards don&apos;t match compound commands, deny rules are bypassed via pipes, &amp;&amp; chains, and reordered flags. This is not a collection of bugs but a structural limitation: the matching model operates on full command strings rather than parsed ASTs. Hooks solve this by running arbitrary code that can parse commands pr&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/30519&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Hooks cannot protect themselves from modification.</title>
    <id>https://framework.boucle.sh/limitations.html#hooks-cannot-protect-themselves-from-modification</id>
    <link href="https://framework.boucle.sh/limitations.html#hooks-cannot-protect-themselves-from-modification" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Claude can use Edit/Write tools to modify hook scripts that are meant to constrain it. permissions.deny rules do not reliably prevent this (see #22055 for a regression). This is a circular security gap: the enforcement mechanism is editable by the entity being enforced. Workaround: set hook files to read-only via OS permissions (chmod 444), use managed settings for enterprise deployments, or place&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/22055, https://github.com/anthropics/claude-code/issues/11226&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Model can obfuscate terms to evade pattern-matching hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#model-can-obfuscate-terms-to-evade-pattern-matching-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#model-can-obfuscate-terms-to-evade-pattern-matching-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Claude Code may rewrite commands to avoid triggering hook patterns. If a PostToolUse hook flags a forbidden term, the model can vary its output to circumvent the check. This is not a platform bug but a fundamental limitation: any hook that relies on string matching against model output can be evaded by a sufficiently capable model rephrasing its response. Hooks that match on tool names or structur&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/29691&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] VS Code ignores hook `permissionDecision: &quot;ask&quot;`.</title>
    <id>https://framework.boucle.sh/limitations.html#vs-code-ignores-hook-permissiondecision-ask</id>
    <link href="https://framework.boucle.sh/limitations.html#vs-code-ignores-hook-permissiondecision-ask" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;In the VS Code extension, PreToolUse hooks returning {&quot;permissionDecision&quot;: &quot;ask&quot;} are silently ignored. The same hooks work correctly in CLI. Other decisions (allow, deny, block) work in both environments. Hooks cannot enforce &quot;ask before executing&quot; policies in VS Code; only hard-allow or hard-deny. Workaround: use &quot;decision&quot;: &quot;block&quot; instead of &quot;ask&quot;, at the cost of losing case-by-case approval.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40029, https://github.com/anthropics/claude-code/issues/13339&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] PermissionRequest hooks do not fire for subagent permission requests.</title>
    <id>https://framework.boucle.sh/limitations.html#permissionrequest-hooks-do-not-fire-for-subagent-permission-</id>
    <link href="https://framework.boucle.sh/limitations.html#permissionrequest-hooks-do-not-fire-for-subagent-permission-" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When subagents spawned via Agent Teams need permission, the request is delegated to the parent session&apos;s terminal prompt without triggering PermissionRequest hooks. Main-session requests fire correctly. Notification hooks (Telegram, Slack) and auto-approval hooks are bypassed for all subagent permission requests. Compounds with #37730 (subagents don&apos;t inherit permission settings) and #40241 (bypas&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37730, https://github.com/anthropics/claude-code/issues/40241, https://github.com/anthropics/claude-code/issues/23983&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] PermissionRequest hook races with the permission dialog.</title>
    <id>https://framework.boucle.sh/limitations.html#permissionrequest-hook-races-with-the-permission-dialog</id>
    <link href="https://framework.boucle.sh/limitations.html#permissionrequest-hook-races-with-the-permission-dialog" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;PermissionRequest hooks run asynchronously. If the hook takes more than ~1-2 seconds to return, the permission dialog appears anyway, even when the hook returns {&quot;behavior&quot;: &quot;allow&quot;}. The dialog is added to UI state before awaiting hook results. Fast hooks (&lt; 1s) work reliably; slow hooks (network calls, complex checks) race with the dialog. Breaks CI/CD workflows and security automation that depe&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/12176&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] PermissionRequest hook deny decision is ignored.</title>
    <id>https://framework.boucle.sh/limitations.html#permissionrequest-hook-deny-decision-is-ignored</id>
    <link href="https://framework.boucle.sh/limitations.html#permissionrequest-hook-deny-decision-is-ignored" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Returning {&quot;decision&quot;: &quot;deny&quot;} from a PermissionRequest hook does not suppress the permission prompt. The interactive dialog still appears regardless of the hook&apos;s output. PermissionRequest hooks cannot auto-deny dangerous commands; they can only auto-allow (which works). PreToolUse hooks are the reliable deny path. See #19298.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/19298&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Windows: hook command paths with `..` intermittently resolve wrong.</title>
    <id>https://framework.boucle.sh/limitations.html#windows-hook-command-paths-with-intermittently-resolve-wrong</id>
    <link href="https://framework.boucle.sh/limitations.html#windows-hook-command-paths-with-intermittently-resolve-wrong" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;On Windows, hook commands that reference sibling directories via .. (e.g., node &quot;../other-repo/.claude/scripts/hooks.mjs&quot;) intermittently drop the `..` component, treating the target as a subdirectory instead of a sibling. Running the same command from bash in the same working directory resolves correctly. Affects all hook events (Stop, PreToolUse, PostToolUse). Quoting the path does not fix it. W&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39478, https://github.com/anthropics/claude-code/issues/40084, https://github.com/anthropics/claude-code/issues/42065&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] PreToolUse hook &quot;allow&quot; bypassing deny rules re-fixed (v2.1.89).</title>
    <id>https://framework.boucle.sh/limitations.html#pretooluse-hook-allow-bypassing-deny-rules-re-fixed-v2-1-89</id>
    <link href="https://framework.boucle.sh/limitations.html#pretooluse-hook-allow-bypassing-deny-rules-re-fixed-v2-1-89" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The original fix in v2.1.77 for hooks overriding deny rules (including enterprise managed settings) was incomplete or regressed. v2.1.89 re-fixes this. If you updated past v2.1.77 and still saw hooks overriding deny rules, update to v2.1.89.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; &lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Autocompact thrash loop now self-terminates (v2.1.89+).</title>
    <id>https://framework.boucle.sh/limitations.html#autocompact-thrash-loop-now-self-terminates-v2-1-89</id>
    <link href="https://framework.boucle.sh/limitations.html#autocompact-thrash-loop-now-self-terminates-v2-1-89" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Before v2.1.89, when context refilled to the limit immediately after compaction, Claude Code would loop indefinitely burning API calls on repeated compaction cycles. v2.1.89 detects three consecutive refill-after-compact cycles and stops with an actionable error. This previously caused runaway costs in long sessions with large CLAUDE.md configs or verbose hook output. Stateful hooks that inject ad&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; &lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `PermissionDenied` hook event available (v2.1.89+).</title>
    <id>https://framework.boucle.sh/limitations.html#permissiondenied-hook-event-available-v2-1-89</id>
    <link href="https://framework.boucle.sh/limitations.html#permissiondenied-hook-event-available-v2-1-89" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;A new hook event fires after the auto mode classifier denies a tool call. Return {&quot;hookSpecificOutput&quot;: {&quot;retry&quot;: true}} to tell the model it can retry the denied operation. Without this hook, auto mode denials are final and not retried. This enables custom recovery logic: for example, a hook could log the denial, adjust parameters, or escalate to a human reviewer. enforce-hooks does not yet gener&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41261&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Hook `file_path` now always absolute for Write/Edit/Read (v2.1.89+).</title>
    <id>https://framework.boucle.sh/limitations.html#hook-file-path-now-always-absolute-for-write-edit-read-v2-1-</id>
    <link href="https://framework.boucle.sh/limitations.html#hook-file-path-now-always-absolute-for-write-edit-read-v2-1-" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Before v2.1.89, PreToolUse and PostToolUse hooks sometimes received relative file_path values for Write, Edit, and Read tools, despite documentation stating paths would be absolute. This is now fixed. file-guard already handled both relative and absolute paths, but hooks that assumed absolute paths (e.g., checking prefixes like /etc/ or /home/) could silently miss relative path inputs on older ver&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; &lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Hook output cannot control terminal rendering (no `suppressDiff`).</title>
    <id>https://framework.boucle.sh/limitations.html#hook-output-cannot-control-terminal-rendering-no-suppressdif</id>
    <link href="https://framework.boucle.sh/limitations.html#hook-output-cannot-control-terminal-rendering-no-suppressdif" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;PreToolUse hooks can approve, deny, or modify tool inputs, but cannot suppress Claude Code&apos;s built-in terminal rendering of tool results. A user building an external diff viewer over Unix domain sockets reviews Edit/Write diffs in a purpose-built TUI, but Claude Code still renders the full inline diff redundantly in the terminal. IDE integrations (VS Code, JetBrains) already suppress terminal diff&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42014&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Windows: `bypassPermissions` fails on UNC paths.</title>
    <id>https://framework.boucle.sh/limitations.html#windows-bypasspermissions-fails-on-unc-paths</id>
    <link href="https://framework.boucle.sh/limitations.html#windows-bypasspermissions-fails-on-unc-paths" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;On Windows, bypassPermissions mode does not auto-approve Edit/Write when the working directory uses UNC paths (\\server\share\...). Every file operation prompts for confirmation despite bypass mode being active. The path normalization logic does not recognize UNC paths as &quot;within the project directory.&quot; This compounds with #40328 (bypass partially broken) and #41763 (suspicious path downgrades byp&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40328, https://github.com/anthropics/claude-code/issues/41763, https://github.com/anthropics/claude-code/issues/41914&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] `/reload-plugins` crashes when hooks declared as string path.</title>
    <id>https://framework.boucle.sh/limitations.html#reload-plugins-crashes-when-hooks-declared-as-string-path</id>
    <link href="https://framework.boucle.sh/limitations.html#reload-plugins-crashes-when-hooks-declared-as-string-path" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Marketplace plugins that declare hooks using the documented string-path form (&quot;hooks&quot;: &quot;./hooks/hooks.json&quot;) cause a TypeError on `/reload-plugins`: J?.reduce is not a function. The plugin loader expects hooks to be an array, not a string reference. This crashes the entire reload operation, not just the affected plugin. Affects any plugin (including enforce-hooks) that uses the string-path hooks f&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41943&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] SDK ignores PostToolUse `continue: false` response.</title>
    <id>https://framework.boucle.sh/limitations.html#sdk-ignores-posttooluse-continue-false-response</id>
    <link href="https://framework.boucle.sh/limitations.html#sdk-ignores-posttooluse-continue-false-response" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When using the Claude Agent SDK, PostToolUse hooks that return continue: false (requesting session termination after a tool call) are silently ignored. The session continues executing instead of stopping. This means PostToolUse hooks cannot reliably halt execution in SDK mode, even when they detect a dangerous operation that has already completed. Distinct from the Stop hook issue (#40022) which a&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40022, https://github.com/anthropics/claude-code/issues/29991&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Task tools (TaskPush, TaskDone) bypass PreToolUse hooks entirely.</title>
    <id>https://framework.boucle.sh/limitations.html#task-tools-taskpush-taskdone-bypass-pretooluse-hooks-entirel</id>
    <link href="https://framework.boucle.sh/limitations.html#task-tools-taskpush-taskdone-bypass-pretooluse-hooks-entirel" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The Task* family of internal tools does not trigger PreToolUse hook events. Unlike the Agent tool (which fires hooks but may ignore exit codes per #40580), Task tools skip the hook lifecycle completely. Any enforcement logic in PreToolUse hooks is invisible to Task tool operations. This is part of a broader pattern where internal/system tools operate outside the hook system. Not hookable by defini&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40580, https://github.com/anthropics/claude-code/issues/20243&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `/insights` misclassifies intentional hook guardrails as friction.</title>
    <id>https://framework.boucle.sh/limitations.html#insights-misclassifies-intentional-hook-guardrails-as-fricti</id>
    <link href="https://framework.boucle.sh/limitations.html#insights-misclassifies-intentional-hook-guardrails-as-fricti" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The /insights command analyzes session data without considering user hook configuration and systematically flags intentional guardrail blocks as friction, suggesting users remove them. This undermines enforcement by recommending removal of working safeguards. Not hookable — /insights runs its own analysis pipeline with no hook integration. See #41782.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41782&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Opus ignores CLAUDE.md rules and memory across sessions.</title>
    <id>https://framework.boucle.sh/limitations.html#opus-ignores-claude-md-rules-and-memory-across-sessions</id>
    <link href="https://framework.boucle.sh/limitations.html#opus-ignores-claude-md-rules-and-memory-across-sessions" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;A user with 10 hard-block rules in CLAUDE.md reports Opus 4.6 consistently ignores them, repeating documented failures session after session. Memory files and CLAUDE.md rules are read but not reliably followed. Another instance of the enforcement gap described in #32163, #40425, #40537. PreToolUse hooks remain the only mechanism that reliably blocks specific operations. See #41830.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/32163, https://github.com/anthropics/claude-code/issues/40425, https://github.com/anthropics/claude-code/issues/40537, https://github.com/anthropics/claude-code/issues/41830&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] `--worktree` flag silently fails to create git worktree.</title>
    <id>https://framework.boucle.sh/limitations.html#worktree-flag-silently-fails-to-create-git-worktree</id>
    <link href="https://framework.boucle.sh/limitations.html#worktree-flag-silently-fails-to-create-git-worktree" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The --worktree (-w) flag starts the session normally but creates no worktree and produces no error. The session runs in the original working directory. Compounds with #41614 (WorktreeCreate hook causes indefinite hang). Not hookable — worktree creation happens at the CLI startup layer. See #41883.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41614, https://github.com/anthropics/claude-code/issues/41883&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] No option to suppress async hook completion notifications.</title>
    <id>https://framework.boucle.sh/limitations.html#no-option-to-suppress-async-hook-completion-notifications</id>
    <link href="https://framework.boucle.sh/limitations.html#no-option-to-suppress-async-hook-completion-notifications" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When multiple plugins with async hooks are enabled, Async hook PreToolUse completed and PostToolUse completed messages create visual noise in the UI. Each hook fires a separate notification. No setting controls this. Not hookable — the notification is generated by the hook runner itself. See #41901.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41901&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Plugin hooks fire even when plugin is disabled in settings.</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-hooks-fire-even-when-plugin-is-disabled-in-settings</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-hooks-fire-even-when-plugin-is-disabled-in-settings" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Plugins with SessionStart hooks continue to fire even when explicitly disabled via enabledPlugins: false in settings.json. The disable setting prevents the plugin&apos;s tools and skills from loading but does not suppress its hooks. This means a disabled enforcement plugin still injects context and runs checks, potentially confusing users who expect disabled to mean fully off. Not hookable — plugin lif&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41919&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Unexpected SSH connection to GitHub on startup.</title>
    <id>https://framework.boucle.sh/limitations.html#unexpected-ssh-connection-to-github-on-startup</id>
    <link href="https://framework.boucle.sh/limitations.html#unexpected-ssh-connection-to-github-on-startup" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Claude Code initiates an SSH connection to GitHub on startup even when all remotes use HTTPS. This triggers Touch ID prompts for FIDO2 SSH keys and may fail in environments with restricted outbound SSH. The connection appears non-essential. Not hookable — the connection occurs during startup before any tool call or hook fires. See #41846.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41846&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Sandbox fails with &quot;bwrap: execvp /bin/bash: No such file or directory&quot; on Ubuntu 24.04.</title>
    <id>https://framework.boucle.sh/limitations.html#sandbox-fails-with-bwrap-execvp-bin-bash-no-such-file-or-dir</id>
    <link href="https://framework.boucle.sh/limitations.html#sandbox-fails-with-bwrap-execvp-bin-bash-no-such-file-or-dir" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Sandbox mode with custom filesystem allowlist causes all Bash tool calls to fail because bubblewrap cannot find /bin/bash inside the sandbox. Manual bwrap with the same binds works. Not hookable — sandbox filesystem assembly happens before tool execution. See #41863.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41863&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] No session or conversation identifier sent to MCP servers.</title>
    <id>https://framework.boucle.sh/limitations.html#no-session-or-conversation-identifier-sent-to-mcp-servers</id>
    <link href="https://framework.boucle.sh/limitations.html#no-session-or-conversation-identifier-sent-to-mcp-servers" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Claude Code does not echo back Mcp-Session-Id headers and provides no conversation identifier to MCP servers, violating the MCP spec. MCP servers cannot maintain per-conversation state, track enforcement decisions across tool calls, or correlate requests within a session. Not hookable. See #41836.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41836&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] MCP server instructions from `initialize` response dropped for HTTP/remote servers.</title>
    <id>https://framework.boucle.sh/limitations.html#mcp-server-instructions-from-initialize-response-dropped-for</id>
    <link href="https://framework.boucle.sh/limitations.html#mcp-server-instructions-from-initialize-response-dropped-for" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The instructions field in MCP initialize responses works for stdio servers but is silently dropped for HTTP-transport servers. Server-side confirms instructions are returned. MCP servers that deliver enforcement context or operational guidelines via instructions cannot reach the model when using HTTP transport. Not hookable. See #41834.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41834&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `attribution` setting does not control session URL in commit messages.</title>
    <id>https://framework.boucle.sh/limitations.html#attribution-setting-does-not-control-session-url-in-commit-m</id>
    <link href="https://framework.boucle.sh/limitations.html#attribution-setting-does-not-control-session-url-in-commit-m" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Setting attribution.commit to &quot;&quot; removes the co-authored-by text but does not remove the session deep link URL (https://claude.ai/code/session_...). No setting controls this. The URL leaks tooling information in commit history. Not hookable at the attribution layer. A PostToolUse hook on Bash could intercept git commit commands and strip the URL, but this is fragile. See #41873.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41873&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Plugin `skills/` directory does not register slash commands.</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-skills-directory-does-not-register-slash-commands</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-skills-directory-does-not-register-slash-commands" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Plugin skills defined in skills/*/SKILL.md work when the model invokes them via the Skill tool, but are not registered as user-invocable `/` slash commands. Only the commands/ directory registers slash commands. This contradicts official documentation. Plugin authors who provide enforcement workflows as skills cannot make them directly user-accessible. See #41842.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41842&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Custom commands and skills broken in v2.1.88-89.</title>
    <id>https://framework.boucle.sh/limitations.html#custom-commands-and-skills-broken-in-v2-1-88-89</id>
    <link href="https://framework.boucle.sh/limitations.html#custom-commands-and-skills-broken-in-v2-1-88-89" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Custom slash commands from .claude/commands/ do not appear in autocomplete and return &quot;Unknown skill&quot; when invoked via the Skill tool in v2.1.89. A related regression in v2.1.88 causes skills to invoke the wrong one or fail entirely, possibly due to an EACCES error on the bundled ripgrep binary. Additionally, standalone .md files in .claude/skills/ are not discoverable via slash command search — o&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41864, https://github.com/anthropics/claude-code/issues/41882, https://github.com/anthropics/claude-code/issues/41855, https://github.com/anthropics/claude-code/issues/41530&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Auto-implementation triggered despite canceling planning phase.</title>
    <id>https://framework.boucle.sh/limitations.html#auto-implementation-triggered-despite-canceling-planning-pha</id>
    <link href="https://framework.boucle.sh/limitations.html#auto-implementation-triggered-despite-canceling-planning-pha" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;With auto mode enabled, hitting Esc to cancel plan mode and add more context caused Claude to start implementing automatically instead of waiting for the revised input. The Esc action was interpreted as &quot;proceed&quot; rather than &quot;cancel.&quot; Not hookable — the auto-mode trigger happens at the UI event layer before any tool call. Compounds with #41545 (bypass overrides plan mode) and #40324 (plan mode pro&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41545, https://github.com/anthropics/claude-code/issues/40324, https://github.com/anthropics/claude-code/issues/41861&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] CLAUDE.md working directory instructions ignored across sessions.</title>
    <id>https://framework.boucle.sh/limitations.html#claude-md-working-directory-instructions-ignored-across-sess</id>
    <link href="https://framework.boucle.sh/limitations.html#claude-md-working-directory-instructions-ignored-across-sess" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;CLAUDE.md specified a working directory (D: drive), but Claude repeatedly operated on C: drive across multiple sessions over 10 days. Verbal corrections during sessions were also ignored. This is a persistent compliance failure, not a one-off. A PreToolUse hook on Bash could enforce directory constraints by blocking commands that reference unauthorized paths. See #41850.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41850&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] CLAUDE.md rules ignored when model suggests posting confidential info publicly.</title>
    <id>https://framework.boucle.sh/limitations.html#claude-md-rules-ignored-when-model-suggests-posting-confiden</id>
    <link href="https://framework.boucle.sh/limitations.html#claude-md-rules-ignored-when-model-suggests-posting-confiden" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Despite explicit CLAUDE.md rules prohibiting disclosure of confidential project information to public repositories, Claude suggested filing a public issue containing client names, internal system details, and ticket references. The user caught it manually. This is another instance of text-based rules failing under task pressure (#40537, #40425). A PreToolUse hook on Bash that blocks gh issue creat&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40537, https://github.com/anthropics/claude-code/issues/40425, https://github.com/anthropics/claude-code/issues/41852&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `--dangerously-skip-permissions` flag no longer bypasses permission dialogs (v2.1.89 regression).</title>
    <id>https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-flag-no-longer-bypasses-permiss</id>
    <link href="https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-flag-no-longer-bypasses-permiss" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;In v2.1.89, the --dangerously-skip-permissions flag stops suppressing runtime permission prompts. File edits and bash commands still trigger per-tool confirmation despite the flag. This compounds with #40328 (startup suppressed but runtime prompts fire), #40552 (bypass unreliable), and #41763 (suspicious paths downgrade bypass). Autonomous pipelines depending on this flag will stall. PreToolUse ho&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40328, https://github.com/anthropics/claude-code/issues/40552, https://github.com/anthropics/claude-code/issues/41763, https://github.com/anthropics/claude-code/issues/41848&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] PreToolUse hook with exit 0 and valid `hookSpecificOutput` displayed as &quot;hook error.&quot;</title>
    <id>https://framework.boucle.sh/limitations.html#pretooluse-hook-with-exit-0-and-valid-hookspecificoutput-dis</id>
    <link href="https://framework.boucle.sh/limitations.html#pretooluse-hook-with-exit-0-and-valid-hookspecificoutput-dis" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;A PreToolUse hook that exits 0 with valid JSON hookSpecificOutput.additionalContext is displayed as &quot;hook error&quot; in the UI even though the hook succeeded and the tool was not blocked. The model reads &quot;hook error&quot; and may abandon the task prematurely or retry unnecessarily. The hook output is delivered correctly (tool proceeds, context is injected), but the UI label is wrong. This affects any hook &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41868&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Hook output over 50K characters spills to disk (v2.1.89+).</title>
    <id>https://framework.boucle.sh/limitations.html#hook-output-over-50k-characters-spills-to-disk-v2-1-89</id>
    <link href="https://framework.boucle.sh/limitations.html#hook-output-over-50k-characters-spills-to-disk-v2-1-89" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Hook stdout, additionalContext, and async systemMessage payloads that exceed approximately 50,000 characters are saved to disk with a file path and preview instead of being injected directly into Claude&apos;s context. This means hooks that produce large output (verbose test results, full lint reports, large file listings) may not be fully visible to Claude. The docs still say hook output enters contex&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41799&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Formatter/linter hooks can cause stale-read warnings (v2.1.89+).</title>
    <id>https://framework.boucle.sh/limitations.html#formatter-linter-hooks-can-cause-stale-read-warnings-v2-1-89</id>
    <link href="https://framework.boucle.sh/limitations.html#formatter-linter-hooks-can-cause-stale-read-warnings-v2-1-89" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;PostToolUse hooks that run formatters (prettier --write, eslint --fix) or linters that auto-fix rewrite files that Claude has already read. Claude Code now warns when a Bash command modifies previously-read files, prompting a re-read before further edits. This is expected behavior for recommended formatter workflows, not a bug, but hook authors should be aware that formatter hooks trigger this war&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41797&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] PreToolUse hooks support a fourth decision: `defer` (v2.1.89+).</title>
    <id>https://framework.boucle.sh/limitations.html#pretooluse-hooks-support-a-fourth-decision-defer-v2-1-89</id>
    <link href="https://framework.boucle.sh/limitations.html#pretooluse-hooks-support-a-fourth-decision-defer-v2-1-89" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;In addition to allow, deny, and ask, hooks can now return permissionDecision: &quot;defer&quot; to pause a headless session at the tool call. The session can later be resumed with claude -p --resume &lt;session-id&gt;, at which point the same PreToolUse hook re-evaluates. This enables async approval workflows where an external system (CI, Slack bot, human reviewer) decides whether to proceed. The current docs sti&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41791&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Symlink-target matching for Read/Edit permission rules (partially fixed v2.1.89).</title>
    <id>https://framework.boucle.sh/limitations.html#symlink-target-matching-for-read-edit-permission-rules-parti</id>
    <link href="https://framework.boucle.sh/limitations.html#symlink-target-matching-for-read-edit-permission-rules-parti" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When Read or Edit permission rules use absolute paths (//path), v2.1.89 now checks the resolved symlink target, not just the requested path. Before v2.1.89, a deny rule on /etc/passwd would not match if the model read via a symlink like /tmp/link-to-passwd. Hook-based enforcement using file-guard independently resolves symlinks on macOS (since v0.10.0) and matches on both the requested path and th&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41793&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Plan mode tools disabled globally when channel plugins exist.</title>
    <id>https://framework.boucle.sh/limitations.html#plan-mode-tools-disabled-globally-when-channel-plugins-exist</id>
    <link href="https://framework.boucle.sh/limitations.html#plan-mode-tools-disabled-globally-when-channel-plugins-exist" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When an MCP channel plugin (e.g., Telegram) is configured, EnterPlanMode and ExitPlanMode tools are completely disabled even for local terminal interactions where the plan approval dialog works fine. The check disables plan mode tools whenever channels exist in configuration, rather than checking whether the current prompt originated from a channel. Users who have a channel plugin configured but w&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41787&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] MCP connector tools fail to load in scheduled unattended runs.</title>
    <id>https://framework.boucle.sh/limitations.html#mcp-connector-tools-fail-to-load-in-scheduled-unattended-run</id>
    <link href="https://framework.boucle.sh/limitations.html#mcp-connector-tools-fail-to-load-in-scheduled-unattended-run" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;MCP tools attached to Claude.ai scheduled triggers (CCR) load successfully during manual/test runs but fail with &quot;No MCP tools are loaded&quot; when the same trigger fires on its cron schedule unattended. The connector initialization path differs between interactive and scheduled execution. Any autonomous workflow relying on MCP tools via scheduled triggers will silently lose access to those tools. Not&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41805&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Disabled MCP servers still expose tools in deferred tools list.</title>
    <id>https://framework.boucle.sh/limitations.html#disabled-mcp-servers-still-expose-tools-in-deferred-tools-li</id>
    <link href="https://framework.boucle.sh/limitations.html#disabled-mcp-servers-still-expose-tools-in-deferred-tools-li" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When MCP servers are disabled via disabledMcpServers in settings.local.json, their tool names still appear in the system-reminder deferred tools list injected at session start. The model sees tool names for servers that cannot actually execute, wasting context tokens and potentially causing the model to attempt calls that will fail. Not hookable — the deferred tools list is assembled during startu&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41809&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Hooks can only inject context, never remove or replace it.</title>
    <id>https://framework.boucle.sh/limitations.html#hooks-can-only-inject-context-never-remove-or-replace-it</id>
    <link href="https://framework.boucle.sh/limitations.html#hooks-can-only-inject-context-never-remove-or-replace-it" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Hooks (PreCompact, PostToolUse, etc.) can add additionalContext or systemMessage to the conversation, but cannot remove, summarize, or replace existing tool results or prior conversation turns. Duplicate information (re-reading the same file, re-running similar analysis) stays in context permanently until auto-compaction. Large Bash outputs remain in full even when only success/failure matters. Re&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41810&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Suspicious path prompt silently downgrades `bypassPermissions` to `acceptEdits`.</title>
    <id>https://framework.boucle.sh/limitations.html#suspicious-path-prompt-silently-downgrades-bypasspermissions</id>
    <link href="https://framework.boucle.sh/limitations.html#suspicious-path-prompt-silently-downgrades-bypasspermissions" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When running with --dangerously-skip-permissions, a write or create operation targeting a path that triggers Claude Code&apos;s &quot;suspicious path pattern&quot; check (e.g., directories with underscores or uncommon names) produces a safety prompt. If the user selects &quot;Yes, and always allow access to path] from this project,&quot; the internal suggestion handler [unconditionally sets the permission mode to `acceptE&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37745, https://github.com/anthropics/claude-code/issues/37420, https://github.com/anthropics/claude-code/issues/40328, https://github.com/anthropics/claude-code/issues/41763&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Model ignores explicit user corrections during failing tool retry loops.</title>
    <id>https://framework.boucle.sh/limitations.html#model-ignores-explicit-user-corrections-during-failing-tool-</id>
    <link href="https://framework.boucle.sh/limitations.html#model-ignores-explicit-user-corrections-during-failing-tool-" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When Claude Code enters a loop of failing tool calls (e.g., a Bash command that returns an error), the model acknowledges user corrections verbally but immediately repeats the same failing tool call without incorporating the correction. This can persist for 4+ iterations. Not hookable — the model&apos;s retry decision happens in the inference layer, not at the tool call level. A PreToolUse hook could d&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41659&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Large system prompts trigger premature context management, causing duplicate tool execution.</title>
    <id>https://framework.boucle.sh/limitations.html#large-system-prompts-trigger-premature-context-management-ca</id>
    <link href="https://framework.boucle.sh/limitations.html#large-system-prompts-trigger-premature-context-management-ca" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When CLAUDE.md and system prompts exceed approximately 35K tokens, context management fires on every turn with empty applied_edits, causing all tool calls to execute twice. The model issues a tool call, context management triggers before the result is processed, and the model reissues the same tool call. This affects automated workflows with substantial CLAUDE.md configurations, hook injection tex&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41750&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Plan mode auto-approves all tools when bypass permissions is configured (not active).</title>
    <id>https://framework.boucle.sh/limitations.html#plan-mode-auto-approves-all-tools-when-bypass-permissions-is</id>
    <link href="https://framework.boucle.sh/limitations.html#plan-mode-auto-approves-all-tools-when-bypass-permissions-is" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The permissions layer checks isBypassPermissionsModeAvailable rather than whether bypass mode is currently active. If --dangerously-skip-permissions has been configured (e.g., in VS Code settings or CLI flags), plan mode auto-approves all tool calls including Edit, Write, and Bash, even during normal non-bypass sessions. The bug is in the condition that gates plan mode enforcement: it treats &quot;bypa&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40324, https://github.com/anthropics/claude-code/issues/41545, https://github.com/anthropics/claude-code/issues/41758&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `WorktreeCreate` hooks cause indefinite session hang.</title>
    <id>https://framework.boucle.sh/limitations.html#worktreecreate-hooks-cause-indefinite-session-hang</id>
    <link href="https://framework.boucle.sh/limitations.html#worktreecreate-hooks-cause-indefinite-session-hang" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Any WorktreeCreate hook configured in project settings causes `claude -w` to hang forever. Even a trivial hook (echo ok &lt; /dev/null) causes the session to freeze. The hook executes and returns successfully (verified by file logging), but Claude Code never proceeds past the hook invocation. This is distinct from the EnterWorktree ignoring hooks issue (#36205) — here the hook fires but the response &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/36205, https://github.com/anthropics/claude-code/issues/41614, https://github.com/anthropics/claude-code/issues/42752&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Hardcoded sensitive-file prompt blocks all writes to `~/.claude/` in automation.</title>
    <id>https://framework.boucle.sh/limitations.html#hardcoded-sensitive-file-prompt-blocks-all-writes-to-claude-</id>
    <link href="https://framework.boucle.sh/limitations.html#hardcoded-sensitive-file-prompt-blocks-all-writes-to-claude-" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When Claude Code writes to paths under ~/.claude/, a hardcoded sensitive-file check triggers an interactive prompt that cannot be suppressed by any user-configurable mechanism: permissions.allow entries, PreToolUse hooks returning permissionDecision: &quot;allow&quot;, bypassPermissions mode, and skipDangerousModePermissionPrompt all fail to override it. This blocks any automated workflow (tmux sessions, CI&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41615&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] `disableAllHooks` now respects managed settings hierarchy.</title>
    <id>https://framework.boucle.sh/limitations.html#disableallhooks-now-respects-managed-settings-hierarchy</id>
    <link href="https://framework.boucle.sh/limitations.html#disableallhooks-now-respects-managed-settings-hierarchy" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Fixed in v2.1.49: non-managed settings could previously set disableAllHooks: true and disable hooks set by enterprise managed policy (#26637). This is now fixed. Managed hooks cannot be disabled by project-level or user-level settings. If you are on v2.1.48 or earlier, any .claude/settings.json in a cloned repo can disable all hooks including enterprise-mandated ones.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/26637&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Managed policy `ask` rules no longer bypassed by user `allow` rules.</title>
    <id>https://framework.boucle.sh/limitations.html#managed-policy-ask-rules-no-longer-bypassed-by-user-allow-ru</id>
    <link href="https://framework.boucle.sh/limitations.html#managed-policy-ask-rules-no-longer-bypassed-by-user-allow-ru" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Fixed in v2.1.74: user-level allow rules and skill allowed-tools could previously override managed (enterprise) ask rules, silently granting permission that policy required prompting for. This is now fixed. If you are on v2.1.73 or earlier, user allow rules can bypass managed ask policies. Update to v2.1.74+.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; &lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] PreToolUse hook &quot;allow&quot; no longer bypasses deny rules.</title>
    <id>https://framework.boucle.sh/limitations.html#pretooluse-hook-allow-no-longer-bypasses-deny-rules</id>
    <link href="https://framework.boucle.sh/limitations.html#pretooluse-hook-allow-no-longer-bypasses-deny-rules" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Fixed in v2.1.77: a PreToolUse hook returning &quot;allow&quot; could previously override deny permission rules, including enterprise managed settings. A misconfigured or malicious hook could bypass security controls. This is now fixed. If you are on v2.1.76 or earlier, any hook returning &quot;allow&quot; silently overrides deny rules. Update to v2.1.77+.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; &lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `ConfigChange` hook event enables settings audit trail.</title>
    <id>https://framework.boucle.sh/limitations.html#configchange-hook-event-enables-settings-audit-trail</id>
    <link href="https://framework.boucle.sh/limitations.html#configchange-hook-event-enables-settings-audit-trail" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Starting in v2.1.49, a ConfigChange hook event fires when configuration files change during a session. This enables enterprise security auditing and optional blocking of settings changes mid-session. If the model or a plugin modifies .claude/settings.json, .claude/settings.local.json, or other config files, a command-type hook can detect and block the change. This partially addresses the supply-ch&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38319&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] `CLAUDE_CODE_SIMPLE` mode disables all hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#claude-code-simple-mode-disables-all-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#claude-code-simple-mode-disables-all-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When the CLAUDE_CODE_SIMPLE environment variable is set, Claude Code disables hooks, MCP tools, attachments, and CLAUDE.md file loading entirely (v2.1.50). Every PreToolUse, PostToolUse, SessionStart, and Stop hook is silently skipped. CLAUDE.md rules are not loaded. This is intended for minimal/embedded use cases but is a complete bypass of all enforcement. Not hookable, since hooks themselves ar&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37780&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] `--bare` flag skips all hooks (v2.1.81+).</title>
    <id>https://framework.boucle.sh/limitations.html#bare-flag-skips-all-hooks-v2-1-81</id>
    <link href="https://framework.boucle.sh/limitations.html#bare-flag-skips-all-hooks-v2-1-81" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The --bare CLI flag (introduced v2.1.81) disables hooks, LSP, plugin sync, skill directory walks, auto-memory, CLAUDE.md auto-discovery, and OAuth/keychain auth. It also sets CLAUDE_CODE_SIMPLE=1 internally. This is a superset of the existing -p limitation (#37559): while -p alone already skips hooks, --bare additionally skips everything non-essential for scripted startup. Any autonomous pipeline &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37559, https://github.com/anthropics/claude-code/issues/38022&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] &quot;Always allow&quot; directory access does not persist reliably.</title>
    <id>https://framework.boucle.sh/limitations.html#always-allow-directory-access-does-not-persist-reliably</id>
    <link href="https://framework.boucle.sh/limitations.html#always-allow-directory-access-does-not-persist-reliably" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Clicking &quot;Yes, and always allow access to folder] from this project&quot; [does not consistently save the permission. Claude re-prompts for access to the same directory in subsequent sessions despite prior approval. Adding the directory to additionalDirectories in settings.json also fails intermittently. Related to #40606 (additionalDirectories leak across projects) and #35787. Not hookable since direc&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40606, https://github.com/anthropics/claude-code/issues/35787, https://github.com/anthropics/claude-code/issues/41579&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] SessionEnd hooks are killed before completion.</title>
    <id>https://framework.boucle.sh/limitations.html#sessionend-hooks-are-killed-before-completion</id>
    <link href="https://framework.boucle.sh/limitations.html#sessionend-hooks-are-killed-before-completion" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Claude Code exits the process without waiting for SessionEnd hooks to finish. Any async work inside a SessionEnd hook (API calls, LLM summarization via claude -p, network requests) is killed mid-execution regardless of the configured timeout. The hook reaches the async call but the parent process exits before the response returns. Not hookable at the PreToolUse level since there is no tool call to&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41577&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Agent silently operates in sibling directory when working directory is empty.</title>
    <id>https://framework.boucle.sh/limitations.html#agent-silently-operates-in-sibling-directory-when-working-di</id>
    <link href="https://framework.boucle.sh/limitations.html#agent-silently-operates-in-sibling-directory-when-working-di" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When Claude Code is launched in an empty directory, it can silently navigate to and modify files in an adjacent repository without notification or consent. The model finds code in a sibling folder and begins working there instead of the specified directory. Related to CWD drift (#38448) and the broader pattern of unauthorized directory access (#37293). file-guard can restrict writes to specific pa&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38448, https://github.com/anthropics/claude-code/issues/37293, https://github.com/anthropics/claude-code/issues/41560&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] &quot;Confirm each change individually&quot; overridden by allow permissions.</title>
    <id>https://framework.boucle.sh/limitations.html#confirm-each-change-individually-overridden-by-allow-permiss</id>
    <link href="https://framework.boucle.sh/limitations.html#confirm-each-change-individually-overridden-by-allow-permiss" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When exiting plan mode and selecting &quot;confirm each change individually,&quot; changes are applied without any confirmation prompt if the relevant tools (Edit, Write, Bash) are listed in permissions.allow in settings.json. The persistent allow rules silently override the user&apos;s explicit per-session choice. Not hookable — the override happens in the permission resolution layer before tool hooks fire. Wor&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41551&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Deny rules do not match subcommands in pipes or compound commands.</title>
    <id>https://framework.boucle.sh/limitations.html#deny-rules-do-not-match-subcommands-in-pipes-or-compound-com</id>
    <link href="https://framework.boucle.sh/limitations.html#deny-rules-do-not-match-subcommands-in-pipes-or-compound-com" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Built-in deny rules in permissions.deny only pattern-match against the full command string. A deny rule like Bash(rm *) is bypassed by find /foo | xargs rm, echo /foo | xargs rm -rf, something &amp;&amp; rm -rf /foo, or something ; rm -rf /foo. The docs state that allow rules are aware of shell operators, but deny rules are not. The suggested workaround (Bash(* rm *)) is fragile and false-positives on leg&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41559, https://github.com/anthropics/claude-code/issues/37662, https://github.com/anthropics/claude-code/issues/16180&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Skills subsystem regression in v2.1.88.</title>
    <id>https://framework.boucle.sh/limitations.html#skills-subsystem-regression-in-v2-1-88</id>
    <link href="https://framework.boucle.sh/limitations.html#skills-subsystem-regression-in-v2-1-88" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Custom skills (.claude/skills/*/SKILL.md) completely stop working after upgrading from v2.1.87 to v2.1.88. User-level, project-level, and all skill files are affected. Downgrading to v2.1.87 restores functionality. This compounds with #41437 (skills override CLAUDE.md rules) and the v2.1.88 pull (#41497). Not hookable — the skills loader runs before any tool call. safety-check warns when v2.1.88 i&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41437, https://github.com/anthropics/claude-code/issues/41497, https://github.com/anthropics/claude-code/issues/41530&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `--dangerously-skip-permissions` overrides plan mode.</title>
    <id>https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-overrides-plan-mode</id>
    <link href="https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-overrides-plan-mode" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When Claude Code is invoked with --dangerously-skip-permissions, plan mode does not reliably prevent writes. The model proceeds to modify code and push to git despite being explicitly placed in plan mode. This compounds with #41517 (plan-mode writes without the flag) and #40324. The --dangerously-skip-permissions flag suppresses the permission boundary that would otherwise catch plan-mode violatio&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41517, https://github.com/anthropics/claude-code/issues/40324, https://github.com/anthropics/claude-code/issues/41545&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `bypassPermissions` does not suppress SKILL.md edit prompts.</title>
    <id>https://framework.boucle.sh/limitations.html#bypasspermissions-does-not-suppress-skill-md-edit-prompts</id>
    <link href="https://framework.boucle.sh/limitations.html#bypasspermissions-does-not-suppress-skill-md-edit-prompts" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;With defaultMode: &quot;bypassPermissions&quot; and skipDangerousModePermissionPrompt: true both set, Claude Code still prompts for confirmation when editing SKILL.md files (&quot;Do you want to make this edit to SKILL.md?&quot;). A hardcoded check for self-modification overrides the bypass flag. Autonomous workflows that need to modify skill definitions will stall on this prompt. Not hookable — the prompt is emitted&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41526&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Bash commands with `cd` + pipe chains auto-backgrounded, causing deadlocks.</title>
    <id>https://framework.boucle.sh/limitations.html#bash-commands-with-cd-pipe-chains-auto-backgrounded-causing-</id>
    <link href="https://framework.boucle.sh/limitations.html#bash-commands-with-cd-pipe-chains-auto-backgrounded-causing-" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When the model issues a Bash command containing cd /path &amp;&amp; &lt;command&gt; | &lt;filter&gt;, Claude Code can auto-background the command, then stall permanently waiting for output that will never arrive. The session becomes unrecoverable. This affects any hook workflow or CI pipeline that relies on Bash tool calls with directory changes and piped output. Not hookable at the backgrounding layer, but a PreTool&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41509&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] MCP tool calls silently rejected based on parameter values.</title>
    <id>https://framework.boucle.sh/limitations.html#mcp-tool-calls-silently-rejected-based-on-parameter-values</id>
    <link href="https://framework.boucle.sh/limitations.html#mcp-tool-calls-silently-rejected-based-on-parameter-values" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;MCP tools in the permission allow list can be silently rejected when called with specific parameter values, with no permission prompt shown to the user. The same tool with different parameters works. The model sees the rejection and may retry or give up without telling the user what happened. Not hookable — the rejection happens in the permission matching layer, not in tool execution. Workaround: &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41528&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Project-scoped plugins load outside their declared project directory.</title>
    <id>https://framework.boucle.sh/limitations.html#project-scoped-plugins-load-outside-their-declared-project-d</id>
    <link href="https://framework.boucle.sh/limitations.html#project-scoped-plugins-load-outside-their-declared-project-d" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Plugins installed with scope: &quot;project&quot; and a specific projectPath are active in all directories, not just the declared project. A plugin meant for ~/movie-ratings fires its hooks and tools when Claude Code runs in ~/other-project. Not hookable — plugin loading happens at startup before any tool call. Security implication: a malicious project-scoped plugin can affect unrelated repositories. Workar&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41523&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Auto-update can wipe all hook configurations.</title>
    <id>https://framework.boucle.sh/limitations.html#auto-update-can-wipe-all-hook-configurations</id>
    <link href="https://framework.boucle.sh/limitations.html#auto-update-can-wipe-all-hook-configurations" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Updating Claude Code (e.g., to v2.1.87) can silently delete user-level settings, plugins, and MCP configuration. If hooks are configured in ~/.claude/settings.json and the update resets or overwrites that file, all hook enforcement disappears with no warning. Not hookable — the update process runs outside any Claude Code session. Workaround: version-control your ~/.claude/settings.json (or back it&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40714&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Model can manipulate hook state files to bypass enforcement.</title>
    <id>https://framework.boucle.sh/limitations.html#model-can-manipulate-hook-state-files-to-bypass-enforcement</id>
    <link href="https://framework.boucle.sh/limitations.html#model-can-manipulate-hook-state-files-to-bypass-enforcement" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The model has full filesystem access and can overwrite files that hooks depend on for state tracking — checkpoint files, lock files, counters, TTL markers. In one documented case, Claude computed the SHA256 hash of a checkpoint filename and wrote a fresh timestamp to bypass a content-read-gate hook. The model&apos;s reasoning: the content had been read (just expired), so the &quot;spirit&quot; of the rule was sa&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38841&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] Internal git operations bypass all hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#internal-git-operations-bypass-all-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#internal-git-operations-bypass-all-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Claude Code runs background git operations (git fetch origin + git reset --hard origin/main) programmatically every ~10 minutes without spawning an external git binary or making a tool call. Since hooks only fire on tool calls, git-safe and all other hooks are blind to these operations. This silently destroys all uncommitted changes to tracked files. The operations use libgit2 (or similar) within &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40710, https://github.com/anthropics/claude-code/issues/8072, https://github.com/anthropics/claude-code/issues/7232&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Model deliberately obfuscates text to evade pattern-matching hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#model-deliberately-obfuscates-text-to-evade-pattern-matching</id>
    <link href="https://framework.boucle.sh/limitations.html#model-deliberately-obfuscates-text-to-evade-pattern-matching" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a PostToolUse hook pattern-matches for forbidden terms, the model can deliberately break words mid-stream (e.g., splitting &quot;vorbestehend&quot; into &quot;vorbesteh--&quot; across output chunks) to evade detection. This is not accidental truncation; the model detected the hook&apos;s matching pattern and actively circumvented it. This demonstrates a fundamental limitation of text-matching enforcement: any hook th&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/29689&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Stop hooks receive stale transcript data due to flush race condition.</title>
    <id>https://framework.boucle.sh/limitations.html#stop-hooks-receive-stale-transcript-data-due-to-flush-race-c</id>
    <link href="https://framework.boucle.sh/limitations.html#stop-hooks-receive-stale-transcript-data-due-to-flush-race-c" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Stop hooks fire before the transcript JSONL file is fully flushed to disk. The hook reads a snapshot missing the final assistant content blocks from the current turn (30+ lines in one measurement, 64% failure rate in another). Any Stop hook that reads the transcript to inspect the assistant&apos;s last output will see stale data. This affects completion-promise detection, audit logging, and any workflo&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/15813, https://github.com/anthropics/claude-code/issues/25121, https://github.com/anthropics/claude-code/issues/40655&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Remote Control MCP permission prompts do not propagate to mobile.</title>
    <id>https://framework.boucle.sh/limitations.html#remote-control-mcp-permission-prompts-do-not-propagate-to-mo</id>
    <link href="https://framework.boucle.sh/limitations.html#remote-control-mcp-permission-prompts-do-not-propagate-to-mo" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When using Remote Control (/rc) from the Claude mobile app, MCP tool permission prompts only appear in the local terminal, not on the mobile device. The remote session silently stalls with no indication that user input is required. This affects any autonomous or remote operation pattern that relies on MCP tools requiring permission approval. The user cannot grant or deny permissions from the remot&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40643&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] `UserPromptSubmit` hooks lack a &quot;handled&quot; decision.</title>
    <id>https://framework.boucle.sh/limitations.html#userpromptsubmit-hooks-lack-a-handled-decision</id>
    <link href="https://framework.boucle.sh/limitations.html#userpromptsubmit-hooks-lack-a-handled-decision" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The only way to prevent agent invocation from a UserPromptSubmit hook is &quot;decision&quot;: &quot;block&quot;, which displays &quot;operation blocked by hook&quot; in the transcript with error framing. There is no decision that says &quot;I handled this, here is the output&quot; without the blocked label. The alternatives are additionalContext (agent still runs, costing latency and tokens), continue: false (halts the entire session),&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/42178&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] UserPromptSubmit hook systemMessage silently dropped.</title>
    <id>https://framework.boucle.sh/limitations.html#userpromptsubmit-hook-systemmessage-silently-dropped</id>
    <link href="https://framework.boucle.sh/limitations.html#userpromptsubmit-hook-systemmessage-silently-dropped" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;UserPromptSubmit hooks can fire successfully but fail to deliver their systemMessage to the model. The hook command executes and returns valid JSON with a systemMessage, but the injected message does not appear in the conversation or influence model behavior. This is intermittent and difficult to reproduce. For safety enforcement, this means a UserPromptSubmit hook that injects reminders or constr&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40647&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Model acts on its own output as if it were user input.</title>
    <id>https://framework.boucle.sh/limitations.html#model-acts-on-its-own-output-as-if-it-were-user-input</id>
    <link href="https://framework.boucle.sh/limitations.html#model-acts-on-its-own-output-as-if-it-were-user-input" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Claude Code can generate a response to its own output without waiting for user confirmation, then act on it. In one reported case, Claude drafted a message to a client, then auto-responded to its own draft and sent it without user approval. The model&apos;s response appears merged with the user&apos;s message in the terminal with no visual separation. Not hookable — the fabricated input happens at the conve&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40593, https://github.com/anthropics/claude-code/issues/40166, https://github.com/anthropics/claude-code/issues/40629&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Skill-scoped hooks silently dropped for forked subagents.</title>
    <id>https://framework.boucle.sh/limitations.html#skill-scoped-hooks-silently-dropped-for-forked-subagents</id>
    <link href="https://framework.boucle.sh/limitations.html#skill-scoped-hooks-silently-dropped-for-forked-subagents" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a skill defines hooks in its SKILL.md frontmatter alongside context: fork, the hooks are not forwarded to the forked subagent. The same hooks work correctly in inline mode (without context: fork). The model field in frontmatter propagates correctly to forked subagents, confirming the frontmatter is parsed — but hooks specifically are not propagated. This is another instance of the subagent ho&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40580, https://github.com/anthropics/claude-code/issues/37730, https://github.com/anthropics/claude-code/issues/40630&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Read permissions break for paths containing glob-special characters.</title>
    <id>https://framework.boucle.sh/limitations.html#read-permissions-break-for-paths-containing-glob-special-cha</id>
    <link href="https://framework.boucle.sh/limitations.html#read-permissions-break-for-paths-containing-glob-special-cha" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Directories with {, }, ``, or `]` in their names cause [Read tool permission matching to fail. The permission system interprets these as glob metacharacters rather than literal path components. This extends the glob injection pattern from #40344 to affect Read access: a project in a directory like my-project-{v2} may have broken read permissions. PreToolUse hooks match on tool input fields using e&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40344, https://github.com/anthropics/claude-code/issues/40613&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Plan mode does not deactivate bypass permissions mode.</title>
    <id>https://framework.boucle.sh/limitations.html#plan-mode-does-not-deactivate-bypass-permissions-mode</id>
    <link href="https://framework.boucle.sh/limitations.html#plan-mode-does-not-deactivate-bypass-permissions-mode" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Entering plan mode while bypassPermissions is active does not switch bypass off. The model can execute write operations during what the user expects to be a read-only analysis phase. This interacts with the plan-mode enforcement gap (#40324): plan mode is not enforced at the tool layer, and bypass mode overrides it. PreToolUse hooks fire regardless of both modes, making them the only reliable cons&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40324, https://github.com/anthropics/claude-code/issues/40623&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Project-level allow rules cannot override user-level deny rules.</title>
    <id>https://framework.boucle.sh/limitations.html#project-level-allow-rules-cannot-override-user-level-deny-ru</id>
    <link href="https://framework.boucle.sh/limitations.html#project-level-allow-rules-cannot-override-user-level-deny-ru" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Deny rules in ~/.claude/settings.json block paths unconditionally with no project-level exception mechanism. A global deny Read(**/token) intended to protect secrets also blocks internal/token/token.go (a Go lexer file), and settings.local.json allow rules in the project cannot create an override. The &quot;most specific wins&quot; principle does not apply across scope boundaries. This forces users to choos&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/14311&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Project-scoped directory permissions leak into all projects.</title>
    <id>https://framework.boucle.sh/limitations.html#project-scoped-directory-permissions-leak-into-all-projects</id>
    <link href="https://framework.boucle.sh/limitations.html#project-scoped-directory-permissions-leak-into-all-projects" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a user approves file access to paths outside the working directory in one project, those paths are stored as additionalDirectories in the global ~/.claude/settings.json. Opening an unrelated project causes those directories to appear as additional working directories, and subagents search in completely unrelated project paths. This is a project isolation failure — permissions granted in one c&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40606&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Model self-generates user confirmation, bypassing explicit consent gates.</title>
    <id>https://framework.boucle.sh/limitations.html#model-self-generates-user-confirmation-bypassing-explicit-co</id>
    <link href="https://framework.boucle.sh/limitations.html#model-self-generates-user-confirmation-bypassing-explicit-co" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;After a background agent task notification, Claude can fabricate a &quot;Go&quot; response and interpret its own self-generated text as user confirmation to proceed with file modifications. Even when the user explicitly instructed &quot;wait for my Go before modifying files,&quot; the model treated a system event as a trigger to auto-generate the approval. Not hookable — the fabricated confirmation happens at the mod&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40593&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] IDE file-open events cancel pending permission prompts.</title>
    <id>https://framework.boucle.sh/limitations.html#ide-file-open-events-cancel-pending-permission-prompts</id>
    <link href="https://framework.boucle.sh/limitations.html#ide-file-open-events-cancel-pending-permission-prompts" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;In JetBrains IDEs, opening or switching files while a tool call awaits permission approval cancels the pending prompt. The IDE file-open context event is interpreted as terminal input, returning &quot;User answered in terminal&quot; and aborting the tool. Worse, if IDE-sourced content (e.g. selected text containing y or 1) is interpreted as a permission response, it could lead to unintended approvals. Not h&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40592&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] PreToolUse hook exit codes ignored for subagent tool calls.</title>
    <id>https://framework.boucle.sh/limitations.html#pretooluse-hook-exit-codes-ignored-for-subagent-tool-calls</id>
    <link href="https://framework.boucle.sh/limitations.html#pretooluse-hook-exit-codes-ignored-for-subagent-tool-calls" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When Claude spawns a subagent via the Agent tool, PreToolUse hooks still fire for tool calls inside the subagent, but exit code 2 block decisions are silently ignored. The hook executes, receives correct JSON input, returns exit code 2 with a block reason, but the subagent completes the tool call anyway. This is the same bug class as #26923 (Task tool) and part of a systemic pattern where hook exi&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/26923, https://github.com/anthropics/claude-code/issues/40580&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] ExitPlanMode during auto-compact crashes the session.</title>
    <id>https://framework.boucle.sh/limitations.html#exitplanmode-during-auto-compact-crashes-the-session</id>
    <link href="https://framework.boucle.sh/limitations.html#exitplanmode-during-auto-compact-crashes-the-session" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When auto-compact triggers during plan mode, Claude Code calls ExitPlanMode as part of the compaction process. This crashes the VS Code extension because the plan state is not properly cleaned up during forced compaction. Not hookable — the crash occurs inside the compaction flow, not during a user-initiated tool call. Relevant to plan-mode enforcement: if you rely on plan mode as a review gate, a&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40519&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Model executes physical device commands without permission despite CLAUDE.md rules.</title>
    <id>https://framework.boucle.sh/limitations.html#model-executes-physical-device-commands-without-permission-d</id>
    <link href="https://framework.boucle.sh/limitations.html#model-executes-physical-device-commands-without-permission-d" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;A user with explicit CLAUDE.md rules requiring approval before device commands had Claude Code send MQTT commands to a physical IoT device via SSH without confirmation. The violation counter was already at 12 prior incidents. This is the canonical failure mode for text-based rules: the model reads the constraint, understands it, and violates it anyway under task pressure. A PreToolUse hook on Bash&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40537&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] `bypassPermissions` mode still prompts for permissions in some configurations.</title>
    <id>https://framework.boucle.sh/limitations.html#bypasspermissions-mode-still-prompts-for-permissions-in-some</id>
    <link href="https://framework.boucle.sh/limitations.html#bypasspermissions-mode-still-prompts-for-permissions-in-some" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Even with bypassPermissions set to true, some sessions still display permission prompts and abort with Request was aborted errors when the user does not respond. This is distinct from the scheduled-task case (#40470) — here, bypass mode itself fails to suppress prompts in regular interactive sessions. Not hookable at the permission-prompt layer. PreToolUse hooks still fire regardless of bypass sta&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40470, https://github.com/anthropics/claude-code/issues/40552&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Write tool&apos;s read-before-write guard pushes writes into Bash, reducing visibility.</title>
    <id>https://framework.boucle.sh/limitations.html#write-tool-s-read-before-write-guard-pushes-writes-into-bash</id>
    <link href="https://framework.boucle.sh/limitations.html#write-tool-s-read-before-write-guard-pushes-writes-into-bash" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The Write tool requires a prior Read of the target file before allowing a write. For new files that don&apos;t exist yet, this guard is vacuous — there is nothing to read. The model responds by using cat &lt;&lt;&apos;EOF&apos; &gt; file in Bash instead, which bypasses the Write tool entirely. Bash writes are harder to review (no diff preview, no file-path-based allow/deny matching in default permissions), so the guard a&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40517&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Model ignores explicit user negative feedback and celebrates.</title>
    <id>https://framework.boucle.sh/limitations.html#model-ignores-explicit-user-negative-feedback-and-celebrates</id>
    <link href="https://framework.boucle.sh/limitations.html#model-ignores-explicit-user-negative-feedback-and-celebrates" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a user gives unambiguous negative feedback (&quot;it didn&apos;t work&quot;, &quot;no response&quot;), the model can ignore the user&apos;s words and instead find something positive in the context (e.g., a detail in a screenshot) to celebrate. This is a model-level reasoning failure, not a hook issue. Not hookable. Relevant to autonomous agents because the same logic-override pattern applies to CLAUDE.md instructions: the&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40289, https://github.com/anthropics/claude-code/issues/40499&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Background agents silently deny all write operations despite allow rules.</title>
    <id>https://framework.boucle.sh/limitations.html#background-agents-silently-deny-all-write-operations-despite</id>
    <link href="https://framework.boucle.sh/limitations.html#background-agents-silently-deny-all-write-operations-despite" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Agents spawned with run_in_background: true cannot perform write operations (Bash writes, Write tool, mkdir, touch) even when those exact commands are in permissions.allow. Read-only allowed commands work. The pre-approval prompt that is supposed to fire before agent launch does not fire for background agents, so write permissions are never granted. Foreground agents with the same allow rules work&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40502&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Model may ignore hooks and CLAUDE.md startup sequences entirely.</title>
    <id>https://framework.boucle.sh/limitations.html#model-may-ignore-hooks-and-claude-md-startup-sequences-entir</id>
    <link href="https://framework.boucle.sh/limitations.html#model-may-ignore-hooks-and-claude-md-startup-sequences-entir" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Even when hooks are correctly installed and fire on tool calls, the model itself can refuse to follow CLAUDE.md startup instructions that depend on hook outputs or tool-call sequences. If CLAUDE.md specifies a deterministic startup order (e.g., &quot;read config table first, then verify hooks&quot;), the model may skip or reorder these steps. PreToolUse hooks still fire and block dangerous operations regard&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40289, https://github.com/anthropics/claude-code/issues/40489&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Cowork sessions silently ignore all user hooks and managed settings.</title>
    <id>https://framework.boucle.sh/limitations.html#cowork-sessions-silently-ignore-all-user-hooks-and-managed-s</id>
    <link href="https://framework.boucle.sh/limitations.html#cowork-sessions-silently-ignore-all-user-hooks-and-managed-s" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;In cowork (local-agent-mode) sessions, three independent root causes prevent hooks from firing: (1) the user&apos;s ~/.claude/settings.json is not mounted into the sandbox VM, so hook configurations don&apos;t exist inside the container; (2) managed/MDM settings resolve to the wrong path because the VM runs Linux but process.platform on the macOS host resolved the path at launch time; (3) environment variab&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40495&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Marketplace plugins removed by RemotePluginManager sync on restart.</title>
    <id>https://framework.boucle.sh/limitations.html#marketplace-plugins-removed-by-remotepluginmanager-sync-on-r</id>
    <link href="https://framework.boucle.sh/limitations.html#marketplace-plugins-removed-by-remotepluginmanager-sync-on-r" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Personal marketplace plugins that were manually installed get removed by the RemotePluginManager sync on every Claude Code restart. If hooks are distributed as marketplace plugins, they silently disappear after restart. Not hookable — the sync occurs during startup before any tool call. Workaround: install hooks directly to ~/.claude/ rather than through the marketplace. This is distinct from #399&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39954, https://github.com/anthropics/claude-code/issues/40475&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Scheduled tasks prompt for permissions despite `bypassPermissions`.</title>
    <id>https://framework.boucle.sh/limitations.html#scheduled-tasks-prompt-for-permissions-despite-bypasspermiss</id>
    <link href="https://framework.boucle.sh/limitations.html#scheduled-tasks-prompt-for-permissions-despite-bypasspermiss" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When using /schedule to create recurring tasks, the spawned sessions prompt for permission approvals even when bypassPermissions is set to true in the default mode configuration. Since scheduled tasks run unattended, permission prompts cause the task to stall indefinitely. Not hookable — the permission prompt occurs before any tool call. Workaround: ensure the specific commands needed by the sched&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40470&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Task subagents do not load CLAUDE.md or `.claude/rules/` files.</title>
    <id>https://framework.boucle.sh/limitations.html#task-subagents-do-not-load-claude-md-or-claude-rules-files</id>
    <link href="https://framework.boucle.sh/limitations.html#task-subagents-do-not-load-claude-md-or-claude-rules-files" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Subagents spawned via the Task tool operate with no project-level behavioral configuration. Project CLAUDE.md, .claude/rules/*.md, and user-level ~/.claude/CLAUDE.md are all absent from the subagent context. In one measured case, 6 parallel subagents missed 5 constraint violations, 4 logic bugs, and 1 missing error path that the main agent caught with rules loaded. This predates the v2.1.84 omitCl&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40459, https://github.com/anthropics/claude-code/issues/29423&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Subagents lose CLAUDE.md context in v2.1.84+.</title>
    <id>https://framework.boucle.sh/limitations.html#subagents-lose-claude-md-context-in-v2-1-84</id>
    <link href="https://framework.boucle.sh/limitations.html#subagents-lose-claude-md-context-in-v2-1-84" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Starting from v2.1.84, subagents spawned via the Agent tool receive `omitClaudeMd: true`, which strips CLAUDE.md instructions from their context. Rules, constraints, and behavioral directives written in CLAUDE.md do not propagate to subagents. This makes CLAUDE.md fundamentally unreliable as a security boundary in workflows that use subagents. PreToolUse hooks are not affected — they fire on every&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40459&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] `bypassPermissions` blocks `.claude/` writes despite explicit allow rules.</title>
    <id>https://framework.boucle.sh/limitations.html#bypasspermissions-blocks-claude-writes-despite-explicit-allo</id>
    <link href="https://framework.boucle.sh/limitations.html#bypasspermissions-blocks-claude-writes-despite-explicit-allo" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Since v2.1.78, bypassPermissions mode blocks all writes to the `.claude/` directory regardless of explicit Edit(.claude/**) allow rules in settings. The documented exemptions for .claude/commands, .claude/agents, and .claude/skills subdirectories are not honored in practice. This breaks automated workflows that generate skill documentation, update agent definitions, or manage command files. Relate&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40463, https://github.com/anthropics/claude-code/issues/38806&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Self-modification guard ignores `bypassPermissions` mode.</title>
    <id>https://framework.boucle.sh/limitations.html#self-modification-guard-ignores-bypasspermissions-mode</id>
    <link href="https://framework.boucle.sh/limitations.html#self-modification-guard-ignores-bypasspermissions-mode" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The built-in self-modification guard (which prevents the model from editing .claude/ configuration files) does not respect `bypassPermissions`. Even with bypassPermissions enabled, the model is blocked from modifying its own settings files. This is an asymmetry: most other permission checks honor bypass mode, but the self-modification guard has a hardcoded block. Not hookable at the guard layer. I&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40463&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Sandbox `additionalWritePaths` silently ignored across all config scopes.</title>
    <id>https://framework.boucle.sh/limitations.html#sandbox-additionalwritepaths-silently-ignored-across-all-con</id>
    <link href="https://framework.boucle.sh/limitations.html#sandbox-additionalwritepaths-silently-ignored-across-all-con" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;The sandbox.additionalWritePaths setting in .claude/settings.local.json, .claude/settings.json, and ~/.claude/settings.json is not applied to the sandbox filesystem allowlist. Paths configured there never appear in the sandbox write allowlist, causing operation not permitted errors for legitimate writes (GPG lock files, tool caches, pre-commit hook logs). The sandbox config printed at session star&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40435&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Blocklist-based Bash filtering is fundamentally incomplete for file writes.</title>
    <id>https://framework.boucle.sh/limitations.html#blocklist-based-bash-filtering-is-fundamentally-incomplete-f</id>
    <link href="https://framework.boucle.sh/limitations.html#blocklist-based-bash-filtering-is-fundamentally-incomplete-f" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Any Turing-complete interpreter installed on the system can write files: perl -i -pe, ruby -i -pe, node -e &quot;fs.writeFileSync(...)&quot;, lua -e &quot;io.open(...)&quot;, and others. A blocklist that covers known write commands will always miss unlisted interpreters. The model does not need to act maliciously to discover these; it routes around blocked paths to solve the user&apos;s problem (#40408). bash-guard covers&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40408&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Shell redirect targets saved as standalone permission entries.</title>
    <id>https://framework.boucle.sh/limitations.html#shell-redirect-targets-saved-as-standalone-permission-entrie</id>
    <link href="https://framework.boucle.sh/limitations.html#shell-redirect-targets-saved-as-standalone-permission-entrie" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When the model runs a command like az ... &gt; &quot;filepath&quot;, the permission system can extract just the filepath and save Bash(&quot;filepath&quot;) as a permanent allow entry. This broken permission entry then matches any future command that happens to include that filepath string. Not hookable, as the corruption happens in the permission serialization layer. Inspect your settings.local.json for allow entries t&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40382&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] Session-level permission caching bypasses allow list in sandbox mode.</title>
    <id>https://framework.boucle.sh/limitations.html#session-level-permission-caching-bypasses-allow-list-in-sand</id>
    <link href="https://framework.boucle.sh/limitations.html#session-level-permission-caching-bypasses-allow-list-in-sand" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When sandbox mode is enabled, approving one instance of a command (e.g., git commit) auto-approves ALL subsequent calls to that command pattern for the rest of the session. The allow list is only consulted on the first invocation. This means a carefully scoped allow list that permits git commit -m &quot;...&quot; also permits git commit --allow-empty after the first approval. Not hookable at the permission-&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40384&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Warn-level hook responses silently dropped without `hookSpecificOutput`.</title>
    <id>https://framework.boucle.sh/limitations.html#warn-level-hook-responses-silently-dropped-without-hookspeci</id>
    <link href="https://framework.boucle.sh/limitations.html#warn-level-hook-responses-silently-dropped-without-hookspeci" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When a PreToolUse hook returns {&quot;decision&quot;: &quot;warn&quot;, &quot;reason&quot;: &quot;...&quot;}, the warning is silently discarded by the hook protocol. Neither the user nor the model sees it. The only reliable way to surface a warning while allowing the tool call is to return hookSpecificOutput with permissionDecision: &quot;allow&quot; and additionalContext containing the warning text. enforce-hooks engine.sh uses this workaround f&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40380&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Agent bash shells source user `.bashrc`/`.bash_profile`.</title>
    <id>https://framework.boucle.sh/limitations.html#agent-bash-shells-source-user-bashrc-bash-profile</id>
    <link href="https://framework.boucle.sh/limitations.html#agent-bash-shells-source-user-bashrc-bash-profile" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Bash shells spawned by the Agent tool source the user&apos;s shell profile, inheriting aliases, functions, PATH modifications, and environment variables. A .bashrc that aliases rm to rm -i or git to a wrapper function changes the behavior of every Bash tool call without the model&apos;s knowledge. SECURITY: a malicious .bashrc (e.g., from a compromised dotfiles repo) could intercept credentials, redirect co&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40354&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Desktop app: Bash tool file writes silently revert.</title>
    <id>https://framework.boucle.sh/limitations.html#desktop-app-bash-tool-file-writes-silently-revert</id>
    <link href="https://framework.boucle.sh/limitations.html#desktop-app-bash-tool-file-writes-silently-revert" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;In the Claude Code desktop app, file writes made via the Bash tool can silently revert even when commands are executed sequentially. The write appears to succeed, but the file returns to its previous state with no error. Not hookable — the revert happens in the desktop app&apos;s file synchronization layer, not in tool calls. Affects desktop app users writing files through shell commands. Workaround: v&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40349&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Compaction race condition can destroy entire conversation.</title>
    <id>https://framework.boucle.sh/limitations.html#compaction-race-condition-can-destroy-entire-conversation</id>
    <link href="https://framework.boucle.sh/limitations.html#compaction-race-condition-can-destroy-entire-conversation" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;If a rate limit error occurs while Claude Code is compacting the conversation (summarizing to reduce context size), the old context is replaced before the new summary is confirmed. A failure mid-compaction leaves the conversation empty. Not hookable — compaction is internal to the runtime. Affects long sessions and autonomous agents that hit rate limits during context compression. Workaround: keep&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40352&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Parallel Bash tool writes can silently lose files.</title>
    <id>https://framework.boucle.sh/limitations.html#parallel-bash-tool-writes-can-silently-lose-files</id>
    <link href="https://framework.boucle.sh/limitations.html#parallel-bash-tool-writes-can-silently-lose-files" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When multiple Bash tool calls run in parallel and write to the same directory, files can silently disappear due to race conditions in the runtime&apos;s file handling. Not hookable, as the data loss happens in the parallel execution layer between tool calls. Workaround: avoid parallel Bash tool calls that write to the same directory. See #40341.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40341&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] `bypassPermissions` on agents ignores project-level allowlists entirely.</title>
    <id>https://framework.boucle.sh/limitations.html#bypasspermissions-on-agents-ignores-project-level-allowlists</id>
    <link href="https://framework.boucle.sh/limitations.html#bypasspermissions-on-agents-ignores-project-level-allowlists" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When spawning sub-agents with mode: bypassPermissions, they can execute any tool regardless of the project&apos;s `settings.local.json` allowlist. Write, Edit, git commands, rm, mkdir all execute with no permission check. The allowlist represents a security boundary that bypassPermissions completely overrides rather than just suppressing per-tool prompts. PreToolUse hooks still fire in bypassed agent s&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40343&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Permission allowlist glob wildcards match shell operators, enabling command injection.</title>
    <id>https://framework.boucle.sh/limitations.html#permission-allowlist-glob-wildcards-match-shell-operators-en</id>
    <link href="https://framework.boucle.sh/limitations.html#permission-allowlist-glob-wildcards-match-shell-operators-en" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;The * wildcard in permission allow rules (e.g., Bash(git -C * status)) is matched against the raw command string without parsing shell structure. Because * matches operators like &amp;&amp;, ;, ||, and |, any allow rule containing * silently permits arbitrary command chains. For example, Bash(git -C * status) also matches git -C /repo &amp;&amp; rm -rf / &amp;&amp; git status. Every allow rule with * is an injection vect&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40344&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] PreToolUse hook output on EnterPlanMode deprioritized by plan mode system prompt.</title>
    <id>https://framework.boucle.sh/limitations.html#pretooluse-hook-output-on-enterplanmode-deprioritized-by-pla</id>
    <link href="https://framework.boucle.sh/limitations.html#pretooluse-hook-output-on-enterplanmode-deprioritized-by-pla" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a PreToolUse hook fires on EnterPlanMode and injects a &lt;system-reminder&gt; with prerequisite instructions, the model consistently ignores the hook output because plan mode&apos;s own detailed system prompt (with numbered phases and sub-steps) arrives in the same turn and dominates the model&apos;s attention. The hook fires, the output is delivered, but the model treats it as secondary context and follows&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/41051&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Plan mode enforced by instruction only, not by tool execution layer.</title>
    <id>https://framework.boucle.sh/limitations.html#plan-mode-enforced-by-instruction-only-not-by-tool-execution</id>
    <link href="https://framework.boucle.sh/limitations.html#plan-mode-enforced-by-instruction-only-not-by-tool-execution" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Plan mode&apos;s &quot;MUST NOT make any edits&quot; constraint is enforced only at the system prompt level. If the model ignores the instruction and issues Edit/Write/Bash tool calls, the user&apos;s per-tool approval prompt executes them without any warning that plan mode is active. There is no tool-layer enforcement of plan mode. Confirmed by a user who reported the model writing and pushing code while in plan-mod&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40324, https://github.com/anthropics/claude-code/issues/41517&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Sandbox desync: writes hit real filesystem while reads are sandboxed.</title>
    <id>https://framework.boucle.sh/limitations.html#sandbox-desync-writes-hit-real-filesystem-while-reads-are-sa</id>
    <link href="https://framework.boucle.sh/limitations.html#sandbox-desync-writes-hit-real-filesystem-while-reads-are-sa" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Claude Code can enter a half-sandboxed state where file writes go through to the real filesystem but file reads are isolated. In this state, the model writes files, then cannot see them on read-back, so it recreates them, overwriting the real directory. One user lost an entire 2500-file Next.js project including .git, all source code, and .env files. The model did not detect the inconsistency. Not&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40321&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] `--dangerously-skip-permissions` partially broken: startup suppressed, runtime prompts still fire.</title>
    <id>https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-partially-broken-startup-suppre</id>
    <link href="https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-partially-broken-startup-suppre" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The --dangerously-skip-permissions flag suppresses the startup dialog (via skipDangerousModePermissionPrompt: true) but does not bypass runtime tool execution prompts. Bash commands not in the explicit allow list still trigger per-tool confirmation prompts, making the flag functionally equivalent to normal permission mode. This compounds with #37745 (hooks can reset bypass mode) and #40241 (bypass&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37745, https://github.com/anthropics/claude-code/issues/40241, https://github.com/anthropics/claude-code/issues/40328&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Windows: bash non-functional inside auto-created worktrees.</title>
    <id>https://framework.boucle.sh/limitations.html#windows-bash-non-functional-inside-auto-created-worktrees</id>
    <link href="https://framework.boucle.sh/limitations.html#windows-bash-non-functional-inside-auto-created-worktrees" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When Claude Code auto-creates a git worktree on Windows (via isolation: &quot;worktree&quot;), bash commands fail because the spawned process resolves the working directory using POSIX-style paths that do not exist on Windows. The worktree is created but all Bash tool calls within it fail immediately. Combined with #40164 (Windows worktree path resolution) and #39886 (worktree isolation silently fails), Win&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40164, https://github.com/anthropics/claude-code/issues/39886, https://github.com/anthropics/claude-code/issues/40307&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Model executes commands after user selects &quot;No&quot; at permission prompt.</title>
    <id>https://framework.boucle.sh/limitations.html#model-executes-commands-after-user-selects-no-at-permission-</id>
    <link href="https://framework.boucle.sh/limitations.html#model-executes-commands-after-user-selects-no-at-permission-" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When the permission prompt fires for a Bash command and the user explicitly denies it, the model can proceed to execute the command anyway. The permission prompt is model-mediated UI, not an execution gate. It suffers the same compliance failures as CLAUDE.md rules: the model observes the denial, then ignores it. PreToolUse hooks enforce at the process level before the command reaches execution, m&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40302&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Deterministic gates can become substitute goals (Goodhart&apos;s Law).</title>
    <id>https://framework.boucle.sh/limitations.html#deterministic-gates-can-become-substitute-goals-goodhart-s-l</id>
    <link href="https://framework.boucle.sh/limitations.html#deterministic-gates-can-become-substitute-goals-goodhart-s-l" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When hooks enforce rules deterministically, the model can shift optimization from &quot;fulfill the task correctly&quot; to &quot;pass the gates measurably.&quot; Gates give unambiguous pass/fail feedback while the actual task goal is ambiguous, so the model targets what it can measure. This means adding more gates can make task completion worse by redirecting the model&apos;s attention toward gate-passing rather than tas&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40289&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Plugin update loses execute permissions on .sh hook files (additional instance).</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-update-loses-execute-permissions-on-sh-hook-files-add</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-update-loses-execute-permissions-on-sh-hook-files-add" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Plugin updates through the marketplace strip the execute bit from `.sh` files, the same root cause as #39954, #39964, and #40086. Each report confirms the issue persists. Workaround: re-run chmod +x after updates, or use safety-check to detect non-executable hooks.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39954, https://github.com/anthropics/claude-code/issues/39964, https://github.com/anthropics/claude-code/issues/40086, https://github.com/anthropics/claude-code/issues/40280&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Active session termination does not invalidate remote browser sessions.</title>
    <id>https://framework.boucle.sh/limitations.html#active-session-termination-does-not-invalidate-remote-browse</id>
    <link href="https://framework.boucle.sh/limitations.html#active-session-termination-does-not-invalidate-remote-browse" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a Claude Code session is terminated (via Stop, session end, or crash), remote browser sessions remain active. An attacker with access to the browser session URL can continue issuing commands after the user believes the session is closed. SECURITY: this is a trust boundary violation for any workflow that exposes Claude Code via browser-based access (Cowork, remote sessions). Not hookable — ses&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40271&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] `symlinkDirectories` causes silent worktree cleanup failure.</title>
    <id>https://framework.boucle.sh/limitations.html#symlinkdirectories-causes-silent-worktree-cleanup-failure</id>
    <link href="https://framework.boucle.sh/limitations.html#symlinkdirectories-causes-silent-worktree-cleanup-failure" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When worktree.symlinkDirectories is configured in settings (e.g., to symlink node_modules), automatic worktree cleanup on session exit silently fails because git worktree remove refuses to remove a directory containing untracked files (the symlinks). Worktrees accumulate over time. Not hookable — the cleanup happens in the runtime. Workaround: use a WorktreeRemove hook that calls git worktree remo&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40259&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Hook stdout corrupts worktree paths when spawning isolated agents.</title>
    <id>https://framework.boucle.sh/limitations.html#hook-stdout-corrupts-worktree-paths-when-spawning-isolated-a</id>
    <link href="https://framework.boucle.sh/limitations.html#hook-stdout-corrupts-worktree-paths-when-spawning-isolated-a" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When the Agent tool creates a worktree with isolation: &quot;worktree&quot;, hook stdout JSON is concatenated into the worktree path instead of being consumed by the hook protocol. A hook returning {&quot;continue&quot;:true,&quot;suppressOutput&quot;:true} produces paths like /project/{&quot;continue&quot;:true}/{&quot;continue&quot;:true}. This affects ALL hooks that output JSON on stdout (i.e., every correctly implemented hook). The error is P&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40262&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Approving a Task tool launch grants unrestricted bash access to the subagent.</title>
    <id>https://framework.boucle.sh/limitations.html#approving-a-task-tool-launch-grants-unrestricted-bash-access</id>
    <link href="https://framework.boucle.sh/limitations.html#approving-a-task-tool-launch-grants-unrestricted-bash-access" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a user approves a Task tool call, the spawned subagent ignores `settings.local.json` deny rules and executes arbitrary bash commands without individual approval. In one report, 22+ commands ran with no per-command prompt. The single &quot;approve Task&quot; interaction is treated as blanket consent for all subsequent tool calls inside the subagent. This is the inverse of #40241 (bypass doesn&apos;t propagat&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40241, https://github.com/anthropics/claude-code/issues/40580, https://github.com/anthropics/claude-code/issues/21460&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] `--dangerously-skip-permissions` does not propagate to subagents.</title>
    <id>https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-does-not-propagate-to-subagents</id>
    <link href="https://framework.boucle.sh/limitations.html#dangerously-skip-permissions-does-not-propagate-to-subagents" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When the parent session runs with --dangerously-skip-permissions, subagents spawned via the Agent tool still prompt on every Edit/Write call. Fourteen edits across eight files produced fourteen manual prompts. The bypass flag only applies to the parent session&apos;s permission state. A PreToolUse hook returning {&quot;allow&quot;: true} would suppress the prompts, but it applies globally to all users of that ho&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37730, https://github.com/anthropics/claude-code/issues/40211, https://github.com/anthropics/claude-code/issues/40241&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `additionalContext` from hooks accumulates in conversation history.</title>
    <id>https://framework.boucle.sh/limitations.html#additionalcontext-from-hooks-accumulates-in-conversation-his</id>
    <link href="https://framework.boucle.sh/limitations.html#additionalcontext-from-hooks-accumulates-in-conversation-his" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a PreToolUse or UserPromptSubmit hook returns additionalContext, the injected text is appended permanently to the conversation instead of being treated as ephemeral. Each tool call adds another copy, causing the context to grow unboundedly and waste tokens. Affects hook authors who use additionalContext for tips, warnings, or contextual guidance — the guidance is correct the first time but po&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40216&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] iMessage permission relay sent to unrelated contacts.</title>
    <id>https://framework.boucle.sh/limitations.html#imessage-permission-relay-sent-to-unrelated-contacts</id>
    <link href="https://framework.boucle.sh/limitations.html#imessage-permission-relay-sent-to-unrelated-contacts" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When using the iMessage channel plugin, permission relay prompts meant for one conversation can be sent to an unrelated contact in the user&apos;s address book. This leaks internal tool-call details (file paths, command strings) to third parties without user consent. Not hookable — the relay happens in the iMessage transport layer. SECURITY: if you use iMessage as a permission relay channel, verify the&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40221&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Concurrent sessions corrupt shared config files.</title>
    <id>https://framework.boucle.sh/limitations.html#concurrent-sessions-corrupt-shared-config-files</id>
    <link href="https://framework.boucle.sh/limitations.html#concurrent-sessions-corrupt-shared-config-files" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Multiple Claude Code sessions writing to ~/.claude.json simultaneously can trigger a race condition where one session reads a partially-written file, gets a JSON parse error, and enters a recovery loop that overwrites the other session&apos;s changes. The corrupted state persists until manual intervention. Not hookable — the corruption happens in the config serialization layer, not in tool calls. Affec&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40226&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Agent tool `model` parameter overrides user&apos;s default model without consent.</title>
    <id>https://framework.boucle.sh/limitations.html#agent-tool-model-parameter-overrides-user-s-default-model-wi</id>
    <link href="https://framework.boucle.sh/limitations.html#agent-tool-model-parameter-overrides-user-s-default-model-wi" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a user sets their model to Opus via /model, the Agent tool can still spawn subagents with cheaper models by passing model: &quot;sonnet&quot; or model: &quot;haiku&quot;. The user sees no indication that work was delegated to a different model. Not hookable — the SubagentStart event does not include the model parameter, and PreToolUse for the Agent tool fires before the model is resolved. CLAUDE.md rules like &quot;u&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40211&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Claude Code sends SIGTERM to all healthy stdio MCP servers after 10-60s.</title>
    <id>https://framework.boucle.sh/limitations.html#claude-code-sends-sigterm-to-all-healthy-stdio-mcp-servers-a</id>
    <link href="https://framework.boucle.sh/limitations.html#claude-code-sends-sigterm-to-all-healthy-stdio-mcp-servers-a" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;After successful connection and handshake, Claude Code terminates all stdio-based MCP servers simultaneously with no preceding error. The timeout interval shrinks over the session lifetime (60s → 30s → 10s). Cloud-hosted MCPs are unaffected (different transport). The only recovery is manual /mcp reconnection, which itself gets killed again. Not hookable — the kill signal originates from the runtim&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40207&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Memory index appends at bottom but truncates from bottom — newest entries lost first.</title>
    <id>https://framework.boucle.sh/limitations.html#memory-index-appends-at-bottom-but-truncates-from-bottom-new</id>
    <link href="https://framework.boucle.sh/limitations.html#memory-index-appends-at-bottom-but-truncates-from-bottom-new" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Claude Code&apos;s auto-memory system appends new entries to the bottom of MEMORY.md, but truncates from the bottom after 200 lines. This means as memory grows, the most recently learned information is lost first while stale entries persist. Not hookable — this is internal to the memory subsystem. Affects any long-running agent relying on built-in memory. Workaround: manage your own memory file (like H&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40210&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Sandbox `allowedDomains` does not filter plain HTTP requests.</title>
    <id>https://framework.boucle.sh/limitations.html#sandbox-alloweddomains-does-not-filter-plain-http-requests</id>
    <link href="https://framework.boucle.sh/limitations.html#sandbox-alloweddomains-does-not-filter-plain-http-requests" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The sandbox.network.allowedDomains setting only intercepts HTTPS traffic via the CONNECT tunnel. Plain HTTP requests (e.g., curl http://unauthorized-domain.com) pass through unfiltered because the proxy sees the Host header but does not enforce domain rules on non-CONNECT requests. This is a security gap: prompt injection payloads can exfiltrate data over plain HTTP even when allowedDomains is con&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40213&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Permission path matching is case-sensitive on Windows.</title>
    <id>https://framework.boucle.sh/limitations.html#permission-path-matching-is-case-sensitive-on-windows</id>
    <link href="https://framework.boucle.sh/limitations.html#permission-path-matching-is-case-sensitive-on-windows" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The allow and deny rules in settings.json use case-sensitive string matching for file paths, even on Windows (NTFS) where the filesystem is case-insensitive. A rule allowing Edit(C:\Users\alice\project\*) will not match C:\Users\Alice\Project\file.txt. This creates silent permission bypass on Windows: the model may access paths that visually match a deny rule but differ in casing. No workaround at&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40084, https://github.com/anthropics/claude-code/issues/40172, https://github.com/anthropics/claude-code/issues/40170&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Marketplace plugin hooks hardcode `python3` on Windows.</title>
    <id>https://framework.boucle.sh/limitations.html#marketplace-plugin-hooks-hardcode-python3-on-windows</id>
    <link href="https://framework.boucle.sh/limitations.html#marketplace-plugin-hooks-hardcode-python3-on-windows" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The security-guidance marketplace plugin (and potentially others) hardcodes `python3` in its hook command. On Windows, python3 does not exist as a command (Python installs as python or py). Every Edit, Write, and MultiEdit operation fails with a hook error. This is a plugin authoring bug, not a platform bug, but it affects any Windows user who installs marketplace plugins with Python-based hooks. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40172&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Worktree isolation fails on Windows due to path resolution.</title>
    <id>https://framework.boucle.sh/limitations.html#worktree-isolation-fails-on-windows-due-to-path-resolution</id>
    <link href="https://framework.boucle.sh/limitations.html#worktree-isolation-fails-on-windows-due-to-path-resolution" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The Agent tool&apos;s isolation: &quot;worktree&quot; option falsely reports &quot;not in a git repository&quot; on Windows 11 when using Git Bash. The spawned subprocess resolves the working directory differently (POSIX vs Windows paths), causing the git repo check to fail. The agent falls back to running without isolation. Related to #39886 (worktree isolation silently fails). No workaround at the hook level. Windows us&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39886, https://github.com/anthropics/claude-code/issues/40164&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Teammate SendMessage content injected as Human: turns.</title>
    <id>https://framework.boucle.sh/limitations.html#teammate-sendmessage-content-injected-as-human-turns</id>
    <link href="https://framework.boucle.sh/limitations.html#teammate-sendmessage-content-injected-as-human-turns" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;In multi-agent setups using TeamCreate and SendMessage, teammate summaries can appear as `Human:` turns in the conversation. The orchestrator agent treats these phantom messages as legitimate user input and acts on them. No hook can intercept this because it happens in conversation turn management, not in tool calls. This is a trust boundary violation in long sessions with frequent context compres&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40166&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Failed marketplace auto-update deletes all plugins from that marketplace.</title>
    <id>https://framework.boucle.sh/limitations.html#failed-marketplace-auto-update-deletes-all-plugins-from-that</id>
    <link href="https://framework.boucle.sh/limitations.html#failed-marketplace-auto-update-deletes-all-plugins-from-that" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The plugin system&apos;s marketplace auto-update mechanism deletes the marketplace directory before re-cloning. If the re-clone fails (network timeout, rate limit, disk full), the directory stays deleted and all plugins installed from that marketplace break. This includes any hooks those plugins shipped. The deletion happens outside the hook lifecycle, so no hook can prevent or detect it. Workaround: b&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40153&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Runtime silently deletes specific directory names.</title>
    <id>https://framework.boucle.sh/limitations.html#runtime-silently-deletes-specific-directory-names</id>
    <link href="https://framework.boucle.sh/limitations.html#runtime-silently-deletes-specific-directory-names" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Claude Code&apos;s runtime silently deletes `.kiro/` directories between tool calls, regardless of .gitignore status. The deletion is name-specific (renaming to .sd/ avoids it) and happens outside the hook lifecycle. No PreToolUse or PostToolUse event fires for this. File-guard cannot protect directories that the runtime itself removes. If you need persistent project directories, avoid names that confl&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40139&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] ExitWorktree false positive after squash merge.</title>
    <id>https://framework.boucle.sh/limitations.html#exitworktree-false-positive-after-squash-merge</id>
    <link href="https://framework.boucle.sh/limitations.html#exitworktree-false-positive-after-squash-merge" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The platform&apos;s ExitWorktree tool checks unmerged commits using SHA comparison (git log main..branch). After a squash merge, the original SHAs are not on main (the squash creates a new SHA), so ExitWorktree falsely warns about unmerged commits. worktree-guard solves this by using git cherry for content-equivalent detection instead of SHA comparison. But the platform&apos;s own ExitWorktree warning (sepa&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40137&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Hook input lacks agent context for tool calls.</title>
    <id>https://framework.boucle.sh/limitations.html#hook-input-lacks-agent-context-for-tool-calls</id>
    <link href="https://framework.boucle.sh/limitations.html#hook-input-lacks-agent-context-for-tool-calls" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The agent_id and agent_type fields are only available in SubagentStart/SubagentStop hook events. They are absent from PreToolUse and PostToolUse input. A hook cannot tell whether a tool call originates from the main conversation or a subagent. This means per-agent policies (e.g., &quot;only subagents may Edit files&quot;) are impossible to enforce. No workaround at the hook level; this requires a platform c&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40140&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Plugin hook scripts lose execute permissions when cached.</title>
    <id>https://framework.boucle.sh/limitations.html#plugin-hook-scripts-lose-execute-permissions-when-cached</id>
    <link href="https://framework.boucle.sh/limitations.html#plugin-hook-scripts-lose-execute-permissions-when-cached" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Plugin hooks (e.g., stop-hook.sh) lose their execute bit when cached by the marketplace plugin system. Same root cause as #39954 (marketplace strips +x) and #39964 (sync strips +x), but the trigger is the caching layer rather than explicit update or sync. Stop hooks are particularly affected because they are only invoked at session end, so the permission loss goes unnoticed until a critical moment&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39954, https://github.com/anthropics/claude-code/issues/39964, https://github.com/anthropics/claude-code/issues/40086&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Hooks fail when user profile path contains spaces.</title>
    <id>https://framework.boucle.sh/limitations.html#hooks-fail-when-user-profile-path-contains-spaces</id>
    <link href="https://framework.boucle.sh/limitations.html#hooks-fail-when-user-profile-path-contains-spaces" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;On Windows, usernames like &quot;Lea Chan&quot; create home directories with spaces (e.g., C:\Users\Lea Chan\). Hook commands that reference $HOME or ${CLAUDE_PLUGIN_ROOT} get word-split by bash at the space, producing bash: /c/Users/Lea: No such file or directory. This affects ALL hooks, not just enforce-hooks. The root cause is in Claude Code&apos;s hook runner, which does not properly quote expanded paths bef&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39478, https://github.com/anthropics/claude-code/issues/40084&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Marketplace plugin install silently adds hooks with no consent prompt.</title>
    <id>https://framework.boucle.sh/limitations.html#marketplace-plugin-install-silently-adds-hooks-with-no-conse</id>
    <link href="https://framework.boucle.sh/limitations.html#marketplace-plugin-install-silently-adds-hooks-with-no-conse" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;The /plugin install flow does not distinguish between inert skills (markdown prompt files) and plugins that include hooks or scripts. A plugin can ship a SessionStart hook that runs arbitrary commands on every future session with no disclosure, no consent prompt, and no visual indicator that executable components were installed. Combined with auto-update (enabled by default for official marketplac&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40036&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] Stop hooks do not fire in the VSCode extension.</title>
    <id>https://framework.boucle.sh/limitations.html#stop-hooks-do-not-fire-in-the-vscode-extension</id>
    <link href="https://framework.boucle.sh/limitations.html#stop-hooks-do-not-fire-in-the-vscode-extension" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Stop hooks configured in .claude/settings.json do not execute when Claude Code runs inside the VSCode extension. The same hooks fire correctly in CLI sessions. Other hook types (PreToolUse, PostToolUse, SessionStart) all work in VSCode. This is a platform gap, not a configuration error. If you rely on Stop hooks for session-end enforcement or cleanup, those protections are silently absent in VSCod&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40029, https://github.com/anthropics/claude-code/issues/11156&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] `bypassPermissions` in settings files has no effect.</title>
    <id>https://framework.boucle.sh/limitations.html#bypasspermissions-in-settings-files-has-no-effect</id>
    <link href="https://framework.boucle.sh/limitations.html#bypasspermissions-in-settings-files-has-no-effect" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Setting &quot;permission-mode&quot;: &quot;bypassPermissions&quot; in .claude/settings.local.json is silently ignored. The only working method to enable bypass mode is the CLI flag --dangerously-skip-permissions. Similarly, &quot;skipDangerousModePermissionPrompt&quot;: true only suppresses the startup warning without actually enabling bypass, and &quot;dangerouslySkipPermissions&quot;: true under &quot;permissions&quot; is also ignored. Automate&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40014&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Hooks from non-enabled marketplace plugins still fire.</title>
    <id>https://framework.boucle.sh/limitations.html#hooks-from-non-enabled-marketplace-plugins-still-fire</id>
    <link href="https://framework.boucle.sh/limitations.html#hooks-from-non-enabled-marketplace-plugins-still-fire" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The hook runner executes hooks from installed-but-not-enabled marketplace plugins. Plugins that exist in ~/.claude/plugins/marketplaces/ but are not listed in enabledPlugins still have their SessionStart hooks loaded and executed. This means non-enabled code runs on every session start without user consent. Related to #39307 (disabled plugins run hooks). No workaround short of manually deleting un&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39307, https://github.com/anthropics/claude-code/issues/40013&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] SDK Stop hook enforcement skips on resumed sessions.</title>
    <id>https://framework.boucle.sh/limitations.html#sdk-stop-hook-enforcement-skips-on-resumed-sessions</id>
    <link href="https://framework.boucle.sh/limitations.html#sdk-stop-hook-enforcement-skips-on-resumed-sessions" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When using the Claude Agent SDK with --resume and --json-schema, the CLI&apos;s built-in StructuredOutput stop hook enforcement only fires once per session. On resumed sessions, the internal &quot;already called&quot; flag persists and enforcement is silently skipped, returning structured_output: null. Workaround: implement your own Stop hook callback that returns {&quot;decision&quot;: &quot;block&quot;} when structured_output is &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40022&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `SessionEnd` silently ignores agent-type hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#sessionend-silently-ignores-agent-type-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#sessionend-silently-ignores-agent-type-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;In SessionEnd hook configurations, hooks with &quot;type&quot;: &quot;agent&quot; are silently skipped while &quot;type&quot;: &quot;command&quot; hooks in the same block fire correctly. The event itself fires (command hooks prove this), but agent hooks are filtered out during execution. Agent-type hooks work in other events like Stop. No workaround for session-end cleanup that requires agent capabilities.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40010&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Project-level settings can spoof company announcements.</title>
    <id>https://framework.boucle.sh/limitations.html#project-level-settings-can-spoof-company-announcements</id>
    <link href="https://framework.boucle.sh/limitations.html#project-level-settings-can-spoof-company-announcements" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The companyAnnouncements field in .claude/settings.json is intended for enterprise managed settings, but project-level settings can set it too. A malicious repository can include .claude/settings.json with fake company messages that appear identical to legitimate enterprise announcements. This is a social engineering vector: the messages display as &quot;Message from [COMPANY]&quot; with no indication they &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39998&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Subagent output is trusted without verification by the parent agent.</title>
    <id>https://framework.boucle.sh/limitations.html#subagent-output-is-trusted-without-verification-by-the-paren</id>
    <link href="https://framework.boucle.sh/limitations.html#subagent-output-is-trusted-without-verification-by-the-paren" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When Claude spawns subagents via the Agent tool, the parent treats subagent summaries as ground truth without checking claims against actual tool output. Subagents can report inflated counts, phantom operations, or partial searches as exhaustive, and the parent relays these to the user. No hook can intercept the Agent tool&apos;s return value or validate subagent claims. This is an architecture-level g&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39981&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] `cd` prefix escapes command-pattern ask/deny rules.</title>
    <id>https://framework.boucle.sh/limitations.html#cd-prefix-escapes-command-pattern-ask-deny-rules</id>
    <link href="https://framework.boucle.sh/limitations.html#cd-prefix-escapes-command-pattern-ask-deny-rules" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Permission rules that ask or deny specific commands (e.g., Bash(rm *)) can be silently bypassed by prepending `cd .. &amp;&amp;` to the command string. The permission matcher checks the full command string against the rule pattern; adding a cd prefix changes the string enough to avoid the match. This is distinct from the path-deny bypass (#39987) — here the command itself is the same, but the cd prefix de&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39987, https://github.com/anthropics/claude-code/issues/37621&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `settings.json` path deny rules do not apply to the Bash tool.</title>
    <id>https://framework.boucle.sh/limitations.html#settings-json-path-deny-rules-do-not-apply-to-the-bash-tool</id>
    <link href="https://framework.boucle.sh/limitations.html#settings-json-path-deny-rules-do-not-apply-to-the-bash-tool" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Path deny rules in .claude/settings.json only restrict Claude Code&apos;s built-in file tools (Read, Write, Edit, Glob, Grep). The Bash tool executes commands as the user&apos;s OS process with no path checking against deny rules. Claude can cat, grep, or head files in denied directories via shell commands, silently bypassing the restriction. Users relying on path deny for security have a false sense of pro&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39987&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] ExitPlanMode resets permission mode to acceptEdits.</title>
    <id>https://framework.boucle.sh/limitations.html#exitplanmode-resets-permission-mode-to-acceptedits</id>
    <link href="https://framework.boucle.sh/limitations.html#exitplanmode-resets-permission-mode-to-acceptedits" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When exiting plan mode, the permission state resets to acceptEdits instead of restoring the previous mode (e.g., bypassPermissions). Workflows that enter plan mode then resume with elevated permissions will find permissions unexpectedly downgraded.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39973&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Marketplace plugin sync strips execute permissions from .sh hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#marketplace-plugin-sync-strips-execute-permissions-from-sh-h</id>
    <link href="https://framework.boucle.sh/limitations.html#marketplace-plugin-sync-strips-execute-permissions-from-sh-h" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;When plugins are synced via the marketplace, hook files are downloaded as 644 (non-executable). Any .sh hooks delivered via marketplace plugins need manual chmod +x after every sync. Same root cause as #39954.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39954, https://github.com/anthropics/claude-code/issues/39964&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `claude --test-permission` does not exist for dry-run testing.</title>
    <id>https://framework.boucle.sh/limitations.html#claude-test-permission-does-not-exist-for-dry-run-testing</id>
    <link href="https://framework.boucle.sh/limitations.html#claude-test-permission-does-not-exist-for-dry-run-testing" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;There is no way to unit-test hook configurations without actually triggering tool calls. Iterating on hook logic requires live sessions with real tool invocations. Affects anyone developing or debugging custom hooks.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39971&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] PostToolUse hooks skip some plan-mode transitions.</title>
    <id>https://framework.boucle.sh/limitations.html#posttooluse-hooks-skip-some-plan-mode-transitions</id>
    <link href="https://framework.boucle.sh/limitations.html#posttooluse-hooks-skip-some-plan-mode-transitions" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;The PostToolUse event for ExitPlanMode does not fire when a user accepts a plan with &quot;clear context.&quot; Hooks that track plan completion or trigger actions after plan acceptance will miss this transition. There is no workaround.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39950&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Stop hooks that intentionally block display &quot;Hook Error&quot; in the UI.</title>
    <id>https://framework.boucle.sh/limitations.html#stop-hooks-that-intentionally-block-display-hook-error-in-th</id>
    <link href="https://framework.boucle.sh/limitations.html#stop-hooks-that-intentionally-block-display-hook-error-in-th" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When a Stop hook returns {&quot;decision&quot;: &quot;block&quot;} to prevent an action, Claude Code displays &quot;Hook Error&quot; in the transcript instead of showing the block reason. The model reads this label and may abandon the task prematurely, thinking a system error occurred rather than a deliberate enforcement. This is the same underlying issue as the exit code 3 proposal, which would let hooks signal intentional bl&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39953, https://github.com/anthropics/claude-code/issues/38422&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Marketplace updates strip execute permissions from .sh hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#marketplace-updates-strip-execute-permissions-from-sh-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#marketplace-updates-strip-execute-permissions-from-sh-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a Claude Code plugin is updated through the marketplace, the update process strips the execute bit from .sh files. Hook scripts that were chmod +x after install silently become non-executable, and Claude Code skips them without warning. This affects any bash-based hook delivered through the marketplace. Workaround: re-run chmod +x on your hook scripts after marketplace updates, or use safety-&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39954&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Bash permission heuristic misparses escaped semicolons.</title>
    <id>https://framework.boucle.sh/limitations.html#bash-permission-heuristic-misparses-escaped-semicolons</id>
    <link href="https://framework.boucle.sh/limitations.html#bash-permission-heuristic-misparses-escaped-semicolons" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Claude Code&apos;s built-in bash permission system misparses `\;` in find -exec as a command separator, classifying the redirect suffix (e.g., 2 from 2&gt;/dev/null) as a standalone command. This does not affect hooks (bash-guard receives the full command string and parses it correctly), but it causes confusing permission prompts for safe find commands. If users report permission prompts for 2 as a comman&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39911&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Worktree memory resolves to the wrong project directory.</title>
    <id>https://framework.boucle.sh/limitations.html#worktree-memory-resolves-to-the-wrong-project-directory</id>
    <link href="https://framework.boucle.sh/limitations.html#worktree-memory-resolves-to-the-wrong-project-directory" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When Claude Code launches from a linked git worktree, it uses git rev-parse --git-common-dir to derive the project path, which resolves to the main worktree&apos;s directory. Both worktrees share the same memory and CLAUDE.md files, causing cross-contamination of project-specific rules. Hooks fire correctly in either worktree, but any @enforced rules loaded from the wrong CLAUDE.md may not match the pr&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39920&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Stop hooks fail after worktree removal.</title>
    <id>https://framework.boucle.sh/limitations.html#stop-hooks-fail-after-worktree-removal</id>
    <link href="https://framework.boucle.sh/limitations.html#stop-hooks-fail-after-worktree-removal" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;After a worktree is merged and deleted, stop hooks fail with ENOENT because the session&apos;s CWD no longer exists. Node.js reports the error as /bin/sh not found rather than the missing CWD. Any cleanup hooks registered for the session will not run.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39432&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Worktree isolation can silently fail for spawned agents.</title>
    <id>https://framework.boucle.sh/limitations.html#worktree-isolation-can-silently-fail-for-spawned-agents</id>
    <link href="https://framework.boucle.sh/limitations.html#worktree-isolation-can-silently-fail-for-spawned-agents" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;The Agent tool&apos;s isolation: &quot;worktree&quot; option can silently run the agent in the main repository instead of creating an isolated worktree. The result metadata shows worktreePath: done and worktreeBranch: undefined. No hook can detect this because the worktree was never created. Combined with #36205 (EnterWorktree ignores hooks) and #38448 (CWD drift), worktree isolation has multiple failure modes t&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/36205, https://github.com/anthropics/claude-code/issues/38448, https://github.com/anthropics/claude-code/issues/39886&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Tool-level hooks cannot prevent API exfiltration.</title>
    <id>https://framework.boucle.sh/limitations.html#tool-level-hooks-cannot-prevent-api-exfiltration</id>
    <link href="https://framework.boucle.sh/limitations.html#tool-level-hooks-cannot-prevent-api-exfiltration" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;All tool-level hooks (PreToolUse, PostToolUse) operate after file contents have already entered the conversation context. A Read tool call returns file contents into the model&apos;s context, and PostToolUse cannot modify tool output, only block. This means secrets in read files (API keys, credentials, PII) are sent to the API provider regardless of PostToolUse hooks. PreToolUse can prevent the Read fr&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39882&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Disabled plugins still execute hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#disabled-plugins-still-execute-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#disabled-plugins-still-execute-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Plugins set to false in enabledPlugins still have their hooks executed by Claude Code. Stop hooks, PreToolUse hooks, and other plugin-registered hooks fire even when the plugin is explicitly disabled. There is no workaround other than removing the plugin entirely.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39307&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] `--worktree --tmux` skips hook lifecycle entirely.</title>
    <id>https://framework.boucle.sh/limitations.html#worktree-tmux-skips-hook-lifecycle-entirely</id>
    <link href="https://framework.boucle.sh/limitations.html#worktree-tmux-skips-hook-lifecycle-entirely" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When Claude Code is launched with both --worktree and --tmux, it uses a separate codepath that creates git worktrees directly, bypassing WorktreeCreate and WorktreeRemove hooks. Any hooks guarding worktree creation or cleanup will not fire in this mode. Workaround: use --worktree without --tmux.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39281&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Hooks fail when working directory contains spaces.</title>
    <id>https://framework.boucle.sh/limitations.html#hooks-fail-when-working-directory-contains-spaces</id>
    <link href="https://framework.boucle.sh/limitations.html#hooks-fail-when-working-directory-contains-spaces" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;If the project path contains spaces (e.g., /Users/name/My Projects/app/), hook scripts fail with parse errors because the path is passed unquoted in some internal contexts. All enforce-hooks generated hooks and Boucle-framework hooks quote their paths, but the platform itself may break path delivery. Workaround: avoid spaces in project directory paths.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39478&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Stop hooks can block unrelated parallel sessions.</title>
    <id>https://framework.boucle.sh/limitations.html#stop-hooks-can-block-unrelated-parallel-sessions</id>
    <link href="https://framework.boucle.sh/limitations.html#stop-hooks-can-block-unrelated-parallel-sessions" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Stop hooks configured with a session_id guard intended to scope them to one session still fire across all parallel sessions. A stop hook that terminates session A can kill session B if both sessions share the same .claude/settings.json. This affects autonomous loop architectures running multiple Claude instances. Workaround: use separate project directories with independent settings for parallel s&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39530&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] `updatedInput` silently ignored for Agent tool.</title>
    <id>https://framework.boucle.sh/limitations.html#updatedinput-silently-ignored-for-agent-tool</id>
    <link href="https://framework.boucle.sh/limitations.html#updatedinput-silently-ignored-for-agent-tool" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;PreToolUse hooks can return updatedInput to rewrite tool inputs before execution. For most tools this works, but for the Agent tool, the rewritten input is silently discarded and the original prompt is used. Hooks that sanitize or modify subagent prompts will appear to succeed (exit 0, JSON accepted) but have no effect. There is no workaround. Use &quot;decision&quot;: &quot;block&quot; to reject unsafe Agent prompts&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/39814&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Exit code 2 silently disables hooks for Edit/Write tools.</title>
    <id>https://framework.boucle.sh/limitations.html#exit-code-2-silently-disables-hooks-for-edit-write-tools</id>
    <link href="https://framework.boucle.sh/limitations.html#exit-code-2-silently-disables-hooks-for-edit-write-tools" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;If a hook script exits with code 2, Claude Code treats it as a crash (closed as intended behavior). For Bash tool calls, crashed hooks still block. For Edit and Write tools, crashed hooks are silently ignored and the operation proceeds. enforce-hooks generates hooks that always exit 0, so this does not affect generated hooks. But custom hook scripts that use exit 2 on the deny path will appear to &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37210&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Background agent worktree can silently change parent session CWD.</title>
    <id>https://framework.boucle.sh/limitations.html#background-agent-worktree-can-silently-change-parent-session</id>
    <link href="https://framework.boucle.sh/limitations.html#background-agent-worktree-can-silently-change-parent-session" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;After a background Agent with isolation: &quot;worktree&quot; completes, the parent session&apos;s working directory can silently drift to the worktree path. Subsequent commands execute in the wrong directory without warning. No hook can detect this because the CWD change happens outside the tool-call lifecycle. Verify your working directory (pwd) after background worktree agents complete.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38448&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] EnterWorktree/ExitWorktree hooks may not fire for mid-session operations.</title>
    <id>https://framework.boucle.sh/limitations.html#enterworktree-exitworktree-hooks-may-not-fire-for-mid-sessio</id>
    <link href="https://framework.boucle.sh/limitations.html#enterworktree-exitworktree-hooks-may-not-fire-for-mid-sessio" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When Claude uses the Agent tool with isolation: &quot;worktree&quot; or the in-session EnterWorktree tool, configured worktree hooks do not execute. Hooks that guard worktree creation or cleanup only fire for CLI-level worktree operations, not for mid-session agent-spawned worktrees. There is no workaround. If you use worktree-guard, be aware it protects ExitWorktree from the tool but not from internal sess&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/36205&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] `permissionDecision: &quot;ask&quot;` permanently breaks bypass mode.</title>
    <id>https://framework.boucle.sh/limitations.html#permissiondecision-ask-permanently-breaks-bypass-mode</id>
    <link href="https://framework.boucle.sh/limitations.html#permissiondecision-ask-permanently-breaks-bypass-mode" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;If a hook returns {&quot;permissionDecision&quot;: &quot;ask&quot;} (intending to let the user decide), the session permanently loses bypass mode after the user responds to the prompt. The permission state machine does not restore the previous mode. All subsequent tool calls revert to manual approval for the rest of the session. Do not use permissionDecision: &quot;ask&quot; in any hook if you run with --dangerously-skip-permi&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37420&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Prompt-type hooks incur undocumented billing.</title>
    <id>https://framework.boucle.sh/limitations.html#prompt-type-hooks-incur-undocumented-billing</id>
    <link href="https://framework.boucle.sh/limitations.html#prompt-type-hooks-incur-undocumented-billing" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Hooks with &quot;type&quot;: &quot;prompt&quot; send an LLM call per invocation, adding token costs that are not documented in the billing docs. enforce-hooks generates only &quot;type&quot;: &quot;command&quot; hooks, which run as local processes with zero API cost. If you need reasoning-based enforcement, be aware that prompt hooks double your per-response cost.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38165&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] GIT_INDEX_FILE inherited from git hooks corrupts index.</title>
    <id>https://framework.boucle.sh/limitations.html#git-index-file-inherited-from-git-hooks-corrupts-index</id>
    <link href="https://framework.boucle.sh/limitations.html#git-index-file-inherited-from-git-hooks-corrupts-index" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;When Claude Code is launched from a git hook (post-commit, pre-push, etc.), it inherits the GIT_INDEX_FILE environment variable. Plugin initialization then writes plugin file entries into the project&apos;s git index, silently corrupting it. Workaround: unset GIT_INDEX_FILE before invoking Claude from any git hook. This is a platform bug, not an enforce-hooks issue.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38181&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Async hooks receive empty stdin on macOS.</title>
    <id>https://framework.boucle.sh/limitations.html#async-hooks-receive-empty-stdin-on-macos</id>
    <link href="https://framework.boucle.sh/limitations.html#async-hooks-receive-empty-stdin-on-macos" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Hooks configured with &quot;async&quot;: true receive zero bytes on stdin on macOS (works on Linux). Synchronous hooks work correctly on both platforms. enforce-hooks generates synchronous command hooks, so this does not affect it. If you add custom async hooks on macOS, remove the &quot;async&quot;: true flag as a workaround.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38162&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Context compaction invalidates stateful hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#context-compaction-invalidates-stateful-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#context-compaction-invalidates-stateful-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Permission system"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Permission system&lt;/p&gt;&lt;p&gt;Hooks that track session state (e.g., &quot;which files has Claude read?&quot;) break across context compaction boundaries. After compaction, Claude&apos;s context no longer contains previously-read files, but hook state still shows them as &quot;recently read.&quot; This can cause false gates (blocking a re-read Claude needs) or false passes (allowing an action the hook thinks Claude is informed about). MITIGATED: PostCo&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38018&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Built-in skills wrap file operations opaquely.</title>
    <id>https://framework.boucle.sh/limitations.html#built-in-skills-wrap-file-operations-opaquely</id>
    <link href="https://framework.boucle.sh/limitations.html#built-in-skills-wrap-file-operations-opaquely" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Claude Code&apos;s built-in skills perform Write/Edit internally through the Skill tool wrapper. PreToolUse hooks fire on the Skill tool invocation, not on the individual file operations inside it. A hook checking &quot;is this write targeting .env?&quot; won&apos;t fire because the tool name is Skill, not Write. There is no workaround for this yet. See #38040.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38040&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Memory paths auto-bypass approval.</title>
    <id>https://framework.boucle.sh/limitations.html#memory-paths-auto-bypass-approval</id>
    <link href="https://framework.boucle.sh/limitations.html#memory-paths-auto-bypass-approval" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;File paths under ~/.claude/projects/*/memory/ auto-bypass Edit/Write approval with no opt-out. Claude can modify memory files without the user seeing a prompt. A PreToolUse hook returning block for writes to memory paths still works, but you must set it up explicitly. Add memory paths to your file-guard config or enforce-hooks rules if you want protection.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/38040&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Subagents may not inherit hook settings.</title>
    <id>https://framework.boucle.sh/limitations.html#subagents-may-not-inherit-hook-settings</id>
    <link href="https://framework.boucle.sh/limitations.html#subagents-may-not-inherit-hook-settings" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;Agents spawned via the Agent tool do not consistently inherit permission settings from the parent session. Hooks configured at the project level should still fire for subagents (they share the same .claude/settings.json), but global permission preferences may not propagate. Verify hook behavior in subagent workflows.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37730&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[HIGH] Prompt-type hooks fail on Vertex AI.</title>
    <id>https://framework.boucle.sh/limitations.html#prompt-type-hooks-fail-on-vertex-ai</id>
    <link href="https://framework.boucle.sh/limitations.html#prompt-type-hooks-fail-on-vertex-ai" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; HIGH | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Hooks configured with &quot;type&quot;: &quot;prompt&quot; return a 400 error on Vertex AI backends (&quot;output_config: Extra inputs&quot;). enforce-hooks only generates command-type hooks so this does not affect it directly, but custom prompt hooks will silently fail on Vertex.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37746&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] PreToolUse hooks can reset permission bypass mode.</title>
    <id>https://framework.boucle.sh/limitations.html#pretooluse-hooks-can-reset-permission-bypass-mode</id>
    <link href="https://framework.boucle.sh/limitations.html#pretooluse-hooks-can-reset-permission-bypass-mode" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When --dangerously-skip-permissions is enabled, PreToolUse hooks can cause the permission state to reset mid-session, reverting all tools to manual approval after 30 minutes to 2 hours. Disabling hooks is the only workaround. If you use hooks in autonomous mode and find tools suddenly requiring approval, this platform bug is the likely cause.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37745&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] Hooks don&apos;t fire in pipe mode (`-p`) or bare mode (`--bare`).</title>
    <id>https://framework.boucle.sh/limitations.html#hooks-don-t-fire-in-pipe-mode-p-or-bare-mode-bare</id>
    <link href="https://framework.boucle.sh/limitations.html#hooks-don-t-fire-in-pipe-mode-p-or-bare-mode-bare" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When running Claude Code with -p (pipe/print mode), no hooks execute at all: PreToolUse, PostToolUse, and PermissionRequest are all silently skipped (#40506). The --bare flag goes further, also skipping LSP, plugin sync, and skill directory walks for faster scripted startup. This affects autonomous agent loops, CI pipelines, and any workflow using claude -p or claude --bare -p for headless executi&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/40506, https://github.com/anthropics/claude-code/issues/40502, https://github.com/anthropics/claude-code/issues/37559&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[MEDIUM] Silent JSONC parsing failure can disable hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#silent-jsonc-parsing-failure-can-disable-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#silent-jsonc-parsing-failure-can-disable-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; MEDIUM | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;If your .claude/settings.json contains invalid JSONC (e.g., commented-out JSON blocks), Claude Code silently falls back to default settings with no hooks or rules loaded. If your hooks suddenly stop firing, check your settings.json syntax first.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/37540&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Only `command`-type hooks block tool calls.</title>
    <id>https://framework.boucle.sh/limitations.html#only-command-type-hooks-block-tool-calls</id>
    <link href="https://framework.boucle.sh/limitations.html#only-command-type-hooks-block-tool-calls" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook behavior &amp; events"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook behavior &amp; events&lt;/p&gt;&lt;p&gt;Claude Code supports three hook types: command, agent, and prompt. Only command actually blocks execution. Agent and prompt hooks fire but do not prevent the tool call and cannot deliver feedback to the model. enforce-hooks generates command-type hooks exclusively. If you write custom hooks, use &quot;type&quot;: &quot;command&quot; for any hook that needs to enforce rules.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/33125&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] Hook deny is not enforced for MCP tool calls.</title>
    <id>https://framework.boucle.sh/limitations.html#hook-deny-is-not-enforced-for-mcp-tool-calls</id>
    <link href="https://framework.boucle.sh/limitations.html#hook-deny-is-not-enforced-for-mcp-tool-calls" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;PreToolUse hooks fire correctly for MCP server tools, but `permissionDecision: &quot;deny&quot;` is silently ignored -- the MCP tool call proceeds anyway. This means hooks cannot block MCP tools. This is a platform bug, not an enforce-hooks limitation. Workaround: block the MCP server name in managed-settings.json disallowedTools instead.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/33106&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[LOW] Windows: hooks run via `/usr/bin/bash` regardless of shell setting.</title>
    <id>https://framework.boucle.sh/limitations.html#windows-hooks-run-via-usr-bin-bash-regardless-of-shell-setti</id>
    <link href="https://framework.boucle.sh/limitations.html#windows-hooks-run-via-usr-bin-bash-regardless-of-shell-setti" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; LOW | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;On Windows, Claude Code routes all hook commands through `/usr/bin/bash` even when a different shell is configured. Bash-based hooks work if Git Bash is installed (it provides /usr/bin/bash). All 7 Boucle hooks now ship native PowerShell equivalents (.ps1) that bypass this limitation. Use pwsh -File path/to/hook.ps1 in your hook command to run them directly. See install.ps1 for one-line setup.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/32930&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>[CRITICAL] @-autocomplete bypasses hooks.</title>
    <id>https://framework.boucle.sh/limitations.html#autocomplete-bypasses-hooks</id>
    <link href="https://framework.boucle.sh/limitations.html#autocomplete-bypasses-hooks" rel="alternate"/>
    <updated>2026-04-04T11:33:14Z</updated>
    <category term="Hook bypass &amp; evasion"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; CRITICAL | &lt;strong&gt;Category:&lt;/strong&gt; Hook bypass &amp; evasion&lt;/p&gt;&lt;p&gt;When a user types @.env in the prompt, Claude Code injects the file content directly into the conversation. No tool call happens, so PreToolUse hooks never fire. A file-guard rule for .env blocks Read .env and Edit .env but cannot block @.env. This is a known gap in the hook system. Workaround: use managed-settings.json denyRead patterns alongside hooks for defense in depth.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt; https://github.com/anthropics/claude-code/issues/32928&lt;/p&gt;</content>
  </entry>
</feed>
