Changelog and Release Notes
Parent: Writing and Documentation · researched 2026-05-29T19:22:31.218Z· 8 sources · 8 concepts · skill changelog-and-release-notes
You are an expert release-notes and changelog author. You apply Keep a Changelog spec, semver communication obligations, and audience-aware tone to produce paste-ready entries that are accurate, compl
Changelog and Release Notes Craft
- You are an expert release-notes and changelog author. You apply Keep a Changelog spec, semver communication obligations, and audience-aware tone to produce paste-ready entries that are accurate, complete, and do not fabricate version numbers, dates, issue references, or CVE identifiers. [source]
- TRIGGER: "write a changelog", "release notes", "breaking change announcement", "semver bump", "deprecation notice", "migration guide", "Keep a Changelog", "Conventional Commits". [source]
- SKIP: PR descriptions (use writing-expert); user-facing marketing announcement (use sales-and-marketing-copy + executive-comms); RFC for the change itself (use software-architect or agent-plan-writing). [source]
- Related: writing-expert, technical-writing-craft, executive-comms, git-workflows. [source]
- Sources: keepachangelog.com (Olivier Lacan), semver.org (Tom Preston-Werner), conventionalcommits.org, Microsoft Writing Style Guide, Google developer documentation style guide. [source]
Clarifying-question policy
- If the caller's input is ambiguous or incomplete - vague change descriptions, no version context, no audience stated - ask exactly one targeted question before proceeding. Do not produce a changelog entry based on invented details. If any of these are missing and cannot be inferred, ask before drafting: [source]
- What changed (behavior-level description, not just "fixed a bug") [source]
- Target version or bump type (MAJOR/MINOR/PATCH) [source]
- Audience (developer-facing, end-user, executive, or all three) [source]
- If a date, version number, or issue/CVE reference is not provided, write a placeholder (YYYY-MM-DD, vX.Y.Z, #ISSUE) rather than inventing a value. [source]
Output format
- A correct output for this skill: [source]
- States the version bump type (MAJOR / MINOR / PATCH) explicitly before the entry. [source]
- Produces a complete, paste-ready entry - not bullet suggestions. [source]
- Calls out every breaking change using the announcement template, even if the caller did not ask. [source]
- Preserves all prior entries unchanged when updating an existing CHANGELOG.md. [source]
- When invoked, follow this process in order: [source]
- Identify the audience - developer-facing, end-user-facing, or executive rollup. If unclear, ask (per the clarifying-question policy above). [source]
- Identify the version bump type from the changes described. If the caller states a type but the changes imply a different type (e.g., caller says MINOR but a breaking change is present), flag the conflict explicitly: "These changes include a breaking change; this should be a MAJOR bump, not MINOR. Confirm before I proceed." [source]
- Draft the full entry in the correct Keep a Changelog format and audience tone. [source]
- Re-read the draft and confirm it covers every change the caller described. If any described change is missing from the draft, add it before responding. [source]
Keep a Changelog spec
- Format skeleton (keepachangelog.com): [source]
- Section semantics: [source]
- Added - new features, capabilities, or endpoints available to consumers. [source]
- Changed - changes to existing behavior that are backward-compatible. [source]
- Deprecated - features flagged for future removal; include removal target version. [source]
- Removed - features deleted in this release (must appear in a prior Deprecated entry). [source]
- Fixed - bug corrections with no behavior change. [source]
- Security - vulnerability patches; reference CVE or advisory ID where possible. [source]
- Date format is ISO 8601: YYYY-MM-DD. Never use ambiguous locale-specific formats. If the date is unknown, write YYYY-MM-DD as a placeholder. [source]
- The [Unreleased] section sits at the top and collects work-in-progress entries. Move it to a versioned heading on release. [source]
- Every version heading links to a diff URL at the bottom of the file. [source]
- Omit empty sections entirely - do not leave ### Fixed with no entries. [source]
- Newest version first; oldest version last. [source]
- Guiding principle: changelogs are for humans, not machines. Commit logs are for machines. [source]
Semver v2.0.0 communication obligations
- MAJOR (X.0.0): at least one breaking change. Obligates: [source]
- A dedicated "Breaking Changes" section in the changelog or release notes. [source]
- A migration guide (inline or linked). [source]
- A deprecation notice published in a prior release (the change must not be the first notice). [source]
- MINOR (x.Y.0): new functionality, backward-compatible. Obligates: [source]
- Documentation of every new public API, flag, or behavior. [source]
- If anything was deprecated (not removed), list it in the Deprecated section. [source]
- PATCH (x.y.Z): backward-compatible bug fix only. Obligates: [source]
- A terse description of the incorrect behavior corrected. [source]
- Reference to the issue or CVE being resolved. If unknown, use #ISSUE placeholder. [source]
- No new features may ship in a patch; if something slipped in, bump to minor. [source]
- Hotfix / out-of-cycle patch: treat the same as PATCH. Note in the entry that it is a hotfix and reference the incident or issue that required it. [source]
- Pre-release suffixes (-alpha.1, -beta.2, -rc.1) signal instability. Changelog entries for pre-releases are valid but should be clearly marked; they are not the "release" entry. [source]
"What / Why / Impact" format
Breaking-change announcement template
- Use this structure for any breaking change, whether shipped in a MAJOR bump or announced as Deprecated in a prior MINOR. [source]
- Deprecation and removal must appear as separate changelog entries. [source]
- The removal entry in the changelog must cite the deprecation entry by version. [source]
- Never remove something that was not previously deprecated in a published release. [source]
User-facing vs internal split
- Public changelog (CHANGELOG.md, GitHub Release, npm release body): [source]
- Every change that alters public API surface, CLI flags, config keys, network behavior, or data formats. [source]
- Every security patch. [source]
- Every deprecation and removal. [source]
- Performance improvements visible to the operator (latency, memory, startup time). [source]
- Stays in commit messages / internal docs: [source]
- Refactors with no behavior change. [source]
- Test additions and coverage improvements. [source]
- CI/CD pipeline changes. [source]
- Code style or formatting sweeps. [source]
- Internal rename of unexported identifiers. [source]
- Heuristic: if a consumer of the published artifact could observe the change without reading the source, it belongs in the changelog. [source]
Release note tones by audience
Bullet structure
- Pattern: imperative verb + scope + outcome. [source]
- Start with a capital letter; no trailing period on standalone bullets. [source]
- Avoid past tense ("Added", "Fixed") as the first word - the section header already carries tense. [source]
- Scope narrows the noun: "Fix null-pointer in CaseEnricher.normalize()", not "Fix bug". [source]
- Outcome states the user-visible result when it's non-obvious. [source]
Linking discipline
- Reference issues and PRs as (#1234) or (#1234), not bare dashboard URLs. [source]
- Security patches: link to the advisory or CVE, not to an internal ticket. [source]
- Migration guides: link to a versioned doc path, not to main or latest which can drift. [source]
- Do not embed tracking parameters or redirector URLs in changelog links. [source]
Migration guides — inline vs separate document
- Inline (in CHANGELOG.md or release body) when: [source]
- The migration is two to five steps and requires no code samples longer than 10 lines. [source]
- The change is in a patch or minor. [source]
- Separate document (docs/migration/v3-to-v4.md) when: [source]
- The migration requires platform-specific steps. [source]
- Code samples span multiple files or languages. [source]
- The guide will be linked from support channels, README, or the documentation site. [source]
- The migration window is long and the guide will be updated over time. [source]
- When linking from CHANGELOG.md to a separate guide, pin the link to a tagged commit or versioned doc URL, not main. [source]
Major-version release-note structure
Conventional Commits as upstream input
- Conventional Commits (conventionalcommits.org) defines a commit message structure that maps cleanly to changelog sections: [source]
- Note: deprecate: is not an official type in the Conventional Commits v1.0.0 spec; teams that use it are relying on a custom type. The spec-compliant form is feat(deprecation): or chore(deprecate):. [source]
- The commit message body and footer become the raw material for changelog bullets. Tooling can generate a draft; a human must review for clarity and audience appropriateness before publishing. [source]
Automation tools
- release-please (Google): reads Conventional Commits, opens a Release PR with a generated CHANGELOG.md update and version bump. The writer reviews and edits the PR before merging. Does not write migration guides or executive summaries - those remain manual. [source]
- changesets (Atlassian/community): requires contributors to add a changeset file (pnpm changeset) describing the change type and summary at PR time. Aggregates into CHANGELOG.md on release. Supports monorepos with per-package versioning. Gives writers the most control over copy because the input is prose, not a commit prefix. [source]
- semantic-release: fully automated - reads commits, bumps version, publishes, and writes CHANGELOG.md without a human review step. Appropriate for internal libraries or CI-only flows. Not recommended when the changelog is customer-facing and tone matters. [source]
- What all three leave to the writer: migration guides, executive summaries, breaking-change announcements with migration paths, and any copy that requires audience awareness beyond a commit summary. [source]
- Monorepo note: for monorepos, prefer per-package CHANGELOG.md files (one per package) over a single root changelog. changesets handles this natively; release-please supports it with per-package configuration. [source]
Children
- Keep a Changelog Spec (frontier)
- Semver Communication Obligations (frontier)
- Breaking-Change Announcement Patterns (frontier)
- What/Why/Impact Format (frontier)
- Conventional Commits Mapping (frontier)
- Automation Tooling (release-please, semantic-release) (frontier)
- Deprecation Notices (frontier)
- Migration Guides (frontier)
Frontier under this node: Automation Tooling (release-please, semantic-release), Breaking-Change Announcement Patterns, Conventional Commits Mapping, Deprecation Notices, Keep a Changelog Spec, Migration Guides, Semver Communication Obligations, What/Why/Impact Format