Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Creates or updates CHANGELOG.md following the Keep a Changelog 1.1.0 format. Use this skill when the user asks to "update the changelog", "generate changelog", "add changelog entry", "create CHANGELOG.md", "sync changelog with tags", or wants to document project changes based on git tags and commit history.
.claude/skills/fradser-update-changelog/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 131% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 107% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 182% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-04 | ✓→✗ | ▼ Worse | 149% | 0% |
Create or update CHANGELOG.md following the Keep a Changelog 1.1.0 format, using git tags as version boundaries.
[Unreleased] section MUST always be present, even if empty.YYYY-MM-DD).See references/keepachangelog-format.md for the full format specification.
Run these commands to understand the project's release history:
bashgit tag --sort=-v:refname git log --oneline --decorate git remote get-url origin
Collect:
v1.0.0 and 1.0.0 prefixes are valid -- detect which convention the project uses and stay consistent.If no tags exist, inform the user and generate only an [Unreleased] section from the full commit history.
Look for CHANGELOG.md (case-insensitive) in the project root.
For each pair of adjacent tags (newest to oldest), extract commits with their full messages:
bashgit log --format="%h %s%n%b" <older-tag>..<newer-tag>
For the oldest tag:
bashgit log --format="%h %s%n%b" <oldest-tag>
For unreleased changes (commits after the latest tag):
bashgit log --format="%h %s%n%b" <latest-tag>..HEAD
Get the tag date for each version:
bashgit log -1 --format=%ai <tag>
Do NOT copy commit messages verbatim. Changelogs are for humans -- readers who care about what changed and why, not how the code was modified.
Analyze the full commit messages gathered in step 3 (subject lines and bodies) to understand the intent and impact of each change. Group related commits into logical changes. Multiple commits that together implement one feature become a single entry. A refactor that splits one file into three is one change, not three.
Classify each logical change into exactly one category (in this order of precedence):
| Category | What belongs here | |----------|-------------------| | Added | New capabilities users can now do | | Changed | Existing behavior that now works differently | | Deprecated | Capabilities that will be removed in a future version | | Removed | Capabilities that no longer exist | | Fixed | Broken behavior that now works correctly | | Security | Vulnerabilities that have been addressed |
Omit changes with no user-facing impact (internal refactors, CI tweaks, test additions, doc typo fixes) unless they substantially affect the development experience for contributors.
Write each entry as a clear, meaningful description:
- .Bad (git log copy-paste):
- Update auth middleware
- Fix bug in login
- Refactor token validationGood (meaningful for readers):
- Session tokens now refresh automatically 5 minutes before expiry, eliminating unexpected logouts during long sessions
- Fix login failing silently when the email contains uppercase charactersFollow this exact structure. See references/keepachangelog-format.md for the full format specification.
markdown# 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] ## [x.y.z] - YYYY-MM-DD ### Added - Entry ### Fixed - Entry [Unreleased]: https://github.com/owner/repo/compare/vx.y.z...HEAD [x.y.z]: https://github.com/owner/repo/compare/vPREV...vx.y.z
Rules:
YYYY-MM-DD).[Unreleased] section is always present, even if empty.Write CHANGELOG.md to the project root. After writing, briefly confirm what was generated (number of versions, notable entries).
When CHANGELOG.md already exists:
[Unreleased] section with commits after the latest tag.references/keepachangelog-format.md -- Full format specification, diff link patterns, and category ordering| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 8,348 | 8,362 | +0% | 1 | 1 | 0% | 451 | 1,664 | +269% | 0 | 0 | — |
case-02 | fail→fail | 5,738 | 4,600 | -20% | 1 | 1 | 0% | 201 | 1,663 | +727% | 0 | 0 | — |
case-03 | fail→fail | 2,569 | 5,314 | +107% | 1 | 1 | 0% | 305 | 1,725 | +466% | 0 | 0 | — |
case-04 | pass→fail | 8,985 | 12,024 | +34% | 1 | 1 | 0% | 1,389 | 3,458 | +149% | 0 | 0 | — |
case-05 | pass→fail | 5,863 | 5,427 | -7% | 1 | 1 | 0% | 999 | 1,738 | +74% | 0 | 0 | — |
case-06 | pass→pass | 14,594 | 15,717 | +8% | 1 | 1 | 0% | 2,244 | 4,050 | +80% | 0 | 0 | — |
case-07 | fail→pass | 5,951 | 5,842 | -2% | 1 | 1 | 0% | 1,002 | 2,319 | +131% | 0 | 0 | — |
case-08 | fail→fail | 9,089 | 5,097 | -44% | 1 | 1 | 0% | 1,573 | 1,705 | +8% | 0 | 0 | — |
case-09 | pass→pass | 4,001 | 3,499 | -13% | 1 | 1 | 0% | 761 | 2,140 | +181% | 0 | 0 | — |
case-10 | pass→pass | 9,026 | 4,626 | -49% | 1 | 1 | 0% | 1,573 | 2,308 | +47% | 0 | 0 | — |
case-11 | fail→pass | 6,993 | 3,133 | -55% | 1 | 1 | 0% | 968 | 2,002 | +107% | 0 | 0 | — |
case-12 | pass→fail | 6,074 | 1,907 | -69% | 1 | 1 | 0% | 1,190 | 1,715 | +44% | 0 | 0 | — |
case-13 | fail→pass | 11,879 | 3,991 | -66% | 1 | 1 | 0% | 738 | 2,080 | +182% | 0 | 0 | — |
case-14 | pass→pass | 5,421 | 3,107 | -43% | 1 | 1 | 0% | 815 | 1,991 | +144% | 0 | 0 | — |
case-15 | pass→pass | 10,710 | 5,174 | -52% | 1 | 1 | 0% | 1,800 | 2,351 | +31% | 0 | 0 | — |
case-16 | fail→fail | 14,861 | 9,389 | -37% | 1 | 1 | 0% | 2,327 | 3,284 | +41% | 0 | 0 | — |
case-17 | pass→pass | 7,871 | 5,687 | -28% | 1 | 1 | 0% | 1,315 | 2,428 | +85% | 0 | 0 | — |
case-18 | pass→pass | 7,132 | 4,365 | -39% | 1 | 1 | 0% | 1,302 | 2,117 | +63% | 0 | 0 | — |
case-19 | fail→pass | 8,407 | 2,450 | -71% | 1 | 1 | 0% | 1,414 | 1,964 | +39% | 0 | 0 | — |
case-20 | pass→pass | 8,848 | 3,640 | -59% | 1 | 1 | 0% | 1,236 | 1,853 | +50% | 0 | 0 | — |
case-21 | pass→pass | 4,042 | 3,751 | -7% | 1 | 1 | 0% | 800 | 2,105 | +163% | 0 | 0 | — |
case-22 | pass→fail | 8,258 | 12,022 | +46% | 1 | 1 | 0% | 1,720 | 4,020 | +134% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 16 counted toward the lift figure. The other 6 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of 0 percentage points is the difference between those two pass rates over the 16 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.