9f6e81607d
The release body was built solely from the CHANGELOG section, which is a terse changelog entry rather than the account of what changed. Gitea's pull_request webhook payload carries the description - PullRequest.Body is a documented field on the API struct - so it is now passed to the release step as PR_BODY and leads the release when present. The CHANGELOG entry is kept behind a fold rather than dropped, so a release records both the narrative and the versioned entry. With no description the body falls back to the CHANGELOG exactly as before, and with neither it says so. Co-author and generation trailers are stripped: they belong on the commit, not on a published release page. The description supplies its own headings, so no "## Changes" wrapper is added around it; the fallback branches emit one because a bare changelog fragment needs it. Verified by lifting the run: block straight out of the workflow and executing it, so the test exercises the shipped code rather than a copy: a description plus changelog produces the folded form, description-only omits the fold, changelog-only falls back, neither produces the placeholder, and the trailers are removed while the real content survives. Both workflows still parse as YAML with the same three jobs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>