agentleFS
michaelsvanbeekmichaelsvanbeek/personal-agent-skills/skills/release-management/SKILL.md

release-management

Skill1 starsChanged 7 months agoMITView on GitHub

Release management with semantic versioning, changelogs, and release workflows. Use when: choosing version numbers, creating releases, writing release notes, writing changelogs, designing release branches, automating version bumps, tagging releases, defining release checklists, or deciding when to cut a release. Covers SemVer 2.0.0, pre-release versions, release notes with breaking/functional/non-functional tiers, release pipelines, and changelog automation.

  • Reads credentials
  • Installs packages
  • Commits and pushes

15 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use infrastructure-as-code, incident-response and 1 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • mmondoraSkill

    infrastructure-as-code

    Infrastructure as Code with Terraform and Pulumi. State management, modularity, drift detection, secrets handling. Use when provisioning cloud resources, writing Terraform/Pulumi modules, or managing infrastructure configuration.

    Also in 3 projects that use this

  • AnthropicSkill

    incident-response

    Run an incident response workflow — triage, communicate, and write postmortem. Trigger with "we have an incident", "production is down", an alert that needs severity assessment, a status update mid-incident, or when writing a blameless postmortem after resolution.

    Also in 3 projects that use this

  • OpenAISkill

    observability

    Vercel Observability expert guidance — Drains (logs, traces, speed insights, web analytics), Web Analytics, Speed Insights, runtime logs, custom events, OpenTelemetry integration, and monitoring dashboards. Use when instrumenting, debugging, or optimizing application performance and user experience on Vercel.

    Also in 3 projects that use this

The file

Show its rules and text

We split this skill into the rules it gives an agent

17 rules. 0 are common, 13 are distinctive, and 4 are very specific to this project.

  • 0

    Common

    Most of the 11 edited versions we read keep these.

  • 13

    Distinctive

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    When MAJOR increments, MINOR and PATCH reset to 0: 1.5.3 → 2.0.0

    line 60
  2. Very specific:

    When MINOR increments, PATCH resets to 0: 1.4.3 → 1.5.0

    line 61
  3. Distinctive:

    Use for testing before a stable release:

    line 65
  4. Distinctive:

    Every project must have one canonical location for its version.

    line 94
  5. Very specific:

    Use annotated tags (-a), not lightweight tags — annotated tags store author, date, and message.

    line 106
  6. Distinctive:

    Update changelog (see Changelog section).

    line 129
  7. Distinctive:

    Every change in a release falls into one of three tiers.

    line 168
  8. Distinctive:

    When using conventional commits (see git-workflow skill), map commit types to release note tiers:

    line 226
  9. Distinctive:

    Write from the consumer's perspective — describe what changed for them, not what code changed.

    line 240
  10. Distinctive:

    Every breaking change must include a migration path — what to do, not just what broke.

    line 242
  11. Distinctive:

    Keep entries to one line unless a migration guide is needed.

    line 245
  12. Distinctive:

    Use imperative mood, present tense: "Add user search" not "Added user search endpoint".

    line 246
  13. Distinctive:

    Before publishing release notes, verify:

    line 250
  14. Very specific:

    Keep an [Unreleased] section at the top for in-progress changes.

    line 269
  15. Distinctive:

    Use the same three-tier classification (Breaking / Functional / Non-Functional) as release notes.

    line 270
  16. Distinctive:

    Never edit entries for past releases — corrections go in a new release.

    line 271
  17. Distinctive:

    Run through before every release:

    line 277

“Common” is measured: kept by at least 6 in 10 of the 11 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Release Management Standards

When to Use

  • Deciding what version number to assign a change
  • Creating a release (tag, branch, changelog entry)
  • Writing release notes or changelog entries
  • Classifying changes as breaking, functional, or non-functional
  • Designing release workflows for a project
  • Automating version bumps in CI/CD
  • Planning breaking changes or deprecations
  • Auditing an existing project for missing version tags, changelogs, or release processes
  • Retrofitting semantic versioning and release workflows to an unversioned project

Semantic Versioning (SemVer 2.0.0)

Version format: MAJOR.MINOR.PATCH

Given a version 1.4.2:

SegmentValueIncrement when
MAJOR1Breaking change — consumers must update their code
MINOR4New feature — backward-compatible addition
PATCH2Bug fix — backward-compatible correction

When to Bump What

Change typeBumpExample
Fix a bug without changing APIPATCH1.4.2 → 1.4.3
Add a new feature, existing behavior unchangedMINOR1.4.3 → 1.5.0
Change or remove existing behaviorMAJOR1.5.0 → 2.0.0
Add deprecation warning (feature still works)MINOR1.5.0 → 1.6.0
Remove deprecated featureMAJOR1.6.0 → 2.0.0
Refactor internals without API changePATCH1.4.2 → 1.4.3
Update dependencies (no behavior change)PATCH1.4.2 → 1.4.3
Update dependencies (new features exposed)MINOR1.4.3 → 1.5.0
Documentation-only changesNo bump (or PATCH if versioned docs)—

Reset Rules

  • When MAJOR increments, MINOR and PATCH reset to 0: 1.5.3 → 2.0.0
  • When MINOR increments, PATCH resets to 0: 1.4.3 → 1.5.0

Pre-Release Versions

Use for testing before a stable release:

2.0.0-alpha.1    # early testing, API may change
2.0.0-beta.1     # feature-complete, fixing bugs
2.0.0-rc.1       # release candidate, final validation

Pre-release versions have lower precedence than the release: 2.0.0-alpha.1 < 2.0.0.

Increment the numeric suffix for subsequent pre-releases: 2.0.0-beta.1 → 2.0.0-beta.2.

Build Metadata

Append with + for informational metadata (ignored in version precedence):

1.4.2+build.456
1.4.2+20260320

Version 0.x.y

Major version zero (0.y.z) signals initial development — anything may change at any time. The public API should not be considered stable. Bump to 1.0.0 when the API is stable and used in production.


Version Source of Truth

Every project must have one canonical location for its version. Never define the version in multiple places.

Project typeVersion sourceHow to read
Pythonpyproject.toml → [project] versionpython -c "import importlib.metadata; print(importlib.metadata.version('pkg'))"
Node.jspackage.json → versionnode -p "require('./package.json').version"
GenericGit taggit describe --tags --abbrev=0
DockerImage tagBuild-time from git tag or version file

Git Tags as the Release Record

  • Tag every release: git tag -a v1.4.2 -m "Release v1.4.2"
  • Use annotated tags (-a), not lightweight tags — annotated tags store author, date, and message.
  • Prefix with v: v1.4.2, not 1.4.2.
  • Tags are immutable — never delete and re-create a tag. If a release is bad, publish a new PATCH.

Release Workflow

Standard Release (Feature or Fix)

main ──────────────────────────────── main
         \                        /
          feat/my-feature ───────    ← development
                                  \
                            PR merge to main
                                  \
                              v1.5.0 tag  ← release
  1. Develop on a feature branch (see git-workflow skill for branch naming).
  2. Open a PR. CI runs lint + test (see cicd skill).
  3. Merge to main.
  4. Update changelog (see Changelog section).
  5. Bump version in the version source file.
  6. Commit: chore(release): v1.5.0
  7. Tag: git tag -a v1.5.0 -m "Release v1.5.0"
  8. Push: git push origin main --follow-tags
  9. CI detects the tag and runs the release pipeline (build, publish, deploy).

Hotfix Release

For urgent fixes to production when main has unreleased changes:

v1.4.0 ──── hotfix/fix-crash ──── v1.4.1
  1. Branch from the release tag: git checkout -b hotfix/fix-crash v1.4.0
  2. Fix the issue. Add a regression test.
  3. Bump PATCH version, update changelog.
  4. Tag: git tag -a v1.4.1 -m "Release v1.4.1"
  5. Push the hotfix branch and tag.
  6. Cherry-pick the fix into main to keep it up to date.

Breaking Change Release

