Conventional Commits y Releases
Resumen
Los mensajes de commit son una interfaz legible por máquina, no solo prosa. El versionado automatizado y la generación de changelogs los analizan; un mensaje mal formado produce una versión pública incorrecta o un release roto. La disciplina en lo pequeño (un mensaje bien formado) da corrección en lo grande (changelog preciso, incremento de versión correcto) de forma gratuita.
El Formato
<tipo>(<ámbito>): <descripción>
| Tipo | Efecto / uso |
|---|---|
feat | Nueva funcionalidad — incremento minor |
fix | Corrección de error — incremento patch |
docs | Solo documentación |
chore | Mantenimiento, dependencias, configuración |
refactor | Cambio de código que preserva el comportamiento |
test | Solo pruebas |
ci / build | Cambios en pipeline / sistema de construcción |
- Modo imperativo: "añade X", no "añadido X" ni "añade X".
- Cambios rupturistas:
feat!:o un pieBREAKING CHANGE:— provoca un incremento major. - Ámbito opcional pero recomendado:
feat(auth):,fix(db):.
Detalles Importantes
- El vínculo tipo↔versión significa que un
featvsfixmal escrito envía una versión incorrecta. Elige el tipo deliberadamente: "add" = nueva funcionalidad, "update" = mejora a existente, "fix" = error. - Squash-merge: el título del PR se convierte en el commit que se envía. Debe ser en sí mismo un Conventional Commit válido, o el release será incorrecto.
- Voz humana. Sin atribución de IA/asistente, sin líneas
Co-authored-by, sin pies de página generados. Los commits deben leerse como escritos por un humano.
Racionalizaciones Comunes
| Excusa | Realidad |
|---|---|
| "El mensaje realmente no importa" | Conduce el changelog y el número de versión. Importa mecánicamente. |
"chore está lo suficientemente cerca para esta funcionalidad" | chore no incrementará la versión; los usuarios no recibirán tu funcionalidad en un release. Usa el tipo correcto. |
| "Arreglaré el título del PR después" | En squash-merge el título es definitivo al fusionar. Arrégralo antes. |
"Un pie Co-authored-by es inofensivo" | La regla del proyecto prohíbe la atribución de IA. Sin excepciones. |
Banderas Rojas — DETENER
- Un mensaje de commit sin prefijo de tipo
- Usar
chore/docspara algo que añade o corrige comportamiento visible para el usuario - Un título de PR de squash que no sea un conventional commit válido
- Cualquier atribución de IA o línea
Co-authored-by
Cumplimiento:
- Título del PR — validado en CI, bloqueante (
amannn/action-semantic-pull-request). Al hacer squash-merge, el título es el commit que se envía, por lo que esta es la puerta que importa. - Atribución de IA — un trabajo bloqueante
No AI Attributionrechaza piesCo-authored-byque mencionen a Claude/Anthropic y piesGenerated with [Claude…], tanto en los commits de la rama como en el cuerpo del PR (el cuerpo se convierte en el cuerpo del commit squash). Los piesCo-authored-byhumanos no se ven afectados. - Cuerpos de commits de rama — deliberadamente sin linting. El squash-merge los descarta, por lo que nunca llegan al changelog. Si cambias a merge commits, añade commitlint.
Brecha conocida: si un commit tiene como autor una cuenta de agente, GitHub compone un
pie Co-authored-by al hacer squash — después de que la verificación del PR se haya ejecutado.
La puerta anterior no puede detectarlo. No hagas commits como identidad de agente.
Razonamiento completo: Artículo III de la constitución, incluido en engineering-constitution/references/engineering-constitution.md.