voyager-release-notes

star 55

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.

yugabyte By yugabyte schedule Updated 6/10/2026

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:

  • from is exclusive, to is inclusive (matches git 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 data could hang when --adaptive-parallelism-max was set below the default parallel-jobs value." 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 cleanImportState to pass tableNames instead of nonEmptyNts"). Describe the effect on the user.
  • Don't explain the cause or the fix mechanism. Write "Fixed an issue where import data could 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.
Install via CLI
npx skills add https://github.com/yugabyte/yb-voyager --skill voyager-release-notes
Repository Details
star Stars 55
call_split Forks 21
navigation Branch main
article Path SKILL.md
More from Creator