Breaking changes require extra care:

  1. Deprecate first — add deprecation warnings in a MINOR release. Document the migration path.
  2. Communicate — changelog, README, and (if applicable) migration guide.
  3. Remove — in the next MAJOR release, remove the deprecated code.
  4. Bump MAJOR — 1.x.y → 2.0.0.

Release Notes

Release notes are the primary communication artifact for every release. They must be clear enough for any consumer — developer, operator, or product stakeholder — to understand what changed, what might break, and what they need to do.

Change Classification

Every change in a release falls into one of three tiers. Group and label changes by tier in the release notes:

TierLabelWhat it coversReader action
Breaking⚠ BREAKINGRemoved APIs, changed behavior, renamed fields, dropped supportMust update code or config before upgrading
FunctionalFeatures & FixesNew features, bug fixes, behavior changes that are backward-compatibleReview and adopt at their discretion
Non-FunctionalInternalRefactors, dependency updates, performance, docs, CI, test changesNo action required — informational only

Release Notes Template

# v2.0.0 — 2026-03-20

## ⚠ Breaking Changes

Changes that require action from consumers before upgrading.

- **Auth: API key authentication removed** — All endpoints now require OAuth2
  Bearer tokens. API keys are no longer accepted. See [Migration Guide](./docs/migrate-v2.md).
- **Config: `DATABASE_URL` renamed to `APP_DATABASE_URL`** — Update environment
  variables in all deployment environments.

### Migration Guide

Step-by-step instructions for upgrading from v1.x:

1. Replace `X-API-Key` header with `Authorization: Bearer <token>` in all clients.
2. Rename `DATABASE_URL` → `APP_DATABASE_URL` in `.env` and deployment config.
3. Run `python -m myapp.migrate_v2` to update stored data formats.

## Features & Fixes

Backward-compatible additions and corrections.

