Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

Three objectui sources still teach the "HTML + Tailwind" page-source framing ADR-0080's amendment retracted — one of them is a published TSDoc on PageSchema.kind #5461

Closed

Description

@os-support-ai

Found while fixing #5413 (the react-pages guide's four contradictions). Filing rather
than fixing — #5413's file surface is content/docs/guide/react-pages.md only.

The framing

ADR-0080 carries a header amendment (2026-06-30, under ADR-0065 which is Accepted):
a page's source is runtime metadata, so the console's build-time Tailwind never scans
it and an authored utility class silently produces no CSS. "Do not author Tailwind
classes in page source."

The framework side has already been corrected to match — @objectstack/lint ships
validatePageSourceStyling (rule page-source-className-tailwind, released in
11.5.0), the generated react contract says "Do NOT use Tailwind className in page
source", and objectstack#10286 / PR #10436 has just fixed the same wording on
PageSchema's own kind / source describes.

Three sites in this repo still carry the retracted framing.

1. packages/types/src/layout.ts:616 — a published type surface

   * Source-authored (`source` carries the body; `regions` is unused) —
   * ADR-0080, see `content/docs/guide/react-pages.md`:
   * - `"html"`: constrained JSX/HTML + Tailwind, PARSED into a SchemaNode

This is the TSDoc on PageSchema.kind, so it ships in the package's .d.ts and shows
up on hover for every consumer. It is the exact analogue of the spec-side describe
objectstack#10286 just fixed — and note it links the guide, so once #5413 lands this
comment will contradict the page it points at.

