Release Notes
You write release notes for developers — someone who wants to know what features were built
and how the system behaves now, without reading commits or code. Notes describe behavior, not
implementation.
Step 1 — Locate the file
Look for an existing release notes file (RELEASE_NOTES.md, CHANGELOG.md, or similar) at the
repo root first, then one level down (e.g. a Laravel app in a subfolder).
- Found one → use it. Match its existing version numbering.
- None found → ask the user where to put it, offering the root of the application's git repo,
as
RELEASE_NOTES.md as the default. Do not silently pick a location.
Step 2 — Determine scope
Find what changed since the last release section:
- Last version section in the file → diff/log since the commit that added it.
- No file yet → since the last tag; no tag → ask the user where this release starts.
Commit messages are only a map. For every change you intend to mention, read the code or tests
behind it and describe what the system actually does. Never copy a commit message into a bullet.
A claim you cannot verify in the code does not go in the notes.
Step 3 — Write the section
Structure
- New section at the top:
## X.Y — Since X.(Y-1) — YYYY-MM-DD. Newest first, never rewrite
history below (see Corrections).
- One-line summary directly under the header naming the headline changes, so the reader decides
in two seconds whether to read on.
- Group bullets under bold area labels (module, screen, or subsystem). Keep the same area order
in every version — pipeline/data-flow order if the app has one, otherwise alphabetical.
Bullets
- Every bullet starts with a bold micro-lead, then one sentence what changed, at most one
sentence why. A scanner reading only the bold text should get the whole release.
- Deep rationale, mechanics, or edge cases → fold into the parent bullet as a clause, or one
sub-bullet. Never a paragraph disguised as a bullet.
- No commit hashes. No class or method names. Config keys, env vars, artisan/CLI commands,
and URLs are allowed when the developer needs the knob.
- Name trade-offs outright. If a change accepts a risk or removes a safeguard, say so in the
bullet ("Note the trade: …"). Honest notes are the point.
- Behavioral numbers (limits, defaults, windows, thresholds) go in exactly as configured, with the
setting that controls them.
Example bullet
Long subjects no longer block auto-approve. Nearly every subject exceeds the 50-char limit
by design, so overflow was noise, not a defect. Still shown as a badge; all other review flags
unchanged. Note the trade: a draft whose only fault is a long subject can send unread.
Corrections — never rewrite history silently
If a past section turns out to be wrong:
- Add a one-line "Correction to X.Y:" bullet in the new section stating the true behavior.
- Annotate the old bullet in place with (Corrected in X.Z: …) — keep it short, keep both
directions linked. Never delete or reword the old claim as if it was always right.
Carry-forward checklist
If the file has a "Before shipping" (or similar open-decisions) list, carry every still-open
item into the new section verbatim, noting it is still open. Drop only items actually resolved,
and say what resolved them.
Step 4 — Verify before finishing
Re-read the drafted section once against the code: every number, every default, every claim.
Then show the user the new section and where it was written.
1---2name: release-notes3description: Write or update developer-facing release notes for the current application. Derives what shipped from the actual code changes since the last release section, verifies every claim against the code, and writes scannable versioned notes a developer can read to understand what features were built. Use whenever the user says "release notes", "changelog", "write up this release", "update RELEASE_NOTES", or asks to document what shipped in a version.4---56# Release Notes78You write release notes for **developers** — someone who wants to know what features were built9and how the system behaves now, without reading commits or code. Notes describe **behavior**, not10implementation.1112## Step 1 — Locate the file1314Look for an existing release notes file (`RELEASE_NOTES.md`, `CHANGELOG.md`, or similar) at the15repo root first, then one level down (e.g. a Laravel app in a subfolder).1617- Found one → use it. Match its existing version numbering.18- None found → ask the user where to put it, offering the **root of the application's git repo,19 as `RELEASE_NOTES.md`** as the default. Do not silently pick a location.2021## Step 2 — Determine scope2223Find what changed since the last release section:2425- Last version section in the file → diff/log since the commit that added it.26- No file yet → since the last tag; no tag → ask the user where this release starts.2728Commit messages are only a map. For every change you intend to mention, **read the code or tests29behind it** and describe what the system actually does. Never copy a commit message into a bullet.30A claim you cannot verify in the code does not go in the notes.3132## Step 3 — Write the section3334### Structure3536- New section at the **top**: `## X.Y — Since X.(Y-1) — YYYY-MM-DD`. Newest first, never rewrite37 history below (see Corrections).38- One-line summary directly under the header naming the headline changes, so the reader decides39 in two seconds whether to read on.40- Group bullets under bold area labels (module, screen, or subsystem). Keep the **same area order41 in every version** — pipeline/data-flow order if the app has one, otherwise alphabetical.4243### Bullets4445- Every bullet starts with a **bold micro-lead**, then one sentence *what changed*, at most one46 sentence *why*. A scanner reading only the bold text should get the whole release.47- Deep rationale, mechanics, or edge cases → fold into the parent bullet as a clause, or one48 sub-bullet. Never a paragraph disguised as a bullet.49- **No commit hashes. No class or method names.** Config keys, env vars, artisan/CLI commands,50 and URLs are allowed when the developer needs the knob.51- **Name trade-offs outright.** If a change accepts a risk or removes a safeguard, say so in the52 bullet ("Note the trade: …"). Honest notes are the point.53- Behavioral numbers (limits, defaults, windows, thresholds) go in exactly as configured, with the54 setting that controls them.5556### Example bullet5758> **Long subjects no longer block auto-approve.** Nearly every subject exceeds the 50-char limit59> by design, so overflow was noise, not a defect. Still shown as a badge; all other review flags60> unchanged. Note the trade: a draft whose only fault is a long subject can send unread.6162## Corrections — never rewrite history silently6364If a past section turns out to be wrong:6566- Add a one-line **"Correction to X.Y:"** bullet in the new section stating the true behavior.67- Annotate the old bullet in place with *(Corrected in X.Z: …)* — keep it short, keep both68 directions linked. Never delete or reword the old claim as if it was always right.6970## Carry-forward checklist7172If the file has a **"Before shipping"** (or similar open-decisions) list, carry every still-open73item into the new section verbatim, noting it is still open. Drop only items actually resolved,74and say what resolved them.7576## Step 4 — Verify before finishing7778Re-read the drafted section once against the code: every number, every default, every claim.79Then show the user the new section and where it was written.