### Added
- User search endpoint with fuzzy matching (`GET /api/users/search?q=`) (#142)
- Dashboard export to CSV (#156)

### Fixed
- Token refresh no longer fails silently when the session cookie is expired (#138)
- Chart tooltips render correctly in dark mode (#161)

### Deprecated
- `GET /api/users?name=` query parameter — use `/api/users/search?q=` instead.
  Will be removed in v3.0.0.

## Internal

Changes with no user-facing impact. No action required.

- Upgraded FastAPI 0.109 → 0.115
- Added integration tests for payment webhook handler
- Reduced Docker image size from 340MB → 120MB via multi-stage build
- Migrated CI from GitHub Actions to Harness Drone

Deriving Release Notes from Conventional Commits

When using conventional commits (see git-workflow skill), map commit types to release note tiers:

Commit typeRelease note tierSection
featFunctionalAdded
fixFunctionalFixed
BREAKING CHANGE footer or ! suffixBreaking⚠ Breaking Changes
deprecated in bodyFunctionalDeprecated
perfNon-Functional (or Functional if user-visible)Internal or Changed
refactor, build, ci, test, choreNon-FunctionalInternal
docsNon-Functional (or Functional if user-facing docs)Internal

Writing Rules

  • Write from the consumer's perspective — describe what changed for them, not what code changed.
  • Breaking changes always come first — they demand immediate attention.
  • Every breaking change must include a migration path — what to do, not just what broke.
  • Deprecations must state when removal will happen (version or date).
  • Link to issues or PRs for traceability: (#142).
  • Keep entries to one line unless a migration guide is needed.
  • Use imperative mood, present tense: "Add user search" not "Added user search endpoint".

Quality Gate

Before publishing release notes, verify:

CheckQuestion
CompleteDoes every merged PR appear in a tier?
CategorizedIs each change in the correct tier (breaking / functional / non-functional)?
ActionableDoes every breaking change have a migration path?
TraceableDoes every entry link to an issue or PR?
Consumer-readableWould someone outside the team understand each entry?

Changelog

Maintain a CHANGELOG.md following the Keep a Changelog format (see git-workflow skill for full template). The changelog is the cumulative history of all release notes.

Changelog Rules

  • Group by release version with a date: ## [1.5.0] - 2026-03-20.
  • Keep an [Unreleased] section at the top for in-progress changes.
  • Use the same three-tier classification (Breaking / Functional / Non-Functional) as release notes.
  • Never edit entries for past releases — corrections go in a new release.

Release Checklist

Run through before every release:

StepCheck
Tests passAll tests green on the release commit (see testing skill)
Lint cleanNo lint or format violations
Version bumpedVersion source file updated to the new version
Changelog updated[Unreleased] entries moved under the new version heading
No secretsNo credentials, keys, or tokens in the release
Dependencies auditedpip audit / npm audit clean (see security skill)
Breaking changes documentedMigration guide written if MAJOR bump
Tag createdAnnotated tag matches the version: v1.5.0
CI green on tagRelease pipeline triggered and completed successfully

CI/CD Integration

Tag-Triggered Release Pipeline

Configure CI to build and publish only when a semver tag is pushed (see cicd skill for full pipeline patterns):

---
kind: pipeline
name: release
trigger:
  event: [tag]
  ref: ["refs/tags/v*"]

steps:
  - name: validate-tag
    image: alpine:3.19
    commands:
      - |
        TAG="${DRONE_TAG}"
        if ! echo "$TAG" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$'; then
          echo "ERROR: Tag '$TAG' does not match semver format (vMAJOR.MINOR.PATCH)"
          exit 1
        fi
        echo "Valid semver tag: $TAG"

  - name: test
    image: python:3.12-slim
    commands:
      - pip install pytest
      - pytest -v --tb=short
    depends_on: [validate-tag]

  - name: build-and-publish
    image: plugins/docker
    settings:
      repo: ${DRONE_REPO_OWNER}/my-service
      tags:
        - latest
        - ${DRONE_TAG}
        - ${DRONE_TAG##v}
      username:
        from_secret: docker_username
      password:
        from_secret: docker_password
    depends_on: [test]

Semver-Aware Docker Tags

Tag images with both the v-prefixed tag and the bare version:

Git tagDocker tags
v1.5.0latest, v1.5.0, 1.5.0
v2.0.0-beta.1v2.0.0-beta.1, 2.0.0-beta.1 (not latest)

Never tag pre-releases as latest — only stable releases.

Automated Version Bumping

For projects that derive version from git tags at build time:

# Get the latest version from git tags
VERSION=$(git describe --tags --abbrev=0 | sed 's/^v//')
echo "Building version: $VERSION"

For projects with a version file, use CI to validate that the tag matches the file:

FILE_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
TAG_VERSION="${DRONE_TAG#v}"
if [ "$FILE_VERSION" != "$TAG_VERSION" ]; then
  echo "ERROR: pyproject.toml version ($FILE_VERSION) != tag ($TAG_VERSION)"
  exit 1
fi

Release Cadence

ModelWhen to useTrade-offs
Release when readyMost projects, especially small teamsSimple, flexible, no artificial deadlines
Scheduled releasesProducts with external consumers or SLAsPredictable for consumers, may delay features
Continuous deliveryMature CI/CD, high test confidenceFastest feedback, requires strong automation

For most projects, release when ready is the right default. Ship when the feature set is coherent and tests pass.


Anti-Patterns

Anti-patternWhy it's badDo this instead
Bumping MAJOR for every changeConsumers can't trust version stabilityReserve MAJOR for actual breaking changes
Skipping versions (1.0.0 → 1.5.0)Confusing, implies missing releasesIncrement sequentially
Tagging without tests passingBroken releases erode trustCI must validate before publish
Manual changelog from memoryIncomplete, error-proneDerive from conventional commits
Version in multiple filesDrift between sourcesSingle source of truth + build-time injection
Deleting and re-creating tagsBreaks downstream caches and referencesBad release → new PATCH release
No changelogConsumers can't assess upgrade riskMaintain CHANGELOG.md for every release
v0.x.y foreverSignals instability, discourages adoptionPromote to 1.0.0 when API is stable

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.