Repository: open-gsd/gsd-core (2026-07-21T18:52:01Z)

Issue:
fix: changeset fragments whose body starts with a newline render as an empty bullet and are dropped from release notes
### GSD Version

1.7.0 (reproduced on `next` @ 343521808)

### Runtime

Claude Code

### Operating System

macOS

### Node.js Version

v26.5.0

### Installation Method

Source checkout (`next`)

### What happened?

A changeset fragment whose body begins with a line terminator renders as an **empty `- ` bullet followed by an orphaned paragraph** in `CHANGELOG.md`. Because `parseChangelog` (`scripts/changeset/serialize.cjs`) treats a non-indented line as *terminating* a bullet, the orphaned paragraph is then **silently dropped** when `scripts/changeset/github-release-notes.cjs` re-parses `CHANGELOG.md` to build the GitHub Release body.

Net effect: the entry disappears from the published release notes entirely.

There are **two independent root causes**, both in `scripts/changeset/parse.cjs`:

1. **`extractDocsExempt` (line ~68)** — the cleanup chain strips trailing line terminators via `.replace(/[\r\n]+$/, '')` but has no leading equivalent. `DOCS_EXEMPT_RE` is anchored `^...$` with the `m` flag, so removing a `<!-- docs-exempt: ... -->` marker deletes the marker text but `$` does not consume the `\n` terminating its line. When the marker occupies the **first** line of the body, that leftover `\n` becomes the body's new first character.

2. **`parseFragment` (line ~104)** — the body is preserved verbatim after the frontmatter, so a fragment authored with a blank line between the closing `---` and the first content line yields a body starting with `\n`. This path has no docs-exempt marker at all, so fix (1) does not cover it.

Discovered while cutting the 1.8.0 release: **8 of 256** pending fragments are affected, split 4/4 across the two causes.

Affected fragments on `next` @ 343521808:

```
1682-opencode-mcp-binding.md
1682-opencode-subset-dialect.md
2002-cli-self-healing-runtime-build.md
2097-eos-augment-imperative-adapter.md
2098-eos-codebuddy.md
2099-eos-copilot.md
calm-eagles-tumble.md
lucky-tigers-leap.md
```

### What did you expect?

Every fragment renders as a single well-formed `- <body> (#NNNN)` bullet that survives a `serializeChangelog` → `parseChangelog` round-trip with its content intact, regardless of whether the body opens with a docs-exempt marker or authoring whitespace.

### Steps to reproduce

1. Check out `next` @ `343521808`.
2. Run the fragment scan:

```bash
node -e '
const fs=require("fs"),p=require("path"),{parseFragment}=require("./scripts/changeset/parse.cjs");
let bad=0;
for (const f of fs.readdirSync(".changeset")) {
  if (!f.endsWith(".md") || f === "README.md") continue;
  const r = parseFragment(fs.readFileSync(p.join(".changeset", f), "utf8"));
  if (r.ok && /^[\r\n]/.test(r.fragment.body)) { bad++; console.log("affected:", f); }
}
console.log("affected count:", bad);'
```

3. Observe 8 affected fragments.
4. Render the changelog and inspect the emitted section:

```bash
node scripts/changeset/cli.cjs render --version 1.8.0 --date 2026-07-21 --allow-empty
awk '/^## \[1\.8\.0\]/{f=1;next} /^## \[/{f=0} f' CHANGELOG.md | grep -n '^-[[:space:]]*$'
```

5. Observe empty `- ` bullets, each followed by a non-indented paragraph carrying the real entry text.

### Error output / logs

Rendered output before the fix (from the 1.8.0 finalize dry run, run 29853013459):

```diff
+- **Phases that integrate an external API/SDK/service ...** (#1562) (#2065)
+- 
+**OpenCode installs now auto-register the GSD companion MCP server (`mcp.gsd`)** — ... (#1682) (#1929)
+- 
+**OpenCode plugin handles `session.idle` + the `opencode-subset` hook dialect ...** (#1682) (#1930)
```

