Claude Code - Dicas para usar o CLAUDE.md
   Este artigo é para quem não usa o arquivo CLAUDE.md com o Claude Code e também para quem usa mas  não sabe muito bem o que esta fazendo.

Para quem não sabe o que é o CLAUDE.md, ele é um arquivo de texto em formato Markdown (.md) colocado na raiz de um projeto para fornecer instruções persistentes, contexto operacional e regras de desenvolvimento lidas automaticamente pelo assistente de IA Claude Code no início de cada sessão.

Pense nele como um guia de onboarding ou um manual de instruções feito para a inteligência artificial, eliminando a necessidade de repetir regras de estilo, comandos ou padrões a cada nova conversa

 

Os modelos de Linguagem (LLMs) são, em sua essência, funções sem estado (stateless). Toda vez que uma sessão começa, o agente não tem memória da sua última conversa, das convenções da sua base de código ou daquela refatoração na qual você passou três dias discutindo. Ele começa "do zero". Sem direcionamento, ele improvisa — e a improvisação de uma IA dentro do código de produção é exatamente tão aterrorizante quanto parece.

Segundo testes da Anthropic, um CLAUDE.md bem configurado pode melhorar a precisão da IA na escrita de código entre 5% e 10%. Na prática, com um arquivo elaborado de forma intencional, os ganhos parecem muito maiores.

A tentação quando você descobre o CLAUDE.md é recheá-lo com tudo: histórico do projeto, documentação de APIs, explicações de regras de negócio complexas e diagramas de arquitetura descritos em texto. Minha primeira tentativa tinha mais de 300 linhas. O desempenho da IA na verdade piorou.

O motivo é mecânico: o CLAUDE.md consome o seu limite de tokens. Cada linha dedicada a um contexto longo e prolixo é uma linha roubada da análise do código real. Pesquisas indicam que arquivos de configuração abaixo de 100 linhas têm o melhor desempenho. Além disso, sinais importantes ficam diluídos no ruído, e o modelo começa a ignorar seletivamente seções que considera menos relevantes.

A disciplina não é apenas brevidade — é precisão.

Em vez de: "Escreva um código limpo".

Prefira: "Métodos devem ter no máximo 40 linhas. Handlers do MediatR DEVEM usar CancellationToken. Consultas de leitura DEVEM usar AsNoTracking() no EF Core."

Cada regra deve ser específica, acionável e verificável. Se uma IA (ou um humano) não consegue dizer se uma regra foi cumprida, a regra é inútil.

A seguir vou apresentar a anatomia de um CLAUDE.md enxuto e eficiente para ser usado em projeto .NET.

1. Declaração da Stack da Tecnologia usada

Aqui você deve ser preciso, e, isso é inegociável, os números de versão importam mais do que você pensa. O .NET 8 e o .NET 9/10 possuem recursos e sintaxes muito diferentes (como Minimal APIs, Primary Constructors, etc.). Sem versionamento explícito, você está jogando dados para ver qual modelo mental o agente usará.
## Tech Stack
**Backend (.NET)**
- .NET 10 SDK / C# 14
- ASP.NET Core Web API (Minimal APIs)
- Entity Framework Core 10 (SQL Server)
- FluentValidation & MediatR (CQRS)
- xUnit & FluentAssertions (Testes)

2. Estrutura do Projeto

Diga ao agente onde as coisas ficam. Sem isso, ele criará pastas onde bem entender — o que frequentemente estará errado no contexto da sua arquitetura (como Clean Architecture ou Vertical Slices).
 ## Estrutura do Projeto
src/
├── Core/
│ ├── Domain/ # Entidades, Objetos de Valor, Eventos de Domínio
│ └── Application/ # Casos de Uso, Commands, Queries, DTOs (MediatR)
├── Infrastructure/ # DbContext, Mapeamentos EF Core, Repositórios
└── API/ # Endpoints (Minimal APIs), Middlewares, Extensions 

3. Estilo de Código — Com Exemplos, Não Apenas Regras

