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
7 tasks
jacderida
added a commit
that referenced
this pull request
Sep 1, 2026
A missing or empty CHANGELOG entry must never block a release. Release- blocking is for correctness and safety, not editorial omissions, and ant-client was the only repo violating that: saorsa-transport's changelog step is `continue-on-error: true` and ant-protocol's is a plain link in the release body. PR #183 did two separable things, and only the first is the V2-1107 fix: 1. Extract the section matching the version being released, instead of blindly taking the first section. This is what stopped `[Unreleased]` shipping as every release's notes (0.3.4's body was byte-identical to 0.3.3's). Kept, unchanged. 2. `exit 1` when that section is missing or empty. Removed. Dropping (2) regresses nothing V2-1107 was about: with (1) in place and no section present the result is *empty* notes, not *stale* ones. The hard failure only converted "missing notes" into "no release at all", which is strictly worse — the artifacts are fine and the omission is fixable after the fact with `gh release edit`. The step now emits a `::warning::` annotation, so the omission stays loud on the workflow run, and writes a placeholder body naming the version. If we still want enforcement it belongs *before* the tag, on the release-prep PR, where a fix is cheap and nothing is blocked; that is a separate follow-up and deliberately not in this change. V2-1142 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nhag7h3fagNA6fqUg6gAmZ
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