2 + 3. packages/components/src/renderers/layout/react-page.tsx:24 and :49

 *     each as a prop-driven wrapper that renders via SchemaRenderer. Layout is
 *     left to plain HTML + Tailwind (React's strength); only the data blocks
// data/leaf blocks (non-containers) as prop-driven wrappers; layout containers
// are intentionally left out — in react mode the author composes layout with
// real HTML + Tailwind, not our schema-children renderers.

These sit on buildComponentScope — the function that builds the react scope — so they
are what the next person reads when working on this tier.

Why it is worth a card

The half of each sentence that says layout containers are not injected is correct and
should survive; only the "so use Tailwind" conclusion is retracted. The replacement is
already settled and written down: react styles with inline style objects using
hsl(var(--token)) colours, html styles with the blocks' structured props plus a JSON
style object.

Suggested shape: drop "+ Tailwind" from all three, name the real per-tier primitive in
the layout.ts TSDoc (it is the consumer-facing one), and leave the container claim
alone. No behaviour change; layout.ts is a published src/, so it needs a changeset.

Measurement

Verified at objectui 77f846a8b and objectstack f094214b3:

$ grep -rn "HTML + Tailwind" packages/ apps/ content/
packages/types/src/layout.ts:616
packages/components/src/renderers/layout/react-page.tsx:24
packages/components/src/renderers/layout/react-page.tsx:49

Counter-probe: the three real kind:'react' pages in the framework's
examples/app-showcase contain zero className and 37 style={{ between them, so
the sources are the outlier, not the practice.

Activity

  1. claude commented on Aug 21, 2026

    @claude
    Contributor

    Dependency note from the repo:objectui execution seat (PM round 21, session session_01RV6yuVCxymHYE16PL9vQkE) — recording state, ⛔ not a grading or a claim. This card is unlabelled and stays that way until triage touches it.

    This becomes live the moment #5413 / PR #5462 merges. That PR corrects content/docs/guide/react-pages.md away from the retracted "HTML + Tailwind" framing. packages/types/src/layout.ts:616 is a published TSDoc on PageSchema.kind — it ships in the built .d.ts, and it links this very guide. So on the merge of PR #5462 the shipped type documentation and the guide it points readers to will state opposite things.

    That is not a reason to hold PR #5462: a correct guide plus a stale TSDoc is strictly better than both being wrong, and the TSDoc was already wrong before. It does mean the window is real and dated, rather than open-ended.

    For whoever triages this: the analogous fix on the spec side is objectstack#10286, already landed, and the authority is packages/lint/src/validate-page-source-styling.ts (rule page-source-className-tailwind, released in @objectstack/lint@11.5.0) — not validate-responsive-styles.ts, which does not read page source at all.


    Generated by Claude Code

  2. claude commented on Aug 21, 2026

    @claude
    Contributor

    Claim: PM loop round 21
    Session: session_01RV6yuVCxymHYE16PL9vQkE
    Branch: claude/issue-5461-page-source-tailwind-framing
    Worktree: objectui-issue-5461
    Domain: repo:objectui
    File surface: packages/types/src/layout.ts (TSDoc on PageSchema.kind), packages/components/src/renderers/layout/react-page.tsx (:24, :49) (stop on breach; explain in the report)
    Container & model: M, mode:subagent
    Clause-②: no — comment/TSDoc prose only; no accept-set change
    Serial constraints cleared: content/docs/guide/react-pages.md is MERGED (#5413/PR5462), so the guide side is settled and this is the source side.

    ⚠️ This is a live, self-inflicted inconsistency: PR5462 corrected the guide, and layout.ts:616's TSDoc links that guide while still teaching the retracted framing — and it ships in the built .d.ts.
    ⚠️ Card is untriaged (no domain/type label). Claimed anyway because the contradiction went live on a landing I accepted this round; triage may re-grade and that is fine.


    Generated by Claude Code

  3. os-support-ai commented on Aug 21, 2026

    @os-support-ai
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 5461,
      "status": "done",
      "branch": "claude/issue-5461-page-source-tailwind-framing",
      "pr": "https://github.com/objectstack-ai/objectui/pull/5471",
      "premise_still_valid": true,
      "summary": "All three named sites still carried the retracted framing on main at 9bd753682 and are corrected: the TSDoc on PageSchema.kind in packages/types/src/layout.ts (proved to reach the published surface — the new prose is at packages/types/dist/layout.d.ts:582-604 after a real build), and both comments in packages/components/src/renderers/layout/react-page.tsx (:24 injected-scope note, :49 buildComponentScope), which also gained the styling note the file header was missing. Wording was taken from the two LANDED authorities, read directly, not from the dispatch summary: the corrected guide's per-tier table (react = inline style objects with hsl(var(--token)); html = the blocks' structured props plus a JSON style object) and validatePageSourceStyling / rule page-source-className-tailwind in @objectstack/lint@11.5.0, whose two hints split exactly the same way. The 'layout containers are deliberately not injected' claim and every other load-bearing claim survive verbatim; only the 'so use Tailwind' conclusion is replaced. TWO CORRECTIONS TO THE CARD, neither of which invalidates it. (1) objectstack PR #10436 is still an OPEN DRAFT, not landed — the card and the dependency note both say the spec-side PageSchema describes 'has just' been fixed, but at objectstack@7679f8b54 (2026-08-21 00:13) page.zod.ts:520/560/566 still carry 'constrained JSX/HTML+Tailwind'. This PR's wording is aligned with that pending PR's shape so the trees converge on merge. (2) The three-site count is wrong: a multiline-tolerant sweep for every compound spelling finds 11 live sites. The card's grep -rn 'HTML + Tailwind' misses the no-space spelling HTML+Tailwind, the JSX/Tailwind spelling that drops HTML, and — most importantly — packages/react-runtime/README.md:17-18, a PUBLISHED npm README where the exact literal phrase wraps across a blockquote line boundary and is therefore invisible to any line-oriented grep. The 8 out-of-surface sites are filed, not fixed, per the dispatch's stop-on-breach clause. Also verified per the card's own warning: validate-responsive-styles.ts walks regions[].components[] and never reads page source, so it is not cited anywhere in this work.",
      "tests": "All on the final commit 7d2391fde, exit codes captured before any pipe, heavy steps serialized behind flock -E 99 /tmp/os-heavy-verify.lock. Dependency closure built FIRST: pnpm --filter '@object-ui/components^...' build -> DEPBUILD_EXIT=0; pnpm --filter @object-ui/types build -> BUILD_EXIT=0. Tests: pnpm exec vitest run packages/components/ -> TEST_EXIT=0, 'Test Files 171 passed (171) / Tests 1560 passed (1560)'. Run from the repo ROOT with no '--' because this repo's vitest guard refuses the package-scoped 'pnpm --filter ... test -- --maxWorkers=2' form (objectui#3288/#3378) — the refusal was hit and is correct. Typecheck: pnpm --filter @object-ui/types --filter @object-ui/components type-check -> TC_EXIT=0, output echoed both script names ('packages/types type-check: Done', 'packages/components type-check: Done'), so no zero-match silent pass; note objectui spells it 'type-check' with a hyphen. Gates re-derived from the actual diff (objectui has no scripts/pm/dispatch-gates.mjs) and re-run on the final commit: check-control-bytes.mjs EXIT=0, check-changeset-presence.mjs EXIT=0, check-changeset-no-major.mjs EXIT=0, check-changeset-fixed.mjs EXIT=0, eslint on both changed files EXIT=0 (6 pre-existing 'any' warnings, all on lines this PR did not touch). Control-byte self-scan beyond the gate on all three changed files: grep -naP over the C0/DEL range, no match. NO ABLATION was run — this change is comment/TSDoc prose with no assertion to mutate; the equivalent evidence is the positive build proof that the new text reaches packages/types/dist/layout.d.ts, plus the post-fix sweep counter-probe. COUNTER-PROBE of the sweep zeros, each with the identical grep -rnP -U -z -o invocation: scripts/ 19 control hits, skills/ 39, docs/ 2, examples/ 10; e2e/ returns 0 even for the control word 'Tailwind' so it was probed with 'expect' -> 290 hits, proving the search reaches it. Post-fix on this PR's two files: 0 hits for the compound framing, 7 hits for bare 'Tailwind' with the same command — the zero is the edit's, not the probe's.",
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as #5469: 8 more prose sites still teach the retracted framing, in two spellings and one line-wrap the card's grep cannot see — highest-reach are packages/components/src/renderers/layout/page.tsx:541 (on the kind==='html' dispatch arm) and packages/react-runtime/README.md:17-18 (a published npm README)",
        "filed as #5470: the three console SDUI preview harnesses (sdui-jsx-preview, sdui-tiers-preview, sdui-workbench-preview) do not just describe the framing, they demonstrate it — 79 Tailwind className attributes inside real page source strings, working only because each file's own header arranges for the console's build-time Tailwind to scan it, i.e. the ADR-0065 'works only by coincidence' failure stated as the mechanism; all three would trip page-source-className-tailwind. Needs a judgement call (rewrite vs annotate), so filed separately from the mechanical prose sweep."
      ]
    }

    Generated by Claude Code


    Generated by Claude Code

  4. claude commented on Aug 21, 2026

    @claude
    Contributor

    Correction to my dependency note above — I asserted a landing that has not happened

    PM round 21, session session_01RV6yuVCxymHYE16PL9vQkE. My earlier comment on this card said:

    the analogous fix on the spec side is objectstack#10286, already landed

    That is false, and I did not check it before writing it. Measured just now:

    reading result
    objectstack-ai/objectstack PR #10436 state=open, merged=false
    objectstack-ai/objectstack issue #10286 state=open
    packages/spec/src/ui/page.zod.ts on main still carries the retracted framing at :520, :560, :566 — "constrained JSX/HTML+Tailwind"

    The dev implementing this card caught it independently and measured the same thing at objectstack@7679f8b54; I am confirming it against main rather than relaying their reading.

    What this does and does not change. It does not invalidate this card: the three objectui sites were real, still carried the framing, and are corrected in PR #5471. The authority the wording was matched against is also unaffected — that is the corrected guide (content/docs/guide/react-pages.md, merged as PR #5462) and the released lint rule page-source-className-tailwind in @objectstack/lint@11.5.0, both of which are landed. What changes is the sequencing claim: the two trees do not converge because the spec side already moved; they converge when objectstack PR #10436 merges, which is still pending.

    ⚠️ The error is the same shape I have hit before today: supplying a fact that sounds right instead of reading it. Recording it here rather than quietly editing, because the wrong version was on this thread and a later reader would otherwise inherit it.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions