changelog · git:20260502.5f45259 · 2026-05-02 · sha256 48c7d4d776b11fd0

changelog git:20260502.5f45259A

Immutable. This exact content is served forever at /api/v1/blob/48c7d4d776b11fd0.

---
name: changelog
description: |-
  Use when writing, updating, or generating a CHANGELOG.md — for a new release, an unreleased section update, or drafting from git history or diff. Triggers: "update the changelog", "write release notes", "what changed since X", "generate changelog for v1.2.0", "add this to the changelog", "draft unreleased section". Not for commit messages (use commit-message skill) or internal deployment runbooks.
---

# Changelog

Draft or update a `CHANGELOG.md` following Keep a Changelog conventions.

## Invocation Notice

Inform the user when this skill is being invoked by name: `changelog`.

## When to Use

- Writing or updating `CHANGELOG.md` for an upcoming or recent release
- Drafting or appending to an `[Unreleased]` section from recent merged work
- Generating a changelog from git history, a commit range, or a diff
- Editing or cleaning up an auto-generated changelog draft

## When Not to Use

- Writing a git commit message — use `commit-message` skill
- Writing internal release notes or deployment runbooks (audience is operators, not users)
- Full code review — use `code-review` skill

## Workflow

### 1. Determine scope

Infer target version, release date, and commit range from context.
Ask only if neither the version nor the range can be determined.

- Default range: `git log <previous-tag>..HEAD --oneline --no-merges`
- If no prior tag exists: `git log --oneline --no-merges`
- If updating `[Unreleased]` only: use commits since last tagged release

Check for an existing `[Unreleased]` section in `CHANGELOG.md` — do not duplicate entries already there.

### 2. Collect commits

```bash
git log <range> --oneline --no-merges
```

Also read the existing `CHANGELOG.md` to understand document structure and last version.

### 3. Filter noise

Exclude commits with no user-visible effect.
Retain only what matters to users.
See `references/entry-guidelines.md` for the full include/exclude list.

**Quick exclusion rule:** if a user reading the changelog would not care, cut it.

### 4. Categorize

Map surviving entries to Keep a Changelog categories (in display order):

| Category             | When to use                                                    |
| -------------------- | -------------------------------------------------------------- |
| **Breaking Changes** | Any change requiring user action — config, API, CLI, behavior  |
| **Added**            | New features, commands, endpoints, options                     |
| **Changed**          | Modified behavior, performance improvements, visible refactors |
| **Deprecated**       | Things that still work but will be removed                     |
| **Removed**          | Deleted features, commands, options                            |
| **Fixed**            | Bug fixes                                                      |
| **Security**         | Vulnerability patches                                          |

Breaking changes get their own subsection at the top of the version block.
See `references/entry-guidelines.md` for the Conventional Commits → category mapping.

### 5. Write entries

- One entry per **logical user-visible outcome** — consolidate multi-commit features into one line
- Imperative present tense: `Add X`, `Fix Y`, `Remove Z`
- For breaking changes: state what broke AND the migration path (e.g., `Remove X — replace with Y; see docs/migration.md`)
- One reference link per entry; prefer PR over commit hash over issue number
- Do not include implementation details, commit hashes in entry text, or "WIP" notes

### 6. Insert into CHANGELOG.md

See `references/changelog-format.md` for the exact block structure and version comparison link format.

**New release (no `[Unreleased]` section):** insert `## [x.y.z] - YYYY-MM-DD` block at the top of the file.

**New release (existing `[Unreleased]` section):**

- If `[Unreleased]` IS the release being cut: replace `## [Unreleased]` with `## [x.y.z] - YYYY-MM-DD`; add a fresh empty `## [Unreleased]` above it.
- If `[Unreleased]` contains unrelated upcoming work: insert the new versioned block between `[Unreleased]` and the previous version.

**Updating `[Unreleased]` only:** append entries under the matching category subsection; create the subsection if absent.

Add or update the version comparison link at the bottom of the file.

### 7. Verify before delivering

- [ ] Version bump is semantically correct: breaking → major, new feature → minor, fix → patch
- [ ] No CI/CD, formatting, test-only, or dev-tooling entries present
- [ ] Breaking changes include a migration path
- [ ] Date is ISO 8601 (`YYYY-MM-DD`)
- [ ] No duplicate entries from the existing `[Unreleased]` section

## Output

An updated `CHANGELOG.md` with the new version block inserted (or `[Unreleased]` section updated), ready for user review before commit.

## References

- `references/entry-guidelines.md` — include/exclude heuristics and Conventional Commits mapping
- `references/changelog-format.md` — full Keep a Changelog format rules and examples