…ives
objectui#7154 reported that `multiple`, `allowCreate`, `lookupPageSize` and
`dependsOn` never reach `ObjectGrid`'s inline lookup picker, because none of
them is on the relational copy set. Measured against the grid's own inline
editor, all four already take effect: the copy set is not the route.
`applyRelationalMeta` writes onto the `fieldMeta` handed to `<CellRenderer>` —
the read-only cell, whose relational reader `LookupCellRenderer` reads none of
the four. The inline editor is a different seam: `renderCellEditor` looks the
field up in the object schema and spreads the whole def into the widget, so
every key a def carries reaches `LookupField` regardless of this list. Both
halves read `objectSchema.fields[name]`, so there is no shape where copying
could rescue an editor the schema read did not already serve.
New `__tests__/lookupPickerKeys-7154.test.tsx` renders each key against a
control column differing only in that key. The four verdicts stay `deferred`,
now with the measurement in their notes, and the docblocks and call-site
comments that claimed the picker reads this bag are corrected.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM
Fixes#7154
Re-derived on
origin/mainhead51449a043. The card asked for fourdeferredverdict flips plus rendering proof. The rendering proof killed the premise, so this PR ships the measurement and the corrections it forces, and flips nothing.The premise, and what falsified it
objectui#7154 says
multiple,allowCreate,lookupPageSizeanddependsOnare spec-declared, read offfieldMetabyLookupField, absent fromRELATIONAL_META_KEYS, and therefore never reach ObjectGrid's inline lookup picker. The first three claims hold on this head. The fourth does not: all four already take effect in the picker, with the copy set unchanged, because the picker is not fed that bag at all.applyRelationalMetawrites ontofieldMeta, andfieldMetagoes toCellRendererand nowhere else inObjectGrid.tsx— the read-only cell. For a relational column that isLookupCellRenderer, which readsreference_to,reference,display_field,displayField,reference_field: none of the four.renderCellEditorlooks the field up in the object schema and spreads the whole def into the widget —{ name: ctx.column.accessorKey, ...fieldDef }— so every key a def carries reachesLookupFieldregardless of the copy set.objectSchema.fields[name], the same object, so there is no shape where copying could rescue an editor the schema read did not already serve: when that lookup misses,renderCellEditorreturnsnullandapplyRelationalMetacopies nothing, together.Flipping the four verdicts would therefore write four members onto a bag whose consumer does not read them — the shape objectui#6711 (
reference_to_field) and objectui#6874 (titleFormat) each retired.Per-key rendering evidence
New
packages/plugin-grid/src/__tests__/lookupPickerKeys-7154.test.tsx. Each case renders one data source, one referenced object, and two lookup columns whose defs differ ONLY in the key under test — the shapelookupDisplayFieldSpelling-6875.test.tsxestablished. The control column is load-bearing in both directions.multiple: trueallowCreate: falselookupPageSize: 3$top: 3and renders 3 rowsRecordPickerDialog's default)dependsOn: ['region']lookup-trigger-gated, disabled, "Select region first"; browse-all disabled toolookup-trigger-owner, enabledA fifth case pins the classification half: the copy set is non-empty, contains
displayField(the control), and contains none of the four.Ablations — direction predicted before running, both as predicted
Run from committed
21509d3c8; each mutation proved on disk by anchor/marker counts plus a blob-hash change, each restore proved bygit diff HEAD,git diff --cachedandgit status --shortall empty plus a hash equal to the HEAD blob. No build step is involved — this repo's vitest aliases@object-ui/*to siblingsrc/, so the mutated source is what runs.renderCellEditor's spread. Predicted: the four behavioural cases go red, the classification case stays green. Observed:Tests 4 failed | 1 passed (5). The editor seam is the delivery route.deferredtospec. Predicted: only the classification case goes red (it asserts non-membership), every behavioural case unchanged. Observed, against this file plus the derivation gate:Tests 1 failed | 12 passed (13). Flipping is behaviourally inert — it changes the classification and nothing a user sees.What this changes
deferred, with the measurement in their notes instead of a promise, so the derivation gate keeps watching them.relationalMetaKeys.ts,relationalMetaCopySet.derivation.test.ts) that claimed the inline editor "dispatches the same bag" intoLookupFieldandUserField, and the threeapplyRelationalMetacall-site comments inObjectGrid.tsxthat said the copy exists so "the inline picker can query". Those sentences are what this card was filed against.✅ 4 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s): .changeset/7154-lookup-picker-keys-editor-seam.md./Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.Assumptions checked
LookupField.tsxreads them at:259,:271,:277,:300. What moved is which bag feeds that file on the grid path.@objectstack/spec17.2.0 as installed,FieldSchemastrict with 71 props; all four declared, none ofallow_create/lookup_page_size/depends_ondeclared; positive controlname/type/labelpresent; a nonsense key parses tounrecognized_keys.renderFieldValuetogetCellRenderer, a cell renderer), so the picker keys have no reader there; that verdict is already recorded onCELL_RELATIONAL_META_KEYSand pinned inlookupRelationalMeta-6694.test.tsx. Nothing to fix.plugin-gridorplugin-dashboardmentions any of the four.Filed, not fixed here
dependsOnlookup column is permanently uneditable in ObjectGrid. The key arrives (the gate is proof) and the gate never lifts, because the grid supplies no dependent values through any ofLookupField's three channels. PR objectui#2216 gave the FORM that injection; the grid never got it. Whether the grid should feed the saved row or the row plus its staged edits is a seam decision, which is why it is filed rather than ridden in here.fieldMetahave no reader on that bag, including two that objectui#6875 added as its fix. Same measurement, opposite direction; retiring them is its own adjudication.Verification
Union re-run at the final commit
21509d3c8:pnpm exec vitest runoverlookupPickerKeys-7154,relationalMetaCopySet.derivation,relationalMetaCopySet-6711,relationalMetaCopySet-6874,lookupDisplayFieldSpelling-6875,inlineEditLookupReproandplugin-dashboard'slookupRelationalMeta-6694—Test Files 7 passed (7)/Tests 35 passed (35).pnpm --filter @object-ui/plugin-grid run type-check— exit 0. First attempt was NOT MEASURED (TS2307 across@object-ui/*, an unbuilt dependency closure); re-run afterpnpm --filter '@object-ui/plugin-grid^...' build.tsconfig.test.jsonincludes the new file (1 hit under--listFiles), so the typecheck covers it.pnpm --filter @object-ui/plugin-grid run lint— exit 0, 731 warnings, 0 errors (all pre-existing).check:control-bytes,check:vi-mock-specifiers,check:vi-mock-inherit,check-changeset-presence,check-changeset-no-major,check-changeset-fixed— all exit 0.Generated by Claude Code
Generated by Claude Code