Filed unassigned by the #7165 execution lane. #7165's dispatch carried this as one of two explicitly-unmeasured items, with the instruction "one probe; if it has the same gap that is a second card, not a widening of this one." This is that second card, and ⚠️the probe is deliberately incomplete — read the boundary below before acting on it.
What was measured (on 899730e0a)
@object-ui/fields' LookupField resolves the record it gates on as:
dependentValues ?? ctx.formValues ?? ctx.data ?? {}
plugin-detail's InlineFieldInput renders the same FieldEditWidget factory the grid does (packages/plugin-detail/src/InlineFieldInput.tsx, the single <FieldEditWidget call site), and:
⛔ The boundary — why this is a finding and not a bug
This is where it differs from #7165, and the difference is load-bearing. The grid was provably broken because a grid renders many rows, so no single ctx.data could ever be the right record — the resolved record was {} for every row and the gate was permanent.
A detail page renders one record, which is exactly the "record scope" ctx.data exists for. So if the host (app-shell's record page) sets ctx.data to the record, the cascade resolves and there is no defect here at all.
That was not measured. No rendering measurement was made against InlineFieldInput — only the supply-side census above. Do not read this card as "the detail page is broken."
The one probe that settles it
Render InlineFieldInput on a record with a region value and a regional_owner lookup declaring dependsOn: ['region'], inside the host the detail page actually runs in, and read the trigger's data-testid:
Keep a live control column in that render (a lookup with no dependsOn), for the reason #7165's tests spell out: an enabled-side green is worthless if the control is also broken.
⚠️ Either way, one thing is already true and worth pinning independently: InlineFieldInput's dependent-value resolution is undeclared and untested. If the answer is "ctx.data rescues it", that rescue is currently an accident of host wiring with no test holding it in place.
Incidence (measured for #7165, carried here)
dependsOn on lookup fields is real in shipped metadata: the hotcrm app declares it on 6 lookup fields across 5 objects (crm_contract ×2, crm_case, crm_quote ×2, crm_opportunity), all scoping contacts to crm_account. Those fields render on detail pages. So if the probe comes back gated, this has live reach.
Filed unassigned by the #7165 execution lane. #7165's dispatch carried this as one of two explicitly-unmeasured items, with the instruction "one probe; if it has the same gap that is a second card, not a widening of this one." This is that second card, and⚠️ the probe is deliberately incomplete — read the boundary below before acting on it.
What was measured (on
899730e0a)@object-ui/fields'LookupFieldresolves the record it gates on as:plugin-detail'sInlineFieldInputrenders the sameFieldEditWidgetfactory the grid does (packages/plugin-detail/src/InlineFieldInput.tsx, the single<FieldEditWidgetcall site), and:dependentValues— not supplied.grep -rn "dependentValues" packages/plugin-detail/src/excluding__tests__returns zero. Control: the same instrument returns 88 files acrosspackages/, so the zero is a reading and not a dead grep.ctx.formValues—SchemaRendererContexthas no such member (unchanged since Cascading lookup (dependsOn) broken in forms: stays gated after parent is chosen; table picker bypasses the dependent filter #2215).ctx.data—plugin-detailnever provides it. It only consumesSchemaRendererContextforapiFetch/dataSource(useRecordEditable.ts). Whetherdatais set is up to the surrounding host.⛔ The boundary — why this is a
findingand not abugThis is where it differs from #7165, and the difference is load-bearing. The grid was provably broken because a grid renders many rows, so no single
ctx.datacould ever be the right record — the resolved record was{}for every row and the gate was permanent.A detail page renders one record, which is exactly the "record scope"
ctx.dataexists for. So if the host (app-shell's record page) setsctx.datato the record, the cascade resolves and there is no defect here at all.That was not measured. No rendering measurement was made against
InlineFieldInput— only the supply-side census above. Do not read this card as "the detail page is broken."The one probe that settles it
Render
InlineFieldInputon a record with aregionvalue and aregional_ownerlookup declaringdependsOn: ['region'], inside the host the detail page actually runs in, and read the trigger'sdata-testid:lookup-trigger-gated+disabled⇒ same defect as bug(plugin-grid): adependsOnlookup column is permanently uneditable in ObjectGrid — the inline editor supplies no dependent values, so the picker gates forever #7165 ⇒ regrade tobug, and the fix is the same one line (dependentValues={record}).lookup-trigger-regional_owner+ enabled ⇒ctx.datarescues it ⇒ close this as measured-not-a-defect, and note that the detail page depends on an implicit host contract that nothing pins.Keep a live control column in that render (a lookup with no
dependsOn), for the reason #7165's tests spell out: an enabled-side green is worthless if the control is also broken.InlineFieldInput's dependent-value resolution is undeclared and untested. If the answer is "ctx.datarescues it", that rescue is currently an accident of host wiring with no test holding it in place.Incidence (measured for #7165, carried here)
dependsOnon lookup fields is real in shipped metadata: thehotcrmapp declares it on 6 lookup fields across 5 objects (crm_contract×2,crm_case,crm_quote×2,crm_opportunity), all scoping contacts tocrm_account. Those fields render on detail pages. So if the probe comes back gated, this has live reach.