changelog-writing
Write and maintain clean, human-readable CHANGELOG.md files adhering to the Keep a Changelog convention. Use when documenting releases, updating the Unreleased section from commit logs or PRs, prepari
Files1
View on GitHubSKILL.mdskills/changelog-writing/SKILL.md
GitHubChangelog Writing
A changelog is a curated, chronologically ordered file that documents notable changes for each version of a project. Unlike a raw git commit log, a changelog is written for human consumers to quickly understand what has changed, why it matters, and how to upgrade.
Follow the Keep a Changelog 1.1.0 standard and align with Semantic Versioning.
Core Principles
- Write for users, not git: Describe observable effects and user benefits, not internal refactoring minutiae.
- Curate and group: Never dump git commit logs verbatim. Group related changes under standard categories.
- Always keep an
[Unreleased]section: Track ongoing changes at the top of the changelog before a version is tagged. - Dates follow ISO 8601: Write dates as
YYYY-MM-DD(e.g.,2026-10-15). - Highlight breaking changes: Document breaking changes prominently with migration guidance.
- Link versions and PRs: Include comparative diff links at the bottom of the changelog.
1. Standard Section Types
Group changes under these standard subheadings (in order):
### Added— New features and capabilities.### Changed— Changes in existing functionality.### Deprecated— Features that will be removed in upcoming releases.### Removed— Features that have now been removed.### Fixed— Bug fixes.### Security— Vulnerability fixes and security enhancements (include CVE IDs when available).
Omit subheadings that have no entries in that release.
2. Canonical Changelog Format
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- Interactive search filters for skill tags (#142).
### Fixed
- Prevent crash when parsing empty YAML frontmatter (#145).
## [1.2.0] - 2026-10-10
### Added
- Multi-threading support for batch file validation (#120).
- Support for custom configuration via `~/.config/app/config.toml` (#124).
### Changed
- Standardized error codes returned by the CLI exit handler (#128).
### Deprecated
- The `--legacy-mode` flag is deprecated and will be removed in v2.0.0. Use `--compat=v1` instead (#130).
### Fixed
- Memory leak in background worker during long-running socket connections (#133).
### Security
- Upgraded `urllib3` to address CVE-2026-XXXXX (#135).
[Unreleased]: https://github.com/org/repo/compare/v1.2.0...HEAD
[1.2.0]: https://github.com/org/repo/compare/v1.1.0...v1.2.0
3. Workflow: Updating the Changelog
Step 1: Gather Recent Changes
Inspect git log since the last release tag:
# Find latest release tag
git describe --tags --abbrev=0
# List commits since the tag
git log v1.2.0..HEAD --oneline --no-merges
Step 2: Categorize and Rephrase
Translate internal commits into consumer-oriented entries:
| Raw Commit | Categorized & Rephrased Entry |
|---|---|
feat(auth): add pkce to oauth flow |
### Added<br>- PKCE support for OAuth authentication flows to enhance mobile security (#102). |
fix: handle None in user profile avatar url |
### Fixed<br>- Avoid AttributeError when loading user profiles with no avatar set (#108). |
refactor: optimize db query in get_stats |
Omit if purely internal with no measurable user effect, or note in ### Changed if performance is noticeably improved. |
Step 3: Preparing a Release
When cutting version 1.3.0:
- Rename
## [Unreleased]to## [1.3.0] - YYYY-MM-DD. - Add a fresh, empty
## [Unreleased]section above it. - Update the compare links at the bottom of the file.
4. Common Mistakes and Anti-Patterns
| Anti-Pattern | Why It Fails | Correction |
|---|---|---|
Direct commit log dumps (fix typo in docs, wip, update deps) |
Noise that hides meaningful changes from users | Synthesize multiple commits into one clear entry |
Missing dates or regional date formats (10/12/26) |
Ambiguous (Oct 12 vs Dec 10) | Always use ISO format: YYYY-MM-DD |
| Omitting migration notes on breaking changes | Users upgrade and their software fails with no guidance | Include a Migration Guide paragraph or explicit before/after snippet |
| Modifying released version history retroactively | Violates historical record | Only update [Unreleased] for ongoing development |
5. Verification Checklist
- Every entry is assigned to one of the 6 standard categories (
Added,Changed,Deprecated,Removed,Fixed,Security). - Version headings follow
## [X.Y.Z] - YYYY-MM-DD. - An
## [Unreleased]section exists at the top. - All PR / Issue links and markdown reference links at the bottom are valid.
- Breaking changes and deprecation warnings are clearly stated with migration guidance.