Skip to content

ci(release): ship version-matched release notes and rotate the changelog backlog - #183

Merged
jacderida merged 2 commits into
mainfrom
ci/changelog-rotation-guard
Aug 31, 2026
Merged

ci(release): ship version-matched release notes and rotate the changelog backlog#183
jacderida merged 2 commits into
mainfrom
ci/changelog-rotation-guard

Conversation

@Nic-dorman

Copy link
Copy Markdown
Member

Linear issue

V2-1107 — https://linear.app/autonominetwork/issue/V2-1107

Risk tier

  • T0 — docs / tooling / CI / pure UX-output. Repo CI only.
  • T1 — client-only, no network-facing behavior change. CI + prod compat smoke.
  • T2 — node/client logic with behavioral surface, no protocol/format/economics change. Dev testnet + ADR.
  • T3 — protocol / storage format / payments / routing. T2 evidence + adversarial testing.

Compatibility

  • Wire: none
  • Storage: none
  • API: none (no crate code touched — CHANGELOG.md + release workflow only)

Semver impact

  • breaking
  • feature
  • fix

What

Every ant release 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:

  1. docs(changelog) — rotation/backfill. Each [Unreleased] entry attributed by git blame on its line → first stable ant-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.
  2. 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

  • The 0.3.5 promote on 2026-09-02 is unaffected: it tags on 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).
  • From the next train's rc.1 onward, the cut must rotate [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.
  • Prereleases and the stable of one train intentionally share one section: rotate at rc.1, and beta/rc/stable all ship the same correct notes.

Test evidence

  • Extraction simulated locally against the rotated changelog for 0.3.4, 0.3.3, 0.2.0 (each pulls exactly its own section — 1/5/1 entries), and 0.3.5-rc.1 / 0.3.5-beta.2 (fail-closed, no [0.3.5] section yet — the designed behavior pre-rotation).
  • Workflow YAML parses (yaml.safe_load).
  • Attribution cross-checked two ways: git blame → first-containing-stable-tag per line, and first-appearance diffs across the published 0.3.0→0.3.5-rc.1 release bodies; the train manifests (V2-1000, V2-1068) corroborate the 0.3.4 and 0.3.5-line attributions.

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

Nic-dorman and others added 2 commits August 31, 2026 10:52
[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>
@Nic-dorman
Nic-dorman requested a review from jacderida August 31, 2026 09:53
@jacderida
jacderida merged commit 392b8af into main Aug 31, 2026
15 checks passed
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.

2 participants