Skip to content

docs(spec): name the real per-tier styling primitive on PageSchema kind/source - #10436

Merged
qq9340100 merged 1 commit into
mainfrom
claude/issue-10286-page-source-styling-prose
Aug 21, 2026
Merged

docs(spec): name the real per-tier styling primitive on PageSchema kind/source#10436
qq9340100 merged 1 commit into
mainfrom
claude/issue-10286-page-source-styling-prose

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Fixes#10286

PageSchema's kind and source.describe() strings taught "constrained
JSX/HTML+Tailwind"
as the html tier's authoring format — a framing ADR-0080's own
2026-06-30 amendment retracted on styling. packages/spec/scripts/build-docs.ts
publishes those strings verbatim, so content/docs/references/ui/page.mdx — the page a
developer lands on from search — taught the retraction with no adjacent correction.

What the amendment says

docs/adr/0080-ai-authored-ui-jsx-source.md, header amendment (quoted, not edited —
docs/adr/** is a governed surface and is untouched by this PR):

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 tiers themselves stand; only the styling
primitive changes: kind:'html' styles via the registered components' structured
props + a JSON style object; kind:'react' styles via inline style={{}} with
hsl(var(--token)) theme colors [...] Do not author Tailwind classes in page source.

The change

packages/spec/src/ui/page.zod.ts — both describes now name the actual per-tier styling
primitive: html via the registered components' structured props plus a JSON style
object with hsl(var(--token)) theme colors, react via inline style with the same
token colors, and neither with Tailwind classes (with the why: source is runtime
metadata the build-time Tailwind never scans).

Every load-bearing claim survives — this was the card's explicit constraint:

ClaimSurvives
parse, never execute (html)✅ verbatim
compiler package per tier — @objectstack/sdui-parser / @object-ui/react-runtime✅ verbatim
source authoritative over regions✅ verbatim
ADR-0080 / ADR-0081 citations, 'jsx' deprecated-alias note✅ verbatim
ADR-0081 host-capability gating + OS_PAGE_REACT=off✅ verbatim

One voice. Wording was cross-checked against the two sources the card names as
already correct, so the tree does not gain a third phrasing: the generated react
contract's STYLING section (skills/objectstack-ui/references/react-blocks.md) and the
html tier's own example docstring
(examples/app-showcase/src/ui/pages/command-center-jsx.page.ts).

Also in the same declared file, named here rather than left silent: the TSDoc block
above source carried the identical retracted framing ("a constrained JSX/HTML+Tailwind
text compiled by @objectstack/sdui-parser"). Correcting the describe while leaving it
would have left the file contradicting itself. It is the same defect class, mechanically
fixed against the same ADR text, inside the file surface this card already claims; it is
source-internal (it does not project into page.mdx — verified by grep on the generated
file).

Regenerated, wholesale, via repo tooling

pnpm --filter @objectstack/spec build then check:generated proved exactly one of
14
artifacts stale — content/docs/references/** — and --fix regenerated only that
one. That the other 13 stayed green is itself the evidence for Clause-②: no: no
authorable-surface, api-surface, spec-changes or migration-registry movement, i.e. no
schema shape, no acceptance change, no public-surface widening. The page.mdx diff is
exactly the two table cells.

Rider (sanctioned by the card)

packages/sdui-parser/src/index.ts's header comment named the package
@object-ui/sdui-parser; its package.json publishes @objectstack/sdui-parser (the
source describe already had this right). Leftover from the hoist out of objectui.
One line, comment only.

Changeset disposition. One entry, @objectstack/spec patch — consumer-visible
describe strings, per the #10173 / #10079 precedent for prose-only spec text that lands
in content/docs/references/. The sdui-parser rider gets no entry: it changes a
source comment only — no export, no behaviour, no published surface — and per AGENTS.md
§Before-you-commit a changeset is for feature work, with pure fixes exempt. There is
nothing an @objectstack/sdui-parser consumer could read in a CHANGELOG and act on.

Verification

Gate families derived from the actual diff via node scripts/pm/dispatch-gates.mjs
(no paths passed — the script takes its own change set from the merge base), then re-run
on the final commit 4cf78dc6b: 24 of 25 green, each exit code captured before any
pipe.

changeset-gate-self-tests EXIT=0 doc-anchors EXIT=0 doc-formula-expressions EXIT=0
cross-package-test-inputs EXIT=0 docs-audit-scope EXIT=0 docs-redirects EXIT=0
spec-empty-state EXIT=0 spec-liveness EXIT=0 merge-driver EXIT=0
objectui-changeset EXIT=0 published-readme-links EXIT=0
quick-reference-counts EXIT=0 role-word EXIT=0 slot-lookup EXIT=0
spec-parsed-alias EXIT=0 spec-strictness-ledger EXIT=0
type-source-resolution EXIT=0 spec-variant-docs EXIT=0 adr-0087-registration EXIT=0
changeset-no-major EXIT=0 cross-package-test-inputs (script) EXIT=0
empty-changeset EXIT=0 affected-docs EXIT=0 nul-bytes EXIT=0

Tests and typecheck, both green on this tree:

packages/spec test: Test Files 415 passed (415) Tests 11071 passed (11071)
packages/sdui-parser test: Test Files 1 passed (1) Tests 6 passed (6)
packages/spec typecheck: Done (tsc --noEmit + check:scripts-typecheck + check:test-typecheck)
packages/sdui-parser typecheck: Done

Declared narrowing — one gate not run locally.node scripts/check-dev-prereqs.mjs
exits 1 here with ✗ The workspace is not built — 1 unmet precondition, not a list of problems. 64 of 67 workspace packages declare an entry point under dist/ that is not on disk. It is a whole-workspace precondition check (pnpm build, all 67 packages), not
a judgement on this diff, and a prose-only change cannot move it. CI runs it on a built
tree. Named rather than quietly skipped.


Generated by Claude Code

…nd/source (#10286)
The `kind` and `source` `.describe()` strings taught "constrained JSX/HTML+Tailwind"
as the html tier's authoring format. ADR-0080's 2026-06-30 amendment retracted that
framing on styling: a page's `source` is runtime metadata, so the console's build-time
Tailwind never scans it and authored utility `className`s silently produce no CSS (the
ADR-0065 failure — the Task Desk modal's `bg-black/50` backdrop rendered transparent).
`packages/spec/scripts/build-docs.ts` published the retracted framing verbatim into
content/docs/references/ui/page.mdx, with no adjacent correction.
Both descriptions now name the actual per-tier primitive, mirroring the amendment:
`html` styles via the registered components' structured props plus a JSON `style`
object with `hsl(var(--token))` theme colors; `react` styles via inline `style` with
the same token colors; neither authors Tailwind classes. Wording cross-checked against
the two sources the tree already had right — the generated react contract's STYLING
section (skills/objectstack-ui/references/react-blocks.md) and the html tier's own
example docstring (examples/app-showcase/src/ui/pages/command-center-jsx.page.ts) — so
the tree keeps one voice.
Prose only, no schema shape or acceptance change. Every load-bearing claim survives:
parse-never-execute, the compiler package per tier (@objectstack/sdui-parser for html,
@object-ui/react-runtime for react), `source` authoritative over `regions`, and the
ADR-0081 OS_PAGE_REACT=off gating. The `source` TSDoc block carried the same retracted
framing and is corrected with it, in the same declared file.
Regenerated content/docs/references/ui/page.mdx wholesale via repo tooling
(check:generated proved exactly one artifact stale, --fix regenerated only that one).
Rider, per the card: packages/sdui-parser/src/index.ts's header comment named the
package @object-ui/sdui-parser; its published name is @objectstack/sdui-parser. Comment
only — no changeset entry, see the PR body.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016gcKVsiywU9CcS96S5t9qD
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/sdui-parser, @objectstack/spec, touching 1 documentable anchor(s).

1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/protocol/objectui/layout-dsl.mdx(via PageSchema (symbol))
What this run could not see
  • 1 changed file(s) yielded no anchor (packages/sdui-parser/src/index.ts) — pages documenting those are invisible to this run
  • the SDK route bridge reached 45 of 221 client-bound route-ledger rows — the other 176 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run: node scripts/docs-audit/affected-docs.mjs --bridge-coverage

Coarse fallback — 117 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 6276651dc1ece03f93f17227ac957b908a2dbd9epackageMentionDocs.

Which tree this was computed on

This run read content/docs from c9bd6d8e968d12819f558cc4b688175d80d3ba83 — the merge of head 4cf78dc6bb8086838f104ccae26e203ea7ed8da6 into base 6276651dc1ece03f93f17227ac957b908a2dbd9e, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin c9bd6d8e968d12819f558cc4b688175d80d3ba83 && git checkout c9bd6d8e968d12819f558cc4b688175d80d3ba83
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 6276651dc1ece03f93f17227ac957b908a2dbd9e 4cf78dc6bb8086838f104ccae26e203ea7ed8da6 && git checkout -B drift-repro 6276651dc1ece03f93f17227ac957b908a2dbd9e && git merge --no-ff 4cf78dc6bb8086838f104ccae26e203ea7ed8da6
node scripts/docs-audit/affected-docs.mjs --json 6276651dc1ece03f93f17227ac957b908a2dbd9e

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 6276651dc1ece03f93f17227ac957b908a2dbd9e → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation tooling protocol:ui labels Aug 20, 2026
@qq9340100
qq9340100 marked this pull request as ready for review August 21, 2026 00:56
@qq9340100
qq9340100 added this pull request to the merge queueAug 21, 2026
Merged via the queue into main with commit 2e3cf95Aug 21, 2026
29 checks passed
@qq9340100
qq9340100 deleted the claude/issue-10286-page-source-styling-prose branch August 21, 2026 01:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:uisize/stooling

Projects

None yet

2 participants

@qq9340100@claude