content/docs/guide/react-pages.md is this repo's home for both source-authoring
tiers, but the only tag-naming rule it states is the react tier's PascalCase one. An
author who writes a kind:'html' page from this page copies that spelling and is
rejected at save time, with nothing on the page naming the rule they broke.
Where the page states the rule
The scope table (the ### What is in scope section) lists
| The public data blocks | Every public non-container block, as a PascalCase tag — … |
and the #### Two tiers: what resolves, and what you author against section derives the
spelling explicitly:
Tags are derived by splitting the registry type on -, _ and : and PascalCasing
each part: object-grid → <ObjectGrid>, record:details → <RecordDetails>.
Neither passage is wrong — both are react-tier material. Neither is marked as such.
Where the html tier needs it and does not have it
The ## kind:'html' section says the whitelist exists but never says how its entries are
spelled:
Only tags in the public block manifest are allowed, props are validated against each
block's declared inputs, and unknown tags are a hard error at save time.
The page names kind:'html' at seven places (frontmatter description, the kind table,
the "reach for html by default" callout, the capability-switch paragraph, the styling
row, and the section itself) and its own html examples use the correct lowercase form
(<flex direction gap>, <grid columns>) — so the correct spelling is demonstrated
while the stated rule is the other tier's.
What the html tier actually accepts (objectstack side, measured)
The whitelist is the registry's own type names, compared by exact string:
packages/sdui-parser/src/index.ts:41 — const allowedTags = new Set(Object.keys(manifest.components))
packages/sdui-parser/src/index.ts:99-100 — the manifest is keyed by the registry
config's own type: components[c.type] = { type: c.type, … }
packages/sdui-parser/src/parse.ts:61 — !this.opts.allowedTags.has(tag), an exact
Set.has; no case folding anywhere in the parser
Compiled against the real 57-component manifest: ListView → ListView is not an allowed component; list-view → accepted. ObjectForm → rejected; object-form →
accepted. RecordRelatedList → rejected; record:related_list → accepted.
⚠️ The rule is registered type names written verbatim, not "kebab-case": 28 of the 57
registered names carry a namespace prefix (record:, page:, element:, action:) and
four are snake_case after the colon — record:related_list, record:line_items,
record:quick_actions, record:reference_rail. Documenting "kebab-case" alone sends an
author to record:related-list, which is not registered either.
Prior art — the same defect, already fixed upstream
objectstack-ai/objectstack#12650 is this defect on content/docs/ui/react-pages.mdx in
the framework repo; objectstack-ai/objectstack#13734 fixes it with two body edits (one
paragraph in the html-tier section naming the registered spelling, and "On this tier"
scoping on the react-tier naming sentence). That diff is a usable model for this page.
Provenance
Found by the dev implementing objectstack-ai/objectstack#12650, whose triage first-touch
reserved this cross-repo follow-up for the PM to file rather than take as a rider.
Verified independently against this repo's origin/main (content/docs/guide/react-pages.md).
Duplicate check: 271 open issues in this repo scanned for PascalCase / react-pages /
html tier / allowed component; no existing card covers it.
Generated by Claude Code
content/docs/guide/react-pages.mdis this repo's home for both source-authoringtiers, but the only tag-naming rule it states is the react tier's PascalCase one. An
author who writes a
kind:'html'page from this page copies that spelling and isrejected at save time, with nothing on the page naming the rule they broke.
Where the page states the rule
The scope table (the
### What is in scopesection) listsand the
#### Two tiers: what resolves, and what you author againstsection derives thespelling explicitly:
Neither passage is wrong — both are react-tier material. Neither is marked as such.
Where the html tier needs it and does not have it
The
## kind:'html'section says the whitelist exists but never says how its entries arespelled:
The page names
kind:'html'at seven places (frontmatter description, the kind table,the "reach for html by default" callout, the capability-switch paragraph, the styling
row, and the section itself) and its own html examples use the correct lowercase form
(
<flex direction gap>,<grid columns>) — so the correct spelling is demonstratedwhile the stated rule is the other tier's.
What the html tier actually accepts (objectstack side, measured)
The whitelist is the registry's own type names, compared by exact string:
packages/sdui-parser/src/index.ts:41—const allowedTags = new Set(Object.keys(manifest.components))packages/sdui-parser/src/index.ts:99-100— the manifest is keyed by the registryconfig's own
type:components[c.type] = { type: c.type, … }packages/sdui-parser/src/parse.ts:61—!this.opts.allowedTags.has(tag), an exactSet.has; no case folding anywhere in the parserCompiled against the real 57-component manifest:
ListView→ListView is not an allowed component;list-view→ accepted.ObjectForm→ rejected;object-form→accepted.
RecordRelatedList→ rejected;record:related_list→ accepted.registered names carry a namespace prefix (
record:,page:,element:,action:) andfour are snake_case after the colon —
record:related_list,record:line_items,record:quick_actions,record:reference_rail. Documenting "kebab-case" alone sends anauthor to
record:related-list, which is not registered either.Prior art — the same defect, already fixed upstream
objectstack-ai/objectstack#12650 is this defect on
content/docs/ui/react-pages.mdxinthe framework repo; objectstack-ai/objectstack#13734 fixes it with two body edits (one
paragraph in the html-tier section naming the registered spelling, and "On this tier"
scoping on the react-tier naming sentence). That diff is a usable model for this page.
Provenance
Found by the dev implementing objectstack-ai/objectstack#12650, whose triage first-touch
reserved this cross-repo follow-up for the PM to file rather than take as a rider.
Verified independently against this repo's
origin/main(content/docs/guide/react-pages.md).Duplicate check: 271 open issues in this repo scanned for
PascalCase/react-pages/html tier/allowed component; no existing card covers it.Generated by Claude Code