The observation
content/docs/ui/pages.mdx routes both source-authoring tiers to
content/docs/ui/react-pages.mdx:
pages.mdx:66 — the source row: "For kind: 'html' it is constrained JSX/HTML
compiled to the tree by @objectstack/sdui-parser at save time … See
React Pages"
pages.mdx:116 — "See React Pages for the full authoring guide"
pages.mdx:295 — "React Pages — The html and react
source-authoring tiers in full"
But on that page only the first two sections are tier-neutral. Its headings on
origin/main:
20 ## Choosing between `react` and `html` <- tier-neutral
47 ## The security gate <- tier-neutral
64 ## What is in scope <- react only, unmarked
93 ## Blocks take flat props <- react only, unmarked
114 ### `Block` — the escape hatch <- react only, unmarked
128 ## Live data <- react only, unmarked
166 ## Styling — a page's source is metadata… <- both, says so inline
229 ## Accepted source shapes <- react only, unmarked
247 ## When something throws <- react only, unmarked
257 ## Page state <- react only, unmarked
270 ## `record:*` blocks are not in this tier <- react only; "this tier" is unbound
295 ## How you check your work <- react only, unmarked
340 ## A complete page <- react only, unmarked
Line 270 is the sharpest instance: a heading whose entire meaning rests on "this tier"
sits on a page the docs advertise as covering two of them.
Why it is a finding and not a queue card
An html-tier reader arriving from any of the three pages.mdx links reads the whole page
as if it applied to them. That is the mechanism behind #12650, where the page's
PascalCase naming sentence (react-tier) was read as the html-tier rule and produced a
save-time rejection with nothing on the page naming the broken rule. #13734 closed that
one trap with one sentence plus an "On this tier" scoping — the correct size for that
card, and deliberately not a restructure.
What is left is a docs-architecture question with more than one defensible answer: split
the page into an html-tier page and a react-tier page (and repoint the three pages.mdx
links per tier), or mark the react-tier half once at ## What is in scope and leave the
page whole. Both are larger than a repair, and picking one is not the dev's call on a
naming card — so this is filed for grading rather than dispatched.
Not yet measured
Whether any further html-tier trap remains on the page after #13734. Only the naming rule
was audited; the other react-only sections were not checked for statements an html author
could act on wrongly (## Live data / useAdapter and ## Page state are the likely
candidates — neither exists on the html tier).
Provenance
Reported by the dev implementing #12650, explicitly as an observation and not a defect
("A2.3 said one sentence, and one sentence is what the defect needed"). Heading census
and the three pages.mdx link sites verified independently against origin/main by the
domain:devx PM seat. The sibling instance in the other repo is filed separately as
objectstack-ai/objectui#7006.
Generated by Claude Code
The observation
content/docs/ui/pages.mdxroutes both source-authoring tiers tocontent/docs/ui/react-pages.mdx:pages.mdx:66— thesourcerow: "Forkind: 'html'it is constrained JSX/HTMLcompiled to the tree by
@objectstack/sdui-parserat save time … SeeReact Pages"
pages.mdx:116— "See React Pages for the full authoring guide"pages.mdx:295— "React Pages — Thehtmlandreactsource-authoring tiers in full"
But on that page only the first two sections are tier-neutral. Its headings on
origin/main:Line 270 is the sharpest instance: a heading whose entire meaning rests on "this tier"
sits on a page the docs advertise as covering two of them.
Why it is a finding and not a queue card
An html-tier reader arriving from any of the three
pages.mdxlinks reads the whole pageas if it applied to them. That is the mechanism behind #12650, where the page's
PascalCase naming sentence (react-tier) was read as the html-tier rule and produced a
save-time rejection with nothing on the page naming the broken rule. #13734 closed that
one trap with one sentence plus an "On this tier" scoping — the correct size for that
card, and deliberately not a restructure.
What is left is a docs-architecture question with more than one defensible answer: split
the page into an html-tier page and a react-tier page (and repoint the three
pages.mdxlinks per tier), or mark the react-tier half once at
## What is in scopeand leave thepage whole. Both are larger than a repair, and picking one is not the dev's call on a
naming card — so this is filed for grading rather than dispatched.
Not yet measured
Whether any further html-tier trap remains on the page after #13734. Only the naming rule
was audited; the other react-only sections were not checked for statements an html author
could act on wrongly (
## Live data/useAdapterand## Page stateare the likelycandidates — neither exists on the html tier).
Provenance
Reported by the dev implementing #12650, explicitly as an observation and not a defect
("A2.3 said one sentence, and one sentence is what the defect needed"). Heading census
and the three
pages.mdxlink sites verified independently againstorigin/mainby thedomain:devxPM seat. The sibling instance in the other repo is filed separately asobjectstack-ai/objectui#7006.
Generated by Claude Code