Skip to content

feat(changelog): skip internal PRs, fold follow-up fixes, group related PRs - #837

Merged
adrians5j merged 2 commits into
masterfrom
feat/changelog-skip-internal-and-follow-ups
Oct 21, 2026
Merged

adrians5j merged 2 commits into
masterfrom
feat/changelog-skip-internal-and-follow-ups

Conversation

@adrians5j

@adrians5j adrians5j commented Oct 21, 2026 •

Copy link
Copy Markdown
Member

What changed

The changelog generator had three problems.

  • Internal PRs made it into the changelog. CI, monorepo build, package publishing, release scripts and E2E changes got entries, and reviewers removed them by hand. 6.5.0 has several of these in its Skipped PRs list (#5776, #5986, #6013, #6018).
  • A feature built in a release often gets a few fix PRs before the release ships. Each fix got its own "Fixed ..." entry, even though no user ever saw the bug. 6.5.0 had the same problem: #5959, #5960, #5966, #6007 and others were removed by hand.
  • PRs that deliver one change got one entry each when they landed in different batches. In 6.5.0, the Admin and API halves of injectable string formatting (#5517, #5526) were merged into one entry by hand.

scripts/generate-changelog.ts now triages new PRs before it generates anything:

  • Title filter. Titles with a ci, build or test type, a ci, build, release, e2e or test scope, or chore: merge ... are dropped without an API call. build-tools is not matched, since it covers user-facing fixes like #5989.
  • Triage call. One Claude call with a forced report_triage tool sees all remaining new PRs plus the titles of PRs handled on earlier runs. It returns the other internal PRs, {pr, parent} follow-up pairs, and groups of related PRs. The script ignores anything that doesn't point at a real PR of the release, resolves chains (fix of a fix → the feature) and ignores cycles.
  • Folding. A follow-up gets no entry. Its title and description are attached to the parent's item as context, so the feature entry describes the final behaviour. The generation prompt also says not to write "Fixed ..." entries for things new in the release.
  • Grouping. Related PRs become one item, sent to Claude in the same batch with an instruction to write one entry and link every PR in its heading. Groups that share a PR are merged. Internal and follow-up PRs are removed from groups, and a group left with one PR is dropped.
  • Stable reruns. Every PR left out is appended to ## Skipped PRs in changelog.ai.txt with the reason, e.g. 6018 - ci(e2e): ...; internal (\ci` change), skipped automatically.` Reviewers can see what was dropped, and the next run doesn't re-decide.

Smaller fixes along the way:

  • changelog.ai.txt is only scaffolded when missing. Before, a fresh run overwrote it.
  • Append vs. fresh-file is now decided by whether changelog.mdx exists. Before, it was decided by whether any PR was already known, which crashed when changelog.ai.txt had skips but no changelog.mdx existed.
  • --dry-run prints what would be left out. With CLAUDE_KEY set, it runs the triage call too.
  • AGENTS.md said PRs come from release commits. The script went back to milestones in ea4ff85, so the note is corrected and describes the triage.

Testing

  • --dry-run for 6.5.0 with its changelog files moved aside: the title filter drops #5776, #5843, #5986, #6013 and #6018, all of which reviewers had removed or which are merges.
  • Ran appendSkippedPRs against the real 6.5.0 changelog.ai.txt and a missing file, and checked that extractSkippedPRNumbers reads the result back.
  • Ran resolveTriage with chains, a cycle, an unknown parent, an internal PR also marked as a follow-up, overlapping groups, and groups that shrink to one PR. Checked the formatItem output for a grouped item with a follow-up.
  • The triage call itself is not tested against the API, because no CLAUDE_KEY was available locally. The first real run (or a --dry-run with the key) will show how it classifies.

Workspace: docs.webiny.com · changelog filtering and grouping

🤖 Generated with Claude Code

Internal changes (CI, build, tests, release tooling) are dropped by title
prefix, then a Claude triage call flags other internal PRs and finds fix
PRs that finish a feature from the same release. Follow-ups get no entry
of their own; they go to Claude as context for the feature's entry.
Everything left out is recorded in changelog.ai.txt so reruns agree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
docs-webiny-com Ready Ready Preview Oct 21, 2026 3:30pm UTC

Request Review

The triage call now also returns groups of PRs that deliver one change,
such as the API and Admin parts of a feature. Each group is sent to
Claude as one item and becomes one entry with all its PRs linked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@adrians5j adrians5j changed the title feat(changelog): skip internal PRs and fold in-release follow-up fixes feat(changelog): skip internal PRs, fold follow-up fixes, group related PRs Oct 21, 2026
@adrians5j
adrians5j merged commit 1acd06a into master Oct 21, 2026
2 checks passed

This branch was successfully deployed

1 active deployment
Preview — ce0709e1 Deployed Oct 21, 2026 by vercel[bot]
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