Skip to content

ci: require a changelog entry for changes that ship - #85

Merged
joris-sevenlab merged 1 commit into
mainfrom
ci/require-changelog-entry
Oct 15, 2026
Merged

joris-sevenlab merged 1 commit into
mainfrom
ci/require-changelog-entry

Conversation

@joris-sevenlab

Copy link
Copy Markdown
Collaborator

What

A new Changelog entry CI job (scripts/changelog-check.mjs). A PR that changes anything that ships must add at least one new line under ## Unreleased in CHANGELOG.md. Once #84 is merged, Prepare release turns that section into the release notes, so an entry missing there is missing from the release.

What counts as shipped: anything under packages/, except each package's own test/ folder and README.md. Template test/ folders and template .md files (e.g. the Claude rules) reach users, so they count.

Exceptions:

  • The skip-changelog label (already created), for a change with nothing to tell users. It works like skip-bump-check from ci: bypass the bump check with a skip-bump-check label #80, and adding or removing it reruns CI.
  • release/v* branches, because the release PR folds ## Unreleased away by design.
  • Push events, which have no base and pass.
  • Dependabot's npm and GitHub Actions PRs get skip-changelog automatically through dependabot.yml, since their commits are listed under the release's ### Commits. Docker base-image PRs don't: they already need a hand-made shared:docker bump, and the entry gets added then.

Documented in: the PR template (new "Changelog" section), CONTRIBUTING.md, docs/repository-settings.md, and pnpm changelog:check for local runs.

Needs a manual step

.github/rulesets/require-ci-to-pass.json now lists Changelog entry, but the live ruleset only changes when someone with admin rights applies the file. Until then the check runs without blocking merges. The same applies to Scaffold with the theme layer and build it from #79, which is in neither the file nor the live ruleset yet.

Verified

  • Unit tests: isShipped (10 paths) and unreleasedEntries, covering multi-line bullets, no section, and a section at the end of the file.
  • Ran the check against origin/main:
    • a commit touching packages/core/src with no entry fails, naming the file
    • adding an Unreleased line passes
    • CHANGELOG_CHECK_HEAD_REF=release/v1.4.0 skips
  • tsc and the full test suite (1064 passed) pass. The workflow and dependabot YAML parse, and so does the ruleset JSON.

Prepare release turns ## Unreleased into the release notes, so a change under
packages/ without an entry is missing from them. A new Changelog entry job
fails such a PR; the skip-changelog label bypasses it, release/v* branches are
exempt, and dependabot's npm and Actions updates get the label automatically.
Each package's own test/ and README.md don't count as shipped; templates'
test/ and .md files do.
@joris-sevenlab
joris-sevenlab merged commit 6ff2fdd into main Oct 15, 2026
8 checks passed
@joris-sevenlab
joris-sevenlab deleted the ci/require-changelog-entry branch October 15, 2026 10:21
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.

1 participant