Skip to content

fix(sdui): no Tailwind in page source — guardrail + corrected guidance (ADR-0065)#2495

Merged
os-zhuang merged 1 commit into
mainfrom
fix/sdui-styling-guidance-guard
Jun 30, 2026
Merged

fix(sdui): no Tailwind in page source — guardrail + corrected guidance (ADR-0065)#2495
os-zhuang merged 1 commit into
mainfrom
fix/sdui-styling-guidance-guard

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Follow-up to #2494 (which removed Tailwind from the react showcase pages). This closes the loop so AI authors don't repeat the mistake: a prevention gate + corrected guidance.

Why

A kind:'html'/'react' page's source is runtime metadata, so the console's build-time Tailwind never scans it — authored utility classNames silently produce no CSS (the ADR-0065 failure the Task Desk modal hit: transparent backdrop, unstyled boxes). The contract/skill/docs were still telling AI to write "HTML + Tailwind", so the gate and the guidance both needed fixing.

Prevention — the guardrail

  • New @objectstack/lint rule validatePageSourceStyling: flags className attributes in source-tier pages, wired into os validate as step 3e — a warning with the actionable fix (react: inline style + hsl(var(--token)) + <ObjectForm formType=…> overlays; html: structured props + a JSON style object).
  • Verified end-to-end: os validate now flags all 7 showcase source pages with the right per-tier hint. 6 unit tests; all 106 lint tests green.
→ Checking source-page styling (ADR-0065)...
⚠ page "showcase_task_desk": 19 `className` attributes in react-source page — Tailwind utilities
  in page source silently produce no CSS (the build never scans authored metadata; ADR-0065).
    Style with inline style={{}} using hsl(var(--token)) … render drawer/modal via <ObjectForm formType=…>.

Corrected guidance — so the docs no longer teach the mistake

  • react-blocks contract generator note → "do NOT use Tailwind className; inline style + hsl(var(--token)); overlays via ObjectForm formType" (regenerated contract.json + react-blocks.md).
  • objectstack-ui SKILL.md: the html + react examples and prose rewritten off Tailwind; the ADR-0065 styling section gains a source-tier subsection (html = structured props + JSON style; react = inline style + hsl(var(--token)) + formType overlays).
  • layout-dsl.mdx: html-tier row no longer says "HTML + Tailwind".
  • ADR-0080 / ADR-0081: amendment notes pointing to ADR-0065 — the tiers stand, only the styling primitive changes.

Follow-up

command-center-jsx (the kind:'html' showcase page) still uses Tailwind — the new guardrail flags it (48 classNames). It's the last page to convert (html tier: structured props + JSON style); doing it in a separate change so this PR stays focused on the systemic gate + guidance.

🤖 Generated with Claude Code

…e (ADR-0065)

A kind:'html'/'react' page's `source` is runtime metadata, so the console's
build-time Tailwind never scans it — authored utility classNames silently produce
no CSS (the ADR-0065 failure that the Task Desk modal hit). The page fixes landed
in the showcase; this closes the loop so AI authors don't repeat the mistake.

Prevention (the guardrail):
- New `@objectstack/lint` rule `validatePageSourceStyling` flags `className`
  attributes in source-tier pages, wired into `os validate` as step 3e — a
  warning with the actionable fix (react: inline style + hsl(var(--token)) +
  ObjectForm formType overlays; html: structured props + a JSON style object).
  Verified: os validate now flags all 7 showcase source pages; 6 unit tests.

Corrected guidance (so the contract/docs/skill no longer teach the mistake):
- react-blocks contract generator note → "do NOT use Tailwind className; style
  with inline style + hsl(var(--token)); overlays via ObjectForm formType"
  (regenerated contract.json + react-blocks.md).
- objectstack-ui SKILL.md: html + react examples and prose rewritten off
  Tailwind; the ADR-0065 styling section gains a source-tier subsection.
- layout-dsl.mdx: html tier row no longer says "HTML + Tailwind".
- ADR-0080 / ADR-0081: amendment notes pointing to ADR-0065 — the tiers stand,
  only the styling primitive changes; never author Tailwind in page source.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jun 30, 2026 3:44pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling size/m labels Jun 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/cli, @objectstack/lint, @objectstack/spec.

93 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx (via packages/cli, packages/spec)
  • content/docs/concepts/cluster-semantics.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/implementation-status.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/concepts/packages.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/concepts/setup-app.mdx (via @objectstack/spec)
  • content/docs/concepts/skills.mdx (via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx (via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx (via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx (via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx (via @objectstack/spec)
  • content/docs/guides/api-reference.mdx (via @objectstack/spec)
  • content/docs/guides/authentication.mdx (via @objectstack/cli)
  • content/docs/guides/business-logic.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx (via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx (via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/guides/common-patterns.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx (via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx (via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx (via packages/spec)
  • content/docs/guides/data-modeling.mdx (via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/guides/external-datasources.mdx (via @objectstack/spec)
  • content/docs/guides/formula.mdx (via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx (via packages/cli, packages/spec)
  • content/docs/guides/kernel-services.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx (via @objectstack/spec)
  • content/docs/guides/packages.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/guides/plugin-development.mdx (via @objectstack/spec)
  • content/docs/guides/plugins.mdx (via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/guides/public-forms.mdx (via @objectstack/spec)
  • content/docs/guides/runtime-services/data-service.mdx (via packages/cli)
  • content/docs/guides/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/index.mdx (via packages/cli, packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/guides/security.mdx (via @objectstack/spec)
  • content/docs/guides/seed-data.mdx (via @objectstack/spec)
  • content/docs/guides/skills.mdx (via packages/cli, @objectstack/spec)
  • content/docs/guides/standards.mdx (via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/guides/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/protocol/objectos/realtime-protocol.mdx (via @objectstack/cli)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang os-zhuang merged commit ec7175d into main Jun 30, 2026
17 checks passed
@os-zhuang os-zhuang deleted the fix/sdui-styling-guidance-guard branch June 30, 2026 15:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant