O Buraco Negro de Recursos do Claude Code: De um Pacote de 11,3 MB a 1,2 TB Consumidos no Disco
Categories:
Claude Code é um cliente Node.js de arquivo único sem gerenciamento de ciclo de vida de recursos: ao iniciar, analisa um pacote de 11,3 MB; em tempo de execução grava no disco sem limites; ao fechar o terminal, o processo continua vivo e consome memória até o sistema travar. Baseado em relatos reais de usuários no GitHub Issues e análises reversas da comunidade, este artigo examina sistematicamente as falhas de gerenciamento de recursos em memória, CPU e disco, revelando problemas estruturais no empacotamento, design de armazenamento e gerenciamento do ciclo de vida dos processos. Esses não são casos de canto, mas falhas de arquitetura relatadas continuamente de agosto de 2025 a abril de 2026, e frequentemente fechadas em massa por bots stale.
Arquitetura de Empacotamento: O Custo de um Arquivo Único de 11,3 MB
O núcleo do Claude Code é um único arquivo cli.js de aproximadamente 11,3 MB. O usuário da comunidade paultendo realizou uma análise estática detalhada no Issue #29481, revelando múltiplos problemas graves de arquitetura.
Tempo de Inicialização do V8: 32 % do Tempo Gasto em Análise
O profiling de CPU mostra que compileSourceTextModule consumiu 31,7 % do tempo de amostragem na fase de inicialização. O motor V8 leva cerca de 300 ms para analisar esse arquivo único de 11,3 MB, enquanto um script Node.js simples leva apenas 23 ms. Outros 7,3 % são gastos em chamadas spawnSync e 3,5 % em coleta de lixo. Isso significa que, antes que o usuário digite qualquer comando, mais de 40 % do tempo de inicialização é desperdiçado apenas em análise.
Carregamento Total: Apenas 20 Imports Dinâmicos
Todo o pacote é analisado e executado na inicialização, contendo apenas 20 expressões import(). Cada usuário paga o custo de todas as funcionalidades, independentemente de usá‑las. A seguir, os componentes que deveriam ser carregados sob demanda, mas são incluídos integralmente:
pie title Composição do Pacote (≈ 13,5 MB)
"Lógica Central da Aplicação" : 7540
"SDK AWS Bedrock" : 1100
"highlight.js (182 linguagens)" : 1000
"OpenTelemetry" : 900
"Google Vertex + gRPC + Protobuf" : 800
"RxJS" : 300
"Outros (Ink, Zod, Ajv, Axios etc.)" : 1807Um assistente de codificação que destaca Brainfuck, MIPS assembly, Flix, Zephir, Inform7, Lasso e outras 182 linguagens demonstra o grau de abrangência do empacotamento. Manter apenas cerca de 40 linguagens comuns poderia economizar aproximadamente 786 KB de análise.
Redundância de Dependências: Quatro Clientes HTTP, Três Bibliotecas de Validação
Diferentes SDKs trazem dependências independentes, resultando em quatro clientes HTTP (Axios, Undici, Got, fetch nativo) e três bibliotecas de validação (Zod, Ajv, JSON Schema) no mesmo pacote. No Node 18+, o fetch nativo já está totalmente disponível, tornando os outros clientes desnecessários.
413 Chamadas Síncronas ao Sistema de Arquivos
O pacote contém 196 chamadas existsSync, 109 statSync, 108 readFileSync, 58 mkdirSync etc., totalizando 413 chamadas síncronas ao sistema de arquivos. Cada uma bloqueia o loop de eventos. Muitos seguem o padrão existsSync(path) && readFileSync(path), que poderia ser substituído por um único try { await readFile(path) } catch {}.
1087 Wrappers de Interoperabilidade CJS/ESM
Cada módulo CommonJS empacotado para ESM gera um wrapper __toESM/__commonJS/__require, totalizando 1087. Esses wrappers aumentam o peso da análise e introduzem pequenas sobrecargas de tempo de execução por módulo.
Polyfills Desnecessários do Node 20
O pacote inclui 62 polyfills de Promise (suportado nativamente desde Node 0.12), 57 de Symbol (desde Node 4), 57 de funções auxiliares async (desde Node 8) e 3 polyfills de AbortController (desde Node 15). Esses são dependências transitivas para versões antigas do Node ou navegadores e são totalmente redundantes no runtime alvo.
ripgrep Empacotado para 6 Plataformas: 61 MB
Todas as 6 binárias do ripgrep são incluídas, totalizando 61 MB. Em contraste, o sharp usa dependências opcionais e instala apenas a binária da plataforma atual, economizando cerca de 51 MB de espaço em disco por instalação.
Degradação de Desempenho do Ink com o Crescimento da Conversa
A UI de terminal usa Ink (React for Terminal). A análise mostra 6 457 chamadas createElement, 578 hooks useState, mas apenas 11 wrappers React.memo(), representando apenas 1,9 % de memoização. No Ink, cada atualização de estado dispara uma reconciliação completa do virtual DOM. Durante respostas em streaming, cada token recebido dispara uma atualização, fazendo com que componentes não memoizados sejam renderizados desnecessariamente. À medida que a conversa cresce, a saída renderizada aumenta, exigindo diffs maiores a cada re‑renderização. Isso