bug(plugin-grid): ObjectGrid's inline lookup picker ignores four more spec-declared field props — multiple, allowCreate, lookupPageSize, dependsOn are read on its own path and never copied #7154

Description

@os-warren

Provenance: measured while implementing objectui#6875, by the derivation that card
asked for. Filed unassigned. Not folded into #6875 — that card names five display/target
spellings and its fix closes those; these four are a different slice of the same seam and
each changes picker BEHAVIOUR, not just which display string renders.

What's measured

objectui#6875 replaced ObjectGrid's hand-kept RELATIONAL_META_KEYS with a table in
packages/plugin-grid/src/relationalMetaKeys.ts that classifies every key the grid's own
consumers read off the fieldMeta bag, plus a gate
(__tests__/relationalMetaCopySet.derivation.test.ts) that re-extracts that read set from
the consumer sources. Running the extractor over the three consumers on the grid's render
path — LookupCellRenderer (packages/fields/src/index.tsx), LookupField.tsx and
UserField.tsx — surfaced four keys that are:

  1. read on this path, off fieldMeta, and
  2. declared by @objectstack/spec 17.2.0's FieldSchema, so a spec-compliant
    producer can and does emit them, and
  3. never copied onto the column meta.

Verbatim from packages/fields/src/widgets/LookupField.tsx on dd35800af:

  • :259const multiple = fieldMeta?.multiple || false;
  • :270const explicitAllowCreate = fieldMeta?.allow_create ?? fieldMeta?.allowCreate;
  • :277const lookupPageSize: number | undefined = fieldMeta?.lookup_page_size ?? fieldMeta?.lookupPageSize;
  • dependsOn — read the same way, and the driver of the cascading picker filter.

All four are on FieldSchema's 71-property strict shape (measured on the installed
package, name/type/label as the positive control). None is on RELATIONAL_META_KEYS
even after #6875.

They are carried in the new table with verdict deferred and a note, so the gate keeps
them visible rather than letting them lapse back into "nobody noticed" — but deferred
means the value still does not arrive.

Why each is a user-visible defect, not a tidiness item

  • multiple — an author declaring a multi-value lookup gets a SINGLE-select inline picker
    in the grid. The form surface honours it; the grid does not.
  • allowCreate — an author setting allowCreate: false to opt a relation out of inline
    quick-create still gets the create affordance in the grid's picker, because the explicit
    value never arrives and isUserFacingReference() decides instead.
  • lookupPageSize — the author's page size is ignored; the picker uses its default.
  • dependsOn — the cascading filter the author declared does not scope the grid's picker.
    ⚠️ objectui#2215 is a closed card in this area ("Cascading lookup (dependsOn) broken in
    forms; table picker bypasses the dependent filter") — worth reading before acting, in
    case this is the grid-side residue of it rather than a fresh defect.

What is NOT measured here

  • No user report is attached. This is the same static producer-vs-consumer measurement
    objectui#6875 was, run one seam wider — the reachability half is measured (spec declares
    all four), the rendering half is not: nobody has yet rendered a grid over a multiple
    lookup and watched the picker.
  • Whether plugin-dashboard needs any of them: it does NOT on today's reading — its two
    widgets are read-only and reach no field EDITOR, so the picker keys have no reader on
    that path. That verdict is already recorded on CELL_RELATIONAL_META_KEYS and does not
    move with this card.

Shape of a fix

Mechanically small — flip four deferred verdicts to spec in
relationalMetaKeys.ts and the derived copy set picks them up, with no list to edit. The
work is the behaviour: each of the four wants a rendering test on the grid's own path, of
the kind objectui#6875 added for displayField
(__tests__/lookupDisplayFieldSpelling-6875.test.tsx), and dependsOn wants objectui#2215
read first.

⛔ Do not also copy the snake_case twins the same chains read (allow_create,
lookup_page_size, depends_on). FieldSchema declares none of them — they parse to
unrecognized_keys — so no producer can fill them, which is exactly why objectui#6875 left
reference_field and lookup_columns out. The gate proves that absence against the
installed spec.

