Found while writing the react/html page-authoring guide (#10210), which was told to take
its kind / source wording from the schema. The schema's wording carries a framing
its own ADR has explicitly retracted, so mirroring it would have republished the
retraction. Filing rather than fixing — packages/spec/** is outside #10210's file
surface, and per #10206 a guide that cannot be written because the schema is wrong is a
domain:spec card.
The two descriptions
packages/spec/src/ui/page.zod.ts:
kind: "... html = author-written constrained JSX/HTML+Tailwind compiled (parsed, never
executed) to the tree (ADR-0080) ..."
source: "Page source text. For kind==='html' (alias 'jsx') it is constrained
JSX/HTML+Tailwind compiled to the tree by @objectstack/sdui-parser at save
time ..."
What ADR-0080 says about that exact phrase
docs/adr/0080-ai-authored-ui-jsx-source.md, header amendment:
Amendment (2026-06-30 — ADR-0065 styling correction). The "HTML + Tailwind"
framing for page source is superseded on styling. A page's source is runtime
metadata, so the console's build-time Tailwind never scans it — authored utility
classNames silently produce no CSS (the exact failure ADR-0065 was written to
prevent; the Task Desk modal's bg-black/50 backdrop rendered transparent). [...]
Do not author Tailwind classes in page source.
So the schema description names, as the tier's authoring format, the one primitive the
ADR it cites tells authors not to use.
Why this is not cosmetic
packages/spec/scripts/build-docs.ts publishes those .describe() strings verbatim into
content/docs/references/ui/page.mdx (L87 and L89 today). The generated reference is the
page a developer lands on from search, and it currently teaches the retracted framing
with no adjacent correction. Every other source in the tree agrees with the ADR:
- the generated react contract (
skills/objectstack-ui/references/react-blocks.md):
"STYLING (ADR-0065) — [...] utility classNAMES silently produce no CSS. Do NOT use
Tailwind className in page source." packages/lint/src/validate-responsive-styles.ts raises style-classname-tailwind
on exactly this.- all four real source-tier pages in
examples/app-showcase contain zero className:
$ grep -c className examples/app-showcase/src/ui/pages/{renewals-pipeline,task-desk,crm-workbench}.page.ts
0
0
0
The html tier's own example (command-center-jsx.page.ts) says so in its docstring:
"this page uses NO Tailwind: layout is the components' own structured props [...] and any
custom CSS is a JSON style object with hsl(var(--token)) theme colors."
Suggested shape
Drop +Tailwind from both descriptions and name the actual styling primitive per tier,
mirroring the amendment: html styles via the registered components' structured props
plus a JSON style object; react styles via inline style with hsl(var(--token))
colors. Regenerating content/docs/references/ui/page.mdx follows from the same change.
Note the descriptions are otherwise accurate and load-bearing — parse-never-execute, the
compiler package per tier, and source winning over regions are all correct and should
survive the edit.
Adjacent, smaller
packages/sdui-parser/src/index.ts's header comment names the package
@object-ui/sdui-parser; the published name in its package.json is
@objectstack/sdui-parser (the schema description above gets this right). Likely a
leftover from the hoist out of objectui.
Found while writing the react/html page-authoring guide (#10210), which was told to take
its
kind/sourcewording from the schema. The schema's wording carries a framingits own ADR has explicitly retracted, so mirroring it would have republished the
retraction. Filing rather than fixing —
packages/spec/**is outside #10210's filesurface, and per #10206 a guide that cannot be written because the schema is wrong is a
domain:speccard.The two descriptions
packages/spec/src/ui/page.zod.ts:What ADR-0080 says about that exact phrase
docs/adr/0080-ai-authored-ui-jsx-source.md, header amendment:So the schema description names, as the tier's authoring format, the one primitive the
ADR it cites tells authors not to use.
Why this is not cosmetic
packages/spec/scripts/build-docs.tspublishes those.describe()strings verbatim intocontent/docs/references/ui/page.mdx(L87 and L89 today). The generated reference is thepage a developer lands on from search, and it currently teaches the retracted framing
with no adjacent correction. Every other source in the tree agrees with the ADR:
skills/objectstack-ui/references/react-blocks.md):"STYLING (ADR-0065) — [...] utility classNAMES silently produce no CSS. Do NOT use
Tailwind className in page source."
packages/lint/src/validate-responsive-styles.tsraisesstyle-classname-tailwindon exactly this.
examples/app-showcasecontain zeroclassName:The
htmltier's own example (command-center-jsx.page.ts) says so in its docstring:"this page uses NO Tailwind: layout is the components' own structured props [...] and any
custom CSS is a JSON
styleobject withhsl(var(--token))theme colors."Suggested shape
Drop
+Tailwindfrom both descriptions and name the actual styling primitive per tier,mirroring the amendment:
htmlstyles via the registered components' structured propsplus a JSON
styleobject;reactstyles via inlinestylewithhsl(var(--token))colors. Regenerating
content/docs/references/ui/page.mdxfollows from the same change.Note the descriptions are otherwise accurate and load-bearing — parse-never-execute, the
compiler package per tier, and
sourcewinning overregionsare all correct and shouldsurvive the edit.
Adjacent, smaller
packages/sdui-parser/src/index.ts's header comment names the package@object-ui/sdui-parser; the published name in itspackage.jsonis@objectstack/sdui-parser(the schema description above gets this right). Likely aleftover from the hoist out of objectui.