Large permissions allow list in settings.local.json causes startup hang in iTerm2

Resolved 💬 3 comments Opened Feb 25, 2026 by jp63670 Closed Mar 1, 2026

Description

Claude Code hangs indefinitely on startup when the project's .claude/settings.local.json contains a large permissions.allow list (~73 entries). The issue is specific to interactive mode - claude -p and claude doctor still work.

Environment

  • Claude Code: Tested on both 2.1.44 (stable) and 2.1.56 (latest)
  • Terminal: iTerm2 3.6.6 (hangs) vs Terminal.app (works fine)
  • OS: macOS 26.4 (Darwin 25.4.0)
  • Node: v25.2.1
  • Shell: zsh

Steps to Reproduce

  1. Have a .claude/settings.local.json with a large permissions.allow list (73 entries in our case)
  2. Some entries contained paths with spaces and various escaping patterns:
  • Double-escaped: Bash(/Volumes/RAID/Options\\\\ Trading\\\\ --\\\\ Zen/venv/bin/pip show:*)
  • Quoted with spaces: Bash("/Volumes/RAID/Options Trading -- Zen/venv/bin/python3" scripts/...)
  • Backslash-escaped: Bash(/Users/jimperkins/Options\\ Trading\\ --\\ Zen/venv/bin/python3:*)
  1. Launch claude in interactive mode from the project directory in iTerm2
  2. Claude hangs indefinitely - no output, no UI rendered

What works

  • claude -p "say hello" works (after MCP startup delay)
  • claude doctor works
  • claude from a different project directory (without the large permissions list) works in iTerm2
  • claude from the same directory works in Terminal.app
  • Removing permissions from settings.local.json (keeping only env) fixes the hang immediately

Diagnostic Steps Taken

  1. Confirmed TTY detection correct in iTerm2 (test -t 0 and test -t 1 both pass)
  2. Disabled iTerm2 shell integration - no effect
  3. Tested with --strict-mcp-config --mcp-config '{}' - still hung
  4. Removed MCP servers from .claude.json - still hung
  5. Removed settings.local.json entirely - fixed
  6. Reduced permissions list from 73 to 38 entries (removing stale/escaped paths) - still hung
  7. Removed permissions block, kept only env - fixed

Workaround

Remove the permissions block from .claude/settings.local.json. If running with --dangerously-skip-permissions, the allow list is unused anyway.

Notes

  • The permissions list accumulated organically over time from approving tool calls
  • A cleaned-up 38-entry list (no problematic escaping) also caused hangs, suggesting it may be the list size or specific pattern matching interacting with terminal rendering
  • Only affects interactive mode, not print mode or subcommands
  • Only reproduces in iTerm2, not Terminal.app

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