Antes do mapa de 4 buckets, olha Arquivo na pasta .claude/rules/ que descreve uma constraint sempre-ligada (ex: nunca commitar .env). Vale em toda sessão, sem precisar invocar. Diferente de skill, que é workflow condicional. e Arquivo SKILL.md numa subpasta de .claude/skills/ que descreve um workflow reutilizável (ex: como fazer deploy). O Claude carrega e usa quando reconhece o trigger no description:. Diferente de rule, que vale sempre. do Starter.
A rule starter/.claude/rules/no-secrets-in-claude-md.md abre assim:
Secrets em arquivos versionados é um vazamento permanente — Git history nunca esquece. Esta rule existe porque um projeto real vazou um Upstash token em .claude/settings.local.json antes desta rule existir. Não repita.
Quatro coisas a notar: (1) frase única de contexto, (2) seção ## What NEVER goes ... listando o anti-padrão, (3) seção ## Where secrets DO go listando o padrão correto, (4) rule curta, de uma página. Ela vale em toda sessão, sem você precisar invocar.
A skill starter/.claude/skills/plan-then-work/SKILL.md abre com este frontmatter:
---name: plan-then-workdescription: The Builder OS signature workflow. Write a markdown plan in plans/ first, then execute it. Use whenever the user asks for a non-trivial change — anything touching ≥2 files, introducing a new dependency, changing a schema, or adding a new route. Do NOT plan one-line tweaks.---
O description: é o A frase que faz o Claude reconhecer quando uma skill se aplica e decidir carregá-la naquela conversa. Trigger ruim = skill que dispara na hora errada ou nunca dispara.: a frase que o Claude lê e usa pra decidir se carrega a skill naquela conversa. Skills só rodam quando o trigger bate. Rules valem o tempo todo.
Essa é a categoria-mãe: rules são sempre-ligadas; skills são condicionais.
Mapa de decisão 2x2: política vs procedimento × sempre-ligado vs condicional, com os 4 buckets resultantesGrid 2x2 mostrando 4 buckets de configuração do Claude Code: Rule (política sempre-ligada), Skill (procedimento condicional), e os 2 quadrantes auxiliares. Cada bucket tem nome + descrição curta + exemplo de arquivo real.
O mapa que vale tirar foto e fixar no monitor: decisão antes de escrever código.
Antes de criar uma rule nova, vale ver o que o template já trouxe. Assim você não duplica nada e já pega o estilo certo.
Cole no Claude:
prompt · text
Liste em duas colunas: as rules em `.claude/rules/` e as skills em `.claude/skills/` deste projeto. Pra cada uma, dê uma frase explicando o que ela define.
A resposta deve mencionar:
Rules (3):bilingual-content (idiomas por superfície), no-secrets-in-claude-md (sem secrets em arquivos versionados), plan-lifecycle (fluxo de planos).
Pede o conteúdo completo de uma delas pra pegar o estilo:
prompt · text
Mostre o conteúdo completo de `.claude/rules/no-secrets-in-claude-md.md` aqui no chat pra eu ver a forma de uma rule do template.
Repare na anatomia que já vimos no abre da lição: contexto curto, ## What NEVER goes ..., ## Where ... DO go, e, quando faz sentido, o incidente real que motivou a rule.
Agora você vai adicionar uma rule própria. Três candidatas que valem pra quase todo produto brasileiro:
Preencha o campo abaixo com a rule que você escolheu:
prompt · text
Crie uma nova rule em `.claude/rules/.md` que codifica esta decisão:
>
Siga o estilo das rules existentes em `.claude/rules/`:
- Título H1 curto.
- 1-2 frases de contexto explicando o que a rule define.
- Seção `## What NEVER goes ...` ou equivalente listando o anti-padrão.
- Seção `## Where it DOES go` listando o padrão correto, com exemplo de código quando fizer sentido.
- Seção `## Why this matters` (opcional, se houver razão concreta — incidente, custo, regulação).
Mantenha curto: máximo 1 página. Mostre o diff antes de criar o arquivo.
REGRA_QUE_VOU_ADICIONAR[REGRA_QUE_VOU_ADICIONAR]— frase curta descrevendo a rule. Ex: "valores monetários sempre em centavos como inteiros".
NOME_DO_ARQUIVO[NOME_DO_ARQUIVO]— kebab-case curto, sem extensão. Ex: money-as-cents, br-date-format, validate-cpf-on-boundary.
O Claude vai propor o conteúdo num diff. Aprova com y se o estilo bate; refina se não bater.
Uma rule que nenhum commit referencia não tem como provar que está moldando o trabalho. Agora você vai fazer um trabalho invocando a rule que acabou de criar.
prompt · text
Implemente um helper pequeno que aplica a rule que acabamos de adicionar em `.claude/rules/.md`.
Decida onde o helper mora (provavelmente `src/lib/`), use TypeScript strict, e exporte uma função pequena. Adicione 2-3 exemplos de uso no final do arquivo, em comentários (`// formatBrDate(new Date('2026-01-15')) → '15/01/2026'`).
Depois faça commit em duas etapas separadas:
Etapa 1 — só a rule:
`git add .claude/rules/.md` + commit com mensagem `feat(rules): add rule`.
Etapa 2 — só o código:
`git add` do código + commit cuja mensagem referencia a rule explicitamente no body. A mensagem deve ser uma linha de subject (`feat(lib): add formatBrDate helper`), uma linha em branco, e o body (`Applies .claude/rules/.md.`).
Mostra o diff e os comandos antes de executar cada etapa.
O Claude vai pedir aprovação pra cada git add e cada git commit. Aprova passo a passo.
Mesma estrutura da lição 05: fecha o Claude (Ctrl+D no terminal, ou fecha o painel/janela). Reabre. Cola:
prompt · text
Estou prestes a implementar uma feature que envolve . Qual rule deste projeto eu preciso respeitar?
A resposta deve referenciar .claude/rules/{{NOME_DO_ARQUIVO}}.md pelo nome, porque o Claude releu as rules na nova sessão e a sua acabou de entrar no conjunto.
Você não vai criar uma skill nesta lição, porque skills são mais difíceis de escrever bem que rules. O description: do frontmatter funciona como gatilho: ele precisa descrever quando a skill é relevante de um jeito que dispare nos pedidos certos sem disparar em todos. O Módulo 5 trata disso ao empacotar suas skills num plugin, onde o namespace (/<plugin>:<skill>) resolve a colisão de nomes que antes você contornava na mão.
Detalhe de escrita pro modo "dispara demais": redija o trigger em imperativo simples (Use esta rule quando...), sem CRITICAL/MUST em maiúsculas. Os modelos novos respondem mais ao system prompt e disparam demais quando a linguagem é agressiva: o trigger grita e a skill carrega na hora errada, gastando uma chamada à toa. A doc da Anthropic dá o exemplo direto: trocar "CRITICAL: You MUST use this tool when..." por "Use this tool when...". Vale também pro corpo das rules. Fonte: Claude 4 best practices.
Por enquanto, fica com o exercício mental: olhe as 5 skills do template que você listou no início. Pra cada uma, identifique:
Qual é o trigger (o description: do frontmatter)?
Qual é o trabalho que ela executa (as etapas concretas)?
Se você notar um workflow que repete em prompts seus ("toda vez que adiciono uma tabela no Postgres, sempre preciso de migration + seed + zod schema juntos"), anota. Vai virar sua primeira skill custom no Módulo 5.
Rules são sempre-ligadas; skills são condicionais (o description: do frontmatter é o trigger).
4 buckets pra decidir onde decisão mora: rule (constraint), skill (workflow com trigger), CLAUDE.md (contexto/domínio), comentário no código (decisão local).
Anatomia de rule curta: contexto de 1 frase, ## What NEVER ..., ## Where ... DO go, e, quando houver, o incidente real que motivou.
O commit em duas etapas (rule, depois código que a aplica) prova que a rule já está moldando o trabalho, em vez de só existir no diretório.