Por que rodar teste e build no Claude Code gasta tanto token?

O gasto de tokens no Claude Code não vem só do que você digita: a saída de cada comando (teste, build, instalação de dependência) entra na janela de contexto e volta como token de entrada em todo turno seguinte, muito depois de o comando ter terminado. Dá pra enxergar isso com /context e /usage, e dá pra conter de quatro formas: limitar a saída de bash com BASH_MAX_OUTPUT_LENGTH (30.000 caracteres por padrão, teto de 150.000), filtrar com um hook PreToolUse, delegar o comando barulhento a um subagente, ou resumir a sessão com /compact
Fala aí, beleza? Aquele npm test tu roda UMA vez, mas o log dele continua sendo cobrado em toda mensagem que vier depois
Esse é o tipo de coisa que quase ninguém contabiliza na hora de economizar. Você já trocou pro modelo mais barato, já encurtou o prompt, já parou de colar arquivo inteiro no chat, e mesmo assim a sessão infla e o gasto de tokens no Claude Code segue subindo do nada
Neste post eu quero te mostrar três coisas: o mecanismo (por que a saída do comando vira custo recorrente), como reconhecer os comandos mais barulhentos do seu projeto, e o que dá pra fazer pra conter isso com o que a documentação oficial já entrega hoje
Bora?
O que acontece com o log do teste depois que o comando termina
O sintoma: a sessão fica cara e lenta sem ninguém escrever código novo
Você rodou a suíte, rodou o build, instalou uma dependência
Depois disso ficou só conversando, ajustando detalhe, pedindo uma renomeação boba… e a impressão é que cada resposta ficou mais pesada que a anterior
Não é impressão, não
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 120 aulas
- 4 projetos
- 9h 48min
A causa: saída de ferramenta é contexto, e contexto é reenviado
A janela de contexto do Claude Code guarda tudo o que ele sabe da sessão: suas instruções, os arquivos lidos, as respostas dele e conteúdo que nunca aparece no seu terminal
A saída de ferramenta entra nesse pacote
Então o log de teste não é um evento que acontece e some. Ele vira parte da conversa e acompanha a requisição seguinte, e a próxima, e a próxima
"Mas não existe cache?" Existe, e é automático
O Claude Code usa prompt caching e ordena cada requisição colocando primeiro o que muda pouco entre turnos. Quando a mudança acontece na camada de conversa, o system prompt e o contexto de projeto continuam em cache; quando a mudança acontece no system prompt, tudo o que vem depois dele é invalidado
Se liga no detalhe que importa aqui: o log do teste cai na camada que MUDA
E cache não é de graça. Nos multiplicadores documentados da plataforma, a leitura de cache custa 0,1x o preço do token de entrada base e a escrita de cache de 5 minutos custa 1,25x o preço de entrada base
Pra ter noção de escala, o Claude Sonnet 5 é cobrado a US$ 2 por milhão de tokens de entrada e US$ 10 por milhão de tokens de saída
A solução: não deixar comando verboso rodar na conversa principal
A correção não é "escrever prompt menor"
É decidir, antes de mandar o agente executar, se a saída daquele comando precisa mesmo estar inteira na conversa principal pelo resto da sessão
Na maioria das vezes você quer as falhas, não as 400 linhas de "PASS" antes delas
Como reconhecer os comandos mais barulhentos da sua sessão
Não precisa de ferramenta nenhuma pra fazer essa triagem. É padrão visual mesmo
Os suspeitos de sempre:
- suíte de teste completa, que imprime uma linha por caso e repete o sumário no fim
- build, que despeja etapa por etapa, warning de dependência e tabela de bundle
- instalação de dependência, que é basicamente uma cascata de nomes de pacote
- leitura de log longo, que é o pior de todos porque quase nada ali é sinal
O critério prático é esse: se a saída é feita de linhas repetidas, barra de progresso e warning que você já ignora há meses, ela é candidata a ser filtrada antes de chegar no modelo
A própria documentação de custos usa um exemplo bem direto: em vez de o Claude ler um log de 10.000 linhas, um hook faz grep por ERROR e devolve só as linhas que casam, reduzindo de dezenas de milhares para centenas de tokens
Mesma lógica vale pra suíte de testes. É bem diferente de simplesmente fazer o agente rodar os testes e engolir o relatório inteiro: você continua rodando, só que devolve o pedaço que importa
E as ferramentas MCP?
Essas também entram na conta, com um comportamento próprio
O Claude Code avisa quando a saída de uma ferramenta MCP passa de 10.000 tokens (esse limiar é fixo) e corta a saída num teto padrão de 25.000 tokens, que dá pra elevar com MAX_MCP_OUTPUT_TOKENS
Detalhe que ajuda: as definições das ferramentas MCP são carregadas sob demanda via tool search, então só os nomes ocupam contexto até o Claude usar uma delas

