CHANGELOG.md currently contains 76 entries ending in a literal (#PR) instead of a pull-request number:
grep -c '(#PR)' CHANGELOG.md
# 76
The very first entry in the file — ## 1.0.1-beta.0 — 2026-08-12 — is one of them, so it's the first thing anyone reading the changelog sees.
CONTRIBUTING.md asks every entry to end with its PR number (e.g. (#123)). (#PR) is the placeholder people write before the PR exists, and it's being forgotten on the way out.
Two parts, both beginner-friendly
1. Backfill the numbers. For each (#PR), find the PR that introduced the entry and substitute the number. git log -S'<a distinctive phrase from the entry>' -- CHANGELOG.md will point you at the commit, and the merge commit or gh pr list --search gets you the number. Where an entry genuinely never had a PR, drop the (#PR) rather than inventing one.
This is mechanical but not blind — take it in batches and note anything ambiguous in the PR description rather than guessing.
2. Add a CI guard so it can't recur. The quality job in .github/workflows/ci.yml already has a small inline check ("Check version consistency") that greps files and calls ::error file=…:: on a mismatch. Add a sibling step that fails when CHANGELOG.md contains (#PR).
Worth deciding (and saying which you chose): should the guard check the whole file, or only the entries added in the current diff? Whole-file is simpler and can't be bypassed; diff-only avoids blocking unrelated PRs on pre-existing debt. Either is defensible — if you pick whole-file, part 1 has to land first or every PR goes red.
Done when
grep -c '(#PR)' CHANGELOG.md returns 0
- CI fails on a branch that adds a
(#PR) line, and passes otherwise
Happy to review this in stages if you'd rather do the backfill and the guard as separate PRs — say so and we'll coordinate.
CHANGELOG.mdcurrently contains 76 entries ending in a literal(#PR)instead of a pull-request number:The very first entry in the file —
## 1.0.1-beta.0 — 2026-08-12— is one of them, so it's the first thing anyone reading the changelog sees.CONTRIBUTING.mdasks every entry to end with its PR number (e.g.(#123)).(#PR)is the placeholder people write before the PR exists, and it's being forgotten on the way out.Two parts, both beginner-friendly
1. Backfill the numbers. For each
(#PR), find the PR that introduced the entry and substitute the number.git log -S'<a distinctive phrase from the entry>' -- CHANGELOG.mdwill point you at the commit, and the merge commit orgh pr list --searchgets you the number. Where an entry genuinely never had a PR, drop the(#PR)rather than inventing one.This is mechanical but not blind — take it in batches and note anything ambiguous in the PR description rather than guessing.
2. Add a CI guard so it can't recur. The
qualityjob in.github/workflows/ci.ymlalready has a small inline check ("Check version consistency") that greps files and calls::error file=…::on a mismatch. Add a sibling step that fails whenCHANGELOG.mdcontains(#PR).Worth deciding (and saying which you chose): should the guard check the whole file, or only the entries added in the current diff? Whole-file is simpler and can't be bypassed; diff-only avoids blocking unrelated PRs on pre-existing debt. Either is defensible — if you pick whole-file, part 1 has to land first or every PR goes red.
Done when
grep -c '(#PR)' CHANGELOG.mdreturns 0(#PR)line, and passes otherwiseHappy to review this in stages if you'd rather do the backfill and the guard as separate PRs — say so and we'll coordinate.