Como criei uma Skill que Economiza 84% dos Tokens no Claude Code
O problema: tokens queimando em silêncio
Toda vez que você abre uma sessão no Claude Code, ele carrega automaticamente os arquivos de contexto do projeto: CLAUDE.md, AGENTS.md, hooks, skills. O que pouca gente percebe é que esses arquivos consomem tokens antes mesmo de você digitar a primeira mensagem.
No nosso projeto — um app React Native com arquitetura Clean Architecture — a situação era essa:
CLAUDE.md (1 linha) → referenciava @AGENTS.md (713 linhas)
.claude/CLAUDE.md → 116 linhas
hooks.json → 5 hooks (rodando em cada mensagem e cada write)
MEMORY.md → 70 linhas (redundante com CLAUDE.md)
────────────────────────────────────
Total por sessão: ~830+ linhas de contexto automático
Eram 830 linhas carregadas antes de qualquer prompt. E pior: muitas eram duplicadas entre os arquivos.
Passo 1: Auditar o que está sendo carregado
A primeira coisa foi entender exatamente o que o Claude Code carrega em cada sessão. A regra é simples:
CLAUDE.md(raiz do projeto): sempre carregado.claude/CLAUDE.md: sempre carregado- Referências
@arquivo: expandidas inline (o@AGENTS.mdestava injetando 713 linhas) MEMORY.md: sempre carregado (memória persistente entre sessões)- Hooks: executados nos eventos configurados (cada hook "prompt" faz uma chamada de API)
- Skills: só carregam quando invocadas (custo zero se não usadas)
O diagnóstico foi claro: AGENTS.md era o vilão, e os hooks estavam multiplicando chamadas desnecessárias.
Passo 2: Compactar o MEMORY.md
O MEMORY.md tinha 70 linhas com informações que já existiam no CLAUDE.md:
- Diagrama de arquitetura (duplicado)
- Code Standards (duplicado)
- Histórico detalhado de sessão anterior (desnecessário)
Ação: Removemos tudo que já estava coberto pelos arquivos de projeto e mantivemos apenas informação exclusiva da memória:
# project - Memory
## Dark Premium Theme (actual hex values)
- Background: #031426
- Emerald: #2BAE7B, #23C98E, #0A3D2E
...
## Pre-existing TS Errors (not ours)
- CreateGroupScreen: disabled prop on TextInput
- PaywallScreen: plan type mismatches
...
## Screens Redesigned (Feb 2026)
- Bets: BetsHub, MarketsList, MyBets...
Resultado: 70 linhas → 22 linhas (~70% de redução).
A regra de ouro: a memória só deve conter o que NÃO existe em nenhum outro arquivo de contexto.
Passo 3: Unificar os hooks
Os hooks eram o custo oculto mais caro. Veja o que tínhamos:
| Hook | Evento | Frequência |
|---|---|---|
| Style validator | PreToolUse (Write/Edit) | Cada write/edit |
| i18n validator | PreToolUse (Write) | Cada write |
| Accessibility validator | PreToolUse (Write) | Cada write |
| Commit format | UserPromptSubmit | Cada mensagem |
| Session context | SessionStart | 1x por sessão |
O problema: cada Write disparava 3 chamadas de API separadas (uma para cada hook de validação). E o hook de commit rodava em toda mensagem do usuário, mesmo que 99% das vezes não fosse sobre commits.
Ação: Unificamos tudo em um único hook:
{
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "prompt",
"prompt": "Check if the tool input contains React Native/TypeScript code. If so, WARN about:\n1. STYLES: Inline StyleSheet.create()...\n2. I18N: Hardcoded user-facing strings...\n3. ACCESSIBILITY: Missing accessibilityRole..."
}
]
}
]
}
Resultado: 5 hooks → 1 hook. De até 4 chamadas extras por turno para no máximo 1 (e só quando escreve arquivo).
O SessionStart foi removido porque o .claude/CLAUDE.md já carrega o mesmo contexto. O UserPromptSubmit de commit foi removido porque rodava em toda mensagem para um caso raríssimo.
Passo 4: Eliminar a duplicação AGENTS.md ↔ CLAUDE.md
Este foi o passo com maior impacto. Tínhamos dois arquivos carregados toda sessão:
AGENTS.md(713 linhas): guia completo com exemplos de código, checklists, padrões.claude/CLAUDE.md(116 linhas): resumo conciso do projeto
O problema: 80% do AGENTS.md era redundante com o CLAUDE.md. Ambos tinham:
- Overview do projeto
- Diagrama de arquitetura
- Naming conventions
- Lista de "Don'ts"
- Theme tokens
- Padrões de estilo
Ação em 3 passos:
- Identificamos o conteúdo único do AGENTS.md (Real-Time Sync, UI Component structure, BDD refs, Firebase schema, Feature checklist)
- Migramos esse conteúdo para o
.claude/CLAUDE.mdde forma compacta - Removemos a referência
@AGENTS.mddoCLAUDE.mdraiz
O CLAUDE.md raiz ficou assim:
See .claude/CLAUDE.md for full project context and rules.
Pay special attention to Real-Time Sync, Optimistic UI, and Component Guidelines.
E o .claude/CLAUDE.md absorveu o conteúdo único de forma concisa. Por exemplo, a seção de Real-Time Sync que tinha 6 linhas no AGENTS.md virou:
### Real-Time Sync & Optimistic UI
- **Local-First**: Use onSnapshot listeners, not getDoc/getDocs
- **Domain naming**: Repository subscriptions use watch prefix and return () => void unsubscribe
- **UI**: Call watch* in useEffect — avoid useFocusEffect refetch after CRUD
Resultado: 830 linhas → 135 linhas (~84% de redução).
O AGENTS.md continua existindo como documentação de referência — ele não foi deletado. Apenas não é mais carregado automaticamente em cada sessão.
Passo 5: Criar o Smart Dispatch (a cereja do bolo)
Com o contexto otimizado, criamos uma skill global para resolver outro problema: usar o modelo certo para cada tarefa.
O Claude Code permite especificar o modelo ao criar subagents via o parâmetro model do Agent tool. Isso significa que podemos rotear tarefas automaticamente:
opus → arquitetura, planejamento, decisões complexas
sonnet → implementação de lógica de negócio
haiku → estilos, testes, i18n, boilerplate
Criamos a skill em ~/.claude/skills/smart-dispatch/SKILL.md:
---
name: smart-dispatch
description: Automatically routes tasks to optimal Claude models
(opus/sonnet/haiku) based on complexity. Use when implementing
features, fixing bugs, or any multi-step development work.
---
# Smart Model Dispatch
## Model Routing Rules
### opus — Complex reasoning & architecture
- Architecture planning and design
- Complex business logic implementation
- Feature planning and requirement analysis
### sonnet — Standard implementation
- Business logic (use cases, repositories, stores)
- Screen/component implementation with logic
- Firebase/API integration
### haiku — Fast, mechanical tasks
- Generating .styles.ts files
- Writing i18n translation files
- Creating boilerplate and mocks
- Writing unit tests
```markdown
A skill inclui regras claras de quando usar cada modelo e exemplos de dispatch paralelo:
```markdown
Exemplo: "Implementa a feature Watchlist"
1. [opus] Planeja arquitetura
2. [sonnet] Implementa domain + data layers
3. [sonnet] Implementa screen com ViewModel
4. [haiku] Gera .styles.ts, i18n, mocks
5. [haiku] Escreve testes unitários
Por ser uma skill global (em ~/.claude/skills/), ela funciona em qualquer projeto, não apenas no Vai ter fut.
Resultado final
Antes e depois em números:
| Métrica | Antes | Depois | Redução |
|---|---|---|---|
| Contexto por sessão | 830 linhas | 135 linhas | 84% |
| Hooks executados | 5 (até 4 por turno) | 1 (só em Write/Edit) | 80% |
| MEMORY.md | 70 linhas | 22 linhas | 70% |
| Chamadas de API extras | ~4 por turno | ~1 por turno | 75% |
E o Smart Dispatch garante que cada subtarefa usa o modelo com melhor custo-benefício, sem intervenção manual.
Lições aprendidas
1. Audite seus arquivos de contexto regularmente. Conforme o projeto cresce, os arquivos vão acumulando duplicações. O que era útil há 3 meses pode estar redundante hoje.
2. Hooks "prompt" são chamadas de API. Cada hook do tipo prompt faz uma chamada separada ao modelo. Três hooks no mesmo evento = três chamadas. Unifique sempre que possível.
3. Nem tudo precisa rodar em toda mensagem. O hook de commit format rodava em 100% das mensagens para ser útil em 1% delas. Se algo é raro, não coloque no UserPromptSubmit.
4. Skills são grátis até serem invocadas. Diferente de hooks e CLAUDE.md, skills só consomem tokens quando chamadas. Use skills para conteúdo detalhado e mantenha o CLAUDE.md enxuto.
5. O modelo certo para a tarefa certa. Não faz sentido usar o Opus para gerar um arquivo .styles.ts. O Haiku faz o mesmo trabalho com fração do custo e tempo. Reserve poder computacional para onde ele importa.
Reproduza no seu projeto
O processo completo em 5 comandos mentais:
- Conte as linhas dos seus arquivos de contexto (
CLAUDE.md,AGENTS.md,MEMORY.md) - Marque duplicações entre eles — provavelmente 50%+ é redundante
- Unifique hooks do mesmo evento em um só
- Remova hooks desnecessários (SessionStart redundante, UserPromptSubmit para casos raros)
- Crie a skill de dispatch para rotear modelos automaticamente
O arquivo de skill é simples, global, e funciona em qualquer projeto. Copie o nosso como ponto de partida.