0004 — Conventional Commits and release-please for changelogs and releases¶
- Status: Accepted
- Date: 2026-05-15
- Deciders: @sinidious
Context¶
CAESAR will ship versioned releases. The maintainer wants:
- A predictable changelog that doesn't depend on hand-writing notes.
- Automatic SemVer bumps from the kinds of changes that landed.
- Releases driven from
mainso anyone can read history and see what shipped and when.
Doing this by hand is error-prone for a single-maintainer project; the release-please workflow is well-trodden in the Google open-source ecosystem and handles the entire pipeline.
Decision¶
CAESAR uses Conventional Commits for every commit on main, and
release-please to drive changelog generation and tagging.
- Commit message format:
<type>(<scope>): <imperative summary>. Allowed types are enumerated inpr-lint.ymland enforced on PR titles. pre-commitrunsconventional-pre-commitoncommit-msgso local commits also have to conform.- The
release-please.ymlworkflow runs on every push tomain. It opens a release PR that bumpspyproject.toml, updatesCHANGELOG.md, and tagsvX.Y.Zon merge. release-please-config.jsonmaps types to changelog sections;featandfixare user-visible,chore/ci/testare hidden by default.
PR titles are linted by
amannn/action-semantic-pull-request
in pr-lint.yml. Squash-merge uses the PR title as the commit subject,
so this is the binding gate.
Alternatives considered¶
- Hand-rolled
CHANGELOG.md— works at scale-of-one but rots fast and tempts skipping during busy weeks. semantic-release— JS-first, fine but adds a Node toolchain just for releases.git-cliff— beautiful changelogs, no release PR / tagging workflow; we'd still need to wire that ourselves.commitizen— strong contender for the bump/tag side; rejected to avoid running it locally on a single-maintainer project — CI is the bottleneck, not the developer.
Consequences¶
Positive¶
- Every release has a clean, sectioned changelog with no manual work.
- PR titles are the durable record (squash-merge), and they're validated automatically.
- New contributors get a quick rejection from CI rather than a vague review comment.
Negative¶
- "I just want to push a quick fix" requires remembering the
fix(scope): …shape. Pre-commit hooks make this less painful. - The release PR adds a step between "merge to main" and "tag" — releases are not instant.
Neutral¶
- We can revisit the type list in
pr-lint.ymland the section map inrelease-please-config.jsonwithout breaking history.