Release Instructions
How to cut a new trip2g release. Every release gets:
- A bilingual entry in both
docs/en/changelog.mdanddocs/ru/changelog.mdwith What / Why / How to use for each user-facing change. - A separate atomic commit
docs(changelog): vX.Y.Z. - An annotated git tag that carries the same release notes (English).
Versioning
Semantic versioning — vMAJOR.MINOR.PATCH.
| Bump | When |
|---|---|
| MAJOR | Breaking change for users, API consumers, or DB schema without auto-migration. |
| MINOR | New user-visible feature (feat: commits) or notable backward-compatible behavior. |
| PATCH | Bug fixes only (fix:, chore:, lint, internal refactors). |
If the diff contains any feat: since the last tag → MINOR at minimum.
Algorithm
1. List what's in the release
LAST=$(git tag --sort=-v:refname | head -1)
git log "$LAST"..HEAD --oneline
Group the commits mentally by feat / fix / docs / chore. Decide the next tag (vX.Y.Z).
2. For each user-facing item, dig up evidence
Don't trust commit subjects alone — find the actual artifact so the changelog entry is accurate and the reader can verify:
- User docs:
docs/en/user/*.mdanddocs/ru/user/*.md— link the page. - Dev docs:
docs/dev/*.md— link if the feature has an internal spec or pattern doc. - Tests / e2e:
internal/**/<feature>_test.go,e2e/<feature>/*— gives you a real example payload or invocation. - Specs / plans:
docs/superpowers/specs/,docs/superpowers/plans/— useful as authoritative description. - CLI / scripts:
cmd/<x>/main.go,scripts/<x>.py— gives you the exact invocation.
Use grep -l <symbol> docs/ -r and find -name '<feature>*' to locate them.
3. Write the changelog entry (EN + RU)
Add a new section at the top of both docs/en/changelog.md and docs/ru/changelog.md. The Russian version is a straight translation of the English one — same structure, same links (adjusted to relative paths), same set of features. Per the project rule on bilingual docs, neither file is allowed to drift.
## vX.Y.Z — YYYY-MM-DD
### <Feature name> — <one-line value prop>
- **What.** <One sentence describing the change.>
- **Why.** <Concrete reason the user should care.>
- **How.** <Doc links, mutation/CLI example, frontmatter key, admin path — enough to start using it.>
Rules of thumb:
- Order: features first (most impactful on top), then Fixes, then Docs & chore.
- Skip pure internal noise (CI tweaks, single-typo fixes) unless they affect a user.
- A backward-compatible automatic improvement (no flag, no config) still gets a section — explicitly state "automatic, no flags".
- Keep the prose user-facing. No commit hashes in the changelog; that's what git is for.
- One feature = one block. Don't bundle unrelated changes.
4. Commit the changelog
git add docs/en/changelog.md docs/ru/changelog.md
git commit -m "docs(changelog): vX.Y.Z"
Use specific paths in git add — never git add -A on a release commit (you'll sweep up unrelated untracked files).
5. Create an annotated tag
Annotated tags carry the release notes inside the tag object so git show vX.Y.Z produces a self-contained summary.
git tag -a vX.Y.Z -m "$(cat <<'EOF'
vX.Y.Z
<paste a compact version of the changelog section here —
What/Why/How bullets collapsed to one line each is fine>
EOF
)"
Verify:
git show vX.Y.Z --stat | head -40
6. Push (manual)
Push is a deliberate, human-controlled step — never automated.
git push origin main
git push origin vX.Y.Z
Undo a local tag before pushing if you change your mind:
git tag -d vX.Y.Z
Backfilling older releases
If a tag predates this changelog convention and you want to record it:
git log <prev-tag>..<tag> --onelineand look at the user-facing diff.- Add a
## vX.Y.Z — historical (backfill)section in bothdocs/en/changelog.mdanddocs/ru/changelog.md. - Don't fabricate dates or sub-bullets you can't verify — when in doubt say "historical".
- Backfill is one commit per batch, not one per tag.
Conventions
- Tag format:
vMAJOR.MINOR.PATCH, lowercasev, no suffix. - Pre-releases:
vX.Y.Z-rc.N(rarely used). - Hotfixes off a release: branch
hotfix/vX.Y.Z+1, tag once merged. - Never re-tag a published version. Bump PATCH instead.
- Don't squash the changelog commit into feature commits — keep it atomic so the tag points at it.