Skip to content

Finish the ADR-0080 page-source styling retraction across the remaining 8 prose sites - #5665

Draft
os-sales wants to merge 2 commits into
mainfrom
claude/issue-5469-adr0080-prose-retraction
Draft

Finish the ADR-0080 page-source styling retraction across the remaining 8 prose sites#5665
os-sales wants to merge 2 commits into
mainfrom
claude/issue-5469-adr0080-prose-retraction

Conversation

@os-sales

Copy link
Copy Markdown
Collaborator

Fixes #5469

ADR-0080's 2026-06-30 header amendment (under ADR-0065, Accepted) retracted the
"JSX/HTML + Tailwind" framing for a page's source. #5461 corrected 3 sites and
asserted that was the complete set; it was 11. This lands the remaining 8.

The census, re-derived (not trusted)

The card's own multiline instrument was re-derived rather than taken on faith, and
cross-checked against two independent instruments. All numbers below are occurrence
counts (NUL records / match counts), never grep -c, which counts lines.

grep -rnP -U -z -o --include='*.ts' --include='*.tsx' --include='*.md' --include='*.mdx' \
  --include='*.json' --include='*.js' --include='*.mjs' --include='*.css' \
  --exclude-dir=node_modules --exclude-dir=dist --exclude-dir=.git \
  '(JSX|HTML|html|jsx)\s*[/+]\s*(\*|>|//|\n|\r|\s)*\s*Tailwind' .

Before: 17 occurrences. After: 10, all of them deliberately preserved. Verified
identically by rg -U --pcre2 --hidden and by a git ls-files-driven sweep.

