Assemble-changelog
Release-time changelog assembly for the Rerun repo.
Always work in the root of a standalone
checkout — normally the
branch, where the result is committed.
This is step 4 of
RELEASES.md; read it for the surrounding context.
Before doing any release work, verify that the current directory is the repository root and that its
is
:
bash
test "$(git rev-parse --show-toplevel)" = "$PWD"
git remote get-url origin
Do not run the workflow in the reality monorepo, including from its
directory.
The release scripts need the standalone repository's
tags and resolve
commit references against
.
Running them against reality can silently resolve reality PR numbers to unrelated Rerun PRs.
If either precondition is not met, stop before running any release command.
Tell the user that the skill requires the root of a standalone
checkout, and ask them to restart it there.
Do not clone a repository, fetch tags, or switch branches for the user.
Resolve the target version from
(e.g.
). If absent, read it
from
(
) and confirm with the user.
Workflow
1. Assemble → the release changeset
The curated entries live one-file-per-PR in
docs/content/changelog/upcoming/*.md
(skip
). Each declares
type: highlight|breaking|feature
in its
frontmatter. Merge them into
docs/content/changelog/changeset-0-XX.md
, creating that file from
docs/content/changelog/_template.md
if it does not exist yet (set
to the version — keep it
quoted, e.g.
, so YAML keeps it a string — and
one lower than the previous release):
- → fold into the prose (write a cohesive few sentences
selling the release; use the entries as raw material, don't just concatenate).
- → one subsection each under .
- → one subsection each under . If none, write .
Keep the sections in that order. The changelog is user-facing (it's part of the website),
so it leads with what's new; the verbose, developer-only breaking-change migration guides
go last so most readers don't have to scroll past them.
Tailor the output to the release type:
- Patch release (, Y > 0) → typically only bug fixes. Skip and
(there usually won't be entries anyway); keep only if there are any.
- Minor release () → the full template: highlights, new features, breaking changes.
Preserve each entry's prose and structure (migration guides, tables,
directives,
screenshots, links).
De-duplicate overlapping entries and order breaking changes most-impactful first.
Drop the per-entry frontmatter.
Relative doc links in entries were written as if from
(e.g.
../reference/migration/...
), which is correct once merged — keep them as-is.
Finally, point the
frontmatter in
docs/content/changelog.md
at
: CI's
scripts/ci/check_changelog_redirect.py
requires the
newest changeset to be the redirect target, so the repoint must land together with the
new changeset.
2. Resolve release blockers
Ensure that every non-template file from
was merged into the changeset, then search the assembled changeset for unresolved placeholders:
bash
rg -n 'TODO\([^)]+\)' docs/content/changelog/changeset-0-XX.md # NOLINT
Resolve every match before continuing.
An unresolved
blocks the release.
3. Generate the summary and detail sections into CHANGELOG.md
bash
pixi run uvpy scripts/generate_changelog.py --version 0.x.y
Edit PR titles/labels to improve the output, then copy the result into
(drop the trailing "Chronological changes" section; replace the placeholder video/blogpost
lines as previous releases did). Spot-check a few entries against the actual PRs:
polluted titles (old, unrelated PRs;
for core team members) mean a PR-number
lookup misfired — see the warning at the top.
Do this
after step 1: the script reads the assembled changeset and emits a summary of it
(section headings + links to the changeset on the website), rather than inlining its prose.
therefore never duplicates the changeset — if the changeset is missing, the
script emits an unresolved placeholder instead.
4. Empty the inbox
Delete the merged
entries, keeping
:
bash
find docs/content/changelog/upcoming -maxdepth 1 -type f -name '*.md' ! -name '_template.md' -exec git rm -- {} +
Checklist before declaring done
Notes
- This skill lives in
skills/assemble-changelog
in the standalone Rerun repository.
- Synced commits in carry a trailer (the reality merge
commit); resolves it back to the originating reality PR for
correct titles, labels, and contributors.
- The next release's changeset is not pre-created: an empty changeset for an
unreleased version would make
check_changelog_redirect.py
fail, since it requires the newest
to be the redirect target. During a cycle, is the only in-flight
artifact.