Permissions

Permissions are the difference between a fast autonomous agent and a fast autonomous disaster. Designing them well is the single highest-leverage config decision you'll make.

The three modes

Allow lists, what to say yes to

Think in tiers:

Always safe (allow widely)

Mostly safe (allow with patterns)

Risky, require explicit approval

Never, deny always

Pattern syntax

Allow/deny entries use a specific pattern syntax:

The deny list always wins

If a call matches both an allow pattern and a deny pattern, it's denied. Use this: broad allows + surgical denies.

"allow": ["Bash(git:*)"],
"deny": ["Bash(git push:*)", "Bash(git reset --hard:*)"]

Result: agent can do all git operations except push and hard-reset.

Auto mode strategy

The goal of auto mode is "zero interruptions for 95% of work." Design it in two passes:

  1. Start conservative. Small allow list: read-only tools, safe shell commands, known MCPs.
  2. Expand on friction. Every time you approve the same thing twice, consider adding it to the allow list.

The /fewer-permission-prompts skill in Claude Code can analyze your recent session history and suggest allow-list additions.

Per-project permissions

Drop a .claude/settings.json in a project directory to override permissions for that project. Useful for prod repos (stricter) vs, playground repos (looser).

Audit log

Claude Code records every tool call. Review periodically. If something surprising got auto-approved, tighten the allow list.

Insight: A good permission model is felt as absence, absence of interruptions, absence of surprises. If you're constantly either approving things or getting surprised, your list needs work.