Two corrections to the instrument as published on the card, both of which silently
change the answer:

  • It needs --exclude-dir=node_modules --exclude-dir=dist. Run in a built
    tree it returned 51, because the emitted .d.ts/.js copies of the very
    files being fixed are matched too. The card's clean census only held because it
    was taken in an unbuilt tree.
  • rg skips dot-directories by default, so it silently misses
    .changeset/** unless --hidden is passed. That is a two-occurrence blind spot
    on this exact pattern.

The 8 sites

Consumer-facing sites name the real primitive; the four source/test docstrings
just drop the Tailwind half of the compound.

Site Spelling Treatment
packages/react-runtime/README.md:17-18 JSX/HTML +Tailwind (line-wrapped) names the primitive; gains the §Styling section it was missing
packages/components/src/renderers/layout/page.tsx:541 JSX/HTML+Tailwind names the primitive on the kind === 'html' dispatch arm
content/docs/components/basic/div.mdx:20 JSX/Tailwind names the primitive
content/docs/components/basic/span.mdx:22 JSX/Tailwind names the primitive
packages/sdui-parser/src/types.ts:5 JSX/HTML+Tailwind drops + Tailwind
packages/components/src/renderers/basic/html-elements.tsx:10 JSX/Tailwind drops + Tailwind
packages/components/src/__tests__/div-deprecation-provenance.test.tsx:12 JSX/Tailwind drops + Tailwind
packages/components/src/__tests__/span-deprecation-provenance.test.tsx:13 JSX/Tailwind drops + Tailwind

Note: the card and its dispatch both say "the three test/source docstrings".
There are foursdui-parser/src/types.ts is the one the count misses. All
four are handled.

Wording is taken from content/docs/guide/react-pages.md §Styling and from the
sibling TSDoc #5461 landed in packages/types/src/layout.ts, so no fourth phrasing
enters the tree. The rule named is page-source-className-tailwind
(@objectstack/lint@11.5.0), a warning on kinds html/react/jsx — not
validate-responsive-styles.ts, which never reads page source. The tiers,
parse-never-execute, the untrusted-author safety argument and the deprecated jsx
alias are all unchanged; only the styling primitive moves.

What was deliberately NOT touched (the 10 remaining)

#5461 overlap verdict: landed, zero overlap

#5461 merged as PR #5471 (a691c0bee), before this branch's base. Its declared
surface — packages/types/src/layout.ts and
packages/components/src/renderers/layout/react-page.tsx — is measured clean of the
pattern, and neither file is touched here. The two file sets are disjoint.

Verification

All at 4060df523, exit codes captured before any pipe.

Gate Verdict line
check-changeset-presence.mjs ✅ 5 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)
check-changeset-no-major.mjs ✅ No changeset declares a 'major' bump.
check-changeset-fixed.mjs ✅ All workspace packages are in the changeset fixed group.
check-control-bytes.mjs ✅ check-control-bytes: OK (scanned 4717 tracked text file(s))
check-doc-links.mjs Links are valid across 13 scan roots.
check-doc-component-types.mjs ✅ Every documented component type is registered.
type-check × 3 pkgs all Done, 3 of 3 scripts echoed (guards the zero-match silent pass)
lint × 3 pkgs 0 errors (898 pre-existing warnings, none in the touched files)
the 2 touched test files Test Files 2 passed (2) / Tests 8 passed (8)

Control probe. Predicted: the census detects a re-injected line-wrapped
occurrence (9 → 10) while a line-oriented grep misses it. Measured exactly that —
the census went 9 → 10 and grep -rnP 'JSX/HTML \+\s*Tailwind' returned no match on
the same mutated file. Mutation was confirmed on disk by anchored counts in both
directions, never by an editor exit code. ⚠️ The restore leg used
git checkout -- <path> against an uncommitted edit and therefore reverted this
PR's own README changes rather than only the mutation; that was detected by the
follow-up census (back to 10), re-applied, re-verified, and the work was committed
before any further verification. Reported rather than silently retried.

Changeset

Three packages, each justified against its built artefact rather than assumed:

  • @object-ui/react-runtimeREADME.md ships to npm (npm includes README.md
    regardless of files).
  • @object-ui/sdui-parser — the corrected header projects verbatim into
    dist/types.d.ts.
  • @object-ui/components — the corrected header projects verbatim into
    dist/renderers/basic/html-elements.d.ts. The page.tsx dispatch-arm comment
    does not project (it is inside a function body).

Generated by Claude Code


Generated by Claude Code

claude added 2 commits August 22, 2026 07:52
…emaining 8 prose sites

ADR-0080's 2026-06-30 header amendment (under ADR-0065, Accepted) retracted the
"HTML + Tailwind" framing for a page's `source`: source is runtime metadata, the
console's Tailwind is compiled at build time by scanning the console's own `src`
with no safelist, so an authored utility class produces CSS only by coincidence
and otherwise nothing, with no error anywhere.

objectui#5461 corrected 3 sites; a multiline census finds 8 more. The tiers,
parse-never-execute, the untrusted-author safety argument and the deprecated
'jsx' alias are all unchanged — only the styling primitive is corrected, to the
wording already used by content/docs/guide/react-pages.md §Styling and by the
`page-source-className-tailwind` rule in @objectstack/lint@11.5.0.

Consumer-facing sites name the real primitive; the four source/test docstrings
just drop the Tailwind half of the compound. CHANGELOG.md hits are untouched —
immutable release history.
… for the prose retraction

Each entry is justified against the package's BUILT artefact rather than assumed:
the react-runtime README ships to npm, and the corrected headers of
sdui-parser/src/types.ts and components/src/renderers/basic/html-elements.tsx
both project verbatim into their published .d.ts files.
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 52 chunks) 3912.5 KB 3990.2 KB
Main entry chunk (gzip) 151.8 KB 350 KB
Entry file index-CTSyub-J.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 10.04KB 3.72KB
app-shell (runtime-config.js) 12.80KB 4.47KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 29.34KB 7.05KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 6.35KB 2.43KB
auth (index.js) 2.77KB 1.22KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.02KB 0.89KB
auth (useIsWorkspaceAdmin.js) 3.04KB 1.45KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 506.21KB 113.58KB
core (index.js) 4.51KB 1.80KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 160.38KB 44.54KB
fields (index.js) 238.85KB 60.13KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.44KB 1.39KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 23.13KB 7.63KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 33.40KB 8.71KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
layout (index.js) 38.95KB 10.97KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.55KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useResponsiveConfig.js) 1.37KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.35KB 3.31KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.42KB 1.42KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 1.81KB 0.83KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.62KB 12.83KB
plugin-charts (index.js) 64.65KB 18.32KB
plugin-chatbot (index.js) 181.41KB 43.22KB
plugin-dashboard (index.js) 128.33KB 32.93KB
plugin-designer (index.js) 212.30KB 42.80KB
plugin-detail (index.js) 242.16KB 60.90KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 125.07KB 30.43KB
plugin-gantt (index.js) 164.10KB 39.87KB
plugin-grid (index.js) 200.79KB 54.26KB
plugin-kanban (index.js) 52.93KB 14.60KB
plugin-list (index.js) 111.74KB 27.18KB
plugin-map (index.js) 20.06KB 6.62KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 43.49KB 11.93KB
plugin-timeline (index.js) 26.68KB 7.66KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.54KB 20.69KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 43.66KB 14.77KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.33KB 0.69KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (index.js) 4.77KB 2.16KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 10.76KB 3.17KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 6.92KB 2.40KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 3.59KB 1.79KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Collaborator Author

Hold stands — but the reason is narrower than I first stated

I held this PR on #5668 saying the main breakage blocks every PR based after it. That was too broad and I have corrected it on #5668. The refined reason, which still holds for this PR specifically:

Build Docs is path-filtered inside the job — on a pull_request event it only builds the site when the diff touches apps/site/** or content/**. This PR edits content/docs/components/basic/div.mdx and span.mdx, so it builds, and the build fails on a main defect its diff cannot reach.

Measured contrast, same base 9986f9114: #5669 touches no docs path → Build Docs success in 11 seconds, nothing built. This PR → failure in 3m26s, with a trace identical to the one on base 9986f9114's own push run.

So this is not "everything is blocked"; it is "PRs that touch docs content are blocked, and this is one of them". The PR remains ACCEPTed on its merits and held on #5668 alone. No fix pushed from here — the defect is not in this diff and widening this PR to chase it would be the wrong shape.


Generated by Claude Code

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 package: components tests

Projects

None yet

2 participants