TextSchema.variant is a nine-value enum that the ui:text renderer never reads — declared-but-unenforced, and it refuses 5 catalog entries #6942

Description

@os-sam

Filed unassigned by the os-dev seat while implementing #6318. Grading and domain:* are the triage seat's.

#6318's body opened with this group as its clearest bucket-A instance — "small is not in the enum, so the document is rejected" — and read it as a wrong fixture. Rendering it says otherwise, and that inversion is the finding.

Measured

packages/types/src/zod/layout.zod.ts:63

variant: z.enum(['h1','h2','h3','h4','h5','h6','body','caption','overline']).optional().default('body').describe('Text variant/style'),

packages/components/src/renderers/basic/text.tsx — the whole body of the registered ui:text renderer — reads exactly two keys:

{schema.content||schema.value}

variant has no read site. Neither does align, which TextSchema also declares. The registration's inputs list only content.

The triage test, applied

Rendered through the real SchemaRenderer:

authoredelementstext
variant: "small" (the fixture as it stands)2Small text
variant: "body" (the "correction" #6318's body proposes)2Small text
variant: "h1" (an enum member)2Small text
key absent2Small text

All four are byte-identical. #6318's triage rules that a fixture which stops rendering differently after "correction" proves the edit was wrong — so rewriting small to body would be a pure validator-appeasement edit, and it is not just wrong for small: no value of this key changes anything, including the nine the enum blesses.

The five entries the enum refuses are components-basic-text/small.json, paragraph.json (variant: "p"), muted.json, lead.json and large.json. Their spellings are the shadcn typography scale (small, p, muted, lead, large), which is what an author reaching for this key would write.

⚠️ There IS a renderer that reads a variantElementTextRenderer in renderers/basic/elements.tsx:74-90 — but it is registered under element:text, reads its props from schema.properties / schema.props rather than the node root, and its vocabulary is a fourth set again (heading, subheading, body, caption). It is not the renderer these entries reach and it does not rescue this key.

The decision this needs

Three coherent outcomes, and they are a product-shape choice rather than a repair — which is why this is a report and not a PR:

  • A. Retire the key (ADR-0049 enforce-or-remove). variant is declared, published, and read by nothing. align sits beside it in the same state and would go the same way. Cheapest and most honest; costs every author currently writing a value that already does nothing.
  • B. Enforce it — teach ui:text a VARIANT_CLASS map the way ElementTextRenderer has one, and make the enum the shadcn scale the corpus actually authors (h1..h6, p, lead, large, small, muted). Turns five broken entries into five that render five visibly different things, which is what a schema catalog is for. Largest surface.
  • C. Widen the enum only — accept the five spellings without implementing them. ⛔ Not recommended: it converts a loud rejection into a silent no-op, which is the failure mode a metadata contract exists to prevent, and it is worse for AI-authored metadata than the current state because the mistake stops being detectable.

Recommendation: A or B, not C, with B preferred if the catalog category is meant to demonstrate typography at all — the five entries were clearly written expecting it to.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      TextSchema.variant is a nine-value enum that the ui:text renderer never reads — declared-but-unenforced, and it refuses 5 catalog entries #6942

      Description

      @os-sam

      Filed unassigned by the os-dev seat while implementing #6318. Grading and domain:* are the triage seat's.

      #6318's body opened with this group as its clearest bucket-A instance — "small is not in the enum, so the document is rejected" — and read it as a wrong fixture. Rendering it says otherwise, and that inversion is the finding.

      Measured

      packages/types/src/zod/layout.zod.ts:63

      variant: z.enum(['h1','h2','h3','h4','h5','h6','body','caption','overline']).optional().default('body').describe('Text variant/style'),

      packages/components/src/renderers/basic/text.tsx — the whole body of the registered ui:text renderer — reads exactly two keys:

      {schema.content||schema.value}

      variant has no read site. Neither does align, which TextSchema also declares. The registration's inputs list only content.

      The triage test, applied

      Rendered through the real SchemaRenderer:

      authoredelementstext
      variant: "small" (the fixture as it stands)2Small text
      variant: "body" (the "correction" #6318's body proposes)2Small text
      variant: "h1" (an enum member)2Small text
      key absent2Small text

      All four are byte-identical. #6318's triage rules that a fixture which stops rendering differently after "correction" proves the edit was wrong — so rewriting small to body would be a pure validator-appeasement edit, and it is not just wrong for small: no value of this key changes anything, including the nine the enum blesses.

      The five entries the enum refuses are components-basic-text/small.json, paragraph.json (variant: "p"), muted.json, lead.json and large.json. Their spellings are the shadcn typography scale (small, p, muted, lead, large), which is what an author reaching for this key would write.

      ⚠️ There IS a renderer that reads a variantElementTextRenderer in renderers/basic/elements.tsx:74-90 — but it is registered under element:text, reads its props from schema.properties / schema.props rather than the node root, and its vocabulary is a fourth set again (heading, subheading, body, caption). It is not the renderer these entries reach and it does not rescue this key.

      The decision this needs

      Three coherent outcomes, and they are a product-shape choice rather than a repair — which is why this is a report and not a PR:

      • A. Retire the key (ADR-0049 enforce-or-remove). variant is declared, published, and read by nothing. align sits beside it in the same state and would go the same way. Cheapest and most honest; costs every author currently writing a value that already does nothing.
      • B. Enforce it — teach ui:text a VARIANT_CLASS map the way ElementTextRenderer has one, and make the enum the shadcn scale the corpus actually authors (h1..h6, p, lead, large, small, muted). Turns five broken entries into five that render five visibly different things, which is what a schema catalog is for. Largest surface.
      • C. Widen the enum only — accept the five spellings without implementing them. ⛔ Not recommended: it converts a loud rejection into a silent no-op, which is the failure mode a metadata contract exists to prevent, and it is worse for AI-authored metadata than the current state because the mistake stops being detectable.

      Recommendation: A or B, not C, with B preferred if the catalog category is meant to demonstrate typography at all — the five entries were clearly written expecting it to.

      Related

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          TextSchema.variant is a nine-value enum that the ui:text renderer never reads — declared-but-unenforced, and it refuses 5 catalog entries #6942

          Description

          @os-sam

          Filed unassigned by the os-dev seat while implementing #6318. Grading and domain:* are the triage seat's.

          #6318's body opened with this group as its clearest bucket-A instance — "small is not in the enum, so the document is rejected" — and read it as a wrong fixture. Rendering it says otherwise, and that inversion is the finding.

          Measured

          packages/types/src/zod/layout.zod.ts:63

          variant: z.enum(['h1','h2','h3','h4','h5','h6','body','caption','overline']).optional().default('body').describe('Text variant/style'),

          packages/components/src/renderers/basic/text.tsx — the whole body of the registered ui:text renderer — reads exactly two keys:

          {schema.content||schema.value}

          variant has no read site. Neither does align, which TextSchema also declares. The registration's inputs list only content.

          The triage test, applied

          Rendered through the real SchemaRenderer:

          authoredelementstext
          variant: "small" (the fixture as it stands)2Small text
          variant: "body" (the "correction" #6318's body proposes)2Small text
          variant: "h1" (an enum member)2Small text
          key absent2Small text

          All four are byte-identical. #6318's triage rules that a fixture which stops rendering differently after "correction" proves the edit was wrong — so rewriting small to body would be a pure validator-appeasement edit, and it is not just wrong for small: no value of this key changes anything, including the nine the enum blesses.

          The five entries the enum refuses are components-basic-text/small.json, paragraph.json (variant: "p"), muted.json, lead.json and large.json. Their spellings are the shadcn typography scale (small, p, muted, lead, large), which is what an author reaching for this key would write.

          ⚠️ There IS a renderer that reads a variantElementTextRenderer in renderers/basic/elements.tsx:74-90 — but it is registered under element:text, reads its props from schema.properties / schema.props rather than the node root, and its vocabulary is a fourth set again (heading, subheading, body, caption). It is not the renderer these entries reach and it does not rescue this key.

          The decision this needs

          Three coherent outcomes, and they are a product-shape choice rather than a repair — which is why this is a report and not a PR:

          • A. Retire the key (ADR-0049 enforce-or-remove). variant is declared, published, and read by nothing. align sits beside it in the same state and would go the same way. Cheapest and most honest; costs every author currently writing a value that already does nothing.
          • B. Enforce it — teach ui:text a VARIANT_CLASS map the way ElementTextRenderer has one, and make the enum the shadcn scale the corpus actually authors (h1..h6, p, lead, large, small, muted). Turns five broken entries into five that render five visibly different things, which is what a schema catalog is for. Largest surface.
          • C. Widen the enum only — accept the five spellings without implementing them. ⛔ Not recommended: it converts a loud rejection into a silent no-op, which is the failure mode a metadata contract exists to prevent, and it is worse for AI-authored metadata than the current state because the mistake stops being detectable.

          Recommendation: A or B, not C, with B preferred if the catalog category is meant to demonstrate typography at all — the five entries were clearly written expecting it to.

          Related

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              TextSchema.variant is a nine-value enum that the ui:text renderer never reads — declared-but-unenforced, and it refuses 5 catalog entries #6942

              Description

              @os-sam

              Filed unassigned by the os-dev seat while implementing #6318. Grading and domain:* are the triage seat's.

              #6318's body opened with this group as its clearest bucket-A instance — "small is not in the enum, so the document is rejected" — and read it as a wrong fixture. Rendering it says otherwise, and that inversion is the finding.

              Measured

              packages/types/src/zod/layout.zod.ts:63

              variant: z.enum(['h1','h2','h3','h4','h5','h6','body','caption','overline']).optional().default('body').describe('Text variant/style'),

              packages/components/src/renderers/basic/text.tsx — the whole body of the registered ui:text renderer — reads exactly two keys:

              {schema.content||schema.value}

              variant has no read site. Neither does align, which TextSchema also declares. The registration's inputs list only content.

              The triage test, applied

              Rendered through the real SchemaRenderer:

              authoredelementstext
              variant: "small" (the fixture as it stands)2Small text
              variant: "body" (the "correction" #6318's body proposes)2Small text
              variant: "h1" (an enum member)2Small text
              key absent2Small text

              All four are byte-identical. #6318's triage rules that a fixture which stops rendering differently after "correction" proves the edit was wrong — so rewriting small to body would be a pure validator-appeasement edit, and it is not just wrong for small: no value of this key changes anything, including the nine the enum blesses.

              The five entries the enum refuses are components-basic-text/small.json, paragraph.json (variant: "p"), muted.json, lead.json and large.json. Their spellings are the shadcn typography scale (small, p, muted, lead, large), which is what an author reaching for this key would write.

              ⚠️ There IS a renderer that reads a variantElementTextRenderer in renderers/basic/elements.tsx:74-90 — but it is registered under element:text, reads its props from schema.properties / schema.props rather than the node root, and its vocabulary is a fourth set again (heading, subheading, body, caption). It is not the renderer these entries reach and it does not rescue this key.

              The decision this needs

              Three coherent outcomes, and they are a product-shape choice rather than a repair — which is why this is a report and not a PR:

              • A. Retire the key (ADR-0049 enforce-or-remove). variant is declared, published, and read by nothing. align sits beside it in the same state and would go the same way. Cheapest and most honest; costs every author currently writing a value that already does nothing.
              • B. Enforce it — teach ui:text a VARIANT_CLASS map the way ElementTextRenderer has one, and make the enum the shadcn scale the corpus actually authors (h1..h6, p, lead, large, small, muted). Turns five broken entries into five that render five visibly different things, which is what a schema catalog is for. Largest surface.
              • C. Widen the enum only — accept the five spellings without implementing them. ⛔ Not recommended: it converts a loud rejection into a silent no-op, which is the failure mode a metadata contract exists to prevent, and it is worse for AI-authored metadata than the current state because the mistake stops being detectable.

              Recommendation: A or B, not C, with B preferred if the catalog category is meant to demonstrate typography at all — the five entries were clearly written expecting it to.

              Related

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  TextSchema.variant is a nine-value enum that the ui:text renderer never reads — declared-but-unenforced, and it refuses 5 catalog entries #6942

                  Description

                  @os-sam

                  Filed unassigned by the os-dev seat while implementing #6318. Grading and domain:* are the triage seat's.

                  #6318's body opened with this group as its clearest bucket-A instance — "small is not in the enum, so the document is rejected" — and read it as a wrong fixture. Rendering it says otherwise, and that inversion is the finding.

                  Measured

                  packages/types/src/zod/layout.zod.ts:63

                  variant: z.enum(['h1','h2','h3','h4','h5','h6','body','caption','overline']).optional().default('body').describe('Text variant/style'),

                  packages/components/src/renderers/basic/text.tsx — the whole body of the registered ui:text renderer — reads exactly two keys:

                  {schema.content||schema.value}

                  variant has no read site. Neither does align, which TextSchema also declares. The registration's inputs list only content.

                  The triage test, applied

                  Rendered through the real SchemaRenderer:

                  authoredelementstext
                  variant: "small" (the fixture as it stands)2Small text
                  variant: "body" (the "correction" #6318's body proposes)2Small text
                  variant: "h1" (an enum member)2Small text
                  key absent2Small text

                  All four are byte-identical. #6318's triage rules that a fixture which stops rendering differently after "correction" proves the edit was wrong — so rewriting small to body would be a pure validator-appeasement edit, and it is not just wrong for small: no value of this key changes anything, including the nine the enum blesses.

                  The five entries the enum refuses are components-basic-text/small.json, paragraph.json (variant: "p"), muted.json, lead.json and large.json. Their spellings are the shadcn typography scale (small, p, muted, lead, large), which is what an author reaching for this key would write.

                  ⚠️ There IS a renderer that reads a variantElementTextRenderer in renderers/basic/elements.tsx:74-90 — but it is registered under element:text, reads its props from schema.properties / schema.props rather than the node root, and its vocabulary is a fourth set again (heading, subheading, body, caption). It is not the renderer these entries reach and it does not rescue this key.

                  The decision this needs

                  Three coherent outcomes, and they are a product-shape choice rather than a repair — which is why this is a report and not a PR:

                  • A. Retire the key (ADR-0049 enforce-or-remove). variant is declared, published, and read by nothing. align sits beside it in the same state and would go the same way. Cheapest and most honest; costs every author currently writing a value that already does nothing.
                  • B. Enforce it — teach ui:text a VARIANT_CLASS map the way ElementTextRenderer has one, and make the enum the shadcn scale the corpus actually authors (h1..h6, p, lead, large, small, muted). Turns five broken entries into five that render five visibly different things, which is what a schema catalog is for. Largest surface.
                  • C. Widen the enum only — accept the five spellings without implementing them. ⛔ Not recommended: it converts a loud rejection into a silent no-op, which is the failure mode a metadata contract exists to prevent, and it is worse for AI-authored metadata than the current state because the mistake stops being detectable.

                  Recommendation: A or B, not C, with B preferred if the catalog category is meant to demonstrate typography at all — the five entries were clearly written expecting it to.

                  Related

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      TextSchema.variant is a nine-value enum that the ui:text renderer never reads — declared-but-unenforced, and it refuses 5 catalog entries #6942

                      Description

                      @os-sam

                      Filed unassigned by the os-dev seat while implementing #6318. Grading and domain:* are the triage seat's.

                      #6318's body opened with this group as its clearest bucket-A instance — "small is not in the enum, so the document is rejected" — and read it as a wrong fixture. Rendering it says otherwise, and that inversion is the finding.

                      Measured

                      packages/types/src/zod/layout.zod.ts:63

                      variant: z.enum(['h1','h2','h3','h4','h5','h6','body','caption','overline']).optional().default('body').describe('Text variant/style'),

                      packages/components/src/renderers/basic/text.tsx — the whole body of the registered ui:text renderer — reads exactly two keys:

                      {schema.content||schema.value}

                      variant has no read site. Neither does align, which TextSchema also declares. The registration's inputs list only content.

                      The triage test, applied

                      Rendered through the real SchemaRenderer:

                      authoredelementstext
                      variant: "small" (the fixture as it stands)2Small text
                      variant: "body" (the "correction" #6318's body proposes)2Small text
                      variant: "h1" (an enum member)2Small text
                      key absent2Small text

                      All four are byte-identical. #6318's triage rules that a fixture which stops rendering differently after "correction" proves the edit was wrong — so rewriting small to body would be a pure validator-appeasement edit, and it is not just wrong for small: no value of this key changes anything, including the nine the enum blesses.

                      The five entries the enum refuses are components-basic-text/small.json, paragraph.json (variant: "p"), muted.json, lead.json and large.json. Their spellings are the shadcn typography scale (small, p, muted, lead, large), which is what an author reaching for this key would write.

                      ⚠️ There IS a renderer that reads a variantElementTextRenderer in renderers/basic/elements.tsx:74-90 — but it is registered under element:text, reads its props from schema.properties / schema.props rather than the node root, and its vocabulary is a fourth set again (heading, subheading, body, caption). It is not the renderer these entries reach and it does not rescue this key.

                      The decision this needs

                      Three coherent outcomes, and they are a product-shape choice rather than a repair — which is why this is a report and not a PR:

                      • A. Retire the key (ADR-0049 enforce-or-remove). variant is declared, published, and read by nothing. align sits beside it in the same state and would go the same way. Cheapest and most honest; costs every author currently writing a value that already does nothing.
                      • B. Enforce it — teach ui:text a VARIANT_CLASS map the way ElementTextRenderer has one, and make the enum the shadcn scale the corpus actually authors (h1..h6, p, lead, large, small, muted). Turns five broken entries into five that render five visibly different things, which is what a schema catalog is for. Largest surface.
                      • C. Widen the enum only — accept the five spellings without implementing them. ⛔ Not recommended: it converts a loud rejection into a silent no-op, which is the failure mode a metadata contract exists to prevent, and it is worse for AI-authored metadata than the current state because the mistake stops being detectable.

                      Recommendation: A or B, not C, with B preferred if the catalog category is meant to demonstrate typography at all — the five entries were clearly written expecting it to.

                      Related

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          TextSchema.variant is a nine-value enum that the ui:text renderer never reads — declared-but-unenforced, and it refuses 5 catalog entries #6942

                          Description

                          @os-sam

                          Filed unassigned by the os-dev seat while implementing #6318. Grading and domain:* are the triage seat's.

                          #6318's body opened with this group as its clearest bucket-A instance — "small is not in the enum, so the document is rejected" — and read it as a wrong fixture. Rendering it says otherwise, and that inversion is the finding.

                          Measured

                          packages/types/src/zod/layout.zod.ts:63

                          variant: z.enum(['h1','h2','h3','h4','h5','h6','body','caption','overline']).optional().default('body').describe('Text variant/style'),

                          packages/components/src/renderers/basic/text.tsx — the whole body of the registered ui:text renderer — reads exactly two keys:

                          {schema.content||schema.value}

                          variant has no read site. Neither does align, which TextSchema also declares. The registration's inputs list only content.

                          The triage test, applied

                          Rendered through the real SchemaRenderer:

                          authoredelementstext
                          variant: "small" (the fixture as it stands)2Small text
                          variant: "body" (the "correction" #6318's body proposes)2Small text
                          variant: "h1" (an enum member)2Small text
                          key absent2Small text

                          All four are byte-identical. #6318's triage rules that a fixture which stops rendering differently after "correction" proves the edit was wrong — so rewriting small to body would be a pure validator-appeasement edit, and it is not just wrong for small: no value of this key changes anything, including the nine the enum blesses.

                          The five entries the enum refuses are components-basic-text/small.json, paragraph.json (variant: "p"), muted.json, lead.json and large.json. Their spellings are the shadcn typography scale (small, p, muted, lead, large), which is what an author reaching for this key would write.

                          ⚠️ There IS a renderer that reads a variantElementTextRenderer in renderers/basic/elements.tsx:74-90 — but it is registered under element:text, reads its props from schema.properties / schema.props rather than the node root, and its vocabulary is a fourth set again (heading, subheading, body, caption). It is not the renderer these entries reach and it does not rescue this key.

                          The decision this needs

                          Three coherent outcomes, and they are a product-shape choice rather than a repair — which is why this is a report and not a PR:

                          • A. Retire the key (ADR-0049 enforce-or-remove). variant is declared, published, and read by nothing. align sits beside it in the same state and would go the same way. Cheapest and most honest; costs every author currently writing a value that already does nothing.
                          • B. Enforce it — teach ui:text a VARIANT_CLASS map the way ElementTextRenderer has one, and make the enum the shadcn scale the corpus actually authors (h1..h6, p, lead, large, small, muted). Turns five broken entries into five that render five visibly different things, which is what a schema catalog is for. Largest surface.
                          • C. Widen the enum only — accept the five spellings without implementing them. ⛔ Not recommended: it converts a loud rejection into a silent no-op, which is the failure mode a metadata contract exists to prevent, and it is worse for AI-authored metadata than the current state because the mistake stops being detectable.

                          Recommendation: A or B, not C, with B preferred if the catalog category is meant to demonstrate typography at all — the five entries were clearly written expecting it to.

                          Related

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              TextSchema.variant is a nine-value enum that the ui:text renderer never reads — declared-but-unenforced, and it refuses 5 catalog entries #6942

                              Description

                              @os-sam

                              Filed unassigned by the os-dev seat while implementing #6318. Grading and domain:* are the triage seat's.

                              #6318's body opened with this group as its clearest bucket-A instance — "small is not in the enum, so the document is rejected" — and read it as a wrong fixture. Rendering it says otherwise, and that inversion is the finding.

                              Measured

                              packages/types/src/zod/layout.zod.ts:63

                              variant: z.enum(['h1','h2','h3','h4','h5','h6','body','caption','overline']).optional().default('body').describe('Text variant/style'),

                              packages/components/src/renderers/basic/text.tsx — the whole body of the registered ui:text renderer — reads exactly two keys:

                              {schema.content||schema.value}

                              variant has no read site. Neither does align, which TextSchema also declares. The registration's inputs list only content.

                              The triage test, applied

                              Rendered through the real SchemaRenderer:

                              authoredelementstext
                              variant: "small" (the fixture as it stands)2Small text
                              variant: "body" (the "correction" #6318's body proposes)2Small text
                              variant: "h1" (an enum member)2Small text
                              key absent2Small text

                              All four are byte-identical. #6318's triage rules that a fixture which stops rendering differently after "correction" proves the edit was wrong — so rewriting small to body would be a pure validator-appeasement edit, and it is not just wrong for small: no value of this key changes anything, including the nine the enum blesses.

                              The five entries the enum refuses are components-basic-text/small.json, paragraph.json (variant: "p"), muted.json, lead.json and large.json. Their spellings are the shadcn typography scale (small, p, muted, lead, large), which is what an author reaching for this key would write.

                              ⚠️ There IS a renderer that reads a variantElementTextRenderer in renderers/basic/elements.tsx:74-90 — but it is registered under element:text, reads its props from schema.properties / schema.props rather than the node root, and its vocabulary is a fourth set again (heading, subheading, body, caption). It is not the renderer these entries reach and it does not rescue this key.

                              The decision this needs

                              Three coherent outcomes, and they are a product-shape choice rather than a repair — which is why this is a report and not a PR:

                              • A. Retire the key (ADR-0049 enforce-or-remove). variant is declared, published, and read by nothing. align sits beside it in the same state and would go the same way. Cheapest and most honest; costs every author currently writing a value that already does nothing.
                              • B. Enforce it — teach ui:text a VARIANT_CLASS map the way ElementTextRenderer has one, and make the enum the shadcn scale the corpus actually authors (h1..h6, p, lead, large, small, muted). Turns five broken entries into five that render five visibly different things, which is what a schema catalog is for. Largest surface.
                              • C. Widen the enum only — accept the five spellings without implementing them. ⛔ Not recommended: it converts a loud rejection into a silent no-op, which is the failure mode a metadata contract exists to prevent, and it is worse for AI-authored metadata than the current state because the mistake stops being detectable.

                              Recommendation: A or B, not C, with B preferred if the catalog category is meant to demonstrate typography at all — the five entries were clearly written expecting it to.

                              Related

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions