Skip to content

finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers #6938

Description

@os-sam

Found while implementing #6150 (declare the 13 renderer-read keys). Filed unassigned, not folded into that PR#6150's dispatch order rules a 14th key out of its scope explicitly:

The 13 only. … If your re-derivation finds a 14th genuinely-read key, ⛔ report it, do not fold it in.

This is that report.

Why #6150's census could not see these

#6150 measured documented keys: it walked the ## Schema blocks of all 76 content/docs/components pages and tested each documented key for membership against the shipped type. A key that the renderer reads and the docs never mention is invisible to that instrument in both directions — it is not in the docs, so it never becomes a candidate.

The re-derivation on #6150's branch ran the opposite way round: for each of the 8 renderers in that batch, enumerate every schema.KEYNAME read in the file and subtract the shipped type's declared members (read through the same built packages/types/dist/index.d.ts path, cross-checked against src). That direction finds keys the docs never recorded. It found the 13, and it found these 5.

The 4 genuinely-read undeclared keys

Measured on 40c479af2. Line numbers drift; the READ is the fact.

typekeyread atwhat it does
CheckboxSchemawrapperClassrenderers/form/checkbox.tsx:33cn("flex items-center space-x-2", schema.wrapperClass)classes on the checkbox+label wrapper
ContextMenuSchematriggerClassNamerenderers/overlay/context-menu.tsx:87 — first limb of schema.triggerClassName || className || schema.className || "h-[120px] …"classes on the right-click area
ContextMenuSchemacontentClassNameoverlay/context-menu.tsx:88, applied at :97className={contentClass} on ContextMenuContentclasses on the popup panel
ContextMenuSchemamodaloverlay/context-menu.tsx:91modal={schema.modal} on the Radix rootmodal vs non-modal menu behaviour

CheckboxSchema.wrapperClass is the one worth noting on its own: wrapperClassis among #6150's 13 — but only on FilterBuilderSchema and FileUploadSchema, because only those two pages document it. The same key, on the same class of read, on a third type, is left undeclared purely because the checkbox page's schema block is a six-line summary. The asymmetry is an artefact of the docs, not of the renderers.

The mirror-image defect on the same type

ContextMenuSchema.children is declared on both faceschildren: SchemaNode | SchemaNode[] in packages/types/src/overlay.ts and children: z.union([...]) in zod/overlay.zod.ts, both required — and no read site consumes it. The full set of schema. reads in context-menu.tsx is className, contentClassName, items, modal, trigger, triggerClassName. The renderer renders schema.trigger inside ContextMenuTrigger, never schema.children.

So the shipped contract for context-menu currently requires an authored key that does nothing, and is silent about the four that do. That is ADR-0049 enforce-or-remove territory, and it is a different remedy from the four above — hence one card with both halves rather than two that have to be read together.

Why this is not a docs card

The same argument #6150 makes. The docs are not wrong about what they describe; they are simply the only place these capabilities are recorded, and for these five they do not record them either. The defect is that the shipped types under-declare a working surface and over-declare a dead one.

Not claimed here

Which of the four are intended public API. triggerClassName / contentClassName overlap className on the same node and may want consolidating rather than declaring — that is a judgement this card does not make, exactly as #6150 declined to make it for CarouselSchema.opts.

Scope note

The re-derivation covered only the 8 types in #6150's batch. The other renderers were not swept in this direction, so this list is a floor, not a census. A full read-driven sweep across all renderers is a separate, larger card.