VPS Hostinger para seu sistema
10% OFF extraVPS com SSD NVMe e backups semanais. O cupom MATHEUSHORADECODAR é aplicado automaticamente pelo link.
Ver planos com 10% OFF →Ou seja: o problema do MCP quase nunca é a definição, é o RETORNO 🙂
Como medir o quanto a saída de comando está ocupando
Chega de achismo, bora medir com os comandos oficiais
- Rode
/contextANTES da suíte. Ele mostra a divisão do contexto por categoria, com sugestões de otimização e quais arquivosCLAUDE.mde de memória foram carregados. O erro comum deste passo é pular a foto do "antes": sem linha de base, o depois não prova nada - Rode o comando barulhento normalmente, do jeito que você já faz no dia a dia. O erro comum aqui é escolher um comando manso pra testar e concluir que "não é tanta coisa assim"
- Rode
/contextde novo e compare categoria por categoria. É nessa comparação que a saída de ferramenta aparece pelo que ela é: um bloco que não vai embora sozinho - Abra
/usagepra ver o uso de tokens atual, olhando o bloco Session, que traz o uso de tokens de API - Leia o detalhamento do
/usagese você está em plano Pro, Max, Team ou Enterprise: ele sinaliza comportamentos responsáveis por 10% ou mais do uso recente, como contexto longo ou cache miss, cada um com uma dica pra reduzir. O erro comum deste passo é bater o olho no total e fechar, sem ler o que foi sinalizado - Use
/compactpra resumir a conversa e liberar espaço quando o diagnóstico confirmar que a janela está entupida
O erro comum que atravessa todos os passos é o mais caro de todos: olhar só o preço por milhão de tokens do modelo e ignorar o volume que já está morando na janela
Modelo barato com janela inchada continua saindo caro, beleza?
Quatro formas de conter a saída de comando (e o que cada uma resolve)
| Tática | O que faz | Quando usar | O que custa |
|---|---|---|---|
BASH_MAX_OUTPUT_LENGTH |
Define quantos caracteres de saída o Claude Code lê de volta do arquivo de trabalho para o resultado do comando: 30.000 caracteres por padrão, teto máximo de 150.000 | Quando você quer um limite geral, válido pra qualquer comando, sem configurar nada por caso | Corte cego: o limite não sabe distinguir linha de erro de linha de progresso |
Hook PreToolUse com matcher Bash |
Pré-processa os dados antes de o Claude ver. A documentação de custos traz um hook desse tipo filtrando a saída de teste pra mostrar só as falhas | Quando o comando é recorrente no projeto e você sabe exatamente que pedaço da saída interessa | Trabalho de configuração e manutenção do filtro conforme o projeto muda |
| Subagente | Roda em conversa própria: as chamadas e os resultados intermediários ficam nele, e só a mensagem final volta pro pai. Rodar testes, buscar documentação e processar arquivos de log são exemplos citados na documentação | Quando a tarefa é verbosa por natureza e você só quer a conclusão na conversa principal | Uma instância a mais rodando; dá pra especificar model: haiku na configuração do subagente pra baratear tarefas simples |
/clear e /compact |
Ambos resetam o cache de prompt e o reconstroem naquele ponto; o /compact resume pra liberar espaço |
Depois que o estrago já aconteceu, pra sair de uma janela entupida | Reconstrução do cache e perda de detalhe fino da conversa |
Uma observação sobre o BASH_MAX_OUTPUT_LENGTH: ele é configurável no shell ou em settings.json, na chave env
export BASH_MAX_OUTPUT_LENGTH=10000
{
"env": {
"BASH_MAX_OUTPUT_LENGTH": "10000"
}
}
Se o seu caso é rodar rotina pesada fora do fluxo de conversa, vale considerar rodar o agente por script e trazer só o resultado de volta, em vez de deixar tudo acontecer na sessão interativa
Quando a saída é grande demais e a compactação trava
O sintoma: erro de thrashing e sessão empacada
Você manda uma coisa simples e não sai do lugar
A sessão fica tentando se organizar sozinha e devolve um erro de thrashing
A causa: uma única saída de ferramenta grande demais
Quando isso acontece, o Claude Code para de compactar automaticamente depois de algumas tentativas, em vez de entrar em loop
Pra entender o cenário completo: as sessões compactam automaticamente antes de a janela encher, por volta de 967K tokens por padrão. Esse limiar é configurável por CLAUDE_CODE_AUTO_COMPACT_WINDOW, que aceita a contagem de tokens, e pelo comando /autocompact, que aceita janela de 100K a 1M

