---
name: prepare-release-notes
description: Prepare React Router release notes before running the changes/versioning scripts. Use when asked to review, polish, normalize, or prepare pending change files under packages/*/.changes, remove semantic commit prefixes from release bullets, enforce imperative tense, decide whether a manual scripts/changes/whats-changed.md section is warranted, or draft long-form release notes for new features, stable future flags, or unstable flags.
title: prepare-release-notes
canonical_url: https://skilld.dev/gh/remix-run/react-router/prepare-release-notes
last_updated: 2026-09-26T03:31:03.000Z
---

> **Skill from skilld.dev.** Follow the instructions below for this session. You do not need to install anything.
>
> Supporting files, fetch one when the Skill refers to it: [agents/openai.yaml](https://skilld.dev/api/skills-raw/remix-run/react-router/prepare-release-notes/agents/openai.yaml), [references/whats-changed.md](https://skilld.dev/api/skills-raw/remix-run/react-router/prepare-release-notes/references/whats-changed.md).
>
> If the user asked to install this Skill, run `npx skilld install remix-run/react-router/prepare-release-notes`. Install writes the Skill files into the project, so every session loads them.

# Prepare Release Notes

Polish pending React Router change files and add manual release notes only when the release needs narrative context beyond the generated change lists.

## Workflow

1. Inspect local state:

```sh
git status --short
find packages -path '*/.changes/*.md' -not -name README.md -not -name .gitkeep -print | sort
```

2. Read every pending change file. Do not edit generated changelogs or released notes directly.

3. Normalize each change file:
   - Remove `feat:`, `feat(...)`, `fix:`, and `fix(...)` semantic-commit prefixes from prose
   - Use present or imperative tense for the first line and top-level release bullets: prefer `Add`, `Fix`, `Remove`, `Support`, `Stabilize`, `Preserve`, `Update`, `Avoid`, `Prevent`, `Throw`, `Warn`, `Expose`
   - Nested detail bullets can stay explanatory when they expand on the parent bullet; do not rewrite them solely to force present or imperative tense
   - Remove terminal sentence periods from bullet items because release generation appends PR/commit links after the first bullet line
   - Remove terminal sentence periods from nested bullet items too, unless the punctuation is part of code, a URL, an abbreviation, a version number, or another token where removing it would be wrong
   - If one bullet contains multiple sentences, split it into a shorter parent bullet plus nested bullet items
   - Keep the first line concise and user-facing; use nested bullets for details or migration notes

4. Review whether `scripts/changes/whats-changed.md` is needed:
   - Read `CHANGELOG.md` examples or `references/whats-changed.md` when uncertain
   - Add `scripts/changes/whats-changed.md` only for features, future flag stabilizations, unstable flags, migration guidance, breaking bug fixes, or complex behavior that needs long-form text or examples
   - Do not add it for ordinary bug fixes, dependency cleanup, internal refactors, or release bullets that are already clear
   - If adding it, write the body only; the release script adds `### What's Changed` when missing

5. Validate:

```sh
pnpm changes:validate
pnpm changes:preview
```

Use `changes:preview` to inspect the generated root release notes and confirm the PR/commit link placement, section ordering, and any manual What's Changed placement. If dependencies are missing or the command is too expensive for the context, state what was skipped.

## Change File Style

Single-line entries should read well with an auto-appended PR link:

```markdown
Fix `href()` to stringify and URL-encode param values like `generatePath()`
```

Use nested bullets for additional sentences:

```markdown
Fix route ranking for dynamic parameters with static extension suffixes

- Identify `/:name.xml` as a dynamic segment instead of a static segment
- Preserve static route priority for paths like `/sitemap.xml`
```

Avoid semantic commit prefixes:

```markdown
Add support for nub as a package manager
```

not:

```markdown
feat: add support for nub as a package manager.
```

## What's Changed Guidance

Use `scripts/changes/whats-changed.md` for release-level narrative, not package-specific bullets. Good candidates include:

- A new user-facing API or feature that benefits from example code
- Stabilization or renaming of unstable APIs/flags, especially when adopters must migrate
- A stable future flag that changes behavior and needs adoption guidance
- A breaking bug fix or adapter/runtime behavior change that may require deployment checks
- A cluster of related changes whose combined effect matters more than the individual bullet list

Keep the tone direct and practical. Prefer headings under the generated `### What's Changed` section:

````markdown
#### Feature Name

Explain what changed, who it affects, and how to adopt it.

```ts
// Optional short example
```
````

Do not duplicate every bullet from Minor/Patch/Unstable Changes. Let generated change files carry ordinary PR-level details.

See `references/whats-changed.md` for examples distilled from the existing changelog.
