feat(release): auto-sync marketing changelog + GH release body from one generation#448
Conversation
…om one generation The GitHub release body was raw PR titles and the marketing changelog (sites/marketing/data/changelog.json) was hand-maintained — two surfaces that drift. Now one release-tools generation drives both: - Bump release-tools v1.1.0 → v2.3.0 (the version that exposes the notes as a file/outputs). It writes the polished notes to release-notes.md. - The GitHub release body now uses those polished notes (--notes-file), with GitHub's auto notes as a file fallback when the polish step is skipped (first release) or fails — so a release never ships a blank/raw body. - New `scripts/changelog-entry.mjs` builds a user-facing changelog.json entry from the SAME notes (bullet lines → `changes`, + the deterministic dmgUrl) and the release job commits it to main → triggers marketing-deploy. Best-effort: a changelog hiccup never fails a shipped release. - docker-publish: ignore `sites/**` so the changelog commit (and any site change) doesn't trigger a wasteful app-image rebuild. The changelog push to main is ignored by prepare-release (PR-merge-triggered) and release.yml (tags-only), and skipped by docker-publish (paths-ignore), so it only redeploys the marketing site. Defensive throughout; real validation is the next tagged release. scripts/changelog-entry.mjs tested locally (prepend, newest-first, idempotent same-version replace). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
👀 Quinn is reviewing — verdict (PASS / WARN / FAIL) + findings to follow. |
There was a problem hiding this comment.
QA Audit — PR #448 | feat(release): auto-sync marketing changelog + GH release body from one generation
VERDICT: PASS (pending terminal CI — 5 checks in progress)
CI Status
- build: queued
- ruff: queued
- Source and Linux host checks: queued
- pytest: queued
- macOS native-audio compile: queued
⏳ CI not yet terminal — this is a non-blocking comment. Formal APPROVE lands once all checks settle green.
Diff Review
Three-file change to .github/workflows/release.yml, .github/workflows/docker-publish.yml, and scripts/changelog-entry.mjs (new). Refactors release tooling from release-tools v1.1.0 → v2.3.0 (SHA 7bea42a), pivoting from inline GH auto-notes generation to the new polished-notes flow that writes to a file and exposes notes/highlights. Adds a marketing changelog sync step (commit to main → triggers marketing-deploy) and excludes sites/** from docker-publish to prevent changelog commits from triggering app-image rebuilds.
Observations
- Gap: External reference
release-tools@7bea42a(v2.3.0) not independently verified — assumed published per PR description linking to protoLabsAI/release-tools#48. Low risk given SHA-pinned pinning, but worth confirming the tag resolves. - Gap:
clawpatchnot available forprotoLabsAI/ORBIS(repo not in project registry) — structural review of CI/CD changes is manual only. - Design soundness (manual review): The
continue-on-error: trueon both the polish step and the changelog sync step correctly ensures a changelog hiccup never fails a shipped release. Thesteps.notes.outcome == 'success'guard on the sync step is correct — sync only runs when polished notes exist. The--quietcheck ongit diffbefore committing avoids spurious commits. The GitHub Actions bot email41898282+github-actions[bot]@users.noreply.github.comis the correct canonical bot identity for GHA. - No unresolved CodeRabbit threads.
— Quinn, QA Engineer
|
Submitted COMMENT review on |
Closes the loop on the changelog work — consumes release-tools#48 (now published as v2.3.0). One LLM generation per release drives both the GitHub release body and the marketing changelog, so they can't drift, and neither is hand-typed.
What changes (release.yml)
v1.1.0→v2.3.0(SHA-pinned7bea42a) — the version that writes the polished notes to a file + exposesnotes/highlights.--notes-file release-notes.md), with GitHub's auto notes as a file fallback when the polish step is skipped (first release) or fails — a release never ships a blank/raw body.scripts/changelog-entry.mjs(new, tested) builds a user-facingchangelog.jsonentry from the same notes (bullet lines →changes, + the deterministicdmgUrl); the release job commits it tomain→ triggersmarketing-deploy.docker-publishnow ignoressites/**, so the changelog commit (and any marketing/site change) doesn't trigger a wasteful app-image rebuild.Safety
continue-on-error+ guarded — a changelog hiccup never fails a shipped release (worst case: a::warning::and you updatechangelog.jsonby hand).mainis ignored byprepare-release(PR-merge-triggered),release.yml(tags-only), anddocker-publish(paths-ignore) — so it only redeploys the marketing site.mainisn't branch-protected, so the CI push works (contents:write).Validation
scripts/changelog-entry.mjsnode --check+ local run (prepend, newest-first, idempotent same-version replace) green.🤖 Generated with Claude Code