Skip to content

feat(release): auto-sync marketing changelog + GH release body from one generation#448

Merged
mabry1985 merged 1 commit into
mainfrom
feat/release-changelog-automation
Jun 7, 2026
Merged

feat(release): auto-sync marketing changelog + GH release body from one generation#448
mabry1985 merged 1 commit into
mainfrom
feat/release-changelog-automation

Conversation

@mabry1985

Copy link
Copy Markdown
Contributor

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)

  • Bump release-tools v1.1.0v2.3.0 (SHA-pinned 7bea42a) — the version that writes the polished notes to a file + exposes notes/highlights.
  • GH release body now uses the polished notes (--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-facing changelog.json entry from the same notes (bullet lines → changes, + the deterministic dmgUrl); the release job commits it to main → triggers marketing-deploy.
  • docker-publish now ignores sites/**, so the changelog commit (and any marketing/site change) doesn't trigger a wasteful app-image rebuild.

Safety

  • The changelog step is continue-on-error + guarded — a changelog hiccup never fails a shipped release (worst case: a ::warning:: and you update changelog.json by hand).
  • The push to main is ignored by prepare-release (PR-merge-triggered), release.yml (tags-only), and docker-publish (paths-ignore) — so it only redeploys the marketing site.
  • main isn't branch-protected, so the CI push works (contents:write).

Validation

  • YAML parses; scripts/changelog-entry.mjs node --check + local run (prepend, newest-first, idempotent same-version replace) green.
  • Real end-to-end validation is the next tagged release — by design it degrades gracefully (file fallback + best-effort changelog) if anything's off.

🤖 Generated with Claude Code

…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>
@protoquinn

protoquinn Bot commented Jun 7, 2026

Copy link
Copy Markdown

👀 Quinn is reviewing — verdict (PASS / WARN / FAIL) + findings to follow.

@mabry1985 mabry1985 merged commit 77c2702 into main Jun 7, 2026
1 check passed

@protoquinn protoquinn Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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: clawpatch not available for protoLabsAI/ORBIS (repo not in project registry) — structural review of CI/CD changes is manual only.
  • Design soundness (manual review): The continue-on-error: true on both the polish step and the changelog sync step correctly ensures a changelog hiccup never fails a shipped release. The steps.notes.outcome == 'success' guard on the sync step is correct — sync only runs when polished notes exist. The --quiet check on git diff before committing avoids spurious commits. The GitHub Actions bot email 41898282+github-actions[bot]@users.noreply.github.com is the correct canonical bot identity for GHA.
  • No unresolved CodeRabbit threads.

— Quinn, QA Engineer

@protoquinn

protoquinn Bot commented Jun 7, 2026

Copy link
Copy Markdown

Submitted COMMENT review on protoLabsAI/ORBIS#448. CI is still running (5 checks queued) — this is a non-blocking pass. The formal APPROVE will land on a re-dispatch once checks reach terminal state.

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