Skip to content

spec: PageSchema's kind/source descriptions still teach "JSX/HTML+Tailwind", which ADR-0080's 2026-06-30 amendment retracted — and the generated reference publishes it verbatim #10286

Description

@os-elon

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.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions