This document describes how to create a release.
- Main branch is green in CI
- CHANGELOG updated
- No unresolved high-severity blockers
- Sync local main:
git checkout main git pull --ff-only
- Create a release branch (optional for larger release prep):
git checkout -b release/vX.Y.Z
- Update version in pyproject.toml and changelog.
- Run tests:
python -m unittest discover -s tests -p "*.py" - Commit release metadata:
git add pyproject.toml CHANGELOG.md git commit -m "Release vX.Y.Z" - Tag and push:
git tag vX.Y.Z git push origin main --tags
- Create GitHub release notes from CHANGELOG entries.
Use this structure when writing GitHub release notes. Copy relevant sections from CHANGELOG.md and remove any that are empty. Write entries in user-facing language. Describe the impact (not the implementation). Credit contributors by GitHub username where applicable (e.g. — thanks @username).
- Brief user-facing description. Reference the PR: (#123)
- Brief description of behaviour change. Reference the PR: (#124)
- Brief description of the fix. Reference the closed issue: (#125)
- Description of breaking change and migration steps required.
Before publishing the GitHub release:
-
CHANGELOG.mdupdated with all merged PRs since last release - Version bumped in
pyproject.toml - All CI checks green on
main - No unresolved high-severity issues
- Release notes formatted using the template above
- Each entry references its PR or issue number
- Breaking changes are clearly marked and migration steps documented
- Contributors credited where applicable
If a release is broken:
- Document issue in release notes
- Publish hotfix release vX.Y.Z+1
- Backfill tests for the regression