Found while fixing #5923 (PR #6082), which corrected the guide's copy of this list. Not fixed there — that card's dispatch scoped the file surface to content/docs/guide/layout.md and nothing else. Filed unassigned for triage.
The claim
content/docs/layout/page-header.mdx:66-68:
subtitle is the canonical key: @objectstack/spec/ui's PageHeaderProps — the contract for the authored page:header node — declares title / subtitle / breadcrumb / actions / recordChrome / showStar / showCopyId / aria and has no description.
That is 8 keys. The shape declares 10 live ones.
Measurement
Against the installed @objectstack/spec17.2.0, walking the zod shape's declared keys (not a safeParse output-key list, which omits optional keys that carry no default):
DECLARED KEY COUNT: 11
["title","subtitle","icon","breadcrumb","actions","recordChrome",
"showStar","showCopyId","maxVisible","mobileMaxVisible","aria"]
icon optional -> never <-- ADR-0087 D2 tombstone, correctly excluded by this page
maxVisible optional -> number <-- not in the page's list
mobileMaxVisible optional -> number <-- not in the page's list
Both missing keys are live and authorable, and carry their own describe() text in the shape:
maxVisible — "How many header actions render as inline buttons before the rest fold into the overflow menu (renderer default 3)."mobileMaxVisible — "The maxVisible budget on mobile viewports (renderer default 1)."
Confirmed accepted: safeParse of an object carrying all ten live keys returns success, with maxVisible and mobileMaxVisible present in the output.
Severity note
Lower-impact than #5923's defect: this page's list omits two keys rather than naming a retired one, so an author following it writes nothing that gets rejected — they just never learn that the header's action-overflow budget is authorable. The page is otherwise accurate, and its handling of the icon spec-tombstone-vs-component-prop split is the clearest treatment of that distinction in the docs tree.
Why no gate caught it
Same structural reason as #5923: the claim is prose, not a code fence, so check-doc-component-types (type literals in code blocks) and check-doc-snippet-types (ts/tsx fence compilation, TS_FENCE_LANGUAGES = ["ts","tsx","typescript"]) are both blind to it. Unlike the guide page, content/docs/layout/page-header.mdx is not in UNGATED_DOCS either — it is covered at document level and still fence-blind to prose.
Found while fixing #5923 (PR #6082), which corrected the guide's copy of this list. Not fixed there — that card's dispatch scoped the file surface to
content/docs/guide/layout.mdand nothing else. Filed unassigned for triage.The claim
content/docs/layout/page-header.mdx:66-68:That is 8 keys. The shape declares 10 live ones.
Measurement
Against the installed
@objectstack/spec17.2.0, walking the zod shape's declared keys (not asafeParseoutput-key list, which omits optional keys that carry no default):Both missing keys are live and authorable, and carry their own
describe()text in the shape:maxVisible— "How many header actions render as inline buttons before the rest fold into the overflow menu (renderer default 3)."mobileMaxVisible— "ThemaxVisiblebudget on mobile viewports (renderer default 1)."Confirmed accepted:
safeParseof an object carrying all ten live keys returnssuccess, withmaxVisibleandmobileMaxVisiblepresent in the output.Severity note
Lower-impact than #5923's defect: this page's list omits two keys rather than naming a retired one, so an author following it writes nothing that gets rejected — they just never learn that the header's action-overflow budget is authorable. The page is otherwise accurate, and its handling of the
iconspec-tombstone-vs-component-prop split is the clearest treatment of that distinction in the docs tree.Why no gate caught it
Same structural reason as #5923: the claim is prose, not a code fence, so
check-doc-component-types(type literals in code blocks) andcheck-doc-snippet-types(ts/tsxfence compilation,TS_FENCE_LANGUAGES = ["ts","tsx","typescript"]) are both blind to it. Unlike the guide page,content/docs/layout/page-header.mdxis not inUNGATED_DOCSeither — it is covered at document level and still fence-blind to prose.