Refs: #6150 (where measured; the 13 land there) · #6151 (sibling finding, same sweep, different mechanism) · #6143 (the docs-driven sweep that started the family) · #5155 (why all of these compile)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No 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)) { // Add copy buttons to all
       blocks
      (function() {
      function addCopyButtons() {
      document.querySelectorAll('pre code').forEach(function(codeBlock) {
      if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
      codeBlock.parentElement.setAttribute('data-copy-added', 'true');
      var btn = document.createElement('button');
      btn.textContent = 'Copy';
      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;';
      btn.onmouseover = function() { this.style.opacity = '1'; };
      btn.onmouseout = function() { this.style.opacity = '0.7'; };
      btn.onclick = function() {
      navigator.clipboard.writeText(codeBlock.textContent).then(function() {
      btn.textContent = 'Copied!';
      setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
      });
      };
      codeBlock.parentElement.style.position = 'relative';
      codeBlock.parentElement.appendChild(btn);
      });
      }
      addCopyButtons();
      // Re-run on dynamic content
      var observer = new MutationObserver(addCopyButtons);
      observer.observe(document.body, { childList: true, subtree: true });
      })();
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers · Issue #6938 · objectstack-ai/objectui · GitHub
      Skip to content

      finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers #6938

      Description

      @os-sam

      Found while implementing #6150 (declare the 13 renderer-read keys). Filed unassigned, not folded into that PR#6150's dispatch order rules a 14th key out of its scope explicitly:

      The 13 only. … If your re-derivation finds a 14th genuinely-read key, ⛔ report it, do not fold it in.

      This is that report.

      Why #6150's census could not see these

      #6150 measured documented keys: it walked the ## Schema blocks of all 76 content/docs/components pages and tested each documented key for membership against the shipped type. A key that the renderer reads and the docs never mention is invisible to that instrument in both directions — it is not in the docs, so it never becomes a candidate.

      The re-derivation on #6150's branch ran the opposite way round: for each of the 8 renderers in that batch, enumerate every schema.KEYNAME read in the file and subtract the shipped type's declared members (read through the same built packages/types/dist/index.d.ts path, cross-checked against src). That direction finds keys the docs never recorded. It found the 13, and it found these 5.

      The 4 genuinely-read undeclared keys

      Measured on 40c479af2. Line numbers drift; the READ is the fact.

      typekeyread atwhat it does
      CheckboxSchemawrapperClassrenderers/form/checkbox.tsx:33cn("flex items-center space-x-2", schema.wrapperClass)classes on the checkbox+label wrapper
      ContextMenuSchematriggerClassNamerenderers/overlay/context-menu.tsx:87 — first limb of schema.triggerClassName || className || schema.className || "h-[120px] …"classes on the right-click area
      ContextMenuSchemacontentClassNameoverlay/context-menu.tsx:88, applied at :97className={contentClass} on ContextMenuContentclasses on the popup panel
      ContextMenuSchemamodaloverlay/context-menu.tsx:91modal={schema.modal} on the Radix rootmodal vs non-modal menu behaviour

      CheckboxSchema.wrapperClass is the one worth noting on its own: wrapperClassis among #6150's 13 — but only on FilterBuilderSchema and FileUploadSchema, because only those two pages document it. The same key, on the same class of read, on a third type, is left undeclared purely because the checkbox page's schema block is a six-line summary. The asymmetry is an artefact of the docs, not of the renderers.

      The mirror-image defect on the same type

      ContextMenuSchema.children is declared on both faceschildren: SchemaNode | SchemaNode[] in packages/types/src/overlay.ts and children: z.union([...]) in zod/overlay.zod.ts, both required — and no read site consumes it. The full set of schema. reads in context-menu.tsx is className, contentClassName, items, modal, trigger, triggerClassName. The renderer renders schema.trigger inside ContextMenuTrigger, never schema.children.

      So the shipped contract for context-menu currently requires an authored key that does nothing, and is silent about the four that do. That is ADR-0049 enforce-or-remove territory, and it is a different remedy from the four above — hence one card with both halves rather than two that have to be read together.

      Why this is not a docs card

      The same argument #6150 makes. The docs are not wrong about what they describe; they are simply the only place these capabilities are recorded, and for these five they do not record them either. The defect is that the shipped types under-declare a working surface and over-declare a dead one.

      Not claimed here

      Which of the four are intended public API. triggerClassName / contentClassName overlap className on the same node and may want consolidating rather than declaring — that is a judgement this card does not make, exactly as #6150 declined to make it for CarouselSchema.opts.

      Scope note

      The re-derivation covered only the 8 types in #6150's batch. The other renderers were not swept in this direction, so this list is a floor, not a census. A full read-driven sweep across all renderers is a separate, larger card.

      Refs: #6150 (where measured; the 13 land there) · #6151 (sibling finding, same sweep, different mechanism) · #6143 (the docs-driven sweep that started the family) · #5155 (why all of these compile)

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No 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)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers · Issue #6938 · objectstack-ai/objectui · GitHub
          Skip to content

          finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers #6938

          Description

          @os-sam

          Found while implementing #6150 (declare the 13 renderer-read keys). Filed unassigned, not folded into that PR#6150's dispatch order rules a 14th key out of its scope explicitly:

          The 13 only. … If your re-derivation finds a 14th genuinely-read key, ⛔ report it, do not fold it in.

          This is that report.

          Why #6150's census could not see these

          #6150 measured documented keys: it walked the ## Schema blocks of all 76 content/docs/components pages and tested each documented key for membership against the shipped type. A key that the renderer reads and the docs never mention is invisible to that instrument in both directions — it is not in the docs, so it never becomes a candidate.

          The re-derivation on #6150's branch ran the opposite way round: for each of the 8 renderers in that batch, enumerate every schema.KEYNAME read in the file and subtract the shipped type's declared members (read through the same built packages/types/dist/index.d.ts path, cross-checked against src). That direction finds keys the docs never recorded. It found the 13, and it found these 5.

          The 4 genuinely-read undeclared keys

          Measured on 40c479af2. Line numbers drift; the READ is the fact.

          typekeyread atwhat it does
          CheckboxSchemawrapperClassrenderers/form/checkbox.tsx:33cn("flex items-center space-x-2", schema.wrapperClass)classes on the checkbox+label wrapper
          ContextMenuSchematriggerClassNamerenderers/overlay/context-menu.tsx:87 — first limb of schema.triggerClassName || className || schema.className || "h-[120px] …"classes on the right-click area
          ContextMenuSchemacontentClassNameoverlay/context-menu.tsx:88, applied at :97className={contentClass} on ContextMenuContentclasses on the popup panel
          ContextMenuSchemamodaloverlay/context-menu.tsx:91modal={schema.modal} on the Radix rootmodal vs non-modal menu behaviour

          CheckboxSchema.wrapperClass is the one worth noting on its own: wrapperClassis among #6150's 13 — but only on FilterBuilderSchema and FileUploadSchema, because only those two pages document it. The same key, on the same class of read, on a third type, is left undeclared purely because the checkbox page's schema block is a six-line summary. The asymmetry is an artefact of the docs, not of the renderers.

          The mirror-image defect on the same type

          ContextMenuSchema.children is declared on both faceschildren: SchemaNode | SchemaNode[] in packages/types/src/overlay.ts and children: z.union([...]) in zod/overlay.zod.ts, both required — and no read site consumes it. The full set of schema. reads in context-menu.tsx is className, contentClassName, items, modal, trigger, triggerClassName. The renderer renders schema.trigger inside ContextMenuTrigger, never schema.children.

          So the shipped contract for context-menu currently requires an authored key that does nothing, and is silent about the four that do. That is ADR-0049 enforce-or-remove territory, and it is a different remedy from the four above — hence one card with both halves rather than two that have to be read together.

          Why this is not a docs card

          The same argument #6150 makes. The docs are not wrong about what they describe; they are simply the only place these capabilities are recorded, and for these five they do not record them either. The defect is that the shipped types under-declare a working surface and over-declare a dead one.

          Not claimed here

          Which of the four are intended public API. triggerClassName / contentClassName overlap className on the same node and may want consolidating rather than declaring — that is a judgement this card does not make, exactly as #6150 declined to make it for CarouselSchema.opts.

          Scope note

          The re-derivation covered only the 8 types in #6150's batch. The other renderers were not swept in this direction, so this list is a floor, not a census. A full read-driven sweep across all renderers is a separate, larger card.

          Refs: #6150 (where measured; the 13 land there) · #6151 (sibling finding, same sweep, different mechanism) · #6143 (the docs-driven sweep that started the family) · #5155 (why all of these compile)

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No 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)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers · Issue #6938 · objectstack-ai/objectui · GitHub
              Skip to content

              finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers #6938

              Description

              @os-sam

              Found while implementing #6150 (declare the 13 renderer-read keys). Filed unassigned, not folded into that PR#6150's dispatch order rules a 14th key out of its scope explicitly:

              The 13 only. … If your re-derivation finds a 14th genuinely-read key, ⛔ report it, do not fold it in.

              This is that report.

              Why #6150's census could not see these

              #6150 measured documented keys: it walked the ## Schema blocks of all 76 content/docs/components pages and tested each documented key for membership against the shipped type. A key that the renderer reads and the docs never mention is invisible to that instrument in both directions — it is not in the docs, so it never becomes a candidate.

              The re-derivation on #6150's branch ran the opposite way round: for each of the 8 renderers in that batch, enumerate every schema.KEYNAME read in the file and subtract the shipped type's declared members (read through the same built packages/types/dist/index.d.ts path, cross-checked against src). That direction finds keys the docs never recorded. It found the 13, and it found these 5.

              The 4 genuinely-read undeclared keys

              Measured on 40c479af2. Line numbers drift; the READ is the fact.

              typekeyread atwhat it does
              CheckboxSchemawrapperClassrenderers/form/checkbox.tsx:33cn("flex items-center space-x-2", schema.wrapperClass)classes on the checkbox+label wrapper
              ContextMenuSchematriggerClassNamerenderers/overlay/context-menu.tsx:87 — first limb of schema.triggerClassName || className || schema.className || "h-[120px] …"classes on the right-click area
              ContextMenuSchemacontentClassNameoverlay/context-menu.tsx:88, applied at :97className={contentClass} on ContextMenuContentclasses on the popup panel
              ContextMenuSchemamodaloverlay/context-menu.tsx:91modal={schema.modal} on the Radix rootmodal vs non-modal menu behaviour

              CheckboxSchema.wrapperClass is the one worth noting on its own: wrapperClassis among #6150's 13 — but only on FilterBuilderSchema and FileUploadSchema, because only those two pages document it. The same key, on the same class of read, on a third type, is left undeclared purely because the checkbox page's schema block is a six-line summary. The asymmetry is an artefact of the docs, not of the renderers.

              The mirror-image defect on the same type

              ContextMenuSchema.children is declared on both faceschildren: SchemaNode | SchemaNode[] in packages/types/src/overlay.ts and children: z.union([...]) in zod/overlay.zod.ts, both required — and no read site consumes it. The full set of schema. reads in context-menu.tsx is className, contentClassName, items, modal, trigger, triggerClassName. The renderer renders schema.trigger inside ContextMenuTrigger, never schema.children.

              So the shipped contract for context-menu currently requires an authored key that does nothing, and is silent about the four that do. That is ADR-0049 enforce-or-remove territory, and it is a different remedy from the four above — hence one card with both halves rather than two that have to be read together.

              Why this is not a docs card

              The same argument #6150 makes. The docs are not wrong about what they describe; they are simply the only place these capabilities are recorded, and for these five they do not record them either. The defect is that the shipped types under-declare a working surface and over-declare a dead one.

              Not claimed here

              Which of the four are intended public API. triggerClassName / contentClassName overlap className on the same node and may want consolidating rather than declaring — that is a judgement this card does not make, exactly as #6150 declined to make it for CarouselSchema.opts.

              Scope note

              The re-derivation covered only the 8 types in #6150's batch. The other renderers were not swept in this direction, so this list is a floor, not a census. A full read-driven sweep across all renderers is a separate, larger card.

              Refs: #6150 (where measured; the 13 land there) · #6151 (sibling finding, same sweep, different mechanism) · #6143 (the docs-driven sweep that started the family) · #5155 (why all of these compile)

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No 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)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers · Issue #6938 · objectstack-ai/objectui · GitHub
                  Skip to content

                  finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers #6938

                  Description

                  @os-sam

                  Found while implementing #6150 (declare the 13 renderer-read keys). Filed unassigned, not folded into that PR#6150's dispatch order rules a 14th key out of its scope explicitly:

                  The 13 only. … If your re-derivation finds a 14th genuinely-read key, ⛔ report it, do not fold it in.

                  This is that report.

                  Why #6150's census could not see these

                  #6150 measured documented keys: it walked the ## Schema blocks of all 76 content/docs/components pages and tested each documented key for membership against the shipped type. A key that the renderer reads and the docs never mention is invisible to that instrument in both directions — it is not in the docs, so it never becomes a candidate.

                  The re-derivation on #6150's branch ran the opposite way round: for each of the 8 renderers in that batch, enumerate every schema.KEYNAME read in the file and subtract the shipped type's declared members (read through the same built packages/types/dist/index.d.ts path, cross-checked against src). That direction finds keys the docs never recorded. It found the 13, and it found these 5.

                  The 4 genuinely-read undeclared keys

                  Measured on 40c479af2. Line numbers drift; the READ is the fact.

                  typekeyread atwhat it does
                  CheckboxSchemawrapperClassrenderers/form/checkbox.tsx:33cn("flex items-center space-x-2", schema.wrapperClass)classes on the checkbox+label wrapper
                  ContextMenuSchematriggerClassNamerenderers/overlay/context-menu.tsx:87 — first limb of schema.triggerClassName || className || schema.className || "h-[120px] …"classes on the right-click area
                  ContextMenuSchemacontentClassNameoverlay/context-menu.tsx:88, applied at :97className={contentClass} on ContextMenuContentclasses on the popup panel
                  ContextMenuSchemamodaloverlay/context-menu.tsx:91modal={schema.modal} on the Radix rootmodal vs non-modal menu behaviour

                  CheckboxSchema.wrapperClass is the one worth noting on its own: wrapperClassis among #6150's 13 — but only on FilterBuilderSchema and FileUploadSchema, because only those two pages document it. The same key, on the same class of read, on a third type, is left undeclared purely because the checkbox page's schema block is a six-line summary. The asymmetry is an artefact of the docs, not of the renderers.

                  The mirror-image defect on the same type

                  ContextMenuSchema.children is declared on both faceschildren: SchemaNode | SchemaNode[] in packages/types/src/overlay.ts and children: z.union([...]) in zod/overlay.zod.ts, both required — and no read site consumes it. The full set of schema. reads in context-menu.tsx is className, contentClassName, items, modal, trigger, triggerClassName. The renderer renders schema.trigger inside ContextMenuTrigger, never schema.children.

                  So the shipped contract for context-menu currently requires an authored key that does nothing, and is silent about the four that do. That is ADR-0049 enforce-or-remove territory, and it is a different remedy from the four above — hence one card with both halves rather than two that have to be read together.

                  Why this is not a docs card

                  The same argument #6150 makes. The docs are not wrong about what they describe; they are simply the only place these capabilities are recorded, and for these five they do not record them either. The defect is that the shipped types under-declare a working surface and over-declare a dead one.

                  Not claimed here

                  Which of the four are intended public API. triggerClassName / contentClassName overlap className on the same node and may want consolidating rather than declaring — that is a judgement this card does not make, exactly as #6150 declined to make it for CarouselSchema.opts.

                  Scope note

                  The re-derivation covered only the 8 types in #6150's batch. The other renderers were not swept in this direction, so this list is a floor, not a census. A full read-driven sweep across all renderers is a separate, larger card.

                  Refs: #6150 (where measured; the 13 land there) · #6151 (sibling finding, same sweep, different mechanism) · #6143 (the docs-driven sweep that started the family) · #5155 (why all of these compile)

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    No labels
                    No 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)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers · Issue #6938 · objectstack-ai/objectui · GitHub
                      Skip to content

                      finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers #6938

                      Description

                      @os-sam

                      Found while implementing #6150 (declare the 13 renderer-read keys). Filed unassigned, not folded into that PR#6150's dispatch order rules a 14th key out of its scope explicitly:

                      The 13 only. … If your re-derivation finds a 14th genuinely-read key, ⛔ report it, do not fold it in.

                      This is that report.

                      Why #6150's census could not see these

                      #6150 measured documented keys: it walked the ## Schema blocks of all 76 content/docs/components pages and tested each documented key for membership against the shipped type. A key that the renderer reads and the docs never mention is invisible to that instrument in both directions — it is not in the docs, so it never becomes a candidate.

                      The re-derivation on #6150's branch ran the opposite way round: for each of the 8 renderers in that batch, enumerate every schema.KEYNAME read in the file and subtract the shipped type's declared members (read through the same built packages/types/dist/index.d.ts path, cross-checked against src). That direction finds keys the docs never recorded. It found the 13, and it found these 5.

                      The 4 genuinely-read undeclared keys

                      Measured on 40c479af2. Line numbers drift; the READ is the fact.

                      typekeyread atwhat it does
                      CheckboxSchemawrapperClassrenderers/form/checkbox.tsx:33cn("flex items-center space-x-2", schema.wrapperClass)classes on the checkbox+label wrapper
                      ContextMenuSchematriggerClassNamerenderers/overlay/context-menu.tsx:87 — first limb of schema.triggerClassName || className || schema.className || "h-[120px] …"classes on the right-click area
                      ContextMenuSchemacontentClassNameoverlay/context-menu.tsx:88, applied at :97className={contentClass} on ContextMenuContentclasses on the popup panel
                      ContextMenuSchemamodaloverlay/context-menu.tsx:91modal={schema.modal} on the Radix rootmodal vs non-modal menu behaviour

                      CheckboxSchema.wrapperClass is the one worth noting on its own: wrapperClassis among #6150's 13 — but only on FilterBuilderSchema and FileUploadSchema, because only those two pages document it. The same key, on the same class of read, on a third type, is left undeclared purely because the checkbox page's schema block is a six-line summary. The asymmetry is an artefact of the docs, not of the renderers.

                      The mirror-image defect on the same type

                      ContextMenuSchema.children is declared on both faceschildren: SchemaNode | SchemaNode[] in packages/types/src/overlay.ts and children: z.union([...]) in zod/overlay.zod.ts, both required — and no read site consumes it. The full set of schema. reads in context-menu.tsx is className, contentClassName, items, modal, trigger, triggerClassName. The renderer renders schema.trigger inside ContextMenuTrigger, never schema.children.

                      So the shipped contract for context-menu currently requires an authored key that does nothing, and is silent about the four that do. That is ADR-0049 enforce-or-remove territory, and it is a different remedy from the four above — hence one card with both halves rather than two that have to be read together.

                      Why this is not a docs card

                      The same argument #6150 makes. The docs are not wrong about what they describe; they are simply the only place these capabilities are recorded, and for these five they do not record them either. The defect is that the shipped types under-declare a working surface and over-declare a dead one.

                      Not claimed here

                      Which of the four are intended public API. triggerClassName / contentClassName overlap className on the same node and may want consolidating rather than declaring — that is a judgement this card does not make, exactly as #6150 declined to make it for CarouselSchema.opts.

                      Scope note

                      The re-derivation covered only the 8 types in #6150's batch. The other renderers were not swept in this direction, so this list is a floor, not a census. A full read-driven sweep across all renderers is a separate, larger card.

                      Refs: #6150 (where measured; the 13 land there) · #6151 (sibling finding, same sweep, different mechanism) · #6143 (the docs-driven sweep that started the family) · #5155 (why all of these compile)

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        No labels
                        No 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)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers · Issue #6938 · objectstack-ai/objectui · GitHub
                          Skip to content

                          finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers #6938

                          Description

                          @os-sam

                          Found while implementing #6150 (declare the 13 renderer-read keys). Filed unassigned, not folded into that PR#6150's dispatch order rules a 14th key out of its scope explicitly:

                          The 13 only. … If your re-derivation finds a 14th genuinely-read key, ⛔ report it, do not fold it in.

                          This is that report.

                          Why #6150's census could not see these

                          #6150 measured documented keys: it walked the ## Schema blocks of all 76 content/docs/components pages and tested each documented key for membership against the shipped type. A key that the renderer reads and the docs never mention is invisible to that instrument in both directions — it is not in the docs, so it never becomes a candidate.

                          The re-derivation on #6150's branch ran the opposite way round: for each of the 8 renderers in that batch, enumerate every schema.KEYNAME read in the file and subtract the shipped type's declared members (read through the same built packages/types/dist/index.d.ts path, cross-checked against src). That direction finds keys the docs never recorded. It found the 13, and it found these 5.

                          The 4 genuinely-read undeclared keys

                          Measured on 40c479af2. Line numbers drift; the READ is the fact.

                          typekeyread atwhat it does
                          CheckboxSchemawrapperClassrenderers/form/checkbox.tsx:33cn("flex items-center space-x-2", schema.wrapperClass)classes on the checkbox+label wrapper
                          ContextMenuSchematriggerClassNamerenderers/overlay/context-menu.tsx:87 — first limb of schema.triggerClassName || className || schema.className || "h-[120px] …"classes on the right-click area
                          ContextMenuSchemacontentClassNameoverlay/context-menu.tsx:88, applied at :97className={contentClass} on ContextMenuContentclasses on the popup panel
                          ContextMenuSchemamodaloverlay/context-menu.tsx:91modal={schema.modal} on the Radix rootmodal vs non-modal menu behaviour

                          CheckboxSchema.wrapperClass is the one worth noting on its own: wrapperClassis among #6150's 13 — but only on FilterBuilderSchema and FileUploadSchema, because only those two pages document it. The same key, on the same class of read, on a third type, is left undeclared purely because the checkbox page's schema block is a six-line summary. The asymmetry is an artefact of the docs, not of the renderers.

                          The mirror-image defect on the same type

                          ContextMenuSchema.children is declared on both faceschildren: SchemaNode | SchemaNode[] in packages/types/src/overlay.ts and children: z.union([...]) in zod/overlay.zod.ts, both required — and no read site consumes it. The full set of schema. reads in context-menu.tsx is className, contentClassName, items, modal, trigger, triggerClassName. The renderer renders schema.trigger inside ContextMenuTrigger, never schema.children.

                          So the shipped contract for context-menu currently requires an authored key that does nothing, and is silent about the four that do. That is ADR-0049 enforce-or-remove territory, and it is a different remedy from the four above — hence one card with both halves rather than two that have to be read together.

                          Why this is not a docs card

                          The same argument #6150 makes. The docs are not wrong about what they describe; they are simply the only place these capabilities are recorded, and for these five they do not record them either. The defect is that the shipped types under-declare a working surface and over-declare a dead one.

                          Not claimed here

                          Which of the four are intended public API. triggerClassName / contentClassName overlap className on the same node and may want consolidating rather than declaring — that is a judgement this card does not make, exactly as #6150 declined to make it for CarouselSchema.opts.

                          Scope note

                          The re-derivation covered only the 8 types in #6150's batch. The other renderers were not swept in this direction, so this list is a floor, not a census. A full read-driven sweep across all renderers is a separate, larger card.

                          Refs: #6150 (where measured; the 13 land there) · #6151 (sibling finding, same sweep, different mechanism) · #6143 (the docs-driven sweep that started the family) · #5155 (why all of these compile)

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            No labels
                            No 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)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers · Issue #6938 · objectstack-ai/objectui · GitHub
                              Skip to content

                              finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers #6938

                              Description

                              @os-sam

                              Found while implementing #6150 (declare the 13 renderer-read keys). Filed unassigned, not folded into that PR#6150's dispatch order rules a 14th key out of its scope explicitly:

                              The 13 only. … If your re-derivation finds a 14th genuinely-read key, ⛔ report it, do not fold it in.

                              This is that report.

                              Why #6150's census could not see these

                              #6150 measured documented keys: it walked the ## Schema blocks of all 76 content/docs/components pages and tested each documented key for membership against the shipped type. A key that the renderer reads and the docs never mention is invisible to that instrument in both directions — it is not in the docs, so it never becomes a candidate.

                              The re-derivation on #6150's branch ran the opposite way round: for each of the 8 renderers in that batch, enumerate every schema.KEYNAME read in the file and subtract the shipped type's declared members (read through the same built packages/types/dist/index.d.ts path, cross-checked against src). That direction finds keys the docs never recorded. It found the 13, and it found these 5.

                              The 4 genuinely-read undeclared keys

                              Measured on 40c479af2. Line numbers drift; the READ is the fact.

                              typekeyread atwhat it does
                              CheckboxSchemawrapperClassrenderers/form/checkbox.tsx:33cn("flex items-center space-x-2", schema.wrapperClass)classes on the checkbox+label wrapper
                              ContextMenuSchematriggerClassNamerenderers/overlay/context-menu.tsx:87 — first limb of schema.triggerClassName || className || schema.className || "h-[120px] …"classes on the right-click area
                              ContextMenuSchemacontentClassNameoverlay/context-menu.tsx:88, applied at :97className={contentClass} on ContextMenuContentclasses on the popup panel
                              ContextMenuSchemamodaloverlay/context-menu.tsx:91modal={schema.modal} on the Radix rootmodal vs non-modal menu behaviour

                              CheckboxSchema.wrapperClass is the one worth noting on its own: wrapperClassis among #6150's 13 — but only on FilterBuilderSchema and FileUploadSchema, because only those two pages document it. The same key, on the same class of read, on a third type, is left undeclared purely because the checkbox page's schema block is a six-line summary. The asymmetry is an artefact of the docs, not of the renderers.

                              The mirror-image defect on the same type

                              ContextMenuSchema.children is declared on both faceschildren: SchemaNode | SchemaNode[] in packages/types/src/overlay.ts and children: z.union([...]) in zod/overlay.zod.ts, both required — and no read site consumes it. The full set of schema. reads in context-menu.tsx is className, contentClassName, items, modal, trigger, triggerClassName. The renderer renders schema.trigger inside ContextMenuTrigger, never schema.children.

                              So the shipped contract for context-menu currently requires an authored key that does nothing, and is silent about the four that do. That is ADR-0049 enforce-or-remove territory, and it is a different remedy from the four above — hence one card with both halves rather than two that have to be read together.

                              Why this is not a docs card

                              The same argument #6150 makes. The docs are not wrong about what they describe; they are simply the only place these capabilities are recorded, and for these five they do not record them either. The defect is that the shipped types under-declare a working surface and over-declare a dead one.

                              Not claimed here

                              Which of the four are intended public API. triggerClassName / contentClassName overlap className on the same node and may want consolidating rather than declaring — that is a judgement this card does not make, exactly as #6150 declined to make it for CarouselSchema.opts.

                              Scope note

                              The re-derivation covered only the 8 types in #6150's batch. The other renderers were not swept in this direction, so this list is a floor, not a census. A full read-driven sweep across all renderers is a separate, larger card.

                              Refs: #6150 (where measured; the 13 land there) · #6151 (sibling finding, same sweep, different mechanism) · #6143 (the docs-driven sweep that started the family) · #5155 (why all of these compile)

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                No labels
                                No labels

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions