Skip to content

feat(release): build notes from highlights and the change list together - #393

Merged
AprilNEA merged 3 commits into
masterfrom
ci/scope-highlights-gate
Aug 13, 2026
Merged

feat(release): build notes from highlights and the change list together#393
AprilNEA merged 3 commits into
masterfrom
ci/scope-highlights-gate

Conversation

@AprilNEA

@AprilNEA AprilNEA commented Aug 13, 2026

Copy link
Copy Markdown
Member

Highlights were the only source of release notes, so a release without them had nothing to ship and cargo xtask release notes refused to build. Two consequences, both observed:

The change

The prose and the list answer different questions. Curated Highlights say why to update; Features and Bug Fixes say what changed. So emit both, in that order, and let either be absent.

Live, against the current release branch:

BeforeError: release 1.37.0 has no non-empty ### Highlights section

After

### Features

* **sandboxes:** surface the sandbox template catalog (CORE-107)

And with Highlights written (real 1.36.0), the two appear together:

ArcBox keeps running after you close its window, so a sandbox execution that
finished and a daemon that died were both invisible until you went back and
looked. […]

### Features

* **notifications:** notify on sandbox results and daemon health

What still fails, and why that one is worth keeping

Only a release with neither prose nor user-facing entries. That is a real signal instead of a standing tax: a bare engine bump lands under Miscellaneous, produces no user-facing entry, and genuinely needs a human to say what it means — 1.36.1 was exactly that release.

Two supporting decisions:

  • Section titles reuse ChangelogParser's user-facing set (Features, Bug Fixes, Performance, Security), so the About window and the update dialog cannot disagree about what counts as user-facing.
  • The ([#387](…)) ([abc1234](…)) trailers are stripped. Right for a changelog, noise in an update dialog — and shipping them would reintroduce exactly what fix(updater): embed release notes in appcast instead of linking GitHub #233 removed when it stopped linking GitHub. Judgment call, reversible by deleting strip_trailing_links; say the word if you'd rather keep them.

Second commit: scope the gate

Kept from the earlier version of this PR. Fatal on the release PR and on master, where it guards the tag and says master is unshippable; a warning on every other PR, where failing turned one bad release PR into everyone's outage. github.head_ref is read via env: rather than interpolated, since it is attacker-controllable on forked PRs.

Verification

  • make test-xtask: 15 passed. Five new cases — pairing, fallback with no Highlights, the nothing-user-facing rejection, an absent release, and that link stripping leaves ordinary parenthesised prose alone.
  • Real extractions run against the live changelog for 1.36.0 and 1.37.0, with the old binary run side by side for the before/after above.
  • Gate branching exercised across release PR / master push / normal PR × missing / present.
  • make lint-xtask clean, actionlint clean, zizmor adds no new findings.
  • CONTRIBUTING.md and xtask/README.md both described Highlights as mandatory; updated.

Not addressed

Nothing here stops a release PR merging red — the master ruleset still has no required_status_checks rule at all. That is a settings change; the prepared payload is still waiting.

581a33c added this check to catch a missing `### Highlights` while it was
still an edit, because v1.34.2 through v1.34.4 each cut a tag and a GitHub
release with no DMG behind them. That part works and stays.

What it did not account for is that release-please never writes that
section, so every release PR fails this by construction — and the version
comes from the manifest, so once one merged red, every other PR failed the
same way, at a step ahead of Lint, Build and Test. Nothing reached the
compiler for 22 hours after 1.35.0, and #386 had to smuggle the changelog
fix into a UI PR to verify itself.

Keep it fatal on the release PR and on master, where it guards the tag and
says master is unshippable. Everywhere else report the same finding as a
warning: still visible, no longer everyone's outage. Both paths now spell
out what to add and why.
Copilot AI lite review requested due to automatic review settings August 13, 2026 17:52

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@greptile-apps

greptile-apps Bot commented Aug 13, 2026

Copy link
Copy Markdown

Greptile Summary

The PR builds Sparkle release notes from optional curated Highlights followed by selected user-facing changelog sections, while retaining rejection when both sources are empty.

  • Adds parsing, rendering, trailer removal, and focused release-note tests.
  • Makes the release-note gate fatal on release branches and pushes while warning on other pull requests.
  • Updates contributor and xtask documentation for the new fallback behavior.

Confidence Score: 4/5

The PR does not appear safe to merge until ordinary pull requests distinguish an expected lack of user-facing notes from unexpected release-note generation failures.

The existing catch-all remains: any nonzero release-note command result on an ordinary pull request, including missing releases and filesystem failures, is converted into a successful warning rather than failing CI.

Files Needing Attention: .github/workflows/pr.yml

Important Files Changed

Filename Overview
.github/workflows/pr.yml Scopes the release-note gate by branch and event, but still conflates expected empty-note failures with unrelated command and I/O failures on ordinary pull requests.
xtask/src/commands/release/notes.rs Combines Highlights with user-facing changelog sections, strips generated link trailers, rejects empty output, and adds representative tests.
CONTRIBUTING.md Documents Highlights as optional when user-facing changelog entries provide fallback release notes.
xtask/README.md Updates the release-notes command description to reflect combined extraction and empty-output rejection.

Reviews (3): Last reviewed commit: "Merge branch 'master' into ci/scope-high..." | Re-trigger Greptile

Comment thread .github/workflows/pr.yml
Highlights were the *only* source of release notes, so a release without
them had nothing to ship and `release notes` refused to build — which is
why every release PR failed by construction and why v1.34.2 through
v1.34.4 each cut a tag with no DMG behind it.

The prose and the list answer different questions. Curated Highlights say
why to update; the Features and Bug Fixes entries say what changed. Emit
both, in that order, and let either be absent.

Only a release with neither now fails, which is a real signal rather than
a standing tax: a bare engine bump lands under Miscellaneous and produces
no user-facing entry, so a human still has to say what it means.

Section titles reuse ChangelogParser's user-facing set, so the About
window and the update dialog cannot disagree about what counts. The
`([#387](…)) ([abc1234](…))` trailers are dropped — right for a changelog,
noise in an update dialog.
Copilot AI review requested due to automatic review settings August 13, 2026 18:04
@AprilNEA AprilNEA changed the title ci: fail the highlights gate only where it protects a release feat(release): build notes from highlights and the change list together Aug 13, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copilot AI review requested due to automatic review settings August 13, 2026 18:14

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@AprilNEA
AprilNEA merged commit 49c77ab into master Aug 13, 2026
6 checks passed
@AprilNEA
AprilNEA deleted the ci/scope-highlights-gate branch August 13, 2026 18:25
@linear-code

linear-code Bot commented Aug 13, 2026

Copy link
Copy Markdown

ABXD-158

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants