← Home ← Codex ← DEBT
Browse by Category
+ added · updated 7d
← Back to glossary

Conventional Commits

Style Beginner
debt(d3/e3/b3/t5)
d3 Detectability Operational debt — how invisible misuse is to your safety net

Closest to 'default linter catches the common case' (d3). The term's detection_hints.tools list includes commitlint, semantic-release, and conventional-changelog — commitlint specifically runs as a git hook or CI step to catch non-conforming commit messages before they're merged. This is essentially a default linter for the commit convention.

e3 Effort Remediation debt — work required to fix once spotted

Closest to 'simple parameterised fix' (e3). The quick_fix shows a straightforward format replacement: type(scope): description. Fixing non-conventional commits involves rewriting commit messages (git rebase -i for history, or just adopting the format going forward). It's more than a one-line patch since you may need to fix multiple commits or set up tooling, but it's a simple pattern adoption within one workflow.

b3 Burden Structural debt — long-term weight of choosing wrong

Closest to 'localised tax' (b3). The convention applies to commit messages across the entire codebase, but it's a lightweight tax — every commit needs the format, yet it doesn't shape architecture or slow down code changes themselves. It's a persistent but minor overhead in the git workflow, not in the code structure.

t5 Trap Cognitive debt — how counter-intuitive correct behaviour is

Closest to 'notable trap' (t5). The misconception explicitly states that developers believe it's 'just a style preference with no functional benefit' when in fact tools parse commit types for automated versioning and changelogs. This is a documented gotcha — most devs eventually learn that feat→minor, fix→patch, BREAKING CHANGE→major, but initially many treat it as cosmetic and miss the automation benefits, leading to broken version bumps.

About DEBT scoring →

Also Known As

Conventional Commits spec commit convention feat fix chore

TL;DR

A commit message specification — type(scope): description — enabling automated changelogs, semantic versioning, and machine-readable history.

Explanation

Conventional Commits defines a structured format: <type>[optional scope]: <description>. Types: feat (new feature → bumps MINOR), fix (bug fix → bumps PATCH), docs, style, refactor, test, chore, perf. Breaking changes are indicated by a ! suffix or BREAKING CHANGE: footer (→ bumps MAJOR). Example: feat(auth): add OAuth2 login via GitHub. Tools built on this format: semantic-release (automated npm/GitHub releases), git-cliff and conventional-changelog (CHANGELOG generation), and commitlint (pre-commit enforcement). For PHP projects, use cocur/slug-based tooling or the standard semantic-release with a PHP adapter. Pair with a pre-commit hook (Husky or a PHP git hook library) to enforce the format.

Common Misconception

Conventional Commits is just a style preference with no functional benefit. Tools like semantic-release and standard-version parse commit types to automatically determine version bumps (feat → minor, fix → patch, BREAKING CHANGE → major) and generate changelogs — the convention drives automation.

Why It Matters

Conventional commits give commit messages a standard format (feat:, fix:, breaking change:) enabling automated changelog generation, semantic version bumping, and clear history filtering.

Common Mistakes

  • Inconsistent type prefixes across the team — some use 'feature:', others 'feat:', others nothing.
  • Vague commit bodies: 'fix: bug' — the body should explain what was broken and how it was fixed.
  • Not using BREAKING CHANGE footer for breaking API changes — automated tooling cannot detect them.
  • Over-strict enforcement driving developers to make huge commits to avoid multiple messages.

Code Examples

✗ Vulnerable
# Non-conventional commits — no structure:
git log:
  'fixed stuff'
  'wip'
  'FINAL'
  'changes'
  'more changes'

# Conventional commits:
  'feat(auth): add OAuth2 Google login'
  'fix(session): regenerate ID after privilege change'
  'docs: add deployment runbook'
  'feat!: rename user_name to username (BREAKING CHANGE)'
✓ Fixed
# Format: <type>(<scope>): <short description>

git commit -m 'feat(auth): add OAuth2 login via GitHub'
git commit -m 'fix(cart): prevent duplicate line items on concurrent add'
git commit -m 'refactor(payment): extract StripeGateway to adapter class'
git commit -m 'perf(query): add covering index on orders.user_id'
git commit -m 'docs(api): document /orders endpoint rate limits'
git commit -m 'test(checkout): add integration test for card decline flow'
git commit -m 'chore(deps): bump phpunit to 11.1'

# BREAKING CHANGE — add ! and footer:
git commit -m 'feat(api)!: rename /users to /members

BREAKING CHANGE: clients must update all /users references to /members'

Added 15 Mar 2026
Edited 22 Mar 2026
Views 58
Rate this term
No ratings yet
🤖 AI Guestbook educational data only
| |
Last 30 days
0 pings T 0 pings W 1 ping T 0 pings F 0 pings S 0 pings S 0 pings M 0 pings T 0 pings W 3 pings T 1 ping F 2 pings S 2 pings S 3 pings M 1 ping T 2 pings W 1 ping T 0 pings F 0 pings S 0 pings S 0 pings M 1 ping T 1 ping W 0 pings T 0 pings F 0 pings S 1 ping S 0 pings M 1 ping T 0 pings W
No pings yet today
PetalBot 1
Scrapy 13 Amazonbot 9 Perplexity 9 Ahrefs 4 Google 3 Unknown AI 2 PetalBot 2 Claude 1 Meta AI 1 SEMrush 1 Qwen 1
crawler 43 crawler_json 2 pre-tracking 1
DEV INTEL Tools & Severity
🟢 Low ⚙ Fix effort: Low
⚡ Quick Fix
Use the format: type(scope): description — feat, fix, docs, refactor, test, chore — and automate changelog generation and version bumps from commit history
📦 Applies To
any any
🔗 Prerequisites
🔍 Detection Hints
Commit messages like 'fix stuff' 'WIP' 'misc changes' with no type or scope structure
Auto-detectable: ✓ Yes commitlint semantic-release conventional-changelog
⚠ Related Problems
🤖 AI Agent
Confidence: Medium False Positives: Medium ✗ Manual fix Fix: Low Context: File


✓ schema.org compliant