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:
- read on this path, off
fieldMeta, and - declared by
@objectstack/spec 17.2.0's FieldSchema, so a spec-compliant
producer can and does emit them, and - never copied onto the column meta.
Verbatim from packages/fields/src/widgets/LookupField.tsx on dd35800af:
:259 — const multiple = fieldMeta?.multiple || false;:270 — const explicitAllowCreate = fieldMeta?.allow_create ?? fieldMeta?.allowCreate;:277 — const 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
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-keptRELATIONAL_META_KEYSwith a table inpackages/plugin-grid/src/relationalMetaKeys.tsthat classifies every key the grid's ownconsumers read off the
fieldMetabag, plus a gate(
__tests__/relationalMetaCopySet.derivation.test.ts) that re-extracts that read set fromthe consumer sources. Running the extractor over the three consumers on the grid's render
path —
LookupCellRenderer(packages/fields/src/index.tsx),LookupField.tsxandUserField.tsx— surfaced four keys that are:fieldMeta, and@objectstack/spec17.2.0'sFieldSchema, so a spec-compliantproducer can and does emit them, and
Verbatim from
packages/fields/src/widgets/LookupField.tsxondd35800af::259—const multiple = fieldMeta?.multiple || false;:270—const explicitAllowCreate = fieldMeta?.allow_create ?? fieldMeta?.allowCreate;:277—const 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 installedpackage,
name/type/labelas the positive control). None is onRELATIONAL_META_KEYSeven after #6875.
They are carried in the new table with verdict
deferredand a note, so the gate keepsthem visible rather than letting them lapse back into "nobody noticed" — but
deferredmeans 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 pickerin the grid. The form surface honours it; the grid does not.
allowCreate— an author settingallowCreate: falseto opt a relation out of inlinequick-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.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
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
multiplelookup and watched the picker.
plugin-dashboardneeds any of them: it does NOT on today's reading — its twowidgets 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_KEYSand does notmove with this card.
Shape of a fix
Mechanically small — flip four
deferredverdicts tospecinrelationalMetaKeys.tsand the derived copy set picks them up, with no list to edit. Thework 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), anddependsOnwants objectui#2215read first.
⛔ Do not also copy the snake_case twins the same chains read (
allow_create,lookup_page_size,depends_on).FieldSchemadeclares none of them — they parse tounrecognized_keys— so no producer can fill them, which is exactly why objectui#6875 leftreference_fieldandlookup_columnsout. The gate proves that absence against theinstalled spec.
Generated by Claude Code