Releasing and Changelog Guide
This project follows Semantic Versioning and keeps a human-focused changelog.Versioning Rules
- Use SemVer: MAJOR.MINOR.PATCH (tag format:
vX.Y.Z). - Breaking changes:
- While the project is on the
v0.xline: bump MINOR. - After the project graduates off the
v0.xline: bump MAJOR.
- While the project is on the
- Features: bump MINOR.
- Fixes/docs-only releases: bump PATCH.
Changelog Format (Predefined)
Use this structure for each release entry:- Newest first.
- Use only the sections that apply.
- Short, user-facing bullets in past tense.
- Dates are UTC in YYYY-MM-DD.
Release Process (Best-Practice Sequence)
This sequence follows typical maintainer workflows: verify state, prepare release notes, update versions, tag, push, then publish a GitHub Release.0) Pre-flight checks (clean repo, sync tags)
- Ensure the working tree is clean and the branch is up to date.
- Make sure you have all remote tags locally before picking the next version.
1) Determine the next version + release name
- Decide
vX.Y.Zusing the SemVer rules above. - Choose a short suggested name for the release title (e.g., “Safari Login Flow”).
- Title format for GitHub Release:
vX.Y.Z - Suggested Name.
2) Draft the changelog entry (authoritative notes)
- Add a new entry to the top of
CHANGELOG.mdwith today’s UTC date. - Summarize user-facing changes in 2–6 bullets.
- Keep language past tense and user-focused.
3) Bump version strings in code
Update release version constants:tools/si/version.go(siVersion)
4) Verify and commit the release prep
- Keep release prep changes in a dedicated commit.
5) Create an annotated tag for the release commit
- Annotated tags are recommended for releases and are the best practice (they store metadata like tagger, date, and message).
6) Push commits and the new tag
- Push the tag explicitly to avoid conflicts with existing tags.
gh release createcan auto-create a tag if it doesn’t exist; using--verify-tagensures you only release a tag you already created and pushed.- If you let
gh release createauto-create a tag, fetch tags afterward to sync locally:git fetch --tags origin. - If you do let it auto-create a tag, use
--target <branch|sha>to pin the release to the desired commit.
7) Prepare release notes (from the changelog or commits)
If you need a quick summary of commits since the last release:CHANGELOG.md). Use the changelog and commit history as inputs, then write a concise, user-facing summary of what changed since the last published GitHub Release.
Option A: Use the changelog entry as the release body.
- Extract the new
vX.Y.Zsection intorelease-notes.md(manual or script). - Create the release with a title and notes file:
--notes-from-taguses the annotated tag message when present; otherwise it falls back to the commit message. Option C: Use GitHub auto-generated release notes and prepend highlights.
--verify-tagaborts if the tag doesn’t already exist on the remote.--generate-notesuses GitHub’s Release Notes API and can be combined with--notes.- Add
--notes-start-tag vA.B.Cto define the start tag for generated notes when needed. - Add
--fail-on-no-commitsif you want to prevent duplicate releases when there are no new commits.
8) Verify the published release
- Confirm title, notes, and tag target are correct.
- Optional: if your repo uses release attestations, run
gh release verify vX.Y.Z.
Tagging Rules
- Use annotated tags:
git tag -a vX.Y.Z -m "vX.Y.Z" <commit>. - Tags should point at the release commit that includes the changelog update.
- Push tags explicitly:
git push origin vX.Y.Z.
Release Notes Style
- Lead with 2–4 key changes.
- Balance Added/Changed/Fixed where possible.
- Keep tone concise and user-focused.