Esta é a visão de maior impacto: código de exemplo supera mil palavras de descrição. Dizer à IA para "tratar erros adequadamente" não significa nada. Mostrar a ela um padrão concreto para replicar é transformador.
## Padrão para Handlers do MediatR e EF Core
✅ Padrão Correto:
```csharp
public sealed class GetCustomerByIdQueryHandler(AppDbContext context,
        ILogger<GetCustomerByIdQueryHandler> logger) 
    : IRequestHandler<GetCustomerByIdQuery, Result<CustomerDto>>
{
    public async Task<Result<CustomerDto>> Handle(GetCustomerByIdQuery request,
 CancellationToken cancellationToken)
    {
        var customer = await context.Customers
            .AsNoTracking()
            .FirstOrDefaultAsync(c => c.Id == request.Id, cancellationToken);
        if (customer is null)
            return Result.Failure<CustomerDto>(DomainErrors.Customer.NotFound(request.Id));
        return customer.ToDto();
    }
}

Todos os Handlers seguem este padrão: Primary Constructors + CancellationToken + AsNoTracking 
para leitura + Pattern Result.
```

4. A Camada de Restrições

Esta seção é o que transforma um assistente capaz em um assistente **seguro**. Você está dizendo ao agente o que ele **nunca** deve tocar.
## Restrições -
❌ NÃO altere arquivos de Migrations no EF Core (`/Infrastructure/Migrations/*`) -
❌ NÃO instale novos pacotes NuGet sem solicitação explícita -
❌ NÃO exponha Entidades de Domínio diretamente nos Endpoints (use DTOs/Results) -
✅ PODE modificar livremente Handlers, Endpoints e Mapeamentos dentro de `/Application` e `/API`

Um limite violado pode significar horas depurando uma Migration quebrada ou um vazamento de contrato de API. Defina as cercas.

5. Seção do Processo de Revisão

Esta pode ser a seção mais subestimada de um CLAUDE.md eficaz. Antes de entregar qualquer código, instrua o agente a executar uma checklist de autoauditoria:
## Processo de Revisão
Antes de concluir qualquer tarefa:
1. Execute `dotnet build` e garanta zero avisos de compilação (Warnings as Errors).
2. Avalie a conformidade — declare explicitamente ✅ ou ❌ para cada item:
   - Uso de `CancellationToken` em métodos assíncronos
   - Injeção de dependência via *Primary Constructors*
   - Tratamento de exceções e uso de tipos `Result`
   - Testes unitários atualizados

Sem isso, a IA entrega o código e considera o trabalho feito. Com isso, o agente captura os próprios erros antes mesmo de você ver o resultado.

A Técnica de Contraste Que Muda Tudo

Um truque de formatação teve um impacto gigantesco na qualidade das respostas: os pares de contraste ❌/✅.
## Atualização de Entidades no EF Core
❌ Errado: Buscar entidade inteira apenas para atualizar um campo sem controle
var user = await context.Users.FindAsync(id);
user.Name = newName;
await context.SaveChangesAsync();
✅ Correto: Atualização via ExecuteUpdateAsync para operações pontuais de alta performance
await context.Users
    .Where(u => u.Id == id)
    .ExecuteUpdateAsync(s => s.SetProperty(u => u.Name, newName), cancellationToken);

O contraste visual torna as regras inequívocas. Quando o modelo vê o padrão errado explicitamente rotulado com , ele o evita. Quando vê o padrão certo com o sinal , ele o replica.

Isso não é um floreio estético — é uma instrução mecanicamente mais eficaz.

O Desbloqueio da Hierarquia: Monorepos e Soluções Multi-Projetos

Se você trabalha em uma Solução .NET complexa (Modular Monolith ou vários projetos na mesma Solution), a abordagem de arquivo único não é suficiente. Ferramentas modernas suportam configurações hierárquicas.
minha-solucao/
├── CLAUDE.md                       # Global: regras Git, estilo C#, convenções da Solution
├── src/
│   ├── Apps.Web/
│   │   └── .claude/CLAUDE.md       # Específico para Blazor / Controllers / UI
│   └── Services.Payment/
│       └── .claude/CLAUDE.md       # Específico para gRPC, RabbitMQ e worker services

