Sumner Evans argues Conventional Commits is not just an annoying convention but a backwards one, in a specific and describable way: it makes the commit type mandatory and puts it first, while the commit scope — the subject of the change — is optional.
His case, short version:
- Everyone who reads a log wants scope, not type. Contributors catching up, debuggers bisecting, incident responders scanning the commits around an error spike: all want to know what area changed. Bugs arrive through commits of any type, including bugfixes.
- Type is redundant.
fix(compiler): prevent namespaced SVG style elements from being strippedalready reads as a fix from the description alone, and subject-line space is scarce. - Type is restrictive too. A commit that updated a component to handle two entry points was a fix, a refactor, and a feature at once — but it only touched one scope.
- Scope being optional is the tell: “having a commit without a scope is like having a sentence without a subject.”
Then he walks the spec’s official selling points and finds none of them hold:
- Auto-generated changelogs mix two audiences. A changelog is user-facing and cares about functional differences between versions; a commit log is developer-facing and cares about the story of how the code changed. Features span many commits, and reverts are meaningful history to developers but equal nothing to users.
- Automatic semver bumps are unsound. Reverts of breaking changes, breakages only recognized in hindsight, and commits that are non-breaking in composition all make tooling pick the wrong major/minor. Fixing it by rebasing rewrites the history contributors rely on and breaks CI.
- Type-triggered builds are a security hole. Run security checks only on commits touching code and a commit titled
docs: fix typosthat edits the auth subsystem walks right past them. Compute is cheap — detect changed files fromgit diff. - It survives corporate use badly. Where audit rules demand a ticket number, the ticket lands in
<scope>, replacing the one useful field with the least useful one.
What works instead is what the long-lived projects already do — scope-prefixed subjects: Linux (subsystem: description), FreeBSD, Git, Go (package: description), nixpkgs, Node.js. Evans has started scopedcommits.com to push the convention, and notes AI tooling now defaults to the other one, propagating it at volume.
The distinction worth keeping: a commit log is for the people who maintain the code, a changelog is for the people who use it. Pick one job per artifact, and put the scope first.