Library feature highlights
ValidMind release notes guides
Human-driven authoring process for validmind-library feature release notes (vX.Y.Z) highlights.
Prerequisites
Why do we generate library feature highlights?
Library feature highlights group a library release into topics, providing a cohesive story for customers:
- Feature highlights are also required to generate[customer release notifications — notification emails pull highlight titles from curated theme pages (
pr-*-highlights.qmd), not from individual per-PRhighlightcategory release notes (pr-{n}.qmd). - Materializing highlights creates those theme pages — without them, notifications have nothing to summarize except customer Zendesk ticket status. Skipping materialize leaves nothing theme-grouped for notifications to summarize, even if individual
pr-{n}.qmdwrappers carry ahighlightcategory.
When should I generate library feature highlights?
Only library feature releases need highlights. Patch v.s. feature is determined from the new tag relative to the previous stable tag:
| Patch release | Feature release |
|---|---|
Same major.minor bump (for example, v2.13.4 → v2.13.5) |
Major or minor bump (for example, v2.13.5 → v2.14.0, or v2.14.0 → v3.0.0) |
First in-scope tag with non-zero patch (for example, v2.14.3) |
First in-scope tag with patch .0 (for example, v2.14.0) |
Generate library feature highlights when initial library release note drafts have been created on a feature release, whether by GitHub Actions automation or by you as a human.
| Scenario | Branch context | When to run | Full context |
|---|---|---|---|
| A — Automation creates library release drafts, branch, & PRs | automated/library-v{version} (Refer to: Library release automation) |
After checking out the open release-notes draft PR |
Automation opens the branch and drafts library release-notes.qmd plus partials; does not curate highlights |
| B — You create library release drafts & branch/worktree | Local batch or individual generate (Refer to: Manual library releases) | After generate_library_release_notes.py (or generate_library_batch.py) writes draft partials on your branch |
Generation drafts library shell plus partials; no branch/worktree or PR unless you create/open |
How should I generate library feature highlights?
1. Curate library highlight topics
- Run the interactive library feature curation script:
poetry run python scripts/curate_library_highlights.py --version {version}
# Include untagged highlight candidates when grouping topics:
# poetry run python scripts/curate_library_highlights.py --version {version} --include-candidates
# Resume after quitting with q:
# poetry run python scripts/curate_library_highlights.py --version {version} --resumeThe script will:
Build suggested topics from GitHub
highlightlabels (+ optional--include-candidatesfor untagged candidates)Show interactive prompts including each topic’s PR
TITLEandCONTENTSpreview (shared monthly partial helpers)At each topic, choose from:
Input Action 1or EnterApprove topic 2Skip topic 3Rename title and/or subtitle, then approve qQuit — Save progress to gitignored draft; re-run with --resumeWrite committed
library-highlights.json
- Spot-check
library-highlights.jsonto confirm approved topics and PR lists look correct:
- Open
releases/validmind-library/v{version}/library-highlights.json— Verify topic titles, slugs, and each topic’sprs[]entries before you commit. - Quitting with
qsaves a gitignored draft only — finish the session or use--resumebefore committing the manifest.
- Commit curated topics before reviewing orphan PRs:
git add releases/validmind-library/v{version}/library-highlights.json
git commit -m "Curate library highlights for v{version}"
git push
# Example — commit topics for 2.14.0 on the automation branch2. Review orphan PRs
We’ll perform an interactive review for PRs not linked to any approved highlight topic (therefore not wrapped up into highlights and still listed under their independent library category sections).
- Run the interactive orphan reporting script:
poetry run python scripts/report_library_orphan_prs.py --version {version}
# Report only (no prompts):
# poetry run python scripts/report_library_orphan_prs.py --version {version} --report-onlyThe script will:
Show interactive prompts including a PR’s
TITLE,CONTENTSpreview, andTAGS(when present)Auto-keep PRs with both
supportandbuglabels before the interactive loop (those orphans are not shown in prompts)For each orphan, choose from:
Input Action 1Promote to a highlight topic — Select a topic by number; syncs library-highlights.json2Hide PR — Sets hiddenon the wrapper and comment-outs the library shell include inrelease-notes.qmd3Keep PR — leave as an independent library category section qQuit — Save progress to library-orphan-prs.jsonand continue laterWrite
releases/validmind-library/v{version}/library-orphan-prs.jsonafter orphan review completes or on quit; on a full session (every orphan reviewed), also write pre-materialize{version}-library-highlights-overview.jsonand{version}-library-highlights-overview.md
Yes — before materializing highlights, rerun the same command to resume an incomplete session or review newly orphaned PRs:
- The script reloads
library-orphan-prs.json; orphans that already have a disposition are skipped, so only pending PRs appear in prompts. qquit saves progress tolibrary-orphan-prs.jsonso you can continue later.- Use
--dry-runto walk prompts without writinglibrary-orphan-prs.json, hide side effects, topic syncs, or overview files. - Use
--report-onlyto list orphans without interactive orphan review (add--acknowledgeto write a timestamped report). - To change an earlier orphan assignment, remove that PR from the
orphans[]array inlibrary-orphan-prs.jsonand undo any side effects before rerunning:- Hidden — Restore the wrapper’s
hiddencategory and uncomment the library shell include inrelease-notes.qmd - Promoted — Remove the PR from the target topic’s
prs[]inlibrary-highlights.json(otherwise it stays linked and will not reappear as an orphan) - Kept — Remove the
library-orphan-prs.jsonentry only; no other files change
- Hidden — Restore the wrapper’s
If you already materialized highlights and need to change orphan reviews:
Update orphan records and related topic or hide files as above.
Rerun orphan review, then materialize highlights —
- Rerun orphan review after undoing side effects —
report_library_orphan_prs.pyhas no--preserve-human-editsflag (that flag applies to initial generate/batch regenerate only):
poetry run python scripts/report_library_orphan_prs.py --version {version}- Use
--dry-runfirst on materialize to inspect planned changes without writing files — the script prints a JSON summary of topics and paths it would create or update (highlight partials, wrappers, library shell include comment-outs, promoted to highlight wrapperhiddentags) plus any warnings; it skips disk writes,--edit-highlightspolish, and overview output until you rerun without the flag:
poetry run python scripts/curate_library_highlights.py --version {version} --materialize --dry-run- Spot-check
{version}-library-highlights-overview.mdto confirm that PRs are grouped as expected:
- After a full orphan review session (every pending orphan reviewed), the script writes pre-materialize overview files under
releases/validmind-library/v{version}/:{version}-library-highlights-overview.md— Human-readable roll-up of highlight topics, orphans, and hidden PRs{version}-library-highlights-overview.json— Same payload in structured form
- Quitting with
qsaves progress tolibrary-orphan-prs.jsononly; it does not write or refresh the overview files — resume and finish the session before spot-checking. - Confirm topics, promoted orphans, hidden PRs, and kept orphans look correct before you commit and materialize.
- Commit updated orphan output before materializing highlights:
releases/validmind-library/v{version}/library-orphan-prs.json(from orphan review)releases/validmind-library/v{version}/{version}-library-highlights-overview.md(human-readable pre-materialize overview, full session)releases/validmind-library/v{version}/{version}-library-highlights-overview.json(structured pre-materialize overview, full session)releases/validmind-library/v{version}/library-highlights.json(promote sync)releases/validmind-library/v{version}/release-notes.qmd(hide — library shell include comment-outs)releases/validmind-library/v{version}/pr-{n}.qmdwrappers (hide —hiddencategory)
git add releases/validmind-library/v{version}/library-orphan-prs.json \
releases/validmind-library/v{version}/{version}-library-highlights-overview.md \
releases/validmind-library/v{version}/{version}-library-highlights-overview.json \
releases/validmind-library/v{version}/library-highlights.json \
releases/validmind-library/v{version}/release-notes.qmd
git add releases/validmind-library/v{version}/pr-*.qmd # Example — hidden wrappers if any
git commit -m "Add orphan PR review output for v{version}"
git push
# Example — commit orphan output for 2.14.0 on the automation branch3. Materialize library highlights
Finally, let’s put it all together.
- We’ll materialize the library feature highlights and pass in:
--edit-highlights— LLM polish on library highlight partials (_pr-*-highlights.qmd): rewrites###heading + prose columns when present; include-only partials are skipped. Does not touch topic wrappers (pr-*-highlights.qmd), individual_pr-{n}.qmd, or hidden PRs. Pass this flag every time you materialize.
# Inspect planned changes first
poetry run python scripts/curate_library_highlights.py --version {version} --materialize --dry-run
poetry run python scripts/curate_library_highlights.py --version {version} --materialize --edit-highlights
# Fail when orphan review is missing or stale:
# poetry run python scripts/curate_library_highlights.py --version {version} --materialize --edit-highlights --require-orphan-reviewMaterialize will:
- Embed
_pr-{n}.qmdintopr-{slug}-highlights.qmd/_pr-{slug}-highlights.qmd - Add
hiddento promoted to highlightpr-{n}.qmdwrappers - Update library
release-notes.qmd## Highlightsincludes and comment-out promoted to highlight category lines - Write post-materialize
{version}-library-release-overview.jsonand{version}-library-release-overview.md - Warn (or fail with
--require-orphan-review) whenlibrary-orphan-prs.jsonis missing or stale
Yes — after upstream curate or orphan fixes, rerun the same command to refresh highlight output:
- The script re-reads
library-highlights.jsonand rebuilds every approved topic from itsprs[]mappings, overwriting highlight partials (_pr-*-highlights.qmd) and topic wrappers (pr-*-highlights.qmd) — scaffold and any prior prose in those files is replaced. - Use
--dry-runto inspect planned changes without writing files — the script prints a JSON summary of topics and paths it would create or update (highlight partials, wrappers, library shell include comment-outs, promoted to highlightpr-{n}.qmdwrapperhiddentags) plus any warnings; it skips disk writes,--edit-highlightspolish, and overview output until you rerun without the flag. - Use
--require-orphan-reviewto block materialize when orphan disposition is incomplete. - Unlike orphan review, there is no human-edit protection on highlight partials — on every rerun it refreshes library shell and wrapper output:
- Highlight partials —
_pr-*-highlights.qmdscaffold and prose replaced (--edit-highlightsrewrites prose when present) - Topic wrappers —
pr-*-highlights.qmdtitle and structure replaced - Source partials —
_pr-{n}.qmddraft partials are not overwritten — materialize only embeds them via include expressions
- Highlight partials —
If you need to refresh highlights after upstream curate or orphan changes:
Update
library-highlights.json, orphan disposition side effects, or curation files as needed.Rerun materialize —
- Use
--dry-runfirst:
poetry run python scripts/curate_library_highlights.py --version {version} --materialize --dry-run- Rerun without
--dry-runto write highlight output and--edit-highlightsfor LLM polish — updates libraryrelease-notes.qmd## Highlightsincludes and comment-outs, setshiddenon promoted to highlightpr-{n}.qmdwrappers, and post-materialize overview files:
poetry run python scripts/curate_library_highlights.py --version {version} --materialize --edit-highlights| Scenario | Rerun? | Notes |
|---|---|---|
library-highlights.json changed |
Yes | Re-read topics and rebuild highlight output |
| Orphan disposition side-effect fixes (promote/hide/keep) | Yes | Refresh wrappers, partials, and library includes |
--dry-run surfaced missing partials or other upstream issues |
Yes | Fix upstream, then rerun without --dry-run |
Only hand-polished highlight prose (--edit-highlights or manual edits) you intend to keep |
No | Materialize overwrites highlight partials and wrappers |
| Stable refresh on automation branch | Yes | Automation re-dispatch preserves automatically via refresh_in_place; manual batch regenerate passes --preserve-human-edits. Feature releases set preserve_materialized=not is_patch so library-highlights.json, *highlights*, hidden wrappers, orphan JSON, and overview pairs on disk are kept |
- Spot-check
{version}-library-release-overview.mdto confirm materialized highlights look correct:
- Open
releases/validmind-library/v{version}/{version}-library-release-overview.md— Verify topic groupings, promoted orphans, hidden PRs, and kept orphans align with orphan review (§2) and curation (§1). - Cross-check highlight partials under
releases/validmind-library/v{version}/_pr-*-highlights.qmdand topic wrapperspr-*-highlights.qmdwhen you ran with--edit-highlights. - Use the
--dry-runcommand above first if you want a JSON summary of planned paths before writing files.
- Commit materialized highlight work:
releases/validmind-library/v{version}/release-notes.qmd(library shell —## Highlightssections and promoted include comment-outs)releases/validmind-library/v{version}/_pr-*-highlights.qmd(embedded highlight partials;--edit-highlightstargets)releases/validmind-library/v{version}/pr-*-highlights.qmd(topic wrappers)releases/validmind-library/v{version}/pr-{n}.qmd(promoted to highlight PR wrappers —hiddencategory)releases/validmind-library/v{version}/{version}-library-release-overview.md(post-materialize overview)releases/validmind-library/v{version}/{version}-library-release-overview.json(structured post-materialize overview)
git add releases/validmind-library/v{version}/release-notes.qmd \
releases/validmind-library/v{version}/{version}-library-release-overview.md \
releases/validmind-library/v{version}/{version}-library-release-overview.json
git add releases/validmind-library/v{version}/*-highlights.qmd \
releases/validmind-library/v{version}/pr-*.qmd # Example — topic wrappers and promoted hidden wrappers
git commit -m "Materialize library feature highlights for v{version}"
git push
# Example — commit materialized highlights for 2.14.0 on the automation branchAppendix
| Script | Purpose | Phase |
|---|---|---|
curate_library_highlights.py |
Interactive topic curation → library-highlights.json |
1 — Curate |
report_library_orphan_prs.py |
Orphan review for unlinked partials | 2 — Orphans |
curate_library_highlights.py --materialize |
Embed partials, library shell, overview | 3 — Materialize |
| Skill | When |
|---|---|
generate-release-notes |
Use in the final human proofread only, NOT to generate release notes as that is now taken care of by the automations/updated scripts — apply the Editing generated release notes process content rules |