Crie sistemas com IA para vender
Prompts, modelos e checklists para criar e publicar seu sistema com IA e preparar a oferta para o primeiro cliente.
Quero o e-book gratuito Receba o livro e os bônus no seu e-mail.E a ordem da limpeza é bem específica: o Claude Code apaga primeiro as saídas de ferramenta mais antigas e só depois resume a conversa, preservando os pedidos do usuário e trechos de código chave
Olha que interessante isso: a saída de ferramenta é a primeira coisa que a ferramenta joga fora
Se é o primeiro item da fila do descarte, é porque é o mais dispensável. Só que enquanto ele está lá, você paga por ele
A solução: cortar na origem, não contar com a compactação
A compactação é rede de segurança, não estratégia
Dependendo dela você já pagou o transporte daquele log por vários turnos antes de ele ser limpo
Vale lembrar que janela de 1M está disponível nos planos Pro, Max, Team e Enterprise com Sonnet 5, Fable 5, Opus 5, Opus 4.8, Opus 4.7 e Opus 4.6, e que requisição de contexto longo é cobrada a preço padrão, sem multiplicador: uma requisição de 900K tokens é cobrada pela mesma taxa por token de uma de 9K
Ou seja: cabe mais, sim, mas cada token continua custando o mesmo
E tem duas configurações que limitam a janela a 200K em vez de 1M: gateway LLM (quando ANTHROPIC_BASE_URL aponta pra um gateway) e CLAUDE_CODE_DISABLE_1M_CONTEXT=1
O que vi comparando Claude Code com outra ferramenta em tarefa real
No vídeo eu coloco o Claude Code e o Antigravity pra fazer a mesma tarefa e vou narrando o que acontece
A fase inicial de planejamento levou cerca de 5 minutos, antes de qualquer linha de código sair. Depois, com as duas ferramentas escrevendo o sistema de comentários, foram mais uns 3 minutos ainda em código. No fim, a mesma funcionalidade saiu com cerca de 2 minutos de diferença a favor do Claude Code
O que me chamou atenção não foi o cronômetro, foi o COMPORTAMENTO
O Claude Code fez a etapa de desenvolvimento em poucas idas e vindas, entregando um bloco grande de uma vez, enquanto a outra ferramenta ficou alternando raciocínio e repetindo requisição, o que alongou o processo
E quando o código ficou pronto, a ferramenta partiu sozinha pra subir o servidor e testar o projeto. Ou seja: a execução entra no mesmo ciclo do agente, e a saída dela cai no mesmo lugar que tudo o mais
Quando o servidor de desenvolvimento acusou porta ocupada, eu resolvi rodar o comando por conta própria em vez de deixar a ferramenta executar, justamente pra não gastar token nessa ida e volta
Mesma postura quando a página quebrou ao recarregar: copiei o erro direto do console do navegador e colei de volta na ferramenta, em vez de pedir pra ela investigar sozinha
Ah, e eu autorizo os comandos de execução logo no começo do projeto, pra não ficar aprovando chamada a cada rodada
Sessão longa de tarefa real é exatamente o cenário onde a saída acumulada pesa mais. Não é o prompt grande que te pega, é o vigésimo log de servidor subindo 😀
No vídeo dá pra ver na prática o momento em que a ferramenta sai do código e começa a executar comando, que é onde a saída passa a mandar no tamanho da sessão
O que fazer na próxima vez que for rodar a suíte
A ideia central do post é essa: o token do teste não é cobrado uma vez, ele MORA na janela
Enquanto estiver lá, ele viaja junto em toda requisição seguinte, e você paga transporte
O próximo passo é concreto e verificável, dá pra fazer hoje:
- rode
/contextantes da próxima suíte - rode a suíte
- rode
/contextde novo e compare - escolha UMA tática pro comando mais barulhento: limite de saída, hook de filtro ou subagente
Uma só, no comando mais barulhento. Depois você repete pro próximo
Pra fechar com noção de escala: em implantações corporativas o custo médio do Claude Code fica em torno de US$ 13 por desenvolvedor por dia ativo e US$ 150 a 250 por desenvolvedor por mês, com 90% dos usuários abaixo de US$ 30 por dia ativo
Dentro dessa faixa, log que ninguém lê ocupando janela é desperdício puro…
Até o próximo post! =)
Perguntas frequentes
Qual o limite padrão de caracteres que o Claude Code lê da saída de um comando bash?
É o BASH_MAX_OUTPUT_LENGTH, que por padrão lê 30.000 caracteres da saída do comando de volta pro resultado, com teto máximo de 150.000. Dá pra configurar esse valor no shell ou na chave env do settings.json. Isso não muda o que o comando faz, só quanto daquela saída volta pra conversa.
O que acontece quando a saída de uma ferramenta MCP é grande demais?
O Claude Code avisa quando a saída passa de 10.000 tokens, esse limiar é fixo, e corta a saída num teto padrão de 25.000 tokens. Dá pra elevar esse teto com a variável MAX_MCP_OUTPUT_TOKENS. As definições das ferramentas MCP em si quase não pesam, porque são carregadas sob demanda via tool search.
Rodar teste dentro de um subagente reduz o gasto de tokens no Claude Code?
Sim, porque cada subagente roda numa conversa própria, e só a mensagem final volta pra conversa principal. As chamadas e resultados intermediários, tipo o log completo da suíte, ficam presos ali dentro. Rodar testes é justamente um dos exemplos citados pra esse tipo de delegação.
Dá pra usar um modelo mais barato num subagente que só roda teste ou build?
Dá. Especificar model: haiku na configuração do subagente reduz o custo em tarefas simples, como triagem de log ou execução de build. Isso soma com o benefício de manter a saída verbosa fora da conversa principal.
/clear e /compact fazem a mesma coisa com o cache de prompt?
Os dois resetam o cache de prompt do Claude Code e reconstroem esse cache a partir daquele ponto. A diferença fica no que sobra da conversa antes disso, mas pro cache em si o efeito de reconstrução é o mesmo. Por isso vale rodar /context antes de decidir qual dos dois usar.
Qual saída o Claude Code descarta primeiro quando a janela de contexto aperta?
As saídas de ferramenta mais antigas saem primeiro, e só depois a conversa é resumida, preservando os pedidos do usuário e trechos de código chave. Isso mostra que o log de comando é o item mais dispensável da janela. Só que, enquanto ele estiver lá, você paga por ele em toda requisição.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 30min
Blog | Mais populares
Bateu o limite de uso do Claude Code? Como retomar a tarefa sem refazer tudo
Bateu o limite de uso do Claude Code? Veja como retomar a tarefa de onde parou com /usage, CLAUDE.md e --continue, sem refazer nada.
Como pagar o Claude Code no Brasil: cartão, dólar, IOF e quanto fica em reais
Claude Code preço Brasil na prática: câmbio, IOF de 3,5% e quanto fica na fatura. Planos Pro e Max convertidos em reais e como pagar com cartão.

O que é o JEV e para que ele serve no Claude Code?
O que é JEV no Claude Code? Entenda o modelo da TypeSafe AI, como instalar a skill e quanto custa por milhão de tokens.
