TL;DR

  • Troquei subagentes por skills em tarefas repetitivas e medi a diferença ao vivo

  • Code review: 38.000 tokens → 2.800 tokens (-93%) | 3min40s → 22 segundos (-90%)

  • A pergunta de decisão que resolve 80% dos casos: isolamento ou contexto da sessão?

  • Template de SKILL.md copiável + os dois campos de frontmatter que todo mundo ignora

  • O único caso onde subagente ainda ganha: paralelismo (com dados)

🎥 Tutorial em Vídeo

Gravei o comparativo: subagente vs skill no mesmo código, commit review em 8 segundos e o caso do paralelismo.

O Problema Que Eu Tinha

Depois de montar os primeiros orquestradores com subagentes, entrei no modo "agente resolve tudo."

Todo fluxo repetitivo que eu queria automatizar criava um subagente. Parecia o caminho natural. Em duas semanas eu tinha 7 subagentes criados: code-reviewer.md, commit-checker.md, pattern-validator.md. Cada um com seu próprio prompt, ferramentas, permissões.

A conta chegou quando eu abri o dashboard de uso de tokens.

Cada execução do code-reviewer: 38.000 tokens. Do zero. O subagente explorava todos os arquivos relevantes, reconstruía o contexto do projeto, e só então fazia a revisão. Sem memória da sessão. Sem acesso ao que eu já tinha discutido.

E o detalhe mais frustrante: 10 minutos antes de rodar o code-reviewer, eu tinha comentado na conversa que queries.js recebia input não-sanitizado. O subagente não sabia disso. Explorou o arquivo, viu a função, não sinalizou nada de errado porque não tinha o contexto do problema que eu já tinha identificado.

Eu estava pagando por isolamento que atrapalhava o meu trabalho, não ajudava.

Tinha criado 7 subagentes em duas semanas. Todos faziam a tarefa certa para o problema errado. O problema não era o código que eles produziam era o ponto de partida. Começar do zero toda vez, em contexto isolado, para tarefas que precisavam exatamente do histórico que eu já tinha construído na sessão.

A Descoberta

A virada veio quando li uma frase na documentação oficial da Anthropic e ela está lá, explícita:

"Consider Skills instead when you want reusable prompts or workflows that run in the main conversation context rather than isolated subagent context."

Quando li isso, entendi o erro.

Skill e subagente parecem a mesma coisa, mas fazem isso de lugares completamente diferentes.

Skill roda dentro da sua sessão. Quando você invoca /code-review, o Claude já sabe tudo que você discutiu, quais arquivos você abriu, o que comentou, as decisões que tomou. Não precisa explorar do zero porque o contexto já existe na conversa.

Subagente abre uma janela separada. Começa do zero. De propósito, e isso é exatamente o que torna ele útil, mas quando você quer esse isolamento.

A maioria das automações que eu tinha criado não precisava de isolamento. Precisava exatamente do contrário.

Antes vs Depois, Code Review:

Subagente

Skill

Tempo

3min40s

22 segundos

Tokens

38.000

2.800

Problemas encontrados

4

6

Acessa histórico da sessão

Os +2 problemas que a skill encontrou vieram direto do contexto da conversa: eu tinha mencionado a vulnerabilidade em queries.js antes de invocar a skill. O subagente nunca teria acesso a isso.

Tutorial Passo-a-Passo

Passo 1: Criar a estrutura da skill

Skills ficam em .claude/skills/<nome>/SKILL.md. Só isso.

mkdir -p .claude/skills/code-review
touch .claude/skills/code-review/SKILL.md

Compare com subagente:

# Subagente fica em:
.claude/agents/code-reviewer.md

A localização define o comportamento. Skill: injeta no contexto principal. Agente: janela separada.

Passo 2: Escrever o SKILL.md

Template base copiável:

---
name: code-review
description: "Revisa código com foco em segurança, performance e padrões do projeto"
---

# Code Review

## O que fazer

Revisar o diff atual (`git diff HEAD~1`) identificando:
- Problemas de segurança (SQL injection, XSS, credenciais expostas)
- Performance (queries N+1, loops desnecessários)
- Violações dos padrões do projeto (verificar CLAUDE.md)
- Inconsistências com o que foi discutido nesta sessão

## Formato do output

