Skip to content

ci(release): single RELEASE_NOTES.md + check-notes gate against stale bodies - #107

Merged
toonoumi merged 1 commit into
mainfrom
ci/release-notes-guard
Jul 10, 2026
Merged

ci(release): single RELEASE_NOTES.md + check-notes gate against stale bodies#107
toonoumi merged 1 commit into
mainfrom
ci/release-notes-guard

Conversation

@toonoumi

@toonoumi toonoumi commented Jul 10, 2026

Copy link
Copy Markdown
Owner

Problem

v1.2.0 and v1.2.1 both published with the previous release's "What's New" (both fixed after the fact with gh release edit). Root cause: the release body was a static string duplicated across the three build jobs in release.yml, updated by hand — nothing failed when it was stale at tag time.

Fix

  • RELEASE_NOTES.md (repo root) is now the single source of the release body. All three jobs consume it via body_path, read at the tagged commit. No more triple copies / KEEP IN SYNC comments. It currently carries the v1.2.1 notes (matching the live release page).
  • New check-notes job gates the build. On tag pushes it fails — in seconds, before any ~30-minute build starts — unless the file mentions FreeCCR <version> for the tagged version. All three build jobs needs: check-notes. Manual workflow_dispatch runs pass through unchanged.
  • CLAUDE.md documents the contract: replace the What's New in RELEASE_NOTES.md before tagging.

So the failure mode changes from "silently publishes last release's notes" to "tag build fails immediately with an error naming the file and version".

Verification

  • yaml.safe_load parses; jobs = check-notes, build-windows, build-macos, build-linux, all three builds needs: check-notes; exactly 3 body_path entries and zero inline bodies remain.
  • Guard simulated locally: passes for v1.2.1 against the current file, fails for v1.3.0 (stale-notes scenario).

#103 (which refreshed the three inline copies in place) was merged while this was in flight; this branch is rebased on top of it and deletes those inline copies in favour of the file.

🤖 Generated with Claude Code

https://claude.ai/code/session_015CWWLim8DnE9WqbqqmHV26

… bodies

v1.2.0 and v1.2.1 both published with the previous release's "What's New"
because the body was a static string duplicated across the three release
jobs and nobody updated it before tagging. Restructure so that cannot
recur:

- RELEASE_NOTES.md (repo root) is now the single release body, consumed by
  all three jobs via body_path — no more triple copies to keep in sync.
- New check-notes job: on tag pushes it fails, in seconds and before any
  build starts, unless RELEASE_NOTES.md mentions "FreeCCR <version>" for
  the tagged version. Non-tag runs (workflow_dispatch) pass through.
- CLAUDE.md documents the new location and the tag-time contract.

Supersedes #103 (which refreshed the three inline copies in place).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015CWWLim8DnE9WqbqqmHV26
@toonoumi
toonoumi force-pushed the ci/release-notes-guard branch from 03646ef to 68d5731 Compare July 10, 2026 03:20
@toonoumi
toonoumi merged commit f7cfdc7 into main Jul 10, 2026
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.

1 participant