O que Conventional Commits e Releases faz?
Visão Geral
As mensagens de commit são uma interface legível por máquina, não apenas prosa. O versionamento automatizado e a geração de changelogs as analisam; uma mensagem malformada produz uma versão pública errada ou um release quebrado. Disciplina no pequeno (uma mensagem bem-formada) gera correção no grande (changelog preciso, bump de versão correto) de graça.
O Formato
<tipo>(<escopo>): <descrição>
| Tipo | Efeito / uso |
|---|---|
feat | Nova funcionalidade — bump minor |
fix | Correção de bug — bump patch |
docs | Apenas documentação |
chore | Manutenção, dependências, configuração |
refactor | Mudança de código sem alterar comportamento |
test | Apenas testes |
ci / build | Mudanças em pipeline / sistema de build |
- Modo imperativo: "adiciona X", não "adicionei X" ou "adiciona-se X".
- Breaking changes:
feat!:ou um rodapéBREAKING CHANGE:— dispara um bump major. - Escopo opcional, mas encorajado:
feat(auth):,fix(db):.
Detalhes Importantes
- A ligação tipo↔versão significa que um
featdigitado errado comofixpublica uma versão errada. Escolha o tipo deliberadamente: "adiciona" = nova funcionalidade, "atualiza" = melhoria em algo existente, "corrige" = bug. - Squash-merge: o título do PR se torna o commit que é publicado. Ele deve ser um commit convencional válido, senão o release estará errado.
- Voz humana. Nenhuma atribuição de IA/assistente, nenhum trailer
Co-authored-by, nenhum rodapé "gerado por". Os commits parecem que foram escritos por um humano.
Racionalizações Comuns
| Desculpa | Realidade |
|---|---|
| "A mensagem realmente não importa" | Ela direciona o changelog e o número da versão. Ela importa mecanicamente. |
"chore serve para essa funcionalidade" | chore não vai alterar a versão; os usuários não receberão sua funcionalidade em um release. Use o tipo correto. |
| "Depois eu corrijo o título do PR" | No squash-merge o título é final no momento da mesclagem. Corrija antes. |
"Um trailer Co-authored-by não faz mal" | A regra do projeto proíbe atribuição de IA. Sem exceções. |
Sinais Vermelhos — PARE
- Uma mensagem de commit sem prefixo de tipo
- Usar
chore/docspara algo que adiciona ou corrige comportamento visível ao usuário - Um título de PR para squash que não é um commit convencional válido
- Qualquer atribuição de IA ou linha
Co-authored-by
Enforcement:
- Título do PR — validado na CI, bloqueante (
amannn/action-semantic-pull-request). No squash-merge o título é o commit que publica, então esta é a validação que importa. - Atribuição de IA — um job bloqueante
No AI Attributionrejeita trailersCo-authored-bymencionando Claude/Anthropic e rodapésGenerated with [Claude…], tanto nos commits do branch como no corpo do PR (o corpo se torna o corpo do commit squash). TrailersCo-authored-byhumanos não são afetados. - Corpos dos commits do branch — deliberadamente não lintados. O squash-merge os descarta, então eles nunca chegam ao changelog. Se você migrar para merge commits, adicione commitlint.
Gap conhecido: se um commit tiver como autor uma conta de agente, o GitHub compõe um
trailer Co-authored-by no momento do squash — após a verificação do PR ter executado. A validação
acima não consegue vê-lo. Não commite como uma identidade de agente.
Justificativa completa: Artigo III da constituição, incluído em engineering-constitution/references/engineering-constitution.md.