Para cada problema encontrado:
1. **Arquivo e linha**: onde está o problema
2. **Severidade**: Alta / Média / Baixa
3. **Descrição**: o que está errado e por quê
4. **Sugestão**: como corrigir

Ao final: resumo com contagem por severidade.

O campo description é o que o Claude usa para decidir quando carregar a skill automaticamente, escreva como o rótulo da ferramenta para o modelo.

Passo 3: Usar os campos de frontmatter que importam

disable-model-invocation: true - o mais importante:

---
name: commit-review
description: "Valida commits antes de enviar"
disable-model-invocation: true
---

Por padrão, o Claude pode invocar uma skill sozinho se achar a situação relevante. disable-model-invocation: true desativa isso, a skill só roda quando você chamar explicitamente.

Para qualquer ação com efeito colateral (commit, deploy, envio de email), esse campo é não-negociável. Você quer decidir o timing, não o modelo.

user-invocable: false - para skills internas:

---
name: context-sync
user-invocable: false
---

Faz a skill sumir do menu /. Ela continua existindo e você pode chamar pelo nome, mas não fica aparecendo na lista. Útil para skills que o Claude usa internamente e não precisam ser visíveis.

Passo 4: Invocar a skill

/code-review

Sem configuração adicional. O slash command vem direto do campo name no frontmatter.

Se quiser que o Claude invoque automaticamente quando relevante (sem disable-model-invocation: true), basta escrever um description claro o modelo usa esse campo para decidir quando acionar.

Passo 5: Decidir quando usar skill vs subagente

O fluxo de decisão que uso:

Nova automação
      ↓
Precisa do contexto da conversa?
  → Sim → Skill
      ↓
Precisa rodar em paralelo com outras tarefas?
  → Sim → Subagente
      ↓
Output vai ser volumoso demais pro contexto?
  → Sim → Subagente
      ↓
Padrão → Skill

A pergunta central que resolve 80% dos casos:

"A tarefa precisa de isolamento ou precisa do contexto que você já tem?"

Caso de Uso: Commit Review

O segundo caso que implementei como skill foi o workflow de commit os mesmos 5 passos que eu descrevia de novo toda sessão:

---
name: commit-review
description: "Workflow de commit: valida, sugere mensagem, aguarda confirmação"
disable-model-invocation: true
---

# Commit Review

Executar em sequência:
1. `git diff HEAD` — listar arquivos modificados
2. Verificar se há credenciais ou dados sensíveis expostos
3. Verificar se os testes passam para os arquivos modificados
4. Sugerir mensagem de commit seguindo o padrão do projeto
5. Aguardar confirmação antes de executar o commit

Resultado: 8 segundos. 5 passos executados. Zero chance de esquecer algum.

O disable-model-invocation: true garante que a skill nunca roda automaticamente. Commit é uma ação com efeito colateral eu quero decidir quando acontece.

Quando Subagente Ainda Ganha

Sendo honesto: tem um caso onde subagente ganha de forma clara. Paralelismo.

Skill roda no contexto principal sequencialmente. Se você tem 6 módulos independentes para refatorar, a skill processa um por vez.

Medição real:

  • Skill sequencial (3 módulos): 3min34s

  • Orquestrador com 6 subagentes em paralelo: 1min12s

Extrapolado para o projeto completo: skill levaria ~16 minutos, subagentes ~5 minutos. 3x mais rápido.

O sinal para usar subagente em vez de skill:

  • Tarefas independentes que podem rodar juntas (sem dependência entre si)

  • Output que seria volumoso demais para o contexto principal

  • Você precisa de um modelo diferente (ex: Haiku para cortar custo)

  • Contexto da sessão vira risco (dados sensíveis que a próxima tarefa não deveria ver)

Caso contrário → skill.

📚 Documentação Oficial

Próximos Passos

  1. Hoje: Identificar um subagente que você usa para tarefa repetitiva (code review, commit, lint)

  2. Amanhã: Migrar para skill — criar .claude/skills/<nome>/SKILL.md com o template acima

  3. Esta semana: Medir a diferença em tempo e tokens (anota os dois antes de migrar)

  4. Próxima semana: Revisar os outros subagentes usando o fluxo de decisão do Passo 5

Adriano Viana
System Architect | AI-Native Content Creator

Keep reading