pub fn render_changelog_body(
sections: &[(ChangelogHeading, Vec<String>)],
) -> StringExpand description
Render sections (from changelog_sections) as Keep-a-Changelog
markdown: each section’s heading line, a blank line, then one - {subject}
line per bullet, with a blank line between sections. Returns an empty
string when sections is empty — the “nothing changed” fallback text is
crate::ship::prepend_changelog’s responsibility, not this function’s.