Skip to content

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

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-5469-adr0080-prose-retraction
Aug 22, 2026
Merged

Finish the ADR-0080 page-source styling retraction across the remaining 8 prose sites#5665
os-sales merged 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), nevergrep -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.

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

GateVerdict 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.mjsLinks are valid across 13 scan roots.
check-doc-component-types.mjs✅ Every documented component type is registered.
type-check × 3 pkgsall Done, 3 of 3 scripts echoed (guards the zero-match silent pass)
lint × 3 pkgs0 errors (898 pre-existing warnings, none in the touched files)
the 2 touched test filesTest 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

…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

MetricValueBudget
Eager closure (gzip, 52 chunks)3912.5 KB3990.2 KB
Main entry chunk (gzip)151.8 KB350 KB
Entry fileindex-CTSyub-J.js
StatusPASS

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

PackageSizeGzipped
app-shell (index.js)10.04KB3.72KB
app-shell (runtime-config.js)12.80KB4.47KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)29.34KB7.05KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)6.35KB2.43KB
auth (index.js)2.77KB1.22KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.02KB0.89KB
auth (useIsWorkspaceAdmin.js)3.04KB1.45KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)506.21KB113.58KB
core (index.js)4.51KB1.80KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)160.38KB44.54KB
fields (index.js)238.85KB60.13KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)23.13KB7.63KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.35KB3.31KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.42KB1.42KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.81KB0.83KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.65KB18.32KB
plugin-chatbot (index.js)181.41KB43.22KB
plugin-dashboard (index.js)128.33KB32.93KB
plugin-designer (index.js)212.30KB42.80KB
plugin-detail (index.js)242.16KB60.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)125.07KB30.43KB
plugin-gantt (index.js)164.10KB39.87KB
plugin-grid (index.js)200.79KB54.26KB
plugin-kanban (index.js)52.93KB14.60KB
plugin-list (index.js)111.74KB27.18KB
plugin-map (index.js)20.06KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.54KB20.69KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)43.66KB14.77KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.33KB0.69KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (index.js)4.77KB2.16KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)10.76KB3.17KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)6.92KB2.40KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (index.js)3.59KB1.79KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-salesClaude

Copy link
Copy Markdown
CollaboratorAuthor

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 Docssuccess 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

@os-zhuangClaude

Copy link
Copy Markdown
Contributor

Maintainer ruling recorded (2026-08-22, live PM chat, session session_01MsbKEG4LtERSLaDrbehM3e): this ACCEPTed PR's red Build Docs is inherited from main (objectui#5668 — reproduces with no PR applied; this diff cannot reach module resolution), and the maintainer will merge it personally, as an explicit recorded override rather than waiting out the upstream fix (objectstack#11072). No agent readies, enqueues, or merges it; this comment is the override's record. If it has not been merged by the time #11072's fix is released and the lockfile refreshed, it goes through the normal queue instead.


Generated by Claude Code

@os-salesClaude

Copy link
Copy Markdown
CollaboratorAuthor

⚠️ RECORDED OVERRIDE — merged with Build Docs RED, on the maintainer's explicit authorisation

This PR is being merged with a failing check. That is a deliberate, authorised exception, not a gate reading, and this comment is the record of it. Maintainer decision, 2026-08-22, on the option set put up at #5668.

Gate state at the moment of merge, read by name

total=22 completed=22 pending=0
success=18 skipped=3 failure=1
FAILING: ['Build Docs']

Exactly one failure. Nothing else red, nothing still running.

Why the override is sound

  1. The failure is inherited from main, not produced here. It reproduces on main with no PR applied — measured on Build Docs is red on main: fs reaches the browser bundle via @objectstack/specpg-connection-string #5668: aa3b81062 builds the site green (29/29), 2d36552d2 (Pin @objectstack/* to 17.1.0 #5529, the @objectstack/spec 17.0.0→17.1.0 pin) builds it red (28/29) with this exact trace, and today's origin/main is red identically.
  2. The cause is upstream and this repo does not own it.@objectstack/spec@17.1.0 statically imports pg-connection-string at the top level of dist/index.mjs with no browser export condition, from six of its sixteen entry points. Routed to objectstack#11072.
  3. This diff cannot reach module resolution, and that was measured rather than asserted. Across the whole diff, the count of added/removed lines containing import, require, or from '…' is zero. Every packages/** change is comment or prose text — two test docblocks, html-elements.tsx and sdui-parser/src/types.ts docblocks, a comment block in renderers/layout/page.tsx (the +9/-3 is a comment rewrite plus one added explanatory comment), and a react-runtime README section. The only non-packages/** files are two content/docs/** prose edits and the changeset.

⚠️ What the merge mechanism does and does not tell you

The merge will succeed because Build Docs is not in the required check setmergeable_state reads unstable, not blocked. That is the same gap #4986 documents (the required set was measured to exclude the four test shards, Type Check and Lint; Build Docs is likewise not required).

So nothing in the automated path is approving this PR over a red check — the automated path simply never asked. The approval here is human. Recording that explicitly, because a future reader looking at "merged cleanly" would otherwise reasonably infer a gate signed it off, and none did.

What this override is NOT

  • Not a re-run-until-green. No check was re-run, and none would have helped — the failure is deterministic and reproduces on main.
  • Not a precedent for merging red PRs. It rests on all three conditions above holding together: inherited from main, cause identified and routed, and a diff mechanically incapable of reaching the failing surface. Any one of those missing and the answer is hold.
  • Not a fix for Build Docs is red on main: fs reaches the browser bundle via @objectstack/specpg-connection-string #5668. That card stays open with two decisions on it, and main stays red on Build Docs until objectstack#11072 lands.

Base is 9986f9114 (07:31Z) and deliberately not refreshed: updating it would re-run CI to the same red Build Docs while adding interaction risk to a comment-only diff, for no new information.

Card #5469 was ACCEPTed on its merits earlier; this unblocks it.


Generated by Claude Code

@os-sales
os-sales marked this pull request as ready for review August 22, 2026 16:03
@os-sales
os-sales added this pull request to the merge queueAug 22, 2026
Merged via the queue into main with commit 0b1326dAug 22, 2026
22 of 23 checks passed
@os-sales
os-sales deleted the claude/issue-5469-adr0080-prose-retraction branch August 22, 2026 16:04
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationpackage: componentstests

Projects

None yet

3 participants

@os-sales@os-zhuang@claude