chore(release): human-readable release notes (github-native changelog)#57
Merged
Conversation
GoReleaser's default changelog dumped raw `<full-sha> <subject>` lines and its `^chore:`-style filters missed scoped conventional commits (so the `chore(release):` bump leaked into the notes). Switch to GitHub's native release-note generator: - .goreleaser.yaml: changelog.use github-native — notes become the familiar "What's Changed" list of PR titles + authors + a Full Changelog compare link. - .github/release.yml: drives grouping/exclusion for both GoReleaser and the releases/generate-notes API. Groups by PR label (enhancement→Features, bug→Bug Fixes, documentation→Docs, * → Other), excludes skip-changelog + bot authors so release-bump PRs no longer show up. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Keeps github-native release notes grouping with zero per-PR effort: labels
each PR from its title prefix (feat→enhancement, fix→bug, docs→documentation,
chore(release)→skip-changelog). Other prefixes stay unlabelled → "Other
Changes". GitHub-side only (labels, no CI) — does not touch Semaphore.
Title is read via the github-script `context` object (runtime JS value, not
`${{ }}`-interpolated into a shell) and the label is chosen from a fixed map,
so the untrusted title is never executed or reflected into the label.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Two pre-existing CI flakes that block reruns/releases: - Lint installs golangci-lint via `install.sh` with no version, so every run calls the GitHub "latest release" API — which intermittently 504s and fails the job. Pin v2.12.2 (the version it was resolving to) to skip that lookup. - Coverage does `artifact push workflow coverage.out` without --force, so any rebuild of the workflow fails: the artifact already exists. Add --force to make reruns idempotent. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
dexyk
approved these changes
Jun 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Release notes were a raw SHA dump (
<full-sha> <subject>), and the^chore:-style GoReleaser filters missed scoped conventional commits — so thechore(release):bump PR leaked into the v0.1.23 notes.This makes release notes human-readable and keeps them that way with zero per-PR effort.
.goreleaser.yaml— github-native noteschangelog.use: github-native. Notes become the familiar "What's Changed" list of PR titles + author handles + a Full Changelog compare link, generated by GitHub..github/release.yml— grouping & exclusionDrives the notes (used both by GoReleaser and the
generate-notesAPI). Groups by PR label:enhancement→ 🚀 Featuresbug→ 🐛 Bug Fixesdocumentation→ 📚 Documentation*→ Other Changesskip-changelog+ bot authors (release-bump PRs vanish)..github/workflows/pr-autolabel.yml— keep it zero-touchTiny GitHub Action that labels each PR from its conventional-commit title (
feat→enhancement,fix→bug,docs→documentation,chore(release)→skip-changelog). Labels only — no CI, doesn't touch Semaphore. The title is read via thegithub-scriptcontextobject (runtime value, not${{ }}-interpolated into a shell) and the label comes from a fixed map, so the untrusted title is never executed.Follow-up (after merge, no code)
Backfill the notes for the last 3 releases (v0.1.21–v0.1.23) via the
generate-notesAPI — it reads.github/release.ymlfrom the default branch, which is why this PR lands first. Historical PRs in that range get labelled per the same mapping so the backfilled notes group correctly.🤖 Generated with Claude Code
Also (rode along — was blocking this PR's own CI)
Two pre-existing CI flakes surfaced while getting this PR green, fixed in the last commit:
golangci-lintinstall hit GitHub's latest-release API and 504'd → pinnedv2.12.2to skip that lookup.artifact push ... coverage.outlacked--force, so any workflow rerun failed (artifact already exists) → added--force.These block reruns/releases generally, not just this PR.