How do I generate release notes?
This recipe is what the Sprint closure phase calls into. The companion sprint-opening flow is How do I open a new sprint?.
Question
I'm closing a sprint. How do I assemble release notes from the merged PRs and the sprint's stories, then cut a draft GitHub release?
Answer
The whole pipeline runs through compass release-notes — five
verbs, run in order, from a task branch off main (never directly
on main).
Prepare a fresh branch. Run on a branch (e.g.
feature/release-notes-sprint-<N>) rather thanmain:git fetch origin main git checkout -b feature/release-notes-sprint-<N> origin/main
Create: collect merged-PR data since the last release tag and render the release notes org file in one step:
./compass.sh release-notes create --sprint <N>
Internally this runs
collect_release_pr_data.py(auto-detects the previousv*tag viagit tag --sort-v:refname=; pass--since-tag v0.0.<N-1>explicitly if a tag for the sprint being closed already exists — otherwise PR collection picks up its own tag as "latest" and undercounts) thengenerate_release_notes.py(parsessprint.organd everystory.org, extracts story descriptions, groups them into sections viaTAG_TO_SECTION, derives Highlights from the retrospective, rendersdoc_release_notes.org.mustache).ghmust be authenticated.Read the closing sprint's
sprint.orgtoo — the* Storiestable and per-story states (DONE/STARTED/BLOCKED/ABANDONED) are not fully captured by PRs alone; the sprint backlog tells you what should have shipped, PRs tell you what did ship, the release notes reconcile both.Fill in the blurbs.
release_notes.orghas two(( ... ))placeholders (opening paragraph, "Next sprint" line) — replace both. Keep the opening paragraph 4–6 sentences, honest: if the sprint missed its mission or overran, say so (sprints 18, 19, and 21 are the model).Under each sprint chart, add a short commentary paragraph reading this sprint's data — peaks, outliers, and what they correspond to — not just the generic legend text.
Charts: render the sprint's gnuplot health charts:
./compass.sh release-notes charts --sprint <N>
Export: batch-export
release_notes.orgto GitHub-flavoured Markdown — this is the file that ships verbatim as the GitHub release body:./compass.sh release-notes export --sprint <N>
- Capture the readme screenshot. Take a fresh screenshot of the
running Qt client (e.g. via the QA Validation Runner panel's
screenshot button, or a desktop screenshot tool) and save it as
assets/images/ore_studio-v0.0.<N>.png. Do not wire it intoreadme.orghere — the readme should show the last released version, so it only gets pointed at this screenshot once sprintNitself closes andN+1opens; see How do I bump the project version? step 5d. Commit: stage, commit, and push
release_notes.org=/.md=, the four chart PNGs, the new screenshot, and the readme update. There is no separate "upload images" step for the charts — the markdown embeds them viaraw.githubusercontent.com/.../main/...URLs, so they only render correctly once merged tomain:./compass.sh release-notes commit --sprint <N>
- Open the PR via
PR Manager. Merge once green — this is what makes the chart images resolve onmain. Draft: tag
mainand open a draft GitHub release. A codename is invented per release (house convention:v0.0.20, "Capopolo") —--codenameis required:./compass.sh release-notes draft --sprint <N> --codename <Codename>
Idempotent: safe to re-run if the tag or release already exists (e.g. tagged ahead of time, or fixing the title/body after the fact) — reuses/updates in place, including the title, without losing the tag/PR/notes work already done. The release stays in draft so a human can add screenshots/binaries and publish.
Template skeleton
# **ORE Studio Sprint N – Release Notes** *Month Year* One-paragraph summary of the sprint's focus and outcomes. --- ## ✅ **Highlights** - ... ## 🛠️ **Key Improvements** ### **Theme A** - ... ### **Theme B** - ... ## ⚠️ **Known Issues & Postponed** - ... ## 📊 **Time Summary** **Total effort**: Xh Ym **Code**: A% | **Infra**: B% | **Agile/Analysis/Doc**: C% --- *Next sprint: one sentence summarising the upcoming mission.*
Script
./compass.sh release-notes (compass_release_notes.py) is the entry
point for all five verbs. It wraps
build/scripts/collect_release_pr_data.py and
build/scripts/generate_release_notes.py (create), delegates to
compass sprint charts (charts), batch-runs
ores-build-release-notes.el via Emacs (export), and shells to
git=/=gh directly for commit and draft.
Tested by
Manual. The script is exercised every sprint closure.
See also
- The compass release-notes pipeline — the design behind these steps: why five verbs, the image-resolution mechanism, tag/release idempotency, the title convention.
- Sprint closure phase — the surrounding lifecycle step.
- How do I open a new sprint? — the sibling flow on the other side of closure.
- Release Notes Generator — the skill that drives this recipe.
PR Manager— the PR-lifecycle skill for the notes PR.