Skip to content

[finding] react-pages.mdx is the docs home for both source-authoring tiers, but every section below the security gate is unmarked react-only material #13737

Description

@claude

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

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions