---
name: changelog-cleanup
description: >-
  Analyze and clean up the Upcoming Release section in CHANGELOG.md. Reviews
  each entry for grammar and logic issues, then sorts entries into named
  sections (New features, Changes, Bugfixes, Dependencies, Internal for
  non-customer-facing work, and Other as needed). Use when the user mentions
  changelog cleanup, changelog sorting, release notes review, or preparing a
  release.
---

# Changelog Cleanup

Cleans up the `## Upcoming Release` section of `CHANGELOG.md` in two phases:
grammar/logic review, then sorting into named sections.

## Changelog structure

Each release is a `## ` heading (e.g., `## Upcoming Release`, `## 2.3.6`).
Within a release, entries are organized under **named sections** — plain-text
labels followed by a colon, each followed by a blank line and then bullet
entries. For `## Upcoming Release`, use the section order defined in Phase 2
below. Older releases may use different section names (e.g., `Deprecations:`,
`Breaking changes:`, `Performance:`) or the legacy flat list.

Example structure:

```markdown
## 2.3.6

New features:

- Entry one

Changes:

- Entry two

Bugfixes:

- Entry three
- Entry four

Dependencies:

- Entry five

Internal:

- Entry visible only in Snowflake-internal or non-customer contexts (see below)
```

Older releases (before 2.3.6) use a legacy flat list of bullets with no named
sections. That format is no longer valid for new releases.

## Phase 1: Grammar and Logic Review

1. Read `CHANGELOG.md` and extract all content under `## Upcoming Release`
   (stop at the next `## ` heading).
2. For each entry, check for:
   - Spelling and grammar mistakes
   - Unclear or ambiguous phrasing
   - Logical issues (e.g., an entry starting with "Fixed" that actually
     describes a new feature, or contradictory statements)
   - Entries placed under the wrong section (e.g., a bug fix listed under
     "New features:", or a customer-visible change under `Internal:`)
3. When an issue is found, use the `AskQuestion` tool to present the proposed
   fix to the user. Provide two options: "Accept" and "Reject".
   Batch related fixes into a single `AskQuestion` call when possible to
   reduce round-trips, but keep each fix clearly labeled.
4. Apply only accepted fixes. Do not modify entries the user rejects.

## Phase 2: Sort Entries into Sections

After grammar/logic fixes are applied, sort entries into named sections.
The five sections below are the **defaults**, but you may rename, split, or
combine them when it makes the release easier for an end-user to scan — for
example, `Bugfixes and Performance:` instead of a single `Bugfixes:` bucket.
When proposing custom section names, use the `AskQuestion` tool to confirm
them with the user.

Default sections, in this order:

### Section 1 — `New features:`

Entries that semantically describe something new (e.g. `Added`), regardless of
the leading verb.

### Section 2 — `Changes:`

Entries that describe enhancing, changing, updating, removing, refactoring, or
modifying existing behavior (e.g. `Improved`, `Changed`, `Updated`, `Removed`,
`Replaced`), regardless of the leading verb. Dependency bumps belong in
`Dependencies:` (see Section 4), not here.

### Section 3 — `Bugfixes:`

Entries that semantically describe fixing incorrect behavior (e.g. `Fixed`),
regardless of the leading verb.

### Section 4 — `Dependencies:`

Customer-visible dependency changes: bumps (e.g. `Bumped axios to ...`),
removals, replacements, or pins of third-party packages that ship to customers.
Include CVE-driven bumps here. Omit this section if the release has no
dependency changes.

Internal-only dependency or tooling changes (e.g. dev-dependency bumps, CI
tooling) belong in `Internal:` instead.

### Section 5 — `Internal:`

Entries that **do not affect end customers** in any meaningful way: no change
to public API, connection options, query behavior, error handling, packaging, or
documented runtime for typical self-hosted or customer Snowflake workloads.

Use `Internal:` for Snowflake-internal execution contexts (e.g. driver behavior
only when running inside SPCS or similar), internal-only request fields or
telemetry that customers do not configure or observe, CI/release automation, or
repo hygiene with zero customer-visible impact.

**Do not** put here: dependency bumps that address CVEs or change shipped
binaries for customers, fixes to connection/auth/query bugs, or any feature a
customer could rely on outside Snowflake-managed environments.

Example (from this repo’s changelog):

```markdown
Internal:

- Included `spcs_token` when driver runs inside SPCS (org/repo#1372)
```

### Section 6 — Other (custom name)

If there are entries that don't fit the five default sections above, or if the
release would be clearer with different groupings (e.g., merging `Bugfixes:`
and a perf cluster into `Bugfixes and Performance:`), use the `AskQuestion`
tool to propose custom section names to the user.

### Sorting rules

- Use the first word after `- ` as a signal, but override when the meaning
  clearly fits a different section.
- Multi-line entries (parent + indented sub-bullets) stay as one unit.
- Preserve original relative order within each section.
- Omit sections that have no entries (don't output an empty section heading).
- Each section heading is followed by a blank line, then its bullet entries.
- Separate sections from each other with a blank line after the last bullet.
- Entries must not end with a trailing period. Remove any trailing `.` from
  bullet entries for consistency (a trailing `(...#1234)` reference already has
  no period after it, so nothing to remove in that case).

## Output format

The final output under `## Upcoming Release` must use named sections with
bullet entries. You may use the default section names or custom ones — whichever
makes the release easiest for an end-user to understand at a glance.

Example with default sections:

```markdown
## Upcoming Release

New features:

- Added support for OAuth tokens
- Added new `timeout` option

Changes:

- Improved error details when OAuth fails
- Changed default `jsonColumnVariantParser` to `JSON.parse`

Bugfixes:

- Fixed a crash when loading config
- Fixed typo in error message

Dependencies:

- Bumped axios to 1.15.1 to address CVE-2025-62718
- Dropped `uuid` dependency in favor of Node built-in `crypto.randomUUID()`

Internal:

- Included `spcs_token` when driver runs inside SPCS (org/repo#1372)
```

Example with custom sections (e.g., for a patch release):

```markdown
## Upcoming Release

Bugfixes and Performance:

- Reduced peak memory usage when streaming large result sets
- Fixed a crash when loading config

Dependencies:

- Bumped axios to 1.15.1 to address CVE-2025-62718

Internal:

- Extended login-request telemetry to detect cloud VMs
```
