You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(release): emit release notes as short bullets, not prose
Release notes were reviewed as too much text in too blocky a form, with a top
paragraph reading like marketing. Two generators write docs/releases/<tag>.mdx
and they disagreed with each other: the gaia-release skill's "Generation
parameters" told the model GAIA's notes "read dry" and to make them "engaging",
while the release-notes job in claude.yml asked for "comprehensive" notes with
an Overview paragraph and emoji headings. Fixing one alone would have been
undone by the other on the next tag.
Both now share one spec: at most one summary sentence, short bullets grouped by
section, and a word cap on the narrative part (350 patch / 600 minor-major).
The cap deliberately excludes Bug Fixes, Known Issues, Contributors, and the
changelog -- those are reference lists sized by how many fixes actually
shipped, so capping them would hide work rather than tighten writing. Tone
guidance is no longer restated in the skill; it points at CLAUDE.md's How You
Communicate, per that file's own link-here-never-restate rule.
Regenerating the last two releases under the new template cuts the narrative
from 1705 to 538 words (v0.22.0) and 1119 to 280 (v0.23.0), with every PR link,
contributor credit, and changelog entry preserved. Both samples still pass
util/validate_release_notes.py unmodified.
Closes#2961
Copy file name to clipboardExpand all lines: .claude/skills/gaia-release/SKILL.md
+57-52Lines changed: 57 additions & 52 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -54,7 +54,7 @@ These map to [CLAUDE.md](../../../CLAUDE.md). Re-read them whenever this skill r
54
54
-**Plain language first, in every artifact** — the release notes, PR body, Discord post, and your own between-phase status updates all follow [CLAUDE.md → How You Communicate](../../../CLAUDE.md#how-you-communicate): lead with what a user can now do, layer version numbers, SHAs, and pipeline mechanics underneath. Say each point once — don't restate a highlight in the changelog and again in the announcement.
55
55
-**No Claude attribution anywhere** — not in PR titles, PR bodies, commit messages (no `Co-Authored-By: Claude ...` trailer), release notes, code comments, or the Discord announcement.
56
56
-**No silent fallbacks** — if a validator fails, a step times out, or a workflow run isn't found, stop with an actionable error. Do not retry blindly. Do not "proceed anyway."
57
-
-**Match house style for release notes** — see *Generation parameters* in Phase 1. In short: value-prop first, **local agents are the headline** (not the SDK), one agent/command per highlight, plain language, engaging but factual, and **no emoji, no fluff** (full banned-phrase list under *Generation parameters*). Read the **last 2–3 release notes** before drafting. Patch releases do **not** include a `pip install` block. Use the `Why upgrade:` framing with a short bullet list, then `## What's New`, then `## Bug Fixes`, then `## Full Changelog`.
57
+
-**Release notes are bulleted, plain, and short** — see *Notes format* in Phase 1. Every entry is one bullet, never a prose block; no narrative overview paragraph; no emoji; a hard word budget that is checked, not eyeballed. Sections in order: `## Breaking Changes` (only if any), `## What's New`, `## Bug Fixes`, `## Known Issues` (only if any), `## Contributors`, `## Full Changelog`. Patch releases do **not** include a `pip install` block.
58
58
-**Match the previous release PR body shape exactly** — read the most recent merged `Release vX.Y.Z` PR (e.g. `gh pr list --repo amd/gaia --state merged --search "Release v in:title" --limit 3`). Open with `# GAIA vX.Y.Z Release Notes` (no MDX frontmatter in the PR body), end with a `Release checklist` section. Style drift here costs review cycles.
59
59
-**Bulletproof commits only** — every change made by this skill must satisfy the four criteria in CLAUDE.md (validated, critiqued, scope-clean, no half-finished work) before being committed.
60
60
-**Pushing tags is irreversible.** Always confirm the SHA the tag will point to and the green status of the pre-tag verification run before `git push origin v<version>`.
@@ -91,48 +91,43 @@ These map to [CLAUDE.md](../../../CLAUDE.md). Re-read them whenever this skill r
91
91
92
92
If the requested version doesn't match the rubric, **stop and surface the mismatch**: *"You asked for `v<requested>` (patch). I see N feat commits since `<prev>` including `<one or two examples>` — this looks minor-shaped. Continue as patch, or bump to `v<suggested>`?"* Do not silently proceed.
93
93
94
-
2.**Read the last 2–3 release notes** to match structure and length (not tone — see *Generation parameters*).
2.**Read recent release notes for structure only** — frontmatter shape, section headings, PR-link format. Take **length and tone from *Notes format* below, not from the files**: [v0.21.1](../../../docs/releases/v0.21.1.mdx) is the model at 267 narrative words, while v0.22.0 (1705) and v0.23.0 (1119) were flagged in review as too much text in too-blocky a form — they are the regression this section exists to prevent.
98
95
99
-
Cross-check: same frontmatter shape, same section headings, same *structure* and length per entry — but **not**the prior tone. The last few releases predate the *Generation parameters* below; match their shape, not their dryness. Patch releases are short; minor/major releases include `pip install` and may have a "Highlights" block.
96
+
Patch releases are short. Minor/major releases carry more bullets and a `pip install` block — the per-bullet shape is identical, only the count grows.
100
97
101
98
3.**Create [docs/releases/v<version>.mdx](../../../docs/releases/)** with this skeleton (adapt to whether it's patch / minor / major):
- Bump the navbar label (e.g. `v<previous-version> · Lemonade <previous-lemonade>` → `v<version> · Lemonade <current-lemonade>`). Read [src/gaia/version.py](../../../src/gaia/version.py) for the `LEMONADE_VERSION` constant — it is the source of truth, and the navbar may be drifted from it (Lemonade bumps land outside release PRs).
@@ -249,6 +249,11 @@ These map to [CLAUDE.md](../../../CLAUDE.md). Re-read them whenever this skill r
Both must exit 0. Fix any errors before continuing. If either fails for reasons unrelated to your changes (missing dep, broken import), stop and surface that — do not silently bypass. `validate_release_notes.py` prints the first failing check (missing/renamed section, absent `compare/` link, tag mismatch) — read that line to localise the fix; it has no `--verbose` flag.
254
259
@@ -460,7 +465,7 @@ Show the user the run URL, the **release PR number** (`#$RELEASE_PR`), and the *
460
465
```
461
466
Required artifacts: `.whl`, `.tar.gz`, `.deb`, `.AppImage`, `.dmg`, `.exe`, and the `latest*.yml` files for the Electron auto-updater. If any are missing, the corresponding build job didn't run or didn't upload — investigate.
462
467
463
-
3.**Draft the Discord announcement.** Read the just-shipped release notes (`docs/releases/v<version>.mdx`) to populate the highlight list — one bullet per "What's New" entry plus any Bug Fix worth surfacing, written in the same voice as the notes — apply the same *Generation parameters* (value-prop first, plain, engaging, no fluff/emoji).
468
+
3.**Draft the Discord announcement.** Read the just-shipped release notes (`docs/releases/v<version>.mdx`) to populate the highlight list — reuse the `What's New` bullets near-verbatim plus any Bug Fix worth surfacing. Same *Notes format* rules apply: bullets, plain, factual, no emoji.
464
469
465
470
**The template and format rules live in**
466
471
[`reference/discord-announcement.md`](reference/discord-announcement.md) — read it and
0 commit comments