Skip to content

feat(spec,lint): ADR-0081 — kind:'html' (rename) + trusted kind:'react' tier#2470

Merged
os-zhuang merged 5 commits into
mainfrom
feat/sdui-page-tiers
Jun 30, 2026
Merged

feat(spec,lint): ADR-0081 — kind:'html' (rename) + trusted kind:'react' tier#2470
os-zhuang merged 5 commits into
mainfrom
feat/sdui-page-tiers

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Summary

ADR-0081 splits the AI page-authoring surface (ADR-0080) into honest tiers. ADR-0080's kind:'jsx' oversold itself — authors expected "JSX" to mean any HTML + any JS, which a constrained parse-never-execute model cannot do. This separates the two:

  • kind:'html' — the constrained, parse-never-execute tier renamed to match what it is (HTML + Tailwind + registered components). 'jsx' kept as a deprecated alias so already-saved pages keep loading.
  • kind:'react' — a new trusted tier whose source is real React, executed at render in the main React tree by @object-ui/react-runtime, gated behind a host capability (default OFF, enterprise/private only). Security = trust + human review, not a sandbox.

Changes

  • @objectstack/specPageSchema.kindenum(['full','slotted','html','react','jsx']); source/kind describes updated; the ADR-0078 completeness gate now requires a non-empty source for html/react/jsx.
  • @objectstack/lintvalidate-jsx-pages lints html/jsx (constrained parse) and skips react (real JS would false-error the constrained parser). +tests for both.
  • examplescommand-center page moves to kind:'html'.
  • docs — ADR-0081.

Verification

  • spec: 6650 tests green; forced dist rebuild (incl. strict DTS) clean.
  • lint: 89 tests green (incl. new html validated / react skipped cases).
  • @objectstack/example-showcase typecheck clean against the new kind type.

Pairs with objectui #2105 (the runtime + renderer + capability gate + the full HTML tag set, browser-verified through the real PageRenderer).

🤖 Generated with Claude Code

…t' tier

- spec: PageSchema.kind gains 'html' (the renamed constrained tier; 'jsx'
  kept as a deprecated alias) and 'react' (trusted real-React, executed at
  render, host-capability gated). Completeness gate requires source for all three.
- lint: validate-jsx-pages lints html/jsx; skips react (real JS, not
  constrained JSX). +tests.
- examples: command-center page moves to kind:'html'.
- docs: ADR-0081.

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 5:14am

Request Review

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

github-actions Bot commented Jun 30, 2026

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.

… page

A complete real-React example (ADR-0081 trusted tier): composes the platform's
real <ListView> + <ObjectForm> with React state to build a master/detail
workbench (row click → controlled recordId; save → list refresh; live KPIs via
useAdapter). Browser-verified through the real PageRenderer. Renders behind the
host capability CAP_REACT_PAGES (a trusted deployment enables it); otherwise it
shows the enterprise-capability notice. Also renames the JSX nav label to (HTML).

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

Per platform-author decision the react tier is no longer enterprise-gated/
default-off. It runs author JS, so it stays behind a host capability — but that
capability defaults ON (trusted, reviewed, draft-gated authors). A deployment
that does not trust its authors disables it with one env var:

- cli: console serving injects window.__OBJECTUI_CAPABILITIES_DISABLED__ =
  ['react-pages'] into the served HTML when OS_DISABLE_REACT_PAGES is set
  (read per request, no rebuild).
- spec: kind describe reframed (default-on, OS_DISABLE_REACT_PAGES opt-out).
- ADR-0081 + showcase comment reframed away from enterprise-only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…off disables)

Page-namespaced toggle reads cleaner than an OS_DISABLE_* flag: default on,
OS_PAGE_REACT=off disables. Updates cli console injection logic, spec describe,
ADR-0081, showcase comment, changeset.
…x gate

- objectstack-ui skill: new section on the source-authoring tiers — when to use
  kind:'html' (constrained, parsed) vs kind:'react' (real React, executed), the
  injected react scope (React/useAdapter/ObjectForm/ListView/...), a master-detail
  example, and the OS_PAGE_REACT availability note. The AI build agent now knows
  the tiers exist.
- lint: validate-react-pages transpiles kind:'react' source (Sucrase, never
  executed) so syntax errors fail at os build, not at render. Wired into
  os validate (ADR-0081). +tests (93 lint tests green).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions github-actions Bot added dependencies Pull requests that update a dependency file size/l and removed size/m labels Jun 30, 2026
@os-zhuang
os-zhuang merged commit 5821c51 into main Jun 30, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the feat/sdui-page-tiers branch June 30, 2026 05:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation protocol:ui size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant