One-liner
Four pages under content/docs/releases/** render two or three <h1>. #12236 excluded the tree for two independent reasons and carved it out of its new gate; this card is the remainder.
Measured on origin/main at 20b0fdb
content/docs/releases/implementation-status.mdx:6 # Implementation Status Matrix (== the frontmatter title)
content/docs/releases/v15.mdx:66,342 # 15.0.0 in detail / # What's new in 15.1.0
content/docs/releases/v16.mdx:117,860 # 16.0.0 in detail / # What's new in 16.1.0
content/docs/releases/v17.mdx:209,3382 # 17.0.0 in detail / # What's new in 17.1.0
Why it is two different jobs
implementation-status.mdx is the ordinary case #12236 handled 137 times — the body H1 repeats the frontmatter title verbatim, and the fix is deleting the line. It was left only because CLAUDE.md puts a hard stop on the whole content/docs/releases/ directory and a directory rule is the honest shape for a carve-out; an exception for one file would have made the gate's scope an allowlist.
The three v*.mdx are NOT mechanical. Their # headings are genuine top-level section dividers with ## children:
## Highlights — 15.0.0
# 15.0.0 in detail <- demoting this alone makes it a sibling of its own children
## New features in 15.0.0 (additive)
## Breaking changes & migration (15.0.0)
# What's new in 15.1.0
## New capabilities in 15.1.0
A correct fix cascades every descendant down one level, which is a structural rewrite of release notes, not a heading demotion. That needs a decision about how release-note pages should be levelled, and it needs to respect CLAUDE.md's rule that these pages are written centrally at release time.
Acceptance
One-liner
Four pages under
content/docs/releases/**render two or three<h1>. #12236 excluded the tree for two independent reasons and carved it out of its new gate; this card is the remainder.Measured on
origin/mainat 20b0fdbWhy it is two different jobs
implementation-status.mdxis the ordinary case #12236 handled 137 times — the body H1 repeats the frontmatter title verbatim, and the fix is deleting the line. It was left only becauseCLAUDE.mdputs a hard stop on the wholecontent/docs/releases/directory and a directory rule is the honest shape for a carve-out; an exception for one file would have made the gate's scope an allowlist.The three
v*.mdxare NOT mechanical. Their#headings are genuine top-level section dividers with##children:A correct fix cascades every descendant down one level, which is a structural rewrite of release notes, not a heading demotion. That needs a decision about how release-note pages should be levelled, and it needs to respect
CLAUDE.md's rule that these pages are written centrally at release time.Acceptance
content/docs/releases/**contains a body-level#headingv*.mdxstill nests (a "in detail" section still owns its subsections)content/docs/releases/**carve-out is deleted fromscripts/check-docs-single-h1.mjs— that gate FAILS when an excluded tree becomes clean, so this is mechanical, not a thing to remember