Support curated release notes for milestone releases - #280
Merged
Conversation
- Tighten release-tag matching in the changelog step - Pass the changelog API credential to curl via a stdin config file - Route remaining git-derived and configured values through env Release body and step summary verified unchanged for normal values in both curated and generated modes.
The curated-notes and hardening changes were written independently per repository, which left the same logic expressed several different ways. Normalise the shared parts so the nine copies stay diffable: identical tag-existence test, identical curl invocation and continuation style, one wording for the tag-selection and credential comments, and consistent brace style. Drops an unused VERSION env entry from the analyze step. No behaviour change; only formatting, comments, and a dead variable.
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.
The tag-release workflow generates its changelog from
git diff <last-tag>..HEAD, so dispatching the 1.0.0 major would have produced release notes describing a two-commit delta since v0.4.12 — the wrong framing for a milestone.The mechanism. If
.github/release-notes/v<version>.mdexists at the tagged ref,tag-release.ymluses it as the release body and skips the Claude changelog generation, the delta-statistics section, and the generated-with footer (hand-written notes shouldn't carry it). When no file exists, behavior is unchanged: same generated changelog, same stats, same footer, byte-for-byte template. The release body is now composed into a file and passed viabody_path, with untrusted changelog content emitted through env/printfper the existing SECURITY (H2) conventions.The 1.0.0 notes.
.github/release-notes/v1.0.0.mdis included — the graduation statement covering the product surface and the 130+ release lineage since June 2024, rather than the delta since last Tuesday. Merging this before dispatchingcreate-release.ymlwithmajormeans the release branch carries the file and the workflow picks it up automatically.Also documents the convention in CLAUDE.md under Deployment. The version-specific filename means a leftover file can never leak into a later release.
Test plan
uvx yamllintpasses (syntax-clean, only pre-existing line-length style warnings). The compose-body script was exercised locally in both modes: curated mode renders the v1.0.0.md content with links but no stats/footer; generated mode reproduces the existing template exactly, and$(...)/backtick content in the changelog stays literal. Pre-commit hook ran the fulltest:allgate.A follow-up commit hardens input and credential handling in
tag-release.yml: tag matching is tightened, the changelog API credential is passed to curl via a stdin config file, and remaining git-derived and configured values are routed throughenv— release body and step summary verified unchanged in both curated and generated modes.