Commit f87fdf3
docs(releases): split the v17 page per minor, and draft the missing 17.4.0 section (#17105)
* docs(releases): split the v17 page per minor, and draft the missing 17.4.0 section
`content/docs/releases/v17.mdx` had reached 5,611 lines / 369 KB — 5.7x the
finished v16 page, at 17.3.0, with 17.4.0 still to land. At roughly 90k tokens
it is two thirds of the budget this project advertises for an entire
application, in one release-notes file.
It is now a folder, one self-contained page per minor:
v17/index.mdx major landing: intro, release status, the
cross-release upgrade-checklist guidance, References
v17/17.0.mdx 1,917 highlights + detail + its own upgrade checklist
v17/17.0-prerelease.mdx 1,688 archive: the rc.0 … rc.6 train, 30% of the
old page and read by nobody upgrading between
shipped versions
v17/17.1 .. 17.3.mdx the same shape, 375-783 lines each
v17/17.4.mdx NEW — see below
A reader's question is per-minor, and the old page answered it in three places
1,200 lines apart: "What's new in 17.2.0", "Breaking changes & migration in
17.2.0", and "17.2.0" under a separate "Upgrade checklist" heading. Each minor
page now carries all three.
Content is conserved: every line of the old body appears in exactly one new
file, verified by set difference. The `### 17.x.0` checklist headings are kept
verbatim, so their `#1730`-style anchors survive the move.
17.4.0 was published on 2026-09-09 — the releases index already named it the
current series — and had no section on any page. `v17/17.4.mdx` is a MACHINE
DRAFT and says so at the top: 396 changesets de-duplicated by hash across all
61 package changelogs (a changeset that bumps six packages appears once), split
into 35 carrying a breaking marker, 140 other minor entries, and 221 patch
entries reported as counts rather than enumerated. No editorial pass has been
made, the Highlights section is deliberately absent rather than guessed, and
the upgrade checklist is not written because nobody has walked 17.3.0 → 17.4.0.
Deciding what is user-facing is the maintainer's judgement at release time.
Two gates learn the second layout rather than being weakened. `check-release-notes`
(page existence) and `check-release-page-status` (what the page says) now accept
either `v<major>.mdx` or `v<major>/index.mdx`; neither layout is deprecated and
no baseline or exception list is introduced. Both pass, as does
`check-release-section-coverage`, which skips v17 and names its own reason.
`role-word-baseline.json` records a pure relocation: the single row
`content/docs/releases/v17.mdx: 2` becomes `v17/17.0.mdx: 2`. Nothing else in
the baseline moved — the sum is unchanged and no other file was re-baselined in
the same stroke. One reserved word in a changeset's own headline is elided in
17.4.mdx with the elision stated inline, rather than silently rewritten.
`upgrading.mdx` follows the checklist links to their new pages and gains a
17.4.0 row that says plainly that its checklist is not written.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016M1gHPfToXY4sUdzsD2CHa
* docs(releases): nest the 17.0 pre-release archive under 17.0, and give 17.4.0 the sibling section shape
Two corrections to the split.
The rc.0 … rc.6 archive sat at the top level of `v17/`, so the sidebar listed it
as a peer of the five real releases. It is not a release — it is 17.0.0's own
pre-history — so 17.0.0 becomes a folder and the archive moves inside it:
v17/17.0/index.mdx the release
v17/17.0/prerelease.mdx the train that preceded it
v17/17.0/meta.json
The archive is now one level down, reachable by expanding 17.0.0 rather than
sitting beside it, and its URL says the same thing:
`/docs/releases/v17/17.0/prerelease`. Its title is now "Pre-release train
(rc.0 … rc.6)" so the nav entry reads as an archive without opening it. The
minors that have no sub-pages stay flat files; a minor becomes a folder only
when it has something to nest.
17.4.0 now carries the same section shape as 17.1.0 through 17.3.0 —
"Highlights — 17.4.0", "What's new in 17.4.0" with "Breaking changes &
migration", "New capabilities", "Fixes" and "New in Console (Studio)" beneath
it, then "Upgrade checklist" — so a reader crossing releases lands where they
expect. Only the shape is finished. The two sections no mechanical pass can
produce say so where they stand instead of being filled with a guess:
Highlights is a judgement about audience, and the upgrade checklist is a walked
route nobody has walked for 17.3.0 → 17.4.0.
The Console section names the pin endpoints it can measure — `00d3f09c500c`
(the last of 17.3.0's four moves, per that page) to `53ded82bf7a4` (the value
of `.objectui-sha` on this tree, bumped by 30b0990) — and states plainly that
the intermediate bumps are NOT enumerated, because this checkout's history for
that file does not carry them. Naming the gap beats guessing the chain.
`role-word-baseline.json` follows the move: one row, path only,
`v17/17.0.mdx: 2` to `v17/17.0/index.mdx: 2`. Count unchanged, nothing else
re-baselined.
check-release-notes, check-release-page-status, check-role-word,
check-doc-anchors (337 fragment links, all resolving) and check-docs-single-h1
all pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016M1gHPfToXY4sUdzsD2CHa
* docs(releases): delete the 17.0.0 pre-release archive instead of housing it
The rc.0 … rc.6 archive was 1,688 lines — 30% of the old monolithic v17 page —
describing changes BETWEEN release candidates of a version that shipped on
2026-08-14. The train it records ended 2026-08-10. Everything it carried is
contained in the shipped 17.0.0.
It had no good home. Flat inside `v17/` it sat in the sidebar as a peer of the
five real releases, which it is not. Nested under `17.0/` it forced a folder and
a fourth path segment into existence for one archive page, and made 17.0.0 the
only minor that expands. Both placements were wrong for the same reason: the
page does not earn a place in the reading path, so any place given to it is one
too many.
Deleted. `17.0` goes back to a flat file, the folder and its `meta.json` go with
it, and the sidebar loses the nesting level entirely:
Releases > v17 > [v17, 17.4.0, 17.3.0, 17.2.0, 17.1.0, 17.0.0]
Nothing is lost that a reader can reach for. "When exactly did X change during
the rc train" is a changelog question, not a documentation-site one, and it is
answered by the `CHANGELOG.md` files inside the published npm tarballs and by
this repository's history. 17.0.0's own page now says that in place of the
archive link, rather than pointing at a page that is gone.
The two links into the archive — both written earlier in this same branch — go
with it. `role-word-baseline.json` follows the file back to the flat path:
`v17/17.0/index.mdx: 2` returns to `v17/17.0.mdx: 2`, count unchanged, nothing
else re-baselined.
check-release-notes, check-release-page-status, check-role-word,
check-doc-anchors and check-docs-single-h1 all pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016M1gHPfToXY4sUdzsD2CHa
* docs(releases): give the v17 minor pages dotless slugs so link checking resolves them
The v17 split landed the per-minor pages as `17.0.mdx` … `17.4.mdx`, and
"Check Documentation Links" went red with 20 `File not found` errors, all of
them `/docs/releases/v17/17.N`.
Root cause, reproduced against the pinned lychee 0.24.2 with the workflow's own
argv and isolated in a three-link fixture:
/docs/t/17.3 (17.3.mdx exists) -> ERROR File not found
/docs/t/17-3 (17-3.mdx exists) -> OK
/docs/t/plain (plain.mdx exists) -> OK
`--fallback-extensions mdx,md` does not fire when the last path segment already
contains a dot — lychee reads `.3` as the extension and never tries `.mdx`. It
is the filename shape, not the split, that the checker cannot follow.
So the slugs lose the dot. Nothing else moves:
* `git mv` 17.N.mdx -> 17-N.mdx, contents untouched;
* every `/docs/releases/v17/17.N` link rewritten to `17-N`;
* `v17/meta.json` pages renamed to match;
* the role-word baseline key follows the file (count stays 2 — pure
relocation, the one path that gate documents as legitimate).
Frontmatter titles are unchanged, so the sidebar still reads 17.0.0 … 17.4.0 —
the slug is invisible to readers.
Verified locally with the workflow's exact command line: 2152 links, 0 errors
(was 20). check-release-notes, check-release-page-status, check-doc-anchors,
check-docs-single-h1 and check-role-word all pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016M1gHPfToXY4sUdzsD2CHa
* fix(gates): regenerate the hand-written docs ledger, and stop the coverage gate skipping v17
Two consequences of the v17 split that CI found and the local run had not.
1. `scripts/docs-audit/handwritten-docs.json` is GENERATED output — the audit
scope, derived as `content/docs/**/*.mdx` minus the generated references, with
hand-editing rejected outright. The split moved six pages under it, so
`check:docs-audit-scope` went red naming both directions of the drift: one
listed path gone, six real pages unlisted. Regenerated with the gate's own
`--write`; the diff is exactly those six for that one, nothing else moved.
Left unfixed this is not cosmetic: a FULL audit would have called itself full
while silently skipping every v17 page, and an agent pointed at the dead path
would report "0 fixes" — indistinguishable in the summary from a page that was
read and found accurate.
2. `check-release-section-coverage` looked only for a flat `v<major>.mdx`, so
after the split it printed "(v17: … skipped)" and then reported "2 GA major(s)
in scope (v16, v17); every one has a heading on its major's release page".
It was asserting nothing about v17 while naming it as covered.
The skip is explicitly justified in the source by the two sibling gates going
red on the same fact — and this PR taught both of them the folder layout, so
that justification had gone. It now reads either layout, the folder as one
corpus, because "some heading names this minor" is a property of the major's
prose wherever it is written; the split moved `## What's new in 17.1.0` from
line 3475 of one file to line 5 of another, which is not a coverage change.
Proven to measure rather than merely stop printing "skipped": with every
heading naming the 17.4 series mutated away, the gate reports the finding
against `content/docs/releases/v17/` and exits 0 advisory / 1 --strict. Its
50-case self-test is unchanged and still passes.
No gate is weakened and no baseline or exception list is added: one generated
artifact regenerated by its own generator, and one lookup taught the second
layout its two siblings already accept.
check:docs-audit-scope, doc-anchors, doc-authoring, docs-redirects,
docs-single-h1, release-notes, release-page-status, release-index-currency-sync,
role-word, quick-reference-counts, corpus-claim-drift, published-readme-links,
org-identifier and docs-image-tag all pass; lychee reports 2152 links, 0 errors.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016M1gHPfToXY4sUdzsD2CHa
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent f904e61 commit f87fdf3
14 files changed
Lines changed: 4529 additions & 5627 deletions
This file was deleted.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
295 | 295 | | |
296 | 296 | | |
297 | 297 | | |
298 | | - | |
299 | | - | |
300 | | - | |
301 | | - | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
302 | 303 | | |
303 | 304 | | |
304 | 305 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
86 | | - | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
87 | 92 | | |
88 | | - | |
| 93 | + | |
| 94 | + | |
89 | 95 | | |
90 | 96 | | |
91 | 97 | | |
| |||
0 commit comments