Skip to main content
← Back to list
01Issue
FeatureOpenUATPublic
AssigneesNone

Relationships

#1806 Send the release headline from the release pipeline so New Release announcements say what shipped

Opened by keeb · 8/24/2026

Follow-up to #1127, which is shipped. The rendering half is live; the data half lives in two other repos and has not been done, so today's announcements still say nothing about what a release contains.

Current state

#1127 removed the dead CI link from the New Release embed and added an optional headline property that renders under the version line. release_published currently carries only version and run_id, so production renders:

New Release Swamp CLI 20260824.164253.0-sha.8d1ce768 has been released

The absent-headline path is correct and tested — it is just the only path that exists.

What is needed

The emitter is swamp-club/swamp-uat.github/workflows/uat.yml, step "Send release telemetry". It needs to add a third property, headline, carrying the raw merged PR title. The discord-bot already formats it (services/discord-bot/lib/release-headline.ts: strips trailing issue refs and the conventional-commit prefix, capitalizes, caps at 180) — send it unformatted.

Two ways, both written up with diffs in scratch/issue-1127-emitter-diffs.md:

  • Option A (preferred)swamp-club/swamp.github/workflows/release.yml already has PR_TITLE in scope where it writes the release body, and already dispatches to swamp-uat. Add headline to the client-payload, falling back to git log -1 --pretty=%s on the workflow_dispatch path (no PR there). uat.yml forwards client_payload.headline. Parse-free, and the title comes from where it is authored.
  • Option Buat.yml reads it itself with gh release view v$SWAMP_VERSION --repo swamp-club/swamp --json body and takes the first * bullet under "What's Changed". One repo, but re-derives the title from rendered markdown.

Result:

New Release Swamp CLI 20260824.164253.0-sha.8d1ce768 has been released Use run-scoped model names to prevent lock contention

The part that is not optional

uat.yml currently builds its ingest JSON by interpolating shell variables into a single-quoted -d '{...}' literal. That is safe today because version and run_id are machine-generated, but a PR title is free text — one double quote, backslash or newline produces invalid JSON, the ingest returns a non-2xx, and the step's own guard (exit 1 on non-2xx) then fails the release. It is also an injection path into telemetry properties.

So whichever option is taken, build the payload with jq -n --arg rather than string interpolation. Do not add the field without doing that.

Done when

A real CLI release posts a New Release embed whose second line names what shipped, and a release whose PR title contains a quote still succeeds.

02Bog Flow
OPENTRIAGEDIN PROGRESSSHIPPED

Open

8/24/2026, 9:16:38 PM

No activity in this phase yet.

03Sludge Pulse

Sign in to post a ripple.