Draft a release changelog
Overview
Turn the commits since the last release tag into a docs/CHANGELOG.md entry:
concise user-facing bullets, contributors credited, in the house style.
Core principle: always draft first and show the user — apply to
docs/CHANGELOG.md only after they accept. The user asked for a draft to
review, not an automatic edit.
Workflow
Get the target version from the request (e.g. 0.42.0) and find the range:
git tag --sort=-v:refname # newest tag first
- Target is not yet a tag (drafting an unreleased version, the usual case) → range is
<newest-tag>..HEAD.
- Target is an existing tag → range is
<tag-immediately-before-it>..<target-tag>.
List commits with authors + emails (email carries the GitHub handle):
git log <range> --format='%h|%an|%ae|%s'
For a commit whose body matters (root cause, what actually changed), read it:
git show -s --format='%s%n%b' <hash>
Derive contributor handles from the author email:
NNN+handle@users.noreply.github.com → @handle (e.g. 175231748+linkmodo@... → @linkmodo).
- Other emails: reuse the handle that person already got in earlier
docs/CHANGELOG.md entries (git log/grep the file); ask the user if unknown.
- Known map: Paul Glover=@paulglover, jboneng=@jboneng, Robin/light-sntchr=@light-sntchr, Henning Ullrich=@hullrich.
marcinz606 is the owner — never credit them.
Drop housekeeping commits — no changelog line for: README/badge edits, changelog typo fixes, merge/revert/"rogue file" cleanups, pure internal log-noise fixes, version bumps.
One bullet per feature, never one per commit. A feature built over
several commits — the feature, then its fixes, follow-ups and polish — gets a
single bullet describing the shipped state. Fold anything the user should
know into that bullet and write no extra Fix: or Change: line: a bug that
never reached a build is not news. Group the range's commits by feature
first, then write. Check every candidate bullet against the range's other
bullets and the entries already in the section, not only the new commits.
The same holds for a fix to an existing panel or control touched more than
once in the range: one bullet naming the end state, not a line per commit.
Check what's already documented — the top ## section may already hold a few entries. Merge into it; don't duplicate.
Write one bullet per feature in the house style (below), grouped New → Change → Fix.
Show the draft in the reply. On approval, insert into docs/CHANGELOG.md under the target ## X.X.X heading (create it if absent), merged with any entries already there.
Set VERSION to the requested version — the repo-root VERSION file holds
the bare number (0.56.0, no v, trailing newline). Write it in the same
change as the accepted changelog entry.
House style
(Established preference — see the user's changelog-style memory.)
- One entry per feature, not per commit — the shipped state, with its in-cycle fixes folded in.
- One line per entry, no explanatory paragraphs:
Prefix: **bold lead** — terse clause naming what was done. Skip the failure-mode/root-cause narrative even on fixes. The long multi-sentence bullets in old sections are not the target.
- Prefix each with
New: / Change: / Fix: (use Change/Fix: if genuinely both). Group in that order.
- No PR/issue numbers (
(#604)) — user-facing notes, not a dev index.
- US "color" in prose, matching the UI labels (Color Negative, colour spellings were swept out in 0.50.0).
- Plain, factual, non-salesy — it's an open-source project. No marketing framing, no dunking on other tools.
- Credit code/idea contributors with a trailing
@handle; never credit whoever merely requested or reported it.
Example (0.41.0, accepted)
- New: **Manage Database…** — dialog to inspect and clear stored data; Clear Saved Edits or Reset Everything, both guarded. @linkmodo
- Change: **Bottom toolbar streamlined** — zoom slider removed, GPU/CPU toggle moved to the overflow menu, tooltips on every item; Before/After and Peak Flat are now mutually exclusive and survive rotate/flip. @linkmodo
- Fix: **Saved export destination restored on reopen** — the Folder mode no longer resets to "Subfolder of source". @paulglover
Gotcha
git log/git show output is piped through the RTK hook, which truncates
long output and garbles it. If a log looks cut off, rerun with rtk proxy git …
to bypass the filter, or dump to a file and open it with the Read tool (Read is
unhooked). Trust exit codes over rendered text.
1---2name: changelog3description: Use when asked to write, draft, or update the changelog for a NegPy release — e.g. "changelog for 0.42.0", "draft release notes since the last tag", "what changed since 0.41.0". Pulls every commit since the previous git tag, summarizes them into concise user-facing bullets, credits outside contributors by @handle, and drafts the entry into docs/CHANGELOG.md for approval. Keywords: changelog, release notes, CHANGELOG.md, version bump, since tag, PRs, contributors.4---56# Draft a release changelog78## Overview910Turn the commits since the last release tag into a `docs/CHANGELOG.md` entry:11concise user-facing bullets, contributors credited, in the house style.1213**Core principle:** always draft first and show the user — apply to14`docs/CHANGELOG.md` only after they accept. The user asked for a draft to15review, not an automatic edit.1617## Workflow18191. **Get the target version** from the request (e.g. `0.42.0`) and find the range:20 ```bash21 git tag --sort=-v:refname # newest tag first22 ```23 - Target is **not yet a tag** (drafting an unreleased version, the usual case) → range is `<newest-tag>..HEAD`.24 - Target **is** an existing tag → range is `<tag-immediately-before-it>..<target-tag>`.25262. **List commits with authors + emails** (email carries the GitHub handle):27 ```bash28 git log <range> --format='%h|%an|%ae|%s'29 ```30 For a commit whose body matters (root cause, what actually changed), read it:31 ```bash32 git show -s --format='%s%n%b' <hash>33 ```34353. **Derive contributor handles** from the author email:36 - `NNN+handle@users.noreply.github.com` → `@handle` (e.g. `175231748+linkmodo@...` → `@linkmodo`).37 - Other emails: reuse the handle that person already got in earlier `docs/CHANGELOG.md` entries (`git log`/grep the file); ask the user if unknown.38 - Known map: Paul Glover=@paulglover, jboneng=@jboneng, Robin/light-sntchr=@light-sntchr, Henning Ullrich=@hullrich.39 - **`marcinz606` is the owner — never credit them.**40414. **Drop housekeeping commits** — no changelog line for: README/badge edits, changelog typo fixes, merge/revert/"rogue file" cleanups, pure internal log-noise fixes, version bumps.42435. **One bullet per feature, never one per commit.** A feature built over44 several commits — the feature, then its fixes, follow-ups and polish — gets a45 single bullet describing the shipped state. Fold anything the user should46 know into that bullet and write no extra `Fix:` or `Change:` line: a bug that47 never reached a build is not news. Group the range's commits by feature48 first, then write. Check every candidate bullet against the range's other49 bullets *and* the entries already in the section, not only the new commits.5051 The same holds for a fix to an existing panel or control touched more than52 once in the range: one bullet naming the end state, not a line per commit.53546. **Check what's already documented** — the top `##` section may already hold a few entries. Merge into it; don't duplicate.55567. **Write one bullet per feature** in the house style (below), grouped New → Change → Fix.57588. **Show the draft in the reply.** On approval, insert into `docs/CHANGELOG.md` under the target `## X.X.X` heading (create it if absent), merged with any entries already there.59609. **Set `VERSION` to the requested version** — the repo-root `VERSION` file holds61 the bare number (`0.56.0`, no `v`, trailing newline). Write it in the same62 change as the accepted changelog entry.6364## House style6566(Established preference — see the user's changelog-style memory.)6768- **One entry per feature**, not per commit — the shipped state, with its in-cycle fixes folded in.69- **One line per entry**, no explanatory paragraphs: `Prefix: **bold lead** — terse clause naming what was done.` Skip the failure-mode/root-cause narrative even on fixes. The long multi-sentence bullets in old sections are **not** the target.70- Prefix each with `New:` / `Change:` / `Fix:` (use `Change/Fix:` if genuinely both). Group in that order.71- **No PR/issue numbers** (`(#604)`) — user-facing notes, not a dev index.72- US **"color"** in prose, matching the UI labels (Color Negative, colour spellings were swept out in 0.50.0).73- Plain, factual, non-salesy — it's an open-source project. No marketing framing, no dunking on other tools.74- Credit code/idea contributors with a trailing `@handle`; **never** credit whoever merely requested or reported it.7576## Example (0.41.0, accepted)7778```markdown79- New: **Manage Database…** — dialog to inspect and clear stored data; Clear Saved Edits or Reset Everything, both guarded. @linkmodo80- Change: **Bottom toolbar streamlined** — zoom slider removed, GPU/CPU toggle moved to the overflow menu, tooltips on every item; Before/After and Peak Flat are now mutually exclusive and survive rotate/flip. @linkmodo81- Fix: **Saved export destination restored on reopen** — the Folder mode no longer resets to "Subfolder of source". @paulglover82```8384## Gotcha8586`git log`/`git show` output is piped through the RTK hook, which **truncates87long output and garbles it**. If a log looks cut off, rerun with `rtk proxy git …`88to bypass the filter, or dump to a file and open it with the Read tool (Read is89unhooked). Trust exit codes over rendered text.