name: voyager-release-notes description: >- Generate yb-voyager release notes from a commit range, formatted like the YugabyteDB Voyager release-notes docs page. Use when the user asks to draft release notes, summarize a release, or write what's-new entries for a voyager version.
Release Notes Generation
Overview
This skill produces a release-notes block for a yb-voyager version in the
same shape as the canonical docs page
(docs/content/stable/yugabyte-voyager/release-notes.md in the yugabyte-db
repo). The output is intended to be pasted into that file by a docs writer.
Output is printed to chat. After printing, ask the user whether to also write it to a markdown file and, if yes, where.
Inputs
Accept inputs in free-form prose from the user. Parse them into this block and confirm with the user before generating:
from: <commit SHA or tag — exclusive>
to: <commit SHA / branch / "HEAD" — inclusive>
version: <user-supplied, e.g., 2026.5.2>
Rules:
fromis exclusive,tois inclusive (matchesgit log from..to).- Always ask the user for the version number — do not auto-detect.
- Do not include a date in the output (header is
## v<version>, no " -"). - The user occasionally lists extra "exception commits" to force-include
(commits outside the range). When they do, add them to the block as
include_extra: [sha, sha]and feed them through the same pipeline as in-range commits. If they don't mention any, omit the field. - Show the parsed block, wait for explicit confirmation or edits, then proceed.
Pipeline
1. Gather commits
Run git log --oneline <from>..<to> to list candidate commits. Add any
include_extra SHAs to the list.
2. Fetch context for each commit
For every commit, gather both:
- The full commit message (
git log -1 --format='%H%n%s%n%n%b' <sha>). - The PR body, if the subject ends with
(#NNNN):gh pr view <N> --json title,body.
Run these fetches in parallel where possible. If gh fails for a given PR,
log a warning and proceed with the commit message alone.
3. Classify each commit
For every commit, decide:
(a) Is it relevant to users? Use your judgment. "Relevant" is broader than the PR template's "user-facing changes" question — it includes behaviour changes, new guardrails, bug fixes a user could hit, and so on, even when the PR description says "no user-facing changes." Always exclude:
- Tests (de-flakes, new test coverage, test infra).
- Refactors with no behaviour change.
- Callhome / telemetry payload changes.
- Internal infra / CI / build / agent-config commits.
- Version-bump commits.
(b) Which bucket does it belong in?
- New feature — a capability the user did not have before (new command, new flag enabling new behaviour, support for a new datatype/source/workflow).
- Enhancement — improvement to an existing capability (better UX, better performance, new guardrail on an existing flow, better error messages, broader applicability of an existing feature).
- Bug fix — corrects incorrect behaviour the user could hit.
When a commit could plausibly be either New feature or Enhancement, prefer Enhancement unless it clearly introduces something new.
4. Phrase each entry
Reduce each commit to what the user observes — the symptom that was fixed, the capability that was added, the behaviour that improved. State that and nothing more. Prefer a single sentence; never exceed two. The goal is a point a user can scan in one read, not a paragraph that re-explains the change.
- Describe the WHAT, never the WHY or HOW. Leave out the root cause and
the mechanism of the fix — those live in the PR, not the release note.
Write "Fixed an issue where
import datacould hang when--adaptive-parallelism-maxwas set below the defaultparallel-jobsvalue." Do not append why it hung (a blocked connection-pool init) or how it was fixed (capping parallelism to the user's max). The user only needs the symptom they could hit. - This rule applies to every bucket, not just bug fixes. A new feature says what the user can now do; an enhancement says what is now better — neither describes internals, data structures, or the code path that changed.
- Use plain text. No markdown links. No Hugo template tags. Code identifiers (commands, flags, SQLSTATEs, datatypes) go in backticks.
- Write for the user, not the contributor. Skip "we", "this PR", "root cause", file paths, function names, struct/field names.
- Start with the user-visible effect ("Fixed an issue where…", "Added…", "Improved…").
5. Render
Emit the block in this exact shape (omit any bucket with no entries):
## v<version>
### New features
- <entry>
- <entry>
### Enhancements
- <entry>
- <entry>
### Bug fixes
- <entry>
- <entry>
Use singular ### New feature / ### Enhancement / ### Bug fix when a
bucket has only one entry (matches existing docs convention).
6. Show the exclusion list
After the release-notes block, print a separate section listing every commit that was excluded, with the one-line reason:
---
**Excluded commits** (not user-facing):
- `<short-sha>` <subject> — <reason: tests | refactor | callhome | infra | version bump>
This lets the user spot anything that was mis-categorized in one glance.
7. Offer to write a file
After printing both blocks, ask the user whether to write the output to a markdown file. If yes, ask for the path. Do not write a file by default.
Anti-patterns
- Don't auto-detect or guess the version number — always ask.
- Don't include a date in the header.
- Don't emit Hugo-style relative links (
[x](../reference/...)) or absolute docs URLs — plain text only. - Don't silently drop a commit you're unsure about; include it under the closest bucket and the user can move it.
- Don't describe the implementation ("changed
cleanImportStateto passtableNamesinstead ofnonEmptyNts"). Describe the effect on the user. - Don't explain the cause or the fix mechanism. Write "Fixed an issue
where
import datacould intermittently fail against multi-node targets with a prepared-statement error" — not "the statement cache was keyed by backend PID, which isn't unique across nodes, so it's now keyed by the connection object." State only the symptom the user hit, in one sentence. - Don't pad a point to a paragraph. If the entry runs past two sentences, it's almost certainly carrying cause or mechanism that belongs in the PR — cut back to the user-visible symptom.
- Don't skip the confirmation block, even when the prose ask looks unambiguous — one parse error wastes more time than one round-trip.
- Don't write the release-notes file without being asked.