O arquivo raiz define as leis universais (padrão de C#, logging, etc.). Cada subdiretório herda essas leis e adiciona regras específicas do seu domínio. O agente lê a raiz primeiro e depois aplica as camadas de configuração com base no diretório em que está trabalhando.

O resultado: ele gera rotas de API na camada web e contratos gRPC na camada de serviços — sem você precisar alternar modos manualmente.

O Ciclo de Feedback: Deixe a IA Evoluir Suas Próprias Instruções

Aqui é onde a qualidade "mestre" começa a emergir.

Depois que a IA gerar um padrão ruim — por exemplo, usar DateTime.Now em vez de uma abstração como TimeProvider padrão do .NET 8 — não se limite a corrigir o código. Corrija as instruções.

Abra o CLAUDE.md e adicione:
## Manipulação de Datas
- NUNCA use `DateTime.Now` ou `DateTime.UtcNow` diretamente
- Use sempre `TimeProvider` injetado para facilitar testes unitários

Após salvar, esse padrão sumiu. E ao longo de semanas trabalhando dessa forma, seu arquivo de configuração se torna um documento vivo de conhecimento institucional valioso — o tipo de conhecimento que antes vivia apenas na cabeça de um desenvolvedor Senior ou Tech Lead.

Você pode inclusive pedir ajuda à própria IA para escrevê-lo. Após resolver um problema de compilação ou arquitetura, pergunte: "Quais padrões deveríamos adicionar aonosso CLAUDE.md com base no que acabamos de refatorar?" O agente trará à tona padrões que você já internalizou, mas nunca documentou.

O Ressalva Honesta

Eu estaria mentindo se dissesse que o CLAUDE.md funciona perfeitamente no piloto automático.

A realidade é que a IA nem sempre consulta o arquivo automaticamente da forma como a documentação sugere. Na prática, prompts explícitos ainda ajudam no início da sessão:

"Revise nosso CLAUDE.md antes de prosseguir."
"O que o CLAUDE.md estabelece sobre o tratamento de erros em APIs?"
"Siga o processo de revisão descrito no CLAUDE.md."

Pense nisso menos como uma configuração "configure e esqueça" e mais como ordens permanentes que um desenvolvedor bem treinado deve ser lembrado no início de cada tarefa. Quando você é explícito, a adesão é quase total.

Cinco erros a evitar

1- Arquivo com mais de 100 linhas: Dilui regras críticas e desperdiça tokens. Solução: Seja implacável na poda.

2- Regras vagas ("escreva código limpo"): A IA não pode executar o que não pode medir. Solução: Torne cada regra acionável.

3= Nunca atualizar o arquivo: Configuração desatualizada gera código desatualizado. Solução: Atualize após cada grande refatoração.

4- Não commitar no Git: Membros da equipe usarão versões diferentes. Solução: O arquivo pertence ao controle de versão.

5- Incluir segredos ou Connection Strings: Eles terminarão no seu repositório. Solução: Descreva a abordagem de configuração (ex: appsettings.json + User Secrets), nunca valores reais.

Conclusão

A primeira vez que vi meu agente de código gerar um endpoint completo em ASP.NET Core Minimal APIs — com validação usando FluentValidation, MediatR, logs estruturados com ILogger, CancellationToken propagado e tipos de retorno genéricos com Results.Problem() — sem eu ter pedido nada disso explicitamente, entendi o que as pessoas querem dizer quando afirmam que o desenvolvimento assistido por IA mudou.

Não foi mágica. Foi o resultado de um CLAUDE.md bem estruturado que ensinou ao agente como é o código "pronto e correto" nesta base de código. O agente não estava mais improvisando. Ele estava executando com base em uma definição compartilhada de qualidade que eu havia construído deliberadamente.

Esse é o salto. Não é um modelo mais inteligente. Não é um prompt melhor. É um colaborador mais bem informado.

E tudo o que foi preciso foram 80 linhas de Markdown.

Comece pequeno. Adicione sua stack .NET e três regras de código específicas. Commit no Git. Depois, cada vez que o agente cometer um erro que você não gostaria de ver novamente — escreva esse erro no arquivo. Em um mês, você terá algo que parece menos um arquivo de configuração e mais a memória institucional da sua equipe.

Crie o seu. E deixe que ele torne seu desenvolvimento muito mais rápido.

E estamos conversados..

"Bendito o Deus e Pai de nosso Senhor Jesus Cristo, o qual nos abençoou com todas as bênçãos espirituais nos lugares celestiais em Cristo"
Efésios 1:3

Referências:


José Carlos Macoratti