Generated by Claude Code

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

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

    bug(plugin-grid): ObjectGrid's inline lookup picker ignores four more spec-declared field props — multiple, allowCreate, lookupPageSize, dependsOn are read on its own path and never copied #7154

    Description

    @os-warren

    Provenance: measured while implementing objectui#6875, by the derivation that card
    asked for. Filed unassigned. Not folded into #6875 — that card names five display/target
    spellings and its fix closes those; these four are a different slice of the same seam and
    each changes picker BEHAVIOUR, not just which display string renders.

    What's measured

    objectui#6875 replaced ObjectGrid's hand-kept RELATIONAL_META_KEYS with a table in
    packages/plugin-grid/src/relationalMetaKeys.ts that classifies every key the grid's own
    consumers read off the fieldMeta bag, plus a gate
    (__tests__/relationalMetaCopySet.derivation.test.ts) that re-extracts that read set from
    the consumer sources. Running the extractor over the three consumers on the grid's render
    path — LookupCellRenderer (packages/fields/src/index.tsx), LookupField.tsx and
    UserField.tsx — surfaced four keys that are:

    1. read on this path, off fieldMeta, and
    2. declared by @objectstack/spec 17.2.0's FieldSchema, so a spec-compliant
      producer can and does emit them, and
    3. never copied onto the column meta.

    Verbatim from packages/fields/src/widgets/LookupField.tsx on dd35800af:

    • :259const multiple = fieldMeta?.multiple || false;
    • :270const explicitAllowCreate = fieldMeta?.allow_create ?? fieldMeta?.allowCreate;
    • :277const lookupPageSize: number | undefined = fieldMeta?.lookup_page_size ?? fieldMeta?.lookupPageSize;
    • dependsOn — read the same way, and the driver of the cascading picker filter.

    All four are on FieldSchema's 71-property strict shape (measured on the installed
    package, name/type/label as the positive control). None is on RELATIONAL_META_KEYS
    even after #6875.

    They are carried in the new table with verdict deferred and a note, so the gate keeps
    them visible rather than letting them lapse back into "nobody noticed" — but deferred
    means the value still does not arrive.

    Why each is a user-visible defect, not a tidiness item

    • multiple — an author declaring a multi-value lookup gets a SINGLE-select inline picker
      in the grid. The form surface honours it; the grid does not.
    • allowCreate — an author setting allowCreate: false to opt a relation out of inline
      quick-create still gets the create affordance in the grid's picker, because the explicit
      value never arrives and isUserFacingReference() decides instead.
    • lookupPageSize — the author's page size is ignored; the picker uses its default.
    • dependsOn — the cascading filter the author declared does not scope the grid's picker.
      ⚠️ objectui#2215 is a closed card in this area ("Cascading lookup (dependsOn) broken in
      forms; table picker bypasses the dependent filter") — worth reading before acting, in
      case this is the grid-side residue of it rather than a fresh defect.

    What is NOT measured here

    • No user report is attached. This is the same static producer-vs-consumer measurement
      objectui#6875 was, run one seam wider — the reachability half is measured (spec declares
      all four), the rendering half is not: nobody has yet rendered a grid over a multiple
      lookup and watched the picker.
    • Whether plugin-dashboard needs any of them: it does NOT on today's reading — its two
      widgets are read-only and reach no field EDITOR, so the picker keys have no reader on
      that path. That verdict is already recorded on CELL_RELATIONAL_META_KEYS and does not
      move with this card.

    Shape of a fix

    Mechanically small — flip four deferred verdicts to spec in
    relationalMetaKeys.ts and the derived copy set picks them up, with no list to edit. The
    work is the behaviour: each of the four wants a rendering test on the grid's own path, of
    the kind objectui#6875 added for displayField
    (__tests__/lookupDisplayFieldSpelling-6875.test.tsx), and dependsOn wants objectui#2215
    read first.

    ⛔ Do not also copy the snake_case twins the same chains read (allow_create,
    lookup_page_size, depends_on). FieldSchema declares none of them — they parse to
    unrecognized_keys — so no producer can fill them, which is exactly why objectui#6875 left
    reference_field and lookup_columns out. The gate proves that absence against the
    installed spec.

    Generated by Claude Code

    Metadata

    Metadata

    Assignees

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

    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

      bug(plugin-grid): ObjectGrid's inline lookup picker ignores four more spec-declared field props — multiple, allowCreate, lookupPageSize, dependsOn are read on its own path and never copied #7154

      Description

      @os-warren

      Provenance: measured while implementing objectui#6875, by the derivation that card
      asked for. Filed unassigned. Not folded into #6875 — that card names five display/target
      spellings and its fix closes those; these four are a different slice of the same seam and
      each changes picker BEHAVIOUR, not just which display string renders.

      What's measured

      objectui#6875 replaced ObjectGrid's hand-kept RELATIONAL_META_KEYS with a table in
      packages/plugin-grid/src/relationalMetaKeys.ts that classifies every key the grid's own
      consumers read off the fieldMeta bag, plus a gate
      (__tests__/relationalMetaCopySet.derivation.test.ts) that re-extracts that read set from
      the consumer sources. Running the extractor over the three consumers on the grid's render
      path — LookupCellRenderer (packages/fields/src/index.tsx), LookupField.tsx and
      UserField.tsx — surfaced four keys that are:

      1. read on this path, off fieldMeta, and
      2. declared by @objectstack/spec 17.2.0's FieldSchema, so a spec-compliant
        producer can and does emit them, and
      3. never copied onto the column meta.

      Verbatim from packages/fields/src/widgets/LookupField.tsx on dd35800af:

      • :259const multiple = fieldMeta?.multiple || false;
      • :270const explicitAllowCreate = fieldMeta?.allow_create ?? fieldMeta?.allowCreate;
      • :277const lookupPageSize: number | undefined = fieldMeta?.lookup_page_size ?? fieldMeta?.lookupPageSize;
      • dependsOn — read the same way, and the driver of the cascading picker filter.

      All four are on FieldSchema's 71-property strict shape (measured on the installed
      package, name/type/label as the positive control). None is on RELATIONAL_META_KEYS
      even after #6875.

      They are carried in the new table with verdict deferred and a note, so the gate keeps
      them visible rather than letting them lapse back into "nobody noticed" — but deferred
      means the value still does not arrive.

      Why each is a user-visible defect, not a tidiness item

      • multiple — an author declaring a multi-value lookup gets a SINGLE-select inline picker
        in the grid. The form surface honours it; the grid does not.
      • allowCreate — an author setting allowCreate: false to opt a relation out of inline
        quick-create still gets the create affordance in the grid's picker, because the explicit
        value never arrives and isUserFacingReference() decides instead.
      • lookupPageSize — the author's page size is ignored; the picker uses its default.
      • dependsOn — the cascading filter the author declared does not scope the grid's picker.
        ⚠️ objectui#2215 is a closed card in this area ("Cascading lookup (dependsOn) broken in
        forms; table picker bypasses the dependent filter") — worth reading before acting, in
        case this is the grid-side residue of it rather than a fresh defect.

      What is NOT measured here

      • No user report is attached. This is the same static producer-vs-consumer measurement
        objectui#6875 was, run one seam wider — the reachability half is measured (spec declares
        all four), the rendering half is not: nobody has yet rendered a grid over a multiple
        lookup and watched the picker.
      • Whether plugin-dashboard needs any of them: it does NOT on today's reading — its two
        widgets are read-only and reach no field EDITOR, so the picker keys have no reader on
        that path. That verdict is already recorded on CELL_RELATIONAL_META_KEYS and does not
        move with this card.

      Shape of a fix

      Mechanically small — flip four deferred verdicts to spec in
      relationalMetaKeys.ts and the derived copy set picks them up, with no list to edit. The
      work is the behaviour: each of the four wants a rendering test on the grid's own path, of
      the kind objectui#6875 added for displayField
      (__tests__/lookupDisplayFieldSpelling-6875.test.tsx), and dependsOn wants objectui#2215
      read first.

      ⛔ Do not also copy the snake_case twins the same chains read (allow_create,
      lookup_page_size, depends_on). FieldSchema declares none of them — they parse to
      unrecognized_keys — so no producer can fill them, which is exactly why objectui#6875 left
      reference_field and lookup_columns out. The gate proves that absence against the
      installed spec.

      Generated by Claude Code

      Metadata

      Metadata

      Assignees

      Labels

      domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

      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

        bug(plugin-grid): ObjectGrid's inline lookup picker ignores four more spec-declared field props — multiple, allowCreate, lookupPageSize, dependsOn are read on its own path and never copied #7154

        Description

        @os-warren

        Provenance: measured while implementing objectui#6875, by the derivation that card
        asked for. Filed unassigned. Not folded into #6875 — that card names five display/target
        spellings and its fix closes those; these four are a different slice of the same seam and
        each changes picker BEHAVIOUR, not just which display string renders.

        What's measured

        objectui#6875 replaced ObjectGrid's hand-kept RELATIONAL_META_KEYS with a table in
        packages/plugin-grid/src/relationalMetaKeys.ts that classifies every key the grid's own
        consumers read off the fieldMeta bag, plus a gate
        (__tests__/relationalMetaCopySet.derivation.test.ts) that re-extracts that read set from
        the consumer sources. Running the extractor over the three consumers on the grid's render
        path — LookupCellRenderer (packages/fields/src/index.tsx), LookupField.tsx and
        UserField.tsx — surfaced four keys that are:

        1. read on this path, off fieldMeta, and
        2. declared by @objectstack/spec 17.2.0's FieldSchema, so a spec-compliant
          producer can and does emit them, and
        3. never copied onto the column meta.

        Verbatim from packages/fields/src/widgets/LookupField.tsx on dd35800af:

        • :259const multiple = fieldMeta?.multiple || false;
        • :270const explicitAllowCreate = fieldMeta?.allow_create ?? fieldMeta?.allowCreate;
        • :277const lookupPageSize: number | undefined = fieldMeta?.lookup_page_size ?? fieldMeta?.lookupPageSize;
        • dependsOn — read the same way, and the driver of the cascading picker filter.

        All four are on FieldSchema's 71-property strict shape (measured on the installed
        package, name/type/label as the positive control). None is on RELATIONAL_META_KEYS
        even after #6875.

        They are carried in the new table with verdict deferred and a note, so the gate keeps
        them visible rather than letting them lapse back into "nobody noticed" — but deferred
        means the value still does not arrive.

        Why each is a user-visible defect, not a tidiness item

        • multiple — an author declaring a multi-value lookup gets a SINGLE-select inline picker
          in the grid. The form surface honours it; the grid does not.
        • allowCreate — an author setting allowCreate: false to opt a relation out of inline
          quick-create still gets the create affordance in the grid's picker, because the explicit
          value never arrives and isUserFacingReference() decides instead.
        • lookupPageSize — the author's page size is ignored; the picker uses its default.
        • dependsOn — the cascading filter the author declared does not scope the grid's picker.
          ⚠️ objectui#2215 is a closed card in this area ("Cascading lookup (dependsOn) broken in
          forms; table picker bypasses the dependent filter") — worth reading before acting, in
          case this is the grid-side residue of it rather than a fresh defect.

        What is NOT measured here

        • No user report is attached. This is the same static producer-vs-consumer measurement
          objectui#6875 was, run one seam wider — the reachability half is measured (spec declares
          all four), the rendering half is not: nobody has yet rendered a grid over a multiple
          lookup and watched the picker.
        • Whether plugin-dashboard needs any of them: it does NOT on today's reading — its two
          widgets are read-only and reach no field EDITOR, so the picker keys have no reader on
          that path. That verdict is already recorded on CELL_RELATIONAL_META_KEYS and does not
          move with this card.

        Shape of a fix

        Mechanically small — flip four deferred verdicts to spec in
        relationalMetaKeys.ts and the derived copy set picks them up, with no list to edit. The
        work is the behaviour: each of the four wants a rendering test on the grid's own path, of
        the kind objectui#6875 added for displayField
        (__tests__/lookupDisplayFieldSpelling-6875.test.tsx), and dependsOn wants objectui#2215
        read first.

        ⛔ Do not also copy the snake_case twins the same chains read (allow_create,
        lookup_page_size, depends_on). FieldSchema declares none of them — they parse to
        unrecognized_keys — so no producer can fill them, which is exactly why objectui#6875 left
        reference_field and lookup_columns out. The gate proves that absence against the
        installed spec.

        Generated by Claude Code

        Metadata

        Metadata

        Assignees

        Labels

        domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

        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

          bug(plugin-grid): ObjectGrid's inline lookup picker ignores four more spec-declared field props — multiple, allowCreate, lookupPageSize, dependsOn are read on its own path and never copied #7154

          Description

          @os-warren

          Provenance: measured while implementing objectui#6875, by the derivation that card
          asked for. Filed unassigned. Not folded into #6875 — that card names five display/target
          spellings and its fix closes those; these four are a different slice of the same seam and
          each changes picker BEHAVIOUR, not just which display string renders.

          What's measured

          objectui#6875 replaced ObjectGrid's hand-kept RELATIONAL_META_KEYS with a table in
          packages/plugin-grid/src/relationalMetaKeys.ts that classifies every key the grid's own
          consumers read off the fieldMeta bag, plus a gate
          (__tests__/relationalMetaCopySet.derivation.test.ts) that re-extracts that read set from
          the consumer sources. Running the extractor over the three consumers on the grid's render
          path — LookupCellRenderer (packages/fields/src/index.tsx), LookupField.tsx and
          UserField.tsx — surfaced four keys that are:

          1. read on this path, off fieldMeta, and
          2. declared by @objectstack/spec 17.2.0's FieldSchema, so a spec-compliant
            producer can and does emit them, and
          3. never copied onto the column meta.

          Verbatim from packages/fields/src/widgets/LookupField.tsx on dd35800af:

          • :259const multiple = fieldMeta?.multiple || false;
          • :270const explicitAllowCreate = fieldMeta?.allow_create ?? fieldMeta?.allowCreate;
          • :277const lookupPageSize: number | undefined = fieldMeta?.lookup_page_size ?? fieldMeta?.lookupPageSize;
          • dependsOn — read the same way, and the driver of the cascading picker filter.

          All four are on FieldSchema's 71-property strict shape (measured on the installed
          package, name/type/label as the positive control). None is on RELATIONAL_META_KEYS
          even after #6875.

          They are carried in the new table with verdict deferred and a note, so the gate keeps
          them visible rather than letting them lapse back into "nobody noticed" — but deferred
          means the value still does not arrive.

          Why each is a user-visible defect, not a tidiness item

          • multiple — an author declaring a multi-value lookup gets a SINGLE-select inline picker
            in the grid. The form surface honours it; the grid does not.
          • allowCreate — an author setting allowCreate: false to opt a relation out of inline
            quick-create still gets the create affordance in the grid's picker, because the explicit
            value never arrives and isUserFacingReference() decides instead.
          • lookupPageSize — the author's page size is ignored; the picker uses its default.
          • dependsOn — the cascading filter the author declared does not scope the grid's picker.
            ⚠️ objectui#2215 is a closed card in this area ("Cascading lookup (dependsOn) broken in
            forms; table picker bypasses the dependent filter") — worth reading before acting, in
            case this is the grid-side residue of it rather than a fresh defect.

          What is NOT measured here

          • No user report is attached. This is the same static producer-vs-consumer measurement
            objectui#6875 was, run one seam wider — the reachability half is measured (spec declares
            all four), the rendering half is not: nobody has yet rendered a grid over a multiple
            lookup and watched the picker.
          • Whether plugin-dashboard needs any of them: it does NOT on today's reading — its two
            widgets are read-only and reach no field EDITOR, so the picker keys have no reader on
            that path. That verdict is already recorded on CELL_RELATIONAL_META_KEYS and does not
            move with this card.

          Shape of a fix

          Mechanically small — flip four deferred verdicts to spec in
          relationalMetaKeys.ts and the derived copy set picks them up, with no list to edit. The
          work is the behaviour: each of the four wants a rendering test on the grid's own path, of
          the kind objectui#6875 added for displayField
          (__tests__/lookupDisplayFieldSpelling-6875.test.tsx), and dependsOn wants objectui#2215
          read first.

          ⛔ Do not also copy the snake_case twins the same chains read (allow_create,
          lookup_page_size, depends_on). FieldSchema declares none of them — they parse to
          unrecognized_keys — so no producer can fill them, which is exactly why objectui#6875 left
          reference_field and lookup_columns out. The gate proves that absence against the
          installed spec.

          Generated by Claude Code

          Metadata

          Metadata

          Assignees

          Labels

          domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

          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

            bug(plugin-grid): ObjectGrid's inline lookup picker ignores four more spec-declared field props — multiple, allowCreate, lookupPageSize, dependsOn are read on its own path and never copied #7154

            Description

            @os-warren

            Provenance: measured while implementing objectui#6875, by the derivation that card
            asked for. Filed unassigned. Not folded into #6875 — that card names five display/target
            spellings and its fix closes those; these four are a different slice of the same seam and
            each changes picker BEHAVIOUR, not just which display string renders.

            What's measured

            objectui#6875 replaced ObjectGrid's hand-kept RELATIONAL_META_KEYS with a table in
            packages/plugin-grid/src/relationalMetaKeys.ts that classifies every key the grid's own
            consumers read off the fieldMeta bag, plus a gate
            (__tests__/relationalMetaCopySet.derivation.test.ts) that re-extracts that read set from
            the consumer sources. Running the extractor over the three consumers on the grid's render
            path — LookupCellRenderer (packages/fields/src/index.tsx), LookupField.tsx and
            UserField.tsx — surfaced four keys that are:

            1. read on this path, off fieldMeta, and
            2. declared by @objectstack/spec 17.2.0's FieldSchema, so a spec-compliant
              producer can and does emit them, and
            3. never copied onto the column meta.

            Verbatim from packages/fields/src/widgets/LookupField.tsx on dd35800af:

            • :259const multiple = fieldMeta?.multiple || false;
            • :270const explicitAllowCreate = fieldMeta?.allow_create ?? fieldMeta?.allowCreate;
            • :277const lookupPageSize: number | undefined = fieldMeta?.lookup_page_size ?? fieldMeta?.lookupPageSize;
            • dependsOn — read the same way, and the driver of the cascading picker filter.

            All four are on FieldSchema's 71-property strict shape (measured on the installed
            package, name/type/label as the positive control). None is on RELATIONAL_META_KEYS
            even after #6875.

            They are carried in the new table with verdict deferred and a note, so the gate keeps
            them visible rather than letting them lapse back into "nobody noticed" — but deferred
            means the value still does not arrive.

            Why each is a user-visible defect, not a tidiness item

            • multiple — an author declaring a multi-value lookup gets a SINGLE-select inline picker
              in the grid. The form surface honours it; the grid does not.
            • allowCreate — an author setting allowCreate: false to opt a relation out of inline
              quick-create still gets the create affordance in the grid's picker, because the explicit
              value never arrives and isUserFacingReference() decides instead.
            • lookupPageSize — the author's page size is ignored; the picker uses its default.
            • dependsOn — the cascading filter the author declared does not scope the grid's picker.
              ⚠️ objectui#2215 is a closed card in this area ("Cascading lookup (dependsOn) broken in
              forms; table picker bypasses the dependent filter") — worth reading before acting, in
              case this is the grid-side residue of it rather than a fresh defect.

            What is NOT measured here

            • No user report is attached. This is the same static producer-vs-consumer measurement
              objectui#6875 was, run one seam wider — the reachability half is measured (spec declares
              all four), the rendering half is not: nobody has yet rendered a grid over a multiple
              lookup and watched the picker.
            • Whether plugin-dashboard needs any of them: it does NOT on today's reading — its two
              widgets are read-only and reach no field EDITOR, so the picker keys have no reader on
              that path. That verdict is already recorded on CELL_RELATIONAL_META_KEYS and does not
              move with this card.

            Shape of a fix

            Mechanically small — flip four deferred verdicts to spec in
            relationalMetaKeys.ts and the derived copy set picks them up, with no list to edit. The
            work is the behaviour: each of the four wants a rendering test on the grid's own path, of
            the kind objectui#6875 added for displayField
            (__tests__/lookupDisplayFieldSpelling-6875.test.tsx), and dependsOn wants objectui#2215
            read first.

            ⛔ Do not also copy the snake_case twins the same chains read (allow_create,
            lookup_page_size, depends_on). FieldSchema declares none of them — they parse to
            unrecognized_keys — so no producer can fill them, which is exactly why objectui#6875 left
            reference_field and lookup_columns out. The gate proves that absence against the
            installed spec.

            Generated by Claude Code

            Metadata

            Metadata

            Assignees

            Labels

            domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

            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

              bug(plugin-grid): ObjectGrid's inline lookup picker ignores four more spec-declared field props — multiple, allowCreate, lookupPageSize, dependsOn are read on its own path and never copied #7154

              Description

              @os-warren

              Provenance: measured while implementing objectui#6875, by the derivation that card
              asked for. Filed unassigned. Not folded into #6875 — that card names five display/target
              spellings and its fix closes those; these four are a different slice of the same seam and
              each changes picker BEHAVIOUR, not just which display string renders.

              What's measured

              objectui#6875 replaced ObjectGrid's hand-kept RELATIONAL_META_KEYS with a table in
              packages/plugin-grid/src/relationalMetaKeys.ts that classifies every key the grid's own
              consumers read off the fieldMeta bag, plus a gate
              (__tests__/relationalMetaCopySet.derivation.test.ts) that re-extracts that read set from
              the consumer sources. Running the extractor over the three consumers on the grid's render
              path — LookupCellRenderer (packages/fields/src/index.tsx), LookupField.tsx and
              UserField.tsx — surfaced four keys that are:

              1. read on this path, off fieldMeta, and
              2. declared by @objectstack/spec 17.2.0's FieldSchema, so a spec-compliant
                producer can and does emit them, and
              3. never copied onto the column meta.

              Verbatim from packages/fields/src/widgets/LookupField.tsx on dd35800af:

              • :259const multiple = fieldMeta?.multiple || false;
              • :270const explicitAllowCreate = fieldMeta?.allow_create ?? fieldMeta?.allowCreate;
              • :277const lookupPageSize: number | undefined = fieldMeta?.lookup_page_size ?? fieldMeta?.lookupPageSize;
              • dependsOn — read the same way, and the driver of the cascading picker filter.

              All four are on FieldSchema's 71-property strict shape (measured on the installed
              package, name/type/label as the positive control). None is on RELATIONAL_META_KEYS
              even after #6875.

              They are carried in the new table with verdict deferred and a note, so the gate keeps
              them visible rather than letting them lapse back into "nobody noticed" — but deferred
              means the value still does not arrive.

              Why each is a user-visible defect, not a tidiness item

              • multiple — an author declaring a multi-value lookup gets a SINGLE-select inline picker
                in the grid. The form surface honours it; the grid does not.
              • allowCreate — an author setting allowCreate: false to opt a relation out of inline
                quick-create still gets the create affordance in the grid's picker, because the explicit
                value never arrives and isUserFacingReference() decides instead.
              • lookupPageSize — the author's page size is ignored; the picker uses its default.
              • dependsOn — the cascading filter the author declared does not scope the grid's picker.
                ⚠️ objectui#2215 is a closed card in this area ("Cascading lookup (dependsOn) broken in
                forms; table picker bypasses the dependent filter") — worth reading before acting, in
                case this is the grid-side residue of it rather than a fresh defect.

              What is NOT measured here

              • No user report is attached. This is the same static producer-vs-consumer measurement
                objectui#6875 was, run one seam wider — the reachability half is measured (spec declares
                all four), the rendering half is not: nobody has yet rendered a grid over a multiple
                lookup and watched the picker.
              • Whether plugin-dashboard needs any of them: it does NOT on today's reading — its two
                widgets are read-only and reach no field EDITOR, so the picker keys have no reader on
                that path. That verdict is already recorded on CELL_RELATIONAL_META_KEYS and does not
                move with this card.

              Shape of a fix

              Mechanically small — flip four deferred verdicts to spec in
              relationalMetaKeys.ts and the derived copy set picks them up, with no list to edit. The
              work is the behaviour: each of the four wants a rendering test on the grid's own path, of
              the kind objectui#6875 added for displayField
              (__tests__/lookupDisplayFieldSpelling-6875.test.tsx), and dependsOn wants objectui#2215
              read first.

              ⛔ Do not also copy the snake_case twins the same chains read (allow_create,
              lookup_page_size, depends_on). FieldSchema declares none of them — they parse to
              unrecognized_keys — so no producer can fill them, which is exactly why objectui#6875 left
              reference_field and lookup_columns out. The gate proves that absence against the
              installed spec.

              Generated by Claude Code

              Metadata

              Metadata

              Assignees

              Labels

              domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

              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

                bug(plugin-grid): ObjectGrid's inline lookup picker ignores four more spec-declared field props — multiple, allowCreate, lookupPageSize, dependsOn are read on its own path and never copied #7154

                Description

                @os-warren

                Provenance: measured while implementing objectui#6875, by the derivation that card
                asked for. Filed unassigned. Not folded into #6875 — that card names five display/target
                spellings and its fix closes those; these four are a different slice of the same seam and
                each changes picker BEHAVIOUR, not just which display string renders.

                What's measured

                objectui#6875 replaced ObjectGrid's hand-kept RELATIONAL_META_KEYS with a table in
                packages/plugin-grid/src/relationalMetaKeys.ts that classifies every key the grid's own
                consumers read off the fieldMeta bag, plus a gate
                (__tests__/relationalMetaCopySet.derivation.test.ts) that re-extracts that read set from
                the consumer sources. Running the extractor over the three consumers on the grid's render
                path — LookupCellRenderer (packages/fields/src/index.tsx), LookupField.tsx and
                UserField.tsx — surfaced four keys that are:

                1. read on this path, off fieldMeta, and
                2. declared by @objectstack/spec 17.2.0's FieldSchema, so a spec-compliant
                  producer can and does emit them, and
                3. never copied onto the column meta.

                Verbatim from packages/fields/src/widgets/LookupField.tsx on dd35800af:

                • :259const multiple = fieldMeta?.multiple || false;
                • :270const explicitAllowCreate = fieldMeta?.allow_create ?? fieldMeta?.allowCreate;
                • :277const lookupPageSize: number | undefined = fieldMeta?.lookup_page_size ?? fieldMeta?.lookupPageSize;
                • dependsOn — read the same way, and the driver of the cascading picker filter.

                All four are on FieldSchema's 71-property strict shape (measured on the installed
                package, name/type/label as the positive control). None is on RELATIONAL_META_KEYS
                even after #6875.

                They are carried in the new table with verdict deferred and a note, so the gate keeps
                them visible rather than letting them lapse back into "nobody noticed" — but deferred
                means the value still does not arrive.

                Why each is a user-visible defect, not a tidiness item

                • multiple — an author declaring a multi-value lookup gets a SINGLE-select inline picker
                  in the grid. The form surface honours it; the grid does not.
                • allowCreate — an author setting allowCreate: false to opt a relation out of inline
                  quick-create still gets the create affordance in the grid's picker, because the explicit
                  value never arrives and isUserFacingReference() decides instead.
                • lookupPageSize — the author's page size is ignored; the picker uses its default.
                • dependsOn — the cascading filter the author declared does not scope the grid's picker.
                  ⚠️ objectui#2215 is a closed card in this area ("Cascading lookup (dependsOn) broken in
                  forms; table picker bypasses the dependent filter") — worth reading before acting, in
                  case this is the grid-side residue of it rather than a fresh defect.

                What is NOT measured here

                • No user report is attached. This is the same static producer-vs-consumer measurement
                  objectui#6875 was, run one seam wider — the reachability half is measured (spec declares
                  all four), the rendering half is not: nobody has yet rendered a grid over a multiple
                  lookup and watched the picker.
                • Whether plugin-dashboard needs any of them: it does NOT on today's reading — its two
                  widgets are read-only and reach no field EDITOR, so the picker keys have no reader on
                  that path. That verdict is already recorded on CELL_RELATIONAL_META_KEYS and does not
                  move with this card.

                Shape of a fix

                Mechanically small — flip four deferred verdicts to spec in
                relationalMetaKeys.ts and the derived copy set picks them up, with no list to edit. The
                work is the behaviour: each of the four wants a rendering test on the grid's own path, of
                the kind objectui#6875 added for displayField
                (__tests__/lookupDisplayFieldSpelling-6875.test.tsx), and dependsOn wants objectui#2215
                read first.

                ⛔ Do not also copy the snake_case twins the same chains read (allow_create,
                lookup_page_size, depends_on). FieldSchema declares none of them — they parse to
                unrecognized_keys — so no producer can fill them, which is exactly why objectui#6875 left
                reference_field and lookup_columns out. The gate proves that absence against the
                installed spec.

                Generated by Claude Code

                Metadata

                Metadata

                Assignees

                Labels

                domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions