Repository navigation
[Decision] 控制台列表中指向其他对象的名称是否可点击打开 #12673
Description
Ruled: 6216810282 · letter A · 2026-10-16T13:42Z
维护者速读: 控制台的列表里,查找字段(比如商机列表里的「客户」)和刚上线的记录指针(审批请求列表里显示的商机名 "Globex Manufacturing Suite")只显示名字,点不开。原因是列表页只会给「当前列表这个对象」的记录生成链接,而记录详情页已经能给任意对象生成链接。要不要让列表也这样?席位推荐 A:列表复用详情页那套「任意对象」的链接生成。
Background. PR #12658 (objectui#12608, merged f78efdd) draws a referenceVia cell as the target record's name. The cell links through the host's recordHref / openRecord, and a unit test pins the link. But the console list host, listRecordActionsValue in app-shell ObjectView.tsx, answers only for the object being listed. Its docblock says so, and says lookup cells that point at a third object stay plain text too. The detail page's RelatedRecordActionsBridge already holds a console-wide builder for any object. The dev reported this as a deviation on PR #12658, and the seat held it for the maintainer (landing note on PR #12658, landed record on objectui#12608).
Governing text.
- The docblock of
listRecordActionsValueonmainf78efdd: "recordHrefaddresses THIS view's object only." and "The console-wide, any-object builder lives on the detail page's bridge". Re-check:git grep -n "addresses THIS view's object only" f78efdd1e -- packages/app-shell/src/views/ObjectView.tsx→ 1 hit (control:export function listRecordActionsValue, same file). - AGENTS.md / ADR / docs: none found (
git grep -il recordHref f78efdd1e -- docs/adr content/docs→ 0; controllookupindocs/adr→ 4).
Protocol: no packages/spec change, and no metadata key in any option.
Premise, with re-check: the any-object builder exists on the detail bridge. git grep -n "const recordHref = useCallback" f78efdd1e -- packages/app-shell/src/views/RelatedRecordActionsBridge.tsx → 1 hit (control: export function RelatedRecordActionsBridge, same file).
| 选项 | 做什么 | 用户看到什么 | 工作量 |
|---|---|---|---|
| A | 列表页发布与详情页同一套「任意对象」链接生成 | 所有列表里的查找字段名和记录指针名都能点开目标记录(⌘ 点击或中键可开新标签) | domain:ui · 1 张卡,app-shell ObjectView 加测试 · 无实测先例(本仓浅克隆读不到 objectui#4490 的落地 diff) |
| B | 只让记录指针(referenceVia)跨对象可点,查找字段保持纯文本 |
审批请求里的记录名能点开,查找字段列仍然点不开 | domain:ui · 1 张卡,plugin-grid 与 app-shell · 无先例 |
| C | 维持现状 | 能看到名字,但要复制名字去搜索才能打开 | 无 |
业务含义:
- A 等于表格里的名字都是超链接:看到客户名就能点开客户。Salesforce 和 Dynamics 365 的列表视图里,查找字段都是链接。
- B 等于同一张表里有的名字能点、有的不能,用户得记住哪种能点。
- C 等于维持今天:看得到,打不开。
四轴(业务立场):
- 项目长远合理性(读数领起): A 让列表、详情、相关列表三处共用一个链接生成,去掉列表页「只认本对象」的特例。两年后的平台应当是任何地方出现的记录名都能点开那条记录,Salesforce Lightning 列表视图和 Dynamics 365 表格的查找值都是这样。B 会在同一张表格里制造两种链接行为。
- 实际业务需求: 有实测拉动。HotCRM 种子里的审批请求,审批人要打开被审批的商机才能判断;HotCRM 的商机、联系人等列表都有指向客户的查找字段。
- 防 AI 犯错: 三项都不新增元数据键。出错时谁看到什么:点开一条无权读取的记录,记录页会显示无权限状态,是响亮的而不是泄露;记录指针单元格对读不到的目标已经显示「record unavailable」。
- 创业阶段不扩散: A 是去掉一个限制,不新增属性或契约,一张卡的工作量。
推荐: A;回退: C。 置信缺口:席位没有实测列表页能否拿到详情页链接生成所需的可路由对象集(详情页桥读的那份),也没有实测密集表格里行点击与单元格内链接的点击区域(嵌套锚点规则已有 objectui#11817 的测试)。这两点由派发卡的开发先测。
自检:只看①选 A;②③④ 是否翻转:否。
os-decision-facets
- ① 项目长远合理性:A 去掉列表页「只给本对象生成链接」的特例,三处共用一个链接生成;B 新增「指针可点、查找不可点」的特例。
- ② 实际业务拉动:今天就有人撞上,审批人要从审批请求列表打开被审批的记录,CRM 列表的客户查找字段也点不开。
- ③ 防 AI 犯错:不加元数据键;无权限目标显示为响亮的无权限状态,不泄露存在性。
- ④ 创业阶段不扩散:A 删一个限制、不加契约;C 什么都不做;B 多一套规则。
Prior rulings read: "addresses THIS view's object only" → 1 hit (the docblock above, objectui#4490's limit); recordHref in docs/adr and content/docs → 0 hits; ADR none; thread: objectui#12608 (PR #12658's deviation, ACCEPT 6214533237).
After the ruling:
- A or B: the seat files one
domain:uicard through triage, with the two confidence-gap measurements as its first step, and dispatches it when the batch has room. - C: the seat records the ruling here and closes this card as not planned.
Related: objectui#12608, PR #12658, objectui#4490.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 16, 2026
席位意见(增量)· director seat (summon #43 continuation 2,
session_01QJC7i981TSs9L1CGJK59Ax), read as batch #357 item 2, 2026-10-16T13:30ZOn the
domain:uiseat's decision card (A recommended, C the fallback), filed from PR #12658's accepted deviation (objectui #12608).Premises re-run in this act, objectui
origin/mainf78efdd1e3:packages/app-shell/src/views/ObjectView.tsx:634「recordHrefaddresses THIS view's object only」 — the list host's limit. Holds.packages/app-shell/src/views/RelatedRecordActionsBridge.tsx:316const recordHref = useCallback(— the detail page's any-object builder exists. Holds.recordHrefin objectstackdocs/adrandcontent/docs: 0 hits — no ADR governs this. Holds.Facets: ① agree — one link builder for list, detail and related list, removing the list host's 「this object only」 special case (objectui #4490's limit); B would put two link behaviours in one table; C keeps a name you can read but not open (Salesforce Lightning list views and Dynamics 365 grids link lookup values) · ② agree — measured on the HotCRM seed: an approver must open the opportunity under approval from the approval-request list, and CRM lists carry account lookups · ③ agree — no metadata key; an unauthorised or missing target shows the loud unavailable / no-permission state the cells already have, with no existence leak · ④ agree — A removes a restriction and adds no contract; one card.
Recommend A; fallback C. Not B. 口径 for the executor, binding with the letter:
recordHref/openRecordthe detail bridge holds, so lookup cells andreferenceViacells in every console list link to the target record (⌘-click or middle-click opens a new tab).premise_still_valid: falsereport on the first falls back to C with no new box visit.referenceViacell in a list open the target; an unreadable target keeps the unavailable state; a row click outside the link still opens the row's record.Clause-②:as the claim measures (likelyno: the host contract already carries the two callbacks for the detail page).Workload: A =
domain:ui· 1 card (this card becomes it), app-shellObjectViewand tests · no measured precedent. B = 1 card, plugin-grid and app-shell. C = none.Execution if A: this card is the execution card —
needs-user-decision→pm:queuewithpriority:p2in the ruling act (domain:uiandarea:recordsare already on it), the two measurements as its first step; no second card.os-decision-facets
自检:只看①选 A;②③④ 是否翻转:否。
objectstack-fleet commentedon Oct 16, 2026
Ruling: batch #357 item 2 · letter A · maintainer 「12673 同意」 2026-10-16T13:42Z
Director seat, summon #43 continuation 2,
session_01QJC7i981TSs9L1CGJK59Ax, on thedomain:uiseat's card (recommendation A, fallback C), the director delta 6216590672 and the premise re-run on objectuiorigin/mainf78efdd1e3(the seat's ledger: objectstack-ai/objectstack#12708, block C 6216570996). The maintainer's word in this session's chat: 「12673 同意」.What the ruling binds (letter A — lists link to any object the way the detail page does):
packages/app-shell/src/views/ObjectView.tsx,listRecordActionsValue) publishes the same any-objectrecordHref/openRecordthat the detail page'sRelatedRecordActionsBridgeholds, so lookup cells andreferenceViacells in every console list link to the target record; ⌘-click or middle-click opens a new tab.premise_still_valid: falsereport on the first falls back to letter C (status quo) with no new box visit.referenceViacell in a list open the target; an unreadable or missing target keeps the cells' unavailable / no-permission state (no existence leak); a row click outside the link still opens the row's record.Clause-②:as the claim measures (the host contract already carries the two callbacks for the detail page).Not taken: B (two link behaviours in one table); C (a name you can read but not open) stays only as item 2's fallback.
Workload of the letter (the card's column):
domain:ui· 1 card (this one) · app-shellObjectViewand tests · no measured precedent.Execution: this card is the execution card:
needs-user-decisionremoved;pm:queueandpriority:p2added in this act (domain:uiandarea:recordsstay); the body's first line carriesRuled:. Thedomain:uilane claims it; no second card.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 3 (
priority:p2; the ruling6216810282on this card, letter A, the maintainer's 「12673 同意」 recorded by the director seat)Session:
session_01SJn1GEkrbbBQkhGC26wEDwAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12673-list-cross-object-linksWorktree:
objectui-issue-12673(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#4Ruling-ref:
6216810282File surface:
packages/app-shell/src/views/ObjectView.tsx(listRecordActionsValueand where the list host publishes it only),packages/app-shell/src/views/RelatedRecordActionsBridge.tsx(only to share its existing any-object record-path builder, no behaviour change on the detail page), the list cells' link path inpackages/plugin-grid/src/ObjectGrid.tsx/RecordPointerCell.tsxand the lookup cell inpackages/fields/src/index.tsxonly if the measurement shows one is needed, tests beside each, one.changeset/12673-*.md(stop on breach; explain in the report)Container & model:
M,mode:cloud,model: opus(cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 3 on 「当前任务处理完,后续并发降到3」, this session's chat, 2026-10-16)Clause-②: no
Clause-② reason: measured on
mainf0e760a:listRecordActionsValueis exported fromObjectView.tsxfor its pin test but not from@object-ui/app-shell's entry (src/index.tsnames neither it norRelatedRecordActionsBridge), andRelatedRecordActionsValue(@object-ui/react) already carriesrecordHrefandopenRecord, so the change fills existing callbacks. If the build has to add or change a member reachable from a package entry, the dev reports it and the seat amends this line toyes.Responsibility: n/a — a ruled console behaviour change
Thread-read: 6216810282
Serial constraints cleared: PR #12662 (objectui#12606, this seat) edits
ObjectView.tsxin another region (the Setup list chrome, about :3650); PR #12646 (another seat) editsObjectGrid.tsxfor its widgets. The regions differ; the later lander mergesmain.