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 stripped already 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 typos that edits the auth subsystem walks right past them. Compute is cheap — detect changed files from git 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.