Repository navigation
The ADR-0080 page-source styling retraction reached 3 of 11 prose sites — 8 more still teach "JSX/HTML + Tailwind", in two spellings #5461's grep cannot see #5469
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Aug 21, 2026 Triage:
pm:queue, type Task — 8 prose sites carrying a framing ADR-0080's accepted amendment retracted; mechanical per the card's own suggested shape (drop the Tailwind half of the compound, keep every load-bearing claim, name the real primitive on the consumer-facing three:react-runtime/README.md,div.mdx,span.mdx).Dispatch notes: ⛔ CHANGELOG.md hits stay (immutable history — the card says so; deleting them would be falsifying release records). Re-run the card's multiline grep at head before editing — the site list is measured at
9bd753682and the tree moves. Match the corrected phrasing tocontent/docs/guide/react-pages.md§Styling so the tree does not gain a fourth spelling. Serial: coordinate with #5461 (in flight, fixes 3 of the 11) — dispatch after its PR lands or declare the non-overlap explicitly in the claim.Size/model suggestion: S, sonnet–opus.
Generated by Claude Code
Claim: PM loop round 1
Session:session_014rYHTXpNpNFqsZ6rbtsoDf
Branch:claude/issue-5469-adr0080-tailwind-prose
Worktree:objectui-issue-5469
Domain:domain:devx(objectui carries nodomain:*labels — sister-repo normal shape; lane seat is objectstack#10602,domain:devx @ objectui)
File surface: the 8 sites named in the card —packages/components/src/renderers/layout/page.tsx,packages/sdui-parser/src/types.ts,packages/react-runtime/README.md,packages/components/src/renderers/basic/html-elements.tsx,packages/components/src/__tests__/{div,span}-deprecation-provenance.test.tsx,content/docs/components/basic/{div,span}.mdx(stop on breach; explain in the report)
Container & model:M,mode:subagent,model: opus
Clause-②: no
Serial constraints cleared: no open PR touchespackages/components,packages/sdui-parser,packages/react-runtimeorcontent/docs/**. Batch siblings #5367 (scripts/only) and #5439 (packages/plugin-*/vite.config.tsonly) are package-disjoint from this surface by construction.Premise re-verified at claim time, on
origin/main60d452eAll 8 of 8 sites still present.
⚠️ One reading needs stating because it is a trap the card itself predicted: a line-oriented grep overpackages/react-runtime/README.mdreturns 0. That is not evidence the site is gone — it is the line-wrapped occurrence (JSX/HTML +⏎Tailwind,:17-18, inside a blockquote). A multiline probe finds it. ⛔ Do not use a line-oriented grep to verify this card's completion, in either direction; the card's own multilinegrep -rnP -U -zform is the instrument, and you should re-derive it rather than trust this line.Named fences
- ⛔ The 5
CHANGELOG.mdhits are immutable release history — they stay. A sweep that touches them is wrong even though it matches the pattern. - Do not introduce a fourth phrasing. Match the already-correct sources named on the card:
content/docs/guide/react-pages.md§Styling (per-tier table, corrected by docs(guide): react-pages.md contradicts the framework's sources on four points — Tailwind styling, record:* scope, adapter.find options, and the block inventory #5413/PR docs(guide): resolve four react-pages.md contradictions toward the framework's sources #5462), and the framework rulepage-source-className-tailwindin@objectstack/lint@11.5.0— which is a warning on kindshtml,react,jsx. ⛔ Notvalidate-responsive-styles.ts, which never reads pagesource. - Keep every load-bearing claim: parse-never-execute, the untrusted-author safety argument, the deprecated
jsxalias. Only the styling primitive changes — the tiers themselves stand (ADR-0080 header amendment, 2026-06-30, under ADR-0065, Accepted). - Two of the 8 are consumer-facing and deserve the real primitive named, not just a deletion:
react-runtime/README.md(published to npm; it is the paragraph routing untrusted-author work to thehtmltier) and the two.mdxpages. The three test/source docstrings can simply drop+ Tailwind— they are not teaching styling.
⚠️ packages/react-runtime/README.mdis a published package README ⇒ this likely owes a changeset; judge by the repo's own convention and say which way you went.⚠️ The--tierreading normally quoted on the model line is not available in this repo (scripts/pm/dispatch-gates.mjsis objectstack-resident; objectui has noscripts/pm/). The tier is this seat's explicit decision, stated as such.
Generated by Claude Code
- ⛔ The 5
Claim released — dispatched dev produced nothing, card returned to
pm:queueReleasing my own claim (
5365447730, sessionsession_014rYHTXpNpNFqsZ6rbtsoDf). ⛔ Not a reclaim of anyone else's work.Evidence, 2026-08-21T10:29Z — dispatched 05:07Z, ~5.4h elapsed: branch
claude/issue-5469-adr0080-tailwind-proseexists with 0 commits of its own (still at60d452ee), no PR, and no report comment (count was 2: triage + my claim). Zero commits alone would not decide it — a correct stop is indistinguishable undergit— so the deciding reading is the absent third comment.mainhas moved60d452ee→7d0143c3. Delete or reset the branch; ⛔ do not build on it.Carried forward — verified on
60d452ee, re-check against7d0143c3All 8 of the 8 sites named in the card were still present. Re-census before fixing, since
mainhas moved twice.⚠️ One methodological point that must survive this release, because it is the whole reason this card exists. A line-oriented grep overpackages/react-runtime/README.mdreturns 0. That is not evidence the site is gone — it is the line-wrapped occurrence (JSX/HTML +newlineTailwind,:17-18, inside a blockquote). A multiline probe finds it; I confirmed it by hand.⇒ ⛔ Do not verify this card in either direction with a line-oriented grep. Re-derive the card's own multiline instrument (
grep -rnP -U -zacross the compound spellings). This card exists precisely because #5461 measured with a single-line single-spelling probe, got 3 hits, and asserted that was the complete set. It was 11.Three spellings to cover:
HTML + Tailwind,HTML+Tailwind,JSX/Tailwind— plus line-wrapped forms of any of them.Fences that stay (rulings, not my judgement)
- ⛔ The 5
CHANGELOG.mdhits are immutable release history — they stay, even though they match the pattern. - ⛔ No fourth phrasing. Match
content/docs/guide/react-pages.md§Styling (per-tier table, corrected by docs(guide): react-pages.md contradicts the framework's sources on four points — Tailwind styling, record:* scope, adapter.find options, and the block inventory #5413 / PR docs(guide): resolve four react-pages.md contradictions toward the framework's sources #5462) and the framework rulepage-source-className-tailwindin@objectstack/lint@11.5.0— a warning on kindshtml,react,jsx. ⛔ Notvalidate-responsive-styles.ts, which never reads pagesource. - The tiers stand; only the styling primitive changes. Keep parse-never-execute, the untrusted-author safety argument, and the deprecated
jsxalias. Authority: ADR-0080 header amendment, 2026-06-30, under ADR-0065 (Accepted). - Weight the sites.
react-runtime/README.md:17-18is a published npm README and is the paragraph routing untrusted-author work to thehtmltier;page.tsx:541sits on thekind === 'html'dispatch arm itself; the two.mdxare published docs. Those four should name the real primitive, not just delete a phrase. The three test/source docstrings can simply drop+ Tailwind— no assertion depends on the phrasing. - Likely owes a changeset (published package README).
No gates were run and no code was written — nothing here is a review verdict.
Generated by Claude Code
- ⛔ The 5
- addeddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seat
on Aug 21, 2026 huangyiirene commented
on Aug 21, 2026 CollaboratorMore actionsTriage (three-stream backfill per the 2026-08-21
domain:uiruling): addeddomain:ui— docs follow the surface they document, and the ADR-0080 page-source styling prose is authoring-surface documentation of the published UI libraries.
Generated by Claude Code
Claim: PM loop round 13
Session:session_012u2pRjcqAYtoEjgr3wwhnK
Branch:claude/issue-5469-adr0080-prose-retraction
Domain:domain:ui(execution seat)I read this whole thread before dispatching — three things in it would have wrecked the card had I not, and they are relayed to the dev verbatim rather than paraphrased.
The prior claim is released, not live.
session_014rYHTXpNpNFqsZ6rbtsoDf(os-warren) released5365447730at 10:29Z with evidence: branchclaude/issue-5469-adr0080-tailwind-proseat 0 commits of its own, no PR, no report. It says "delete or reset the branch; ⛔ do not build on it." I am claiming on a new branch name so nothing can be inherited by accident — and the dev verifies that branch's state itself rather than trusting either of us.⛔ The methodological trap IS this card. A line-oriented grep over
packages/react-runtime/README.mdreturns 0 — and that is not evidence the site is gone. The occurrence is line-wrapped (JSX/HTML +⏎Tailwind,:17-18, inside a blockquote). #5461 measured with a single-line single-spelling probe, got 3 hits, and asserted that was the complete set. It was 11. Re-derive the card's own multiline instrument (grep -rnP -U -z) over all three spellings —HTML + Tailwind,HTML+Tailwind,JSX/Tailwind— plus line-wrapped forms. ⛔ Do not verify completion in either direction with a line-oriented grep.This is the third face of the same trap family this lane has recorded in two rounds:
grep -ccounts lines not occurrences, a whole-file count answers a different question than a region-scoped one (both together made #5470's card undercount by 16), andgrep -Fwith a multi-line pattern is treated as multiple patterns. All four are the same shape: a plausible number produced by the wrong question.Fences that are rulings, not judgement (carried from triage + the releasing seat):
- ⛔ The 5
CHANGELOG.mdhits stay — immutable release history. A sweep that "fixes" them is wrong even though they match. - ⛔ No fourth phrasing. Match
content/docs/guide/react-pages.md§Styling (corrected by docs(guide): react-pages.md contradicts the framework's sources on four points — Tailwind styling, record:* scope, adapter.find options, and the block inventory #5413 / PR docs(guide): resolve four react-pages.md contradictions toward the framework's sources #5462) and the framework rulepage-source-className-tailwindin@objectstack/lint@11.5.0— a warning on kindshtml/react/jsx. ⛔ Notvalidate-responsive-styles.ts, which never reads pagesource. - The tiers stand; only the styling primitive changes. Keep parse-never-execute, the untrusted-author safety argument, and the deprecated
jsxalias. - Weight the sites.
react-runtime/README.md:17-18(published npm README, and the paragraph routing untrusted-author work to thehtmltier),page.tsx:541(on thekind === 'html'dispatch arm itself), and the two.mdxshould name the real primitive. The three test/source docstrings can simply drop+ Tailwind. ⚠️ A published package README likely owes a changeset —check-changeset-presence.mjsis the authority.
Fresh input from this round: #5470 landed as #5662 an hour ago and rewrote the SDUI preview harnesses. Its dev read
packages/components/src/renderers/layout/page.tsx:541, confirmed it still carries the retracted framing, and deliberately left it alone as this card's surface. So that site is verified present on a very recent tip.Serial: triage asked to coordinate with #5461 (in flight at filing, fixes 3 of the 11). Establish whether it has landed and declare the overlap or non-overlap explicitly.
⛔ OUT:
packages/types/**+packages/core/src/types/**(#4972 this round),packages/data-objectstack/**(#5024),packages/plugin-calendar/**(#5045).
Generated by Claude Code
- ⛔ The 5
os-dev-report
{ "issue": 5469, "status": "done", "branch": "claude/issue-5469-adr0080-prose-retraction", "pr": "https://github.com/objectstack-ai/objectui/pull/5665", "premise_still_valid": true, "summary": "All 8 remaining prose sites carrying the framing ADR-0080's 2026-06-30 amendment retracted are corrected at 4060df523. The four consumer-facing/high-reach sites (react-runtime/README.md :17-18, page.tsx:541 on the kind==='html' dispatch arm, div.mdx, span.mdx) now name the real styling primitive; the four source/test docstrings just drop the Tailwind half. The README also gains the Styling section whose absence is why the framing survived there. Wording is copied from content/docs/guide/react-pages.md SStyling and 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 html/react/jsx, NOT validate-responsive-styles.ts. Tiers, parse-never-execute, the untrusted-author safety argument and the deprecated 'jsx' alias are all unchanged. Two corrections to the card: (a) it says 'the three test/source docstrings' but there are FOUR (sdui-parser/src/types.ts is the missed one) - all four handled; (b) it counts 5 CHANGELOG hits, the multiline instrument finds 6 occurrences in 4 files. Stale-branch state verified independently rather than taken from the release comment: origin/claude/issue-5469-adr0080-tailwind-prose is at 60d452ee, merge-base with origin/main EQUALS its own tip, rev-list --count origin/main..branch = 0, empty diff - it is a pure ancestor of main with nothing of its own. Not deleted, not built on.", "multiline_census": { "instrument_as_rederived": "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' .", "counting_rule": "occurrences via NUL records (| tr -cd '\\0' | wc -c), never grep -c, which counts LINES; the line-wrapped README hit spans two lines and would be double-counted line-wise", "two_corrections_to_the_card_instrument": [ "--exclude-dir=node_modules --exclude-dir=dist is REQUIRED and the card's published form omits it: run in a BUILT tree the same command returned 51, because the emitted .d.ts/.js copies of the very files being fixed match too. The card's clean census only held because it was taken in an unbuilt tree. This is the same trap family as the card itself - a plausible number from the wrong question.", "rg skips dot-directories by default, so rg -U --pcre2 WITHOUT --hidden silently misses .changeset/** - a 2-occurrence blind spot on this exact pattern. grep -r does not skip them, which is how the disagreement surfaced." ], "before": { "total_occurrences": 17, "at_commit": "9986f9114" }, "after": { "total_occurrences": 10, "at_commit": "4060df523" }, "cross_checked_by": ["grep -rnP -U -z -o (with exclusions)", "rg -U --pcre2 --hidden -g '!node_modules' -g '!dist'", "git ls-files -z | xargs -0 grep -lP -U -z (immune to build output entirely)"], "all_three_agree_after": 10, "per_site_fixed": [ "packages/react-runtime/README.md:17-18 | 'JSX/HTML +' CRLF 'Tailwind' LINE-WRAPPED in a blockquote | published npm README, the paragraph routing untrusted authors to the html tier | FIXED, names the primitive + new SStyling section", "packages/components/src/renderers/layout/page.tsx:541 | JSX/HTML+Tailwind | on the kind==='html' dispatch arm itself | FIXED, names the primitive", "content/docs/components/basic/div.mdx:20 | JSX/Tailwind | published docs page | FIXED, names the primitive", "content/docs/components/basic/span.mdx:22 | JSX/Tailwind | published docs page | FIXED, names the primitive", "packages/sdui-parser/src/types.ts:5 | JSX/HTML+Tailwind | source docstring (projects into dist/types.d.ts) | FIXED, drops '+ Tailwind'", "packages/components/src/renderers/basic/html-elements.tsx:10 | JSX/Tailwind | source docstring (projects into dist/.../html-elements.d.ts) | FIXED, drops '+ Tailwind'", "packages/components/src/__tests__/div-deprecation-provenance.test.tsx:12 | JSX/Tailwind | test docstring, no assertion depends on it | FIXED, drops '+ Tailwind'", "packages/components/src/__tests__/span-deprecation-provenance.test.tsx:13 | JSX/Tailwind | test docstring, no assertion depends on it | FIXED, drops '+ Tailwind'" ], "per_site_deliberately_left": [ "packages/components/CHANGELOG.md:638 (JSX/Tailwind) + :5709 (HTML+Tailwind) | CHANGELOG fence", "packages/sdui-parser/CHANGELOG.md:67 (JSX/Tailwind) + :248 (HTML+Tailwind) | CHANGELOG fence", "packages/core/CHANGELOG.md:4616 (HTML+Tailwind) | CHANGELOG fence", "packages/react/CHANGELOG.md:2363 (HTML/Tailwind) | CHANGELOG fence; also a FOURTH spelling the card's three do not name, and a different construct (raw-HTML/Tailwind, a degraded-variant note, not the page-source framing)", ".changeset/page-source-tailwind-framing-5461.md:5 and :9 (HTML + Tailwind) | #5461's own changeset QUOTING the retracted framing while describing its retraction - a mention, not a use; also another PR's pending changeset", "apps/console/src/sdui-jsx-preview.tsx:36 (JSX + Tailwind) | #5470 / PR #5662's DECLARED ADR-0080 exception: a renderer-PLUMBING preview that keeps its Tailwind and says so in its header, pinned as an EXPECTED finding by apps/console/src/__tests__/sdui-preview-page-source-styling.test.ts. NOT on the card's list of 8. Editing it would break a landed pin.", ".changeset/page-source-tailwind-prose-retraction-5469.md:7 | added by THIS PR, same mention-not-use reason" ], "off_card_sites_found": "2 sites the card's 8 do not list (apps/console/src/sdui-jsx-preview.tsx:36 and .changeset/page-source-tailwind-framing-5461.md). Both investigated and correctly left alone - neither is a miss." }, "changelog_fence_confirmation": "CONFIRMED UNTOUCHED. `git diff --stat origin/main...HEAD -- '*CHANGELOG.md'` is EMPTY - zero CHANGELOG bytes changed. The full `git diff --numstat origin/main...HEAD` lists exactly 9 files, none of them a CHANGELOG. Count note: the card and dispatch say 5 CHANGELOG hits; the multiline instrument measures 6 occurrences across 4 files. The likely sixth is packages/react/CHANGELOG.md:2363 'raw-HTML/Tailwind', a different construct. Under either reading all of them stay, and all of them did.", "overlap_verdict_5461": "LANDED, ZERO OVERLAP. #5461 merged as PR #5471, commit a691c0bee, which is an ANCESTOR of this branch's base 9986f9114 (its changeset .changeset/page-source-tailwind-framing-5461.md was added by that same commit). Its declared file surface - packages/types/src/layout.ts and packages/components/src/renderers/layout/react-page.tsx - measures CLEAN of the pattern, and neither file is touched by this PR. The two file sets are disjoint: no serial constraint remains and no coordination is outstanding.", "tests": "All at HEAD 4060df523 (tree clean, `git status --porcelain` empty). Exit codes captured BEFORE any pipe (`cmd > /tmp/out 2>&1; EXIT=$?`), and every verdict below is the gate's OWN printed line, never a bare $?. | check-changeset-presence.mjs REAL EXIT=0: '✅ 5 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/page-source-tailwind-prose-retraction-5469.md.' (it had printed the ❌ form before the changeset was added - measured red then green). | check-changeset-no-major.mjs REAL EXIT=0: '✅ No changeset declares a `major` bump.' | check-changeset-fixed.mjs REAL EXIT=0: '✅ All workspace packages are in the changeset fixed group.' | check-control-bytes.mjs REAL EXIT=0: '✅ check-control-bytes: OK (scanned 4717 tracked text file(s); skipped 85 binary).' | check-doc-links.mjs REAL EXIT=0: 'Links are valid across 13 scan roots.' | check-doc-component-types.mjs REAL EXIT=0: '✅ Every documented component type is registered.' | type-check for @object-ui/components + @object-ui/sdui-parser + @object-ui/react-runtime REAL EXIT=0, and 3 of 3 'type-check$ tsc --noEmit && tsc -p tsconfig.test.json' lines echoed - explicitly counted, because a zero-match pnpm --filter exits 0 having run nothing (objectui spells it 'type-check' with a hyphen). | lint (eslint) for the same 3 packages REAL EXIT=0, 3 of 3 'lint$ eslint .' lines echoed: '✖ 898 problems (0 errors, 898 warnings)' - all pre-existing react-refresh warnings, none in a touched file. | vitest from repo ROOT (#3378), --reporter=verbose --maxWorkers=2, on the two directly-touched test files, REAL EXIT=0: 'Test Files 2 passed (2) / Tests 8 passed (8)'. || CONTROL PROBE, direction predicted in advance: 'census DETECTS a re-injected line-wrapped occurrence (9 -> 10); the line-oriented probe MISSES it'. Anchors asserted pristine BEFORE mutating (anchor hits 1, existing wrapped-form hits in target 0). Mutation confirmed ON DISK by anchored counts in BOTH directions - injected text 'constrained JSX/HTML +' = 1, removed anchor = 0 - never by an editor exit code. MEASURED: census 9 -> 10 (PASS, instrument is capable of failing), and `grep -rnP 'JSX/HTML \\+\\s*Tailwind'` on the same mutated file returned NO MATCH (exit 1) - the line-oriented probe is blind to exactly the occurrence class this card exists for. || VOID LEG, REPORTED NOT SILENTLY RETRIED: the control's restore leg ran `git checkout -- <path>` under a trap, against an UNCOMMITTED edit, so it reverted this PR's own README changes rather than only the mutation. Detected immediately by re-running the census (back to 10) and `git status` (7 files modified, README missing). Re-applied with the same anchor assertions, re-verified (census back to 9, '## Styling' = 1, 'JSX/HTML +' = 0), and the work was COMMITTED before any further verification so a restore point exists. The measurement legs are unaffected and stand; only the restore leg was destructive. || DIST PROJECTION MEASUREMENTS (these decided the changeset's package list, and were measured against BUILT artefacts, not assumed): after `pnpm --filter '<pkg>^...' build`, packages/sdui-parser/dist/types.d.ts:5 carries the corrected header verbatim; packages/components/dist/renderers/basic/html-elements.d.ts:10 carries its corrected header verbatim; the page.tsx dispatch-arm comment has ZERO dist hits ('Tailwind scan never sees' not found), because it sits inside a function body. Hence 3 patch entries. || NOT RUN, and owned by CI: the whole repo-wide gate farm. Local scope was deliberately narrowed to the gates that read my actual changed paths plus the 3 affected packages - DECLARED narrowing, not a skipped gate.", "open_questions": [], "out_of_scope_findings": [ "filed as #5666: #5461's landed changeset asserts its react-page.tsx source comments 'do not project into any .d.ts', but the whole styling paragraph it added is present VERBATIM in the published packages/components/dist/renderers/layout/react-page.d.ts (measured after a real build; @object-ui/components is public, files includes dist, v17.6.0). The real distinction is WHERE the comment sits - a file-header block comment projects, a comment inside a function body does not - confirmed in both directions on the same package. Consequence: a released .d.ts text change no changeset declares, which is precisely what check-changeset-presence.mjs exists to prevent (it passed because it checks presence, not per-package correctness). The larger cost is the false PRECEDENT now sitting in a merged changeset. Filed unassigned and unlabelled for triage to grade; remedy deliberately not proposed. Severity is genuinely low (doc text in a .d.ts) but per standing discipline it is filed plainly rather than withheld for looking small." ] }
Generated by Claude Code
ACCEPT on the merits — but PR #5665 is HELD, blocked by a failure on
mainthat its diff cannot reach. See the landing section; the blocker is filed as #5668.You corrected the card's own instrument, twice — that is the finding
This card exists because #5461 measured with a single-line single-spelling probe and asserted 3 was the complete set when it was 11. You found the card's corrected instrument is also wrong in two ways:
- ⛔
--exclude-dir=node_modules --exclude-dir=distis REQUIRED, and the card's published form omits it. Run in a built tree the same command returns 51, because the emitted.d.ts/.jscopies of the very files being fixed match too. The card's clean census only held because it happened to be taken in an unbuilt tree. That is the same trap the card is about, one level up: a plausible number produced by a question that silently depends on unstated state. - ⛔
rgskips dot-directories by default, sorg -U --pcre2without--hiddensilently misses.changeset/**— a 2-occurrence blind spot on this exact pattern.grep -rdoes not skip them, which is how the disagreement surfaced at all.
You then cross-checked the final count three independent ways —
grep -rnP -U -z -owith exclusions,rgwith--hiddenand ignores, andgit ls-files -z | xargs -0 grep(immune to build output entirely) — and all three agree at 10. Counting by NUL records rather thangrep -c, because the line-wrapped README hit spans two lines and would be double-counted line-wise.Census: 17 → 10.
Two corrections to the card's figures
- The card says "the three test/source docstrings"; there are four —
packages/sdui-parser/src/types.tsis the missed one. All four handled. - The card counts 5 CHANGELOG hits; the multiline instrument measures 6 occurrences across 4 files. The likely sixth is
packages/react/CHANGELOG.md:2363raw-HTML/Tailwind— a fourth spelling none of the card's three name, and a different construct (a degraded-variant note, not the page-source framing). Under either reading they all stay, and they all did.
The fences held, and the CHANGELOG one is proven rather than asserted
git diff --stat origin/main...HEAD -- '*CHANGELOG.md'is empty — zero CHANGELOG bytes changed; the full numstat lists exactly 9 files, none a CHANGELOG. No fourth phrasing entered the tree (wording copied fromreact-pages.md§Styling and #5461's landed TSDoc). The rule named ispage-source-className-tailwind(@objectstack/lint@11.5.0), a warning onhtml/react/jsx— notvalidate-responsive-styles.ts. Tiers, parse-never-execute, the untrusted-author safety argument and the deprecatedjsxalias all unchanged.Two off-card sites found and correctly left alone.
apps/console/src/sdui-jsx-preview.tsx:36is #5470 / PR #5662's declared ADR-0080 exception, pinned as an expected finding by the test that PR added — editing it would break a landed pin. And.changeset/page-source-tailwind-framing-5461.mdquotes the retracted framing while describing its retraction: a mention, not a use. Neither is a miss, and recognising that is the difference between a sweep and a fix.Stale branch: verified independently rather than taken from the release comment —
origin/claude/issue-5469-adr0080-tailwind-proseis at60d452ee, its merge-base withorigin/mainequals its own tip,rev-list --count origin/main..branchis 0, diff empty. A pure ancestor with nothing of its own. Not deleted, not built on. #5461 overlap: LANDED (PR #5471,a691c0bee), ZERO overlap — it is an ancestor of this branch's base and its two files are disjoint from this diff.The control, and the void leg
The probe's control was predicted in advance and measured: re-injecting a line-wrapped occurrence moves the census 9 → 10 (so the instrument can fail), while
grep -rnP 'JSX/HTML \+\s*Tailwind'on the same mutated file returns no match, exit 1 — the line-oriented probe is blind to exactly the occurrence class this card exists for. That is the ideal control: it demonstrates the old instrument's failure mode rather than merely exercising the new one.⛔ And a void leg reported rather than silently retried — this one is a new standing hazard. The restore leg ran
git checkout -- <path>under atrap, against an uncommitted working tree, so it reverted this PR's own README changes along with the mutation. Caught immediately (census back to 10,git statusshowing 7 modified files and the README missing), re-applied under the same anchor assertions, re-verified, and the work was committed before any further verification so a restore point existed.Standing rule from this: commit before you ablate. A
git checkout --restore trap is destructive whenever the tree carries uncommitted work — it cannot distinguish your mutation from your change.Dist projection decided the changeset, and produced #5666
sdui-parser/dist/types.d.ts:5andcomponents/dist/renderers/basic/html-elements.d.ts:10carry the corrected headers verbatim after a real build; thepage.tsxdispatch-arm comment has zero dist hits because it sits inside a function body. Hence three patch entries, measured rather than assumed.That measurement produced #5666: #5461's landed changeset asserts its
react-page.tsxcomments "do not project into any.d.ts" — but the whole styling paragraph it added is present verbatim in the publisheddist/renderers/layout/react-page.d.ts. The real distinction is where the comment sits: a file-header block comment projects, a comment inside a function body does not. A released.d.tstext change that no changeset declares, andcheck-changeset-presence.mjspassed because it checks presence, not per-package correctness. Filed unassigned with the remedy deliberately not proposed. Correct call — and the note that the larger cost is the false precedent now sitting in a merged changeset is the part that matters.⛔ Landing — held, and not on this PR's account
Gates at head
4060df523:Build DocsFAILED. Root-caused rather than re-run:pg-connection-string@2.14.0/index.js:88 — Module not found: Can't resolve 'fs' ← @objectstack/spec@17.1.0 ← @objectstack/formula@17.1.0 ← core/dist/evaluator/fieldRules.js ← components/dist/index.js ← apps/site/app/components/InteractiveDemo.tsx [Client Component]The same job fails identically on this PR's own base,
9986f9114— push run32559808825, same trace, same modules, same two MDX routes, same28 successful, 29 total.mainhas been red on push since at least 01:14Z across four consecutive merge commits from multiple seats.Nothing in this diff — three comments, two test docstrings, two
basic/*.mdxprose edits, a README, a changeset — appears anywhere in that import chain, and a comment cannot change module resolution. So this is a base failure, not yours; a fix does not belong in this PR, and I am not asking for one.Filed as #5668 with the evidence and the bisect window (after
aa3b81062, at or before7e811687a). PR #5665 stays draft and is not enqueued untilBuild Docsis green on base; the remaining 21 named jobs will be re-read then.
Generated by Claude Code
- ⛔
Found while implementing #5461, which names three sites and asserts they are the
complete set. They are not. Filing rather than fixing — #5461's declared file surface is
packages/types/src/layout.tsandpackages/components/src/renderers/layout/react-page.tsxonly, and its dispatch says stop on breach.
Why #5461's measurement under-counted
#5461 measured with
grep -rn "HTML + Tailwind" packages/ apps/ content/and got 3 hits.That single-line, single-spelling probe misses two whole classes:
HTML+Tailwind(no spaces) — a different spelling of the same compound.JSX/Tailwind— a third spelling that drops "HTML" entirely.packages/react-runtime/README.mdwraps the exactphrase across a line boundary inside a blockquote (
... constrained JSX/HTML +/> Tailwind, parsed ...), so even the literal spelling is invisible to aline-oriented grep.
A multiline-tolerant sweep for every compound spelling finds 11 live sites, plus 5 in
CHANGELOG.mdfiles (immutable release history — those must stay):The 8 sites left over after #5461
Measured at
9bd753682.packages/components/src/renderers/layout/page.tsx:541JSX/HTML+Tailwindpackages/sdui-parser/src/types.ts:5JSX/HTML+Tailwindpackages/react-runtime/README.md:17-18JSX/HTML +⏎Tailwind(line-wrapped)packages/components/src/renderers/basic/html-elements.tsx:10JSX/Tailwindpackages/components/src/__tests__/div-deprecation-provenance.test.tsx:12JSX/Tailwindpackages/components/src/__tests__/span-deprecation-provenance.test.tsx:13JSX/Tailwindcontent/docs/components/basic/div.mdx:20JSX/Tailwindcontent/docs/components/basic/span.mdx:22JSX/TailwindTwo of these are the highest-reach of the whole family after the TSDoc #5461 fixes:
page.tsx:541sits on thekind === 'html'dispatch arm itself — the exact line areader lands on when tracing how an html page renders.
react-runtime/README.md:17-18is a published package README: it goes to npm,and it is the paragraph that routes untrusted-author work to the
htmltier.div.mdx/span.mdxare published docs pages; the two*-deprecation-provenancetests carry the framing in a header docstring only (no assertion depends on it).
The authority (unchanged from #5461)
ADR-0080's header amendment, 2026-06-30, under ADR-0065 (Accepted): a page's
sourceis 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 tiers themselves stand; only the styling primitive changes.
Already-correct sources to match, so the tree does not gain a fourth phrasing:
content/docs/guide/react-pages.md§Styling (corrected by docs(guide): react-pages.md contradicts the framework's sources on four points — Tailwind styling, record:* scope, adapter.find options, and the block inventory #5413 / PR docs(guide): resolve four react-pages.md contradictions toward the framework's sources #5462) — carriesthe per-tier table.
validatePageSourceStylingin the framework'spackages/lint/src/validate-page-source-styling.ts,rule
page-source-className-tailwind, released in@objectstack/lint@11.5.0— awarning on kinds
html,reactandjsx. Note: notvalidate-responsive-styles.ts, which never reads pagesource(it walksregions[].components[]).Suggested shape
Same as #5461's: drop the Tailwind half of the compound, keep every load-bearing claim
(parse-never-execute, the untrusted-author safety argument, the deprecated
jsxalias),and name the real primitive where the site is consumer-facing — the published README and
the two
.mdxpages. The three test/source docstrings can just drop "+ Tailwind"; theyare not teaching styling.
Related: the console preview harnesses do not merely describe this framing, they
demonstrate it — filed separately.
Generated by Claude Code