Files
NotAlterra/skills/release-workflow/SKILL.md
T

2.6 KiB

Release Workflow

Versioning, release checklist, signing, and push conventions.

Versioning

Bump When Example
PATCH Bug fix or small polish after a release v0.3.1 → v0.3.2
MINOR New feature or significant restructure v0.3.x → v0.4.0
MAJOR Breaking change (1.0+ only) 1.0.0 → 2.0.0
  • Version in the project manifest matches the latest release tag
  • Tags are created at release time, not per-commit
  • Multiple commits can happen between tags

Draft Release Cycle

commit → push → tag v0.x.y → CI builds draft → user tests → publish

No release goes live without the user testing the draft first.

Release Checklist

Before signing a release tag:

  • Impact analysis completed — all call sites for new/changed functions
  • All tests pass
  • Linter passes with zero warnings
  • CHANGELOG.md has an entry for the new version
  • Working tree is clean — no uncommitted changes
  • Release notes file is updated for the new version

After CI completes:

  • Download draft binaries from the releases page
  • Test on target platform — basic workflow, key features
  • Click Publish release on the hosting platform when satisfied

Signing & Push

  • Commit with --no-gpg-sign (avoids GPG passphrase hang in non-interactive terminals)
  • Sign once. Wait for CI to go green on the unsigned commit, then amend with --gpg-sign + force-push. Do not amend between CI runs — each amend creates a new SHA, which triggers a new CI run and leaves stale Pages deployments that block the next run.
  • Passphrase typo protection. Run git commit --amend --gpg-sign --no-edit alone first. If the passphrase is wrong, only that command fails — the force-push, tag, and push don't run on a broken state. Verify with git verify-commit HEAD before proceeding with the remaining commands.
  • Normal push for fast-forward commits
  • --force-with-lease for amended commits or tag refreshes
  • Start from a clean tag. Before re-tagging, always delete the old tag locally AND remotely (git tag -d v0.x.y && git push --delete origin v0.x.y). If the old tag still exists, git tag -s will fail with "tag already exists" and you'll end up with a tag pointing to the wrong commit.
  • If force-pushing, delete old tag and re-tag after the new commit lands
  • Tag once, push once. Re-signing an existing tag pushes a new SHA and triggers another CI run with the same deployment conflict risk.

Release Notes

  • Release notes file contains only the current version's changes
  • Historical release notes on the platform are cleaned per-release