### How often does this happen?

Always — deterministic for any fragment whose body begins with a line terminator.

### Impact

Release-notes data loss. Eight user-facing entries — including the OpenCode MCP binding (#1682), the pi extension (#1965), and the EoS Augment/CodeBuddy/Copilot adapters (#2097/#2098/#2099) — would have been omitted from the v1.8.0 GitHub Release. Caught during the 1.8.0 finalize dry run before publish; the release is held pending this fix.

### Workaround (if any)

Hand-edit the affected fragments to remove the leading blank line / move the docs-exempt marker off the first line, or correct the GitHub Release body after the fact with `gh release edit`. Neither addresses the underlying parser defect.

### Additional context

`CHANGELOG.md` is a shipped artifact, so this silently degrades every release containing an affected fragment, not just 1.8.0.



Discussion:
Branch `fix/2488-fix-changeset-fragments-whose-body-start` created.

```bash
git fetch origin && git checkout fix/2488-fix-changeset-fragments-whose-body-start
```



Patch:
diff --git a/scripts/changeset/parse.cjs b/scripts/changeset/parse.cjs
index 4787b0cfcd..30a057eca9 100644
--- a/scripts/changeset/parse.cjs
+++ b/scripts/changeset/parse.cjs
@@ -65,10 +65,23 @@ function extractDocsExempt(body) {
   // is CRLF-aware so Windows-authored fragments don't leave residual `\r`
   // characters that would shift the `(#NNNN)` PR suffix to a blank line in
   // the rendered CHANGELOG.md / GitHub release-notes bullet.
+  //
+  // Both leading AND trailing line terminators are stripped. `DOCS_EXEMPT_RE`
+  // removes the marker's own text but its `$` anchor (multiline mode) does
+  // not consume the `\n` that terminates the marker's line. When the marker
+  // is the FIRST line of the body, that leftover `\n` becomes the new first
+  // character of `body` — serializeChangelog then emits an empty `- ` bullet
+  // followed by an orphaned continuation paragraph, and parseChangelog's
+  // bullet-continuation check (which requires a leading `\s`) treats that
+  // non-indented paragraph as terminating the bullet, silently dropping the
+  // entry's content on re-parse. Stripping leading terminators here closes
+  // that gap the same way the trailing strip already does for the opposite
+  // (marker-last) position.
   const cleaned = body
     .replace(DOCS_EXEMPT_RE, '')
     .replace(/[ \t\r]+$/gm, '')             // strip trailing \r/spaces on each line
     .replace(/(?:\r?\n){3,}/g, '\n\n')      // collapse 3+ blank lines (CRLF-aware)
+    .replace(/^[\r\n]+/, '')                // strip terminators left by a first-line marker
     .replace(/[\r\n]+$/, '');               // strip every trailing line terminator
   return { docsExempt: reason, body: cleaned };
 }
@@ -105,6 +118,19 @@ function parseFragment(src) {
   if (body.endsWith('\r\n')) verbatimBody = body.slice(0, -2);
   else if (body.endsWith('\n')) verbatimBody = body.slice(0, -1);
   else verbatimBody = body;
+  // Some fragments have a blank line between the closing frontmatter `---`
+  // and the first line of actual content (purely a stylistic authoring
+  // choice — the blank line carries no significant content, unlike
+  // indentation inside a code block). Strip any such leading blank line(s)
+  // here, mirroring the trailing-terminator strip above. Without this,
+  // `body` starts with `\n`/`\r\n`, serializeChangelog emits an empty `- `
+  // bullet followed by an orphaned paragraph, and parseChangelog's
+  // continuation check (requires a leading `\s` on the line) treats that
+  // non-indented paragraph as terminating the bullet — silently dropping
+  // the fragment's content on re-parse. This is the same downstream failure
+  // mode as a first-line docs-exempt marker (see extractDocsExempt below);
+  // it just arises from plain authoring whitespace instead of a marker.
+  verbatimBody = verbatimBody.replace(/^(?:[ \t]*\r?\n)+/, '');
   const { docsExempt, body: visibleBody } = extractDocsExempt(verbatimBody);
   if (!visibleBody.trim()) return { ok: false, reason: FRAGMENT_ERROR.EMPTY_BODY };
 


Test patch:
diff --git a/tests/changeset-parse.test.cjs b/tests/changeset-parse.test.cjs
index 4c71721e0a..aa1f09193b 100644
--- a/tests/changeset-parse.test.cjs
+++ b/tests/changeset-parse.test.cjs
@@ -27,6 +27,48 @@ describe('changeset parse: fragment file → typed record (#2975)', () => {
     assert.equal(r.fragment.body, '```js\nlet x = 1;\n```');
   });
 
+  test('strips a blank line between the frontmatter close and the body content (no marker involved)', () => {
+    // Same downstream failure mode as a first-line docs-exempt marker, but
+    // triggered purely by authoring whitespace (a blank line right after the
+    // closing `---`) with no docs-exempt marker present at all — a distinct
+    // root cause than extractDocsExempt's marker-stripping path, discovered
+    // via the .changeset/ fleet scan while regression-testing #1929.
+    const src = '---\ntype: Changed\npr: 2036\n---\n\n**Bold text describing the fix.** More detail follows.\n';
+    const r = parseFragment(src);
+    assert.equal(r.ok, true);
+    assert.equal(r.fragment.docsExempt, null);
+    assert.doesNotMatch(r.fragment.body, /^[\r\n]/);
+    assert.match(r.fragment.body, /^\*\*Bold text describing the fix\.\*\*/);
+  });
+
+  test('CRLF variant: blank line between frontmatter close and body content is stripped identically', () => {
+    const src = '---\r\ntype: Changed\r\npr: 2036\r\n---\r\n\r\n**Bold text describing the fix.** More detail follows.\r\n';
+    const r = parseFragment(src);
+    assert.equal(r.ok, true);
+    assert.doesNotMatch(r.fragment.body, /^[\r\n]/);
+    assert.doesNotMatch(r.fragment.body, /[\r]/);
+    const lfSrc = '---\ntype: Changed\npr: 2036\n---\n\n**Bold text describing the fix.** More detail follows.\n';
+    assert.equal(r.fragment.body, parseFragment(lfSrc).fragment.body);
+  });
+
+  test('end-to-end: leading-blank-line fragment survives serializeChangelog → parseChangelog round-trip', () => {
+    const src = '---\ntype: Changed\npr: 2036\n---\n\n**Bold text describing the fix.** More detail follows.\n';
+    const r = parseFragment(src);
+    assert.equal(r.ok, true);
+
+    const { serializeChangelog, parseChangelog } = require(path.join(__dirname, '..', 'scripts', 'changeset', 'serialize.cjs'));
+    const out = serializeChangelog({
+      releaseHeader: { version: '1.0.0', date: '2026-01-01' },
+      sections: [{ type: 'Changed', bullets: [{ pr: r.fragment.pr, body: r.fragment.body }] }],
+      priorChangelog: null,
+    });
+    const parsed = parseChangelog(out);
+    assert.equal(parsed.releases.length, 1);
+    assert.deepEqual(parsed.releases[0].sections, [
+      { type: 'Changed', bullets: [{ body: '**Bold text describing the fix.** More detail follows.', pr: 2036 }] },
+    ]);
+  });
+
   test('exposes a frozen FRAGMENT_ERROR enum with the documented codes', () => {
     assert.deepEqual(
       Object.keys(FRAGMENT_ERROR).sort(),
@@ -176,6 +218,58 @@ describe('changeset parse: docs-exempt extraction (#3213)', () => {
     assert.match(r.fragment.body, /bug fix\./);
   });
 
+  test('marker as the FIRST line of the body does not leave a leading line terminator (root-cause fix)', () => {
+    // Before the fix: DOCS_EXEMPT_RE's `$` (multiline mode) does not consume
+    // the `\n` terminating the marker's own line, so when the marker is the
+    // first line, `body` was left starting with `\n`. serializeChangelog then
+    // emits an empty `- ` bullet followed by an orphaned paragraph, and
+    // parseChangelog's continuation check (requires leading `\s`) treats the
+    // non-indented paragraph as terminating the bullet — dropping the
+    // content on re-parse.
+    const src = '---\ntype: Fixed\npr: 1929\n---\n<!-- docs-exempt: first-line marker -->\nBold text describing the fix.\n';
+    const r = parseFragment(src);
+    assert.equal(r.ok, true);
+    assert.equal(r.fragment.docsExempt, 'first-line marker');
+    assert.doesNotMatch(r.fragment.body, /^[\r\n]/);
+    assert.match(r.fragment.body, /Bold text describing the fix\./);
+  });
+
+  test('CRLF-authored fragment with a FIRST-line marker: same leading-terminator fix applies', () => {
+    const src = '---\r\ntype: Fixed\r\npr: 1929\r\n---\r\n<!-- docs-exempt: first-line marker -->\r\nBold text describing the fix.\r\n';
+    const r = parseFragment(src);
+    assert.equal(r.ok, true);
+    assert.equal(r.fragment.docsExempt, 'first-line marker');
+    assert.doesNotMatch(r.fragment.body, /^[\r\n]/);
+    assert.doesNotMatch(r.fragment.body, /[\r]/);
+    // LF- and CRLF-authored variants of the same fragment must produce the
+    // identical body — the recurring CRLF bug class (#1658/#1668/#2206/
+    // #2449/#2450) means these two must never diverge.
+    const lfSrc = '---\ntype: Fixed\npr: 1929\n---\n<!-- docs-exempt: first-line marker -->\nBold text describing the fix.\n';
+    const lfResult = parseFragment(lfSrc);
+    assert.equal(r.fragment.body, lfResult.fragment.body);
+  });
+
+  test('end-to-end: FIRST-line marker fragment survives serializeChangelog → parseChangelog round-trip (#1929 pin)', () => {
+    // This is the assertion that pins the user-visible defect: a dropped
+    // bullet in GitHub release notes (scripts/changeset/github-release-notes.cjs),
+    // built by feeding the CHANGELOG.md text through parseChangelog.
+    const src = '---\ntype: Fixed\npr: 1929\n---\n<!-- docs-exempt: first-line marker -->\nBold text describing the fix.\n';
+    const r = parseFragment(src);
+    assert.equal(r.ok, true);
+
+    const { serializeChangelog, parseChangelog } = require(path.join(__dirname, '..', 'scripts', 'changeset', 'serialize.cjs'));
+    const out = serializeChangelog({
+      releaseHeader: { version: '1.0.0', date: '2026-01-01' },
+      sections: [{ type: 'Fixed', bullets: [{ pr: r.fragment.pr, body: r.fragment.body }] }],
+      priorChangelog: null,
+    });
+    const parsed = parseChangelog(out);
+    assert.equal(parsed.releases.length, 1);
+    assert.deepEqual(parsed.releases[0].sections, [
+      { type: 'Fixed', bullets: [{ body: 'Bold text describing the fix.', pr: 1929 }] },
+    ]);
+  });
+
   test('marker on its own line trailing a fragment body still wins (real-marker positive case)', () => {
     const src =
       '---\ntype: Added\npr: 3213\n---\n' +
diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json
index 712c873356..6850d50e70 100644
--- a/tests/fixtures/golden-install-parity/antigravity.json
+++ b/tests/fixtures/golden-install-parity/antigravity.json
@@ -358,7 +358,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json
index 40e0957f8b..2f87ab10d1 100644
--- a/tests/fixtures/golden-install-parity/augment.json
+++ b/tests/fixtures/golden-install-parity/augment.json
@@ -428,7 +428,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/claude-local.json b/tests/fixtures/golden-install-parity/claude-local.json
index d5553e30ef..f221906374 100644
--- a/tests/fixtures/golden-install-parity/claude-local.json
+++ b/tests/fixtures/golden-install-parity/claude-local.json
@@ -427,7 +427,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json
index d628bd5273..243a6fc0db 100644
--- a/tests/fixtures/golden-install-parity/claude.json
+++ b/tests/fixtures/golden-install-parity/claude.json
@@ -356,7 +356,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json
index 063c6cb017..45f33abe1e 100644
--- a/tests/fixtures/golden-install-parity/cline.json
+++ b/tests/fixtures/golden-install-parity/cline.json
@@ -332,7 +332,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json
index fd6a1379a8..c49a5a2985 100644
--- a/tests/fixtures/golden-install-parity/codebuddy.json
+++ b/tests/fixtures/golden-install-parity/codebuddy.json
@@ -428,7 +428,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json
index 3efbf4d1f1..4cec23e931 100644
--- a/tests/fixtures/golden-install-parity/codex.json
+++ b/tests/fixtures/golden-install-parity/codex.json
@@ -437,7 +437,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json
index b6545a26d9..9ba02f53ab 100644
--- a/tests/fixtures/golden-install-parity/copilot.json
+++ b/tests/fixtures/golden-install-parity/copilot.json
@@ -331,7 +331,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json
index c4dcf0b794..d7a5ca7454 100644
--- a/tests/fixtures/golden-install-parity/cursor.json
+++ b/tests/fixtures/golden-install-parity/cursor.json
@@ -406,7 +406,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json
index 203dc7b702..fbf0d23989 100644
--- a/tests/fixtures/golden-install-parity/hermes.json
+++ b/tests/fixtures/golden-install-parity/hermes.json
@@ -357,7 +357,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json
index 388473bb7e..df9b47f9da 100644
--- a/tests/fixtures/golden-install-parity/kilo.json
+++ b/tests/fixtures/golden-install-parity/kilo.json
@@ -430,7 +430,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json
index 1ddb7297cd..41b26045ae 100644
--- a/tests/fixtures/golden-install-parity/kimi.json
+++ b/tests/fixtures/golden-install-parity/kimi.json
@@ -393,7 +393,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json
index ffdc3f2714..3d8bd5a30f 100644
--- a/tests/fixtures/golden-install-parity/opencode.json
+++ b/tests/fixtures/golden-install-parity/opencode.json
@@ -430,7 +430,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/pi.json b/tests/fixtures/golden-install-parity/pi.json
index 0c5c73a82a..a997d3883b 100644
--- a/tests/fixtures/golden-install-parity/pi.json
+++ b/tests/fixtures/golden-install-parity/pi.json
@@ -324,7 +324,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json
index 97c3ce5135..ac252e85b4 100644
--- a/tests/fixtures/golden-install-parity/qwen.json
+++ b/tests/fixtures/golden-install-parity/qwen.json
@@ -357,7 +357,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json
index ff5c2cab9e..8caa9b50a5 100644
--- a/tests/fixtures/golden-install-parity/trae.json
+++ b/tests/fixtures/golden-install-parity/trae.json
@@ -329,7 +329,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json
index e9b637d201..7a65a4c05b 100644
--- a/tests/fixtures/golden-install-parity/windsurf.json
+++ b/tests/fixtures/golden-install-parity/windsurf.json
@@ -331,7 +331,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",
diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json
index 6e59d951ee..49951300b4 100644
--- a/tests/fixtures/golden-install-parity/zcode.json
+++ b/tests/fixtures/golden-install-parity/zcode.json
@@ -400,7 +400,7 @@
   "scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
   "scripts/changeset/lint.cjs": "23cb53f77a6ea180",
   "scripts/changeset/new.cjs": "4991e21fd17f5541",
-  "scripts/changeset/parse.cjs": "f9a949cbcab56445",
+  "scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
   "scripts/changeset/render.cjs": "e47bc3e1587c3cae",
   "scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
   "scripts/fix-slash-commands.cjs": "0519742531ff3529",