| name | release-process |
| description | Execute the full release workflow: bump version, update changelog, run dotnet format and dotnet test quality gates, prepare release notes, commit and push to main, wait for CI green, then create and push the annotated tag. WHEN: shipping a new release, bumping version in the repo, creating a git tag, or running pre-release quality gates. |
| domain | release-management |
| confidence | high |
| source | manual |
Context
Use this skill when preparing and shipping a release from main in this repository. It standardizes the release order and enforces a hard CI gate before tags are created.
Patterns
- Start from updated main
git checkout main
git fetch origin
git pull --ff-only origin main
- Bump version first
- Update version in the canonical repo locations for the release.
- Keep version values consistent across all touched files.
- Update changelog
- Add the release entry in
CHANGELOG.md with date, version, and notable changes.
- Ensure the changelog reflects exactly what is being released.
- Run quality gates (MANDATORY)
dotnet format --verify-no-changes — verify formatting; fix any issues before proceeding.
dotnet test — all tests must pass; do NOT proceed if any test fails.
- If either command fails, fix the issue first and restart from step 2.
- Leela owns release notes
- Leela prepares release notes content (summary, highlights, breaking changes, migration notes if applicable).
- Do not publish release tags until Leela's release notes are finalized.
- Commit release prep together
- Stage version + changelog + release notes artifacts in one release-prep commit.
- Suggested message format:
chore(release): vX.Y.Z.
- Push release prep commit
- Hard CI gate
- Wait until CI for
main is fully green.
- No tag creation while any required check is pending or failed.
- Create and push tag only after CI green
git tag -a vX.Y.Z -m "vX.Y.Z"
git push origin vX.Y.Z
- If multiple tags are intentionally used, push explicitly or with
git push --tags.
- Post-tag verification
- Confirm tag exists remotely and points to the intended release commit.
Examples
git checkout main
git fetch origin
git pull --ff-only origin main
dotnet format --verify-no-changes
dotnet test
git add <version-files> CHANGELOG.md <release-notes-files>
git commit -m "chore(release): vX.Y.Z"
git push origin main
git tag -a vX.Y.Z -m "vX.Y.Z"
git push origin vX.Y.Z
Anti-Patterns
- ❌ Tagging before CI is green
- ❌ Splitting version/changelog/release-notes across multiple unrelated commits
- ❌ Pushing tags from a branch other than updated
main
- ❌ Publishing tags before Leela finalizes release notes
- ❌ Using broad destructive git commands to force release state
- ❌ Pushing a release without running
dotnet test first