Repository navigation
Change logs: assemble component change-log fragments at release time and check readiness before tagging - #1612
Merged
Conversation
…rep pull request Pull requests that change a component edited the same newest entry of each change log, so concurrent pull requests conflicted there. The component targets go, java, python, rust, typescript, web, cli, server, agents, and agents-packages now take fragments under changelog.d/<target>/ with a section front matter key, linted with the docs prose rules for the docs change logs. prepare <components> --version --date writes each release entry: a new entry per minor (per 0.1.N for server-zd, per release for agents/CHANGELOG.md), a patch folded into its minor with "Since" items, a repeated prepare folded into the same entry, and the existing unreleased entries absorbed on the first run. verify-release-prep checks every target the pull request touches against prepare on its base. check-ready fails the Release changed components plan while a selected change log does not record the release; the server binary release only warns. Grace pull requests may edit only the unreleased entry. Snapshot compare links prefill the changelog: correction line, and the five sdk-*/CHANGELOG.md files now point to the docs change logs.
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
…and parse Released lines - The server binary release now fails in its metadata job when check-ready does not find the entry, before any build, upload, or snapshot. Its message says to delete the release and tag, merge the release-prep pull request, and tag again. - check-ready parses the Released line of the newest entry and validates each date, tag, and release URL, and the agents package heading date. - A same-version prepare that adds items removes "No user-visible changes.". - A release that does not match the unreleased entry on main names the version main ships instead. - Under grace, the unreleased entry's version key must stay newer than the newest released entry and must not move back from the base's key.
The image release runs the same check-ready step on the tagged commit in its metadata job, so a missing entry stops the build and push, as in the binary release.
This was referenced Nov 11, 2026
longquanzheng
added a commit
that referenced
this pull request
Nov 11, 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.
Summary
Component change logs now come from fragments, as the skills change log does
since #1609. A pull request that changes a component adds a uniquely named
fragment under
changelog.d/<target>/. It no longer edits the newest entry ofdocs/reference/<component>/changelog.mdxoragents/CHANGELOG.md. Arelease-prep pull request writes each release entry before the tag.
This pull request is based on main. It is no longer stacked on #1609, which
is merged.
changelog.d/gainsgo,java,python,rust,typescript,web,cli,server,agents(the docs change log), andagents-packages(agents/CHANGELOG.md).sectionfront matter key: Breaking, Added,Changed, Deprecated, or Fixed.
agents-packagesmay also name a topic,such as Dex MCP conventions.
backticks, and no braces or
<.new <target> --section <section>writes the skeleton.prepare <components> --version <V> --date <D> [--allow-empty]writesthe release entries. Its logic is in the new
script/release/component_changelogs.py.0.1.Nand eachagents package release in
agents/CHANGELOG.md. The heading, anchor,and Released line follow the existing format.
and its items end with "Since 1.NN.P".
--allow-emptywrites "No user-visible changes." A later prepare of thesame version that adds items removes that line.
keeps their section order. A release that does not match such an entry
fails. For example,
1.44.1while main holds unreleased 1.45 fails: themessage says main ships that entry as 1.45.0, so release 1.45.0 or first
move its items into fragments. These are "Not released yet" in the docs
change logs,
## Unreleased, and## 0.5.0 (not released yet).Reference:links stay byte-identical.agentsprepares both agents change logs.verify-release-prepchecks every target that a labelled pull requesttouches. It takes each target's version and date from that target's own
newest Released line or heading. It reruns
prepareon the base andrequires byte-identical output. When the base gained a fragment, it fails
and prints the exact re-prep command.
check-ready <component> <version>fails while a target still hasfragments, or while its newest entry is unreleased or is not the target
version. It prints the prepare command.
tag with a calendar date and its release URL, with
/encoded as%2F.A missing or malformed Released line fails. The agents package heading
needs a valid date.
script/release/changed_components.pycalls it for every selectedcomponent. Release changed components therefore fails its plan
before creating any tag.
server-zd-binary-release.ymlandserver-zd-image-release.ymlcallit on the tagged commit in their metadata jobs. A failure stops the
binary build, asset upload, and reference snapshot, and the image build
and push. Its message says the entry must be
merged to main before the tag: delete the release and its tag, merge the
release-prep pull request, and tag again.
check-prrejects edits to any component change log unless thedescription contains a line
changelog: correction: <reason>.LEGACY_CHANGELOG_PR_MAXmay edit only the newestunreleased entry, or open one above the released entries. They may do so
only while that target has no fragments.
newest released entry, and must not move back from the base's unreleased
version. Reopening or moving back to a released version fails.
release-changed-components.ymlandserver-zd-binary-release.ymlprefillchangelog: correction: reference snapshot. A snapshot may rewrite linksin a change log.
sdk-*/CHANGELOG.mdfiles now point to thedocs change logs. They only held a never-stamped
## Unreleasedsectionthat duplicated the docs change logs. Nothing in
.github/or packagemetadata reads them.
CLAUDE.md,AGENTS.md, and.cursor/rules/project-core.mdc. The patch fold-insentence,
CONTRIBUTING.mdReleases,docs/README.md,changelog.d/README.md, and the pull request template are updated too.because a test prepares every current change log.
Why
Concurrent pull requests insert entries at the same spot of the same files.
In the last three weeks,
agents/CHANGELOG.mdchanged in 48 commits anddocs/reference/web/changelog.mdxin 25. #1574 and #1598 both created the## 1.45section in five SDK change logs and conflicted in all five. Releasestamping pull requests, such as #1576, touch the same region again.
Fragments have unique names, so concurrent pull requests never touch the same
path. The rule "the change-log entry is on main before the tag" holds
mechanically. The release-prep pull request writes the final entry with its
Released line before the tag. The release then snapshots the reference from
main with that entry, and the preflight refuses to tag without it.
Compatibility
prepareturns eachcurrent unreleased entry into the release entry.
LEGACY_CHANGELOG_PR_MAXkeep workingwhile their target has no fragments.
dispatching Release changed components or creating a
server-zd/vRelease.
Testing
make release-tooling-testruns 83 tests.script/release/component_changelogs_integ_test.py, with 21fixture-repo integration tests:
new --section;--allow-empty;check-ready, with Released-line parsing (an unencoded URL, animpossible date, a wrong tag, another version, a malformed line, a
missing line, and a folded patch);
workflows, which every later job needs;
verify-release-prepacross several components, with tampering and amoved base;
check-prwith a correction line, the narrowed grace, and graceversion keys that move back;
prepareandcheck-readyon every current change log.changed_components_integ_test.py. Its fixtures write readychange logs, and new cases fail on pending fragments, a missing entry, a
stale entry, and a Released line naming the wrong tag.
A dry run on a copy of current main ran:
prepare go,java,python,rust,typescript,web,cli --version 1.45.0 --allow-emptyprepare server --version 0.1.26prepare agents --version 0.5.0After it:
check-readypassed for every component.check-pr --labels release-preppassed.agents_release_notes.py 0.5.0extracted the new section.cd docs && npm run checkpassed.cd docs && npm run checkpasses on this branch.Skills
check-package.py,check-doc-map.py, and the skills unit testspass, as do
make copyright-checkandmake ci-runner-check.check-pron this branch againstorigin/mainpasses.CI runs Check Gate and Release Tooling CI.
skills-release: no bump needed: release tooling and contributor rules only; no skill content changes