MODULO 5.1

🔐 Permissions

O pipeline de permissoes que decide se cada tool use e permitido, negado ou requer aprovacao do usuario -- do deny-first design ate o classificador AI automatico.

8
Topicos
~90
Minutos
Deep
Nivel
Source
Tipo
1

🛡️ System Overview

Cada tool use -- comandos bash, edicoes de arquivo, endpoints MCP -- passa por um pipeline de permissoes que produz tres resultados possiveis:

allow

Ferramenta executa imediatamente sem intervencao do usuario.

deny

Ferramenta e bloqueada; Claude recebe o motivo.

ask

Usuario e solicitado a aprovar ou rejeitar.

Tres inputs dirigem o pipeline: a ferramenta solicitada, seus parametros de entrada e o contexto de permissao atual (modo, regras, estado da sessao).

2

🔍 The Decision Pipeline

Implementado em hasPermissionsToUseToolInner() em permissions.ts. Os passos sao numerados para corresponder aos comentarios no codigo:

1a Deny rule para a ferramenta inteira -- bloqueio imediato se encontrado.
1b Ask rule para a ferramenta inteira.
1c checkPermissions() proprio de cada tool (Bash checa prefixos, FileWrite checa limites de diretorio).
1e requiresUserInteraction -- tools como ExitPlanMode, AskUserQuestion sempre requerem aprovacao humana.
1g Safety check (bypass-immune) -- escrita em .git/, .claude/, .vscode/, shell configs sempre requer aprovacao.
2a bypassPermissions mode -- tudo que passou pelo step 1 e permitido.
3 Mode transformations: dontAsk vira deny; auto vai para classificador; headless vai para hooks.
3

🎯 The 5 Permission Modes

Modo Comportamento
defaultMostra prompt para cada tool use nao reconhecido
planRead-only. Write tools bloqueados ate sair do plan mode
acceptEditsAuto-aprova file edits dentro do working directory. Shell ainda pede
bypassPermissionsPula todos os prompts (exceto deny, safety checks, requiresUserInteraction)
dontAskConverte todo "ask" em "deny". Claude e informado que nao pode usar a tool
autoRoteia decisoes "ask" por um classificador AI em vez de prompt humano

💡 O que bypassPermissions NAO pode ultrapassar

  • Deny rules -- sempre respeitadas, sem excecoes
  • requiresUserInteraction -- ExitPlanMode, AskUserQuestion, ReviewArtifact sempre precisam de humano
  • Content-specific ask rules -- Bash(npm publish:*) na ask list sempre pergunta
  • Safety checks -- escrita em .git/, .claude/, .vscode/, shell configs sempre pergunta
4

📝 Rule Matching System

Cada regra e uma string no formato ToolName ou ToolName(content), armazenada em listas allow/deny/ask. Tres tipos de content rules:

exact

Igualdade completa apos trim.

Bash(npm install)

prefix (legacy)

Termina com :*. Parte antes de : e prefixo.

Bash(npm:*)

wildcard

Contem * nao-escapado. Convertido para regex.

Bash(git * --dry-run)
// Tool-wide rule
"Bash"                   // match any Bash command
"mcp__myserver"          // match all tools from myserver MCP

// Content-specific rules
"Bash(npm install)"      // exact match
"Bash(npm:*)"            // legacy prefix
"Bash(git add *)"        // wildcard
5

📚 Rule Sources & Priority

Fonte Arquivo Compartilhado?
policySettingsEnterprise managed policySim
projectSettings.claude/settings.jsonSim (git)
userSettings~/.claude/settings.jsonNao
localSettings.claude/settings.local.jsonNao
flagSettings--settings CLI flagNao
sessionIn-memory (sessao atual)Nao
{
  "permissions": {
    "allow": ["Bash(npm:*)", "Bash(git status)"],
    "deny":  ["WebFetch"],
    "ask":   ["Bash(npm publish:*)"]
  }
}
6

🤖 Auto Mode & AI Classifier

Quando o modo e auto, decisoes ambiguas sao roteadas por um modelo Claude secundario ("YOLO classifier") em vez de prompt humano. Tres fast paths pulam o classificador:

  • Safety checks nao-classificaveis -- escrita em .git/ ou shell configs nunca e auto-aprovada
  • acceptEdits fast path -- file edits dentro do CWD sao permitidos sem chamar classificador
  • Safe tool allowlist -- ferramentas read-only pulam o classificador

Denial Tracking

O classificador rastreia negacoes consecutivas e totais. Apos 3 consecutivas ou 20 totais, cai de volta para prompt do usuario. Uma tool use bem-sucedida reseta a contagem consecutiva (mas nao o total).

Dangerous Patterns Stripped at Auto Mode Entry

Ao entrar em auto mode, allow rules que deixariam Claude ultrapassar o classificador sao removidas:

const DANGEROUS_BASH_PATTERNS = [
  'python', 'node', 'deno', 'ruby', 'perl',
  'npx', 'bunx', 'npm run', 'yarn run',
  'bash', 'sh', 'eval', 'exec', 'sudo', 'xargs',
]
7

👁️ Shadowed Rule Detection

Uma regra pode se tornar inalcancavel -- escrita corretamente mas nunca avaliada porque uma regra mais geral dispara primeiro. shadowedRuleDetection.ts detecta e reporta esses conflitos.

❌ Deny-shadowed

Bash na deny list faz Bash(ls:*) na allow list ser inalcancavel.

permissions.deny  = ["Bash"]      // bloqueia tudo
permissions.allow = ["Bash(ls:*)"] // nunca alcancada!

⚠️ Ask-shadowed

Bash na ask list sempre pergunta, tornando Bash(ls:*) na allow list inalcancavel.

8

💬 Permission Explainer

Quando um prompt de permissao aparece, permissionExplainer.ts faz uma chamada API lateral para gerar uma explicacao legivel do que o comando faz, por que Claude quer executa-lo e o nivel de risco.

{
  explanation: "What this command does (1-2 sentences)",
  reasoning:   "I need to check the file contents",
  risk:        "Modifies files outside the working directory",
  riskLevel:   "HIGH"  // LOW | MEDIUM | HIGH
}
  • Usa sideQuery() -- chamada API separada que NAO conta nos totais de tokens da sessao
  • Modelo forcado a usar tool especifica (explain_command) para output estruturado garantido
  • Inclui ate 1.000 chars de contexto recente para respostas "why" fundamentadas

📋 Resumo do Modulo

Deny rules sao verificadas primeiro -- antes de bypass mode, antes de allow rules, antes de logica especifica da tool
bypassPermissions nao e verdadeiramente incondicional -- nao pode ultrapassar deny rules, content-specific ask rules, safety checks e requiresUserInteraction
Paths protegidos (.git/, .claude/, .vscode/) sao bypass-immune por design, prevenindo corrupcao silenciosa
Auto mode tem fast paths em camadas: safe allowlist, acceptEdits check, classifier. Apenas o ultimo passo custa uma chamada API
Limites de negacao do classificador previnem loops: 3 consecutivas ou 20 totais, sistema cai para prompt humano
Shadowed rule detection avisa quando regras especificas sao inalcancaveis por regras tool-wide mais amplas
Voltar para Trilha Proximo Modulo