You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
console: a bulk action's lookup param bound through objectOverride renders as a free textbox — HotCRM's bulk 'Add to campaign' takes the campaign name as text, reports success, and writes orphan members #12207
Filing gate ①: a product defect, reproduced and measured. Source: 2026-10-12 hosted-shape browser pass of HotCRM 4.0.1 on a cloud rig at production v1.36.0's pins (objectui d758f2f20d, framework 56bf27affb).
What happens
HotCRM's lead action 加入营销活动 (crm_lead.create_campaign, locations: [list_toolbar, list_item]) declares one param that is bound to a lookup field on another object:
Single-record dialog (row menu): the param renders as a lookup picker, and the action works.
Bulk dialog (select 1–2 rows → bulk bar → 加入营销活动): the same param renders as a plain textbox.
The tester typed the campaign's name (T-hc-sales-Campaign A, then its code CPG-0008). The confirm step listed raw record ids.
执行 reported "成功 2 / 2" (then "成功 1 / 1").
What the server did with it (POST /api/v1/actions/crm_lead/create_campaign body {"recordId":"…","params":{"crm_campaign":"T-hc-sales-Campaign A"}} → 200):
Answered {"campaignId":"T-hc-sales-Campaign A","count":1,"ids":["KlpjuftuQyw7uWBo"]}, i.e. it stored the typed text as the campaign id.
The leads did not join the real campaign. The returned member ids read back as 404.
The orphan rows keep breaking hooks afterwards. Server log: campaign_member_metrics_refresh and campaign_lead_conversion_refresh → Record T-hc-sales-Campaign A not found in crm_campaign / Record CPG-0008 not found.
Reproduced 2 of 2.
Three layers, each with its own gap (for triage to split)
objectui (this card): the bulk dialog does not resolve a field-bound param through objectOverride, so a lookup becomes a free textbox. The single-record dialog resolves it.
framework, to check: ADR-0104 D2's param contract enforces reference-id shape, yet a value with spaces passed for a lookup-bound param. Either enforcement does not resolve objectOverride, or it does not check that the reference resolves.
hotcrm: the action body writes crm_campaign_member rows without checking that the campaign exists.
Acceptance
The bulk dialog renders a field-bound lookup param (including objectOverride) with the same lookup picker as the single-record dialog.
A value that names no campaign is refused before any row is written. Where layers 2 and 3 apply, file and track them on their own cards.
Cloud's console pin d758f2f20d is 17 commits behind that merge (compare 29b99490…d758f2f2 → behind). That is why the hosted-shape rig still showed it. It reaches hosted environments with cloud's next .objectui-sha move; no objectui work remains.
The other two layers this card listed are not objectui's:
the server-side param contract accepting free text for a lookup-bound param;
HotCRM's create_campaign writing members without checking the campaign exists.
Both are carried on the HotCRM summary card for this pass, which triage can split upstream.
Activity
hotlong commentedon Oct 12, 2026
Closing as a duplicate of #12105, found by the dedupe the filing gate requires. I ran that search after filing, which is the wrong order.
bulk actions: a promoted action's field-backed param (
field+objectOverride) renders a raw text box on the selection bar, and the confirm step lists raw ids #12105 (bulk action field-backed param +objectOverride→ raw text box) is the same UI defect. It was fixed on objectuimainby PR fix(plugin-grid,fields,app-shell): a promoted bulk action's field-backed param resolves through the shared action-param resolver (objectui#12105) #12119 (merged 2026-10-11T06:20Z).Cloud's console pin
d758f2f20dis 17 commits behind that merge (compare 29b99490…d758f2f2→behind). That is why the hosted-shape rig still showed it. It reaches hosted environments with cloud's next.objectui-shamove; no objectui work remains.The other two layers this card listed are not objectui's:
create_campaignwriting members without checking the campaign exists.Both are carried on the HotCRM summary card for this pass, which triage can split upstream.
🤖 Generated with Claude Code