ci(release): ship version-matched release notes and rotate the changelog backlog - #183
Merged
Conversation
[Unreleased] had not been rotated since [0.1.1] (2026-03-28), so entries accumulated for four months. Attribution by git blame on each entry line, mapped to the first stable ant-cli-v* tag containing that commit: - 0.3.4: written fresh from the 08-18 train manifest (V2-1000) — #173 was its only ant-client PR and had no entry at all. - 0.3.3: the external-signer merkle epic (#166/#167/#168 era entries). - 0.2.1: datamap naming/overwrite/download entries + datamap_file module. - 0.2.0: IPv6 dual-stack binding. - Still [Unreleased] (0.3.5-line, prerelease-only so far): resumable finalize, --service-name race fix, node add --json fix, --evm-network devnet guard, CLI-audit thinning. - 0.3.0/0.3.1/0.3.2 and 0.2.2–0.2.11: stubs — nothing was ever recorded for them; backfill tracked in V2-1107. Entry text preserved verbatim; only placement changed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The release body took "the first CHANGELOG.md section", which was the never-rotated [Unreleased] blob — every release from 0.2.x through 0.3.4 shipped stale accumulated notes (0.3.4's were byte-identical to 0.3.3's). Extraction now targets '## [<base version>]' (rc/beta suffix stripped, so all prereleases and the stable of one train share the section created at rc.1 cut) and fails the release if the section is missing or empty, with the rotation instruction in the error. Would have caught all five stale releases. V2-1107. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
jacderida
approved these changes
Aug 31, 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.
Linear issue
V2-1107 — https://linear.app/autonominetwork/issue/V2-1107
Risk tier
Compatibility
Semver impact
What
Every
antrelease from 0.2.x through 0.3.4 shipped stale accumulated notes: the release body extracts "the first CHANGELOG.md section", and[Unreleased]was never rotated after[0.1.1] - 2026-03-28. Concretely: 0.3.4's notes are byte-identical to 0.3.3's (its actual content, #173, appears nowhere), ~80% of 0.3.5-rc.1's entries are re-shipped from earlier releases, and the IPv6 dual-stack entry (April, 0.2.0) has re-shipped for four months. Full audit on V2-1107.Two commits:
docs(changelog)— rotation/backfill. Each[Unreleased]entry attributed bygit blameon its line → first stableant-cli-v*tag containing that commit. Entry text preserved verbatim; only placement changed.[0.3.4]is written fresh from the 08-18 train manifest (V2-1000; feat(channel): make the ant client beta-channel aware #173 was its only ant-client PR and never had an entry). The five 0.3.5-line entries (refactor(core): thin the CLI — move parsing/resolution into ant-core, route all daemon calls through the client #157/fix(cli): refuse ambiguous EVM network selection (devnet manifest vs mainnet default) #158/feat(client): resumable external-signer finalize for both paths #172 era) stay under[Unreleased]until 0.3.5 promotes. Releases nothing was ever written for (0.3.0–0.3.2, 0.2.2–0.2.11) get honest stub sections pointing at V2-1107 — happy to drop the stubs or deep-backfill instead if you'd rather.ci(release)— the guard. Extraction now targets## [<base version>](rc/beta suffix stripped) and fails the release when that section is missing or empty, with the rotation instruction in the error. This alone would have caught all five stale releases.Sequencing — please confirm at review
rc-2026.8.4, which carries the pre-guard workflow and its own frozen CHANGELOG. It will ship one final stale body; the live 0.3.2–0.3.4 bodies can be patched post-merge from the rotated sections (gh release edit, listed on V2-1107).[Unreleased]→## [X.Y.Z] - <date>(one mechanical edit alongside the version bumps) or the guard blocks the tag — deliberately. The cut/promote tooling needs that step before the next cut.Test evidence
0.3.4,0.3.3,0.2.0(each pulls exactly its own section — 1/5/1 entries), and0.3.5-rc.1/0.3.5-beta.2(fail-closed, no[0.3.5]section yet — the designed behavior pre-rotation).yaml.safe_load).New dependency
none
ADR
n/a
Mitigation / rollback
Revert the workflow commit to restore first-section extraction (the rotated changelog is content-only and safe either way). The guard can only block a release, never mis-publish one.
Noted while auditing, author's call: #174 (NetworkHealth) has no changelog entry; if it warrants one it belongs under
[Unreleased]before the 0.3.6 cut.🤖 Generated with Claude Code