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.objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12673, "status": "done", "branch": "claude/issue-12673-list-cross-object-links", "pr": 12738, "session": "session_01CrvmqMe8FLB3kXU3NHq25T (Claude-Session trailer on 1a00c21); dispatched by PM seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw", "premise_still_valid": true, "summary": "Measured first, on base 15d8ca6. (1) The list host can reach the same routable-object set the detail bridge reads. AppContent mounts ObjectView and RecordDetailView with the same `allObjects` prop, and ObjectViewInner already reads `appName` from useParams, so the premise holds. (2) Click areas: an in-cell link covers its own text only (live, 1280px: link 155x16 inside a 180x41 cell inside a 1199x41 row). Two guards keep the row click out: the anchor's own stopPropagation, and data-table's row handler, which ignores targets inside an anchor. LinkCell masks the host for its children, so there are no nested anchors (objectui#11817; live count of nested anchors is 0). Change: RelatedRecordActionsBridge now exports its existing builder as two pure functions, `routableObjectNames` and `appRecordPath`. The bridge's own recordPath calls them and its ?from= trail is unchanged. `listRecordActionsValue` takes an optional `routes` argument (appName, objects, navigate, routerRootHref). With it, any other routable object gets the same `/apps/APP/OBJECT/record/ID` route. The href is a document href through the existing `documentHref` join; a plain click navigates by router path; no ?from= entry is added. The listed object keeps its own route. A non-routable object, no app segment, or an empty id answers null. ObjectView passes the routes. No change in plugin-grid or fields: RecordPointerCell and ReferencedRecordLink already draw an anchor whenever the host answers. Verified live on HotCRM: pointer cells in Setup > Approval Requests and account lookups in the opportunities list link and open the target record. Ctrl-click and middle-click open a new tab. A click on a non-link cell opens the row's own record.", "tests": "Pinned to HEAD 1a00c21. New: packages/app-shell/src/views/__tests__/listCrossObjectCells-12673.test.tsx, 8 tests, real ObjectGrid and cell renderers under the real listRecordActionsValue fed by the router's navigate and useHref, basename /_console, react-router Link used as the href oracle. Covers: lookup to another object (href and left click; row click not fired); modifier click left to the browser; referenceVia cell (href and click); unreadable/missing pointer target keeps 'Opportunity · record unavailable' with no anchor; lookup with no value served draws no anchor; non-routable lookup target draws no anchor; row click on a non-link cell opens the row's record; the link is the only anchor in its cell, and there are no nested anchors. New: ObjectView.listCrossObjectHost-12673.test.tsx, 6 tests, real ObjectView wiring through a probe: another object gets a basename+app href with no trail; a click lands on that record; an unroutable object gets null and goes nowhere; the list href path equals the bridge's href path (one builder). CONTROL: the record page keeps its ?from= trail and answers null for an unroutable object. Updated: ObjectView.listRecordHref.test.ts. The old 'no href for any other object' case is renamed to the no-routes case and still passes. Added 7 cases for routes: encoded document href, no trail, router-path navigate, unroutable, no app, empty id, listed-object control. Targeted run: 3 files, 32 passed (vitest exit 0). Ablations (each: python replace with anchor count == 1, trap restore, then HEAD blob hash compared and `git diff HEAD` empty; vitest aliases @object-ui/* to src per vitest.config.mts, so no dist step): A1 ObjectView stops passing routes → 3 red (host file). A2 host answers null for other objects → 7 red (unit + cells). A3 shared appRecordPath drops the routable check → 4 red, including the record-page control. A4 bridge drops the ?from= trail → 1 red (CONTROL). A5 ObjectGrid drops onRowClick → 1 red (row-click pin). A6 lookup link loses stopPropagation alone → stayed GREEN: data-table's row handler independently ignores clicks inside an anchor, so this single ablation is not a failing leg. A6b removed both guards (stopPropagation + preventDefault in ReferencedRecordLink, and the row's anchor check) → 1 red ('lookup ... href and left click'). A7 RecordPointerCell renders the readable branch for unreadable targets → 1 red. Every restore matched the HEAD blob; git diff HEAD was empty. Full app-shell suite on 1a00c21: 12 sequential shards `pnpm exec vitest run packages/app-shell/ --shard=K/12 --reporter=dot`, each under os-verify-lock with VERDICT command-exit 0. Files 1461 total (1460 passed, 1 skipped); tests 13774 passed, 9 skipped, 0 failed.", "gates": "All read on 1a00c21, exit codes captured before any pipe. (1) `pnpm --filter @object-ui/app-shell test` in full, once, foreground, under the lock: the container moved it to background at the 10-min foreground cap, and the harness killed it at its 30-min background cap (pnpm reports 'Command failed with signal SIGTERM', no result). NOT MEASURED in that form. Replaced by the 12-shard run of the same 1461 files (repo-root spelling, which AGENTS.md §9 names as equivalent to CI): 12/12 lock verdicts command-exit 0, counts above. (2) `pnpm --filter @object-ui/app-shell type-check` (tsc --noEmit && tsc -p tsconfig.test.json): the first run exited 2 because dependency dist was missing (TS2307 only). Built the closure with `turbo run build --filter='@object-ui/app-shell^...' --concurrency=2` (28/28 ok, lock exit 0), then type-check passed: lock VERDICT command-exit 0, 0 'error TS'. `tsc -p tsconfig.test.json --listFilesOnly` lists all three touched test files. (3) eslint on the 5 touched ts/tsx files: exit 0, 0 errors, 199 warnings (no-explicit-any, mostly pre-existing in ObjectView.tsx). (4) `pnpm --filter @object-ui/app-shell build`: lock VERDICT command-exit 0; dist completeness check passed, 1116 emitted files verified. (5) `pnpm check:i18n-keys` exit 0; `pnpm check:i18n-drift` exit 0 ('No en value changed'); `pnpm check:new-line-citations` exit 0 ('0 new citation(s)'). (6) `node scripts/check-changeset-presence.mjs` exit 0 (1 released package, 1 changeset). i18n-designer-parity and i18n-dead-keys were not run: no keys added or retired. (7) Control-character self-scan of the 6 changed files: no match. (8) `dispatch-gates.mjs --commands` / `--ran` are objectstack-only (objectui has none), so the gate list was derived by hand from the dispatch. Repo-wide lint and CI families belong to CI; no PR exists yet, so no check-runs to cite.", "mcp_calls": "5 — claude-code-remote add_repo ×2 (objectstack, hotcrm; both answered read_available, nothing attached); ToolSearch ×1 (to load the issue_read schema); mcp__github__issue_read ×2 (get, get_comments on #12673). No write tool.", "api_writes": "0 REST writes. Git pushes only, all to objectui: the empty branch claude/issue-12673-list-cross-object-links (first action), then 1a00c21 to it; the evidence branch claude/issue-12673-evidence at cb648c3c. No PR, card comment, label or assignee write, per the dispatch's degraded channel. Local-only writes against my own `--fresh` HotCRM backend (PATCH crm_opportunity ×9 to raise approval requests for the screenshots) are not GitHub writes.", "open_questions": [ { "question": "A record of ANOTHER object opened from a list carries no way back to the list. The listed object's own row open passes `location.state.from` with the list's label; the cross-object navigate passes nothing, and no ?from= entry is added, per the dispatch. Should the cross-object open also pass the list as origin state?", "options": [ "A: keep it as shipped. No origin is passed and the record page shows its default breadcrumb, which is the record page's behaviour when reached by URL.", "B: also pass `{ from: { pathname, label } }` on cross-object navigate, so the target record's breadcrumb offers 'back to Opportunities'." ], "recommendation": "A. The ruling and dispatch say no trail on a list. B is a small follow-up only if users ask for it, and it adds no contract (stage axis: no pull measured)." }, { "question": "Lookup cells draw a link for a raw id the cell could not resolve to a name (the objectui#8695 face: unresolved marker inside a link). The dispatch says 'no link to a page that will refuse'. For record-pointer cells, unreadable/missing targets already have no anchor, and that is pinned. For a lookup whose server answer is null (target unreadable), nothing is drawn, also pinned. But a lookup holding an unnamed raw id still links, exactly as it does on the record page today.", "options": [ "A: keep it. It is the deliberate #8695 behaviour shared with the record page (the CONTROL says the detail page is unchanged). The target page answers deleted and not-visible with the same 404 face, so there is no existence oracle.", "B: drop the link for unresolved raw ids in LookupCellRenderer. That changes the fields package and the record page too, so it needs its own card." ], "recommendation": "A. It stays within the claim's surface and the detail-page control, and it leaks nothing." } ], "out_of_scope_findings": [ "Not filed (none of classes a/b/c; duplication/drift only): `pageRecordActionsValue` in packages/app-shell/src/views/pageRecordActions.ts holds a third, independent copy of the routable-set + `/apps/APP/OBJECT/record/ID` builder. It is outside this claim's file surface, so it is untouched here. It could import `routableObjectNames` / `appRecordPath` from RelatedRecordActionsBridge. carrier: none (承接者:无), noted in Acceptance notes. Dedupe words: pageRecordActionsValue duplicate record path, appRecordPath, routableObjectNames.", "Not filed (stale prose): the docblock of `documentHref` (documentHref.ts) still reads 'The one join for every host that publishes recordHref' and names two hosts; the list host is now a third user. Outside the claimed surface. carrier: none, noted in Acceptance notes.", "Observation, not filed: in Setup (light theme) the record-pointer link's `text-primary` renders close to body text, so the link is visible mainly by hover/focus. This is the objectui#12608 cell's existing styling and theme token, unchanged here. carrier: none, noted." ], "pr_title_draft": "feat(app-shell): console lists link names that point at another object's record (objectui#12673)", "pr_body_draft": "(elided: it is the body of objectstack-ai/objectui#12738, opened from it verbatim by the seat)", "screenshots": [ "https://github.com/objectstack-ai/objectui/blob/cb648c3ca12ef6446b9fdc92cae839b08d740ea3/docs/design/findings/12673/approval-requests-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/cb648c3ca12ef6446b9fdc92cae839b08d740ea3/docs/design/findings/12673/approval-requests-dark.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/cb648c3ca12ef6446b9fdc92cae839b08d740ea3/docs/design/findings/12673/opportunities-account-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/cb648c3ca12ef6446b9fdc92cae839b08d740ea3/docs/design/findings/12673/opportunities-account-dark.png?raw=true" ], "files_changed": [ "packages/app-shell/src/views/ObjectView.tsx", "packages/app-shell/src/views/RelatedRecordActionsBridge.tsx", "packages/app-shell/src/views/ObjectView.listRecordHref.test.ts", "packages/app-shell/src/views/ObjectView.listCrossObjectHost-12673.test.tsx", "packages/app-shell/src/views/__tests__/listCrossObjectCells-12673.test.tsx", ".changeset/12673-list-cross-object-links.md" ], "deviations": [ "Contract vs dispatch: os-dev.md makes the dev open the draft PR (pr_create) and post the os-dev-report comment through the scripts/pm fleet-write relay. The dispatch says this session's proxy refuses that relay (403) and that the PM opens the PR and posts the report. Per the dispatch, the file wins on disagreement, but its write channel is the relay the dispatch reports as refused, so I did not attempt pr_create or the comment (no write tried, so no endpoint or status to report). The PR body is under pr_body_draft. Flagged here per the dispatch.", "The full single-run `pnpm --filter @object-ui/app-shell test` could not finish in this container: it was moved to background at the 10-min foreground cap and killed at the 30-min background cap (SIGTERM, no counts). Replaced by 12 sequential shards of the same 1461 files, each under the lock with verdict 0. Declared here as a split of the required run.", "The shared checkout /home/user/objectui had a local branch of this name checked out (no commits of its own, at 15d8ca6). To delete it as the dispatch instructs, I detached the shared checkout's HEAD at the same commit, then created the worktree. No files in the shared checkout were edited.", "Base is 15d8ca6 (origin/main at worktree creation), not f0e760afe. origin/main has since moved 9 commits, none touching the changed files; `git merge-tree` is clean, so no merge was made.", "Ablation tooling: objectui has no scripts/ablation-replace.mjs or ablation-dist-preflight.mjs (objectstack-only). I used an anchor-checked Python replace (exactly one hit required) with trap restore and a HEAD-blob hash compare. No dist leg was needed: vitest aliases @object-ui/* to src (vitest.config.mts). For the one multi-line anchor (A6), the `grep -c` landing printout is meaningless; A6b proved landing by the absence count instead.", "Clause-② stays `no`: the new exports (`routableObjectNames`, `appRecordPath`, `ListRecordRoutes`, the 4th parameter of `listRecordActionsValue`) are module exports, not reachable from packages/app-shell/src/index.ts, and the package exports only '.'. No amendment needed.", "Cleanup: the evidence worktree has been removed. The feature worktree /home/user/objectui-issue-12673 is kept, clean at 1a00c21, for any patch round, because the PR is not open yet. The HotCRM backend (:4710) and console (:5710) I started were stopped by PID; both ports are free." ], "line_budget": "n/a" }Relayed by seat
domain:ui#4(session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final message (degraded channel: the session pushed and returnedpr: null; the seat opened #12738 frompr_title_draftandpr_body_draft, and setprabove).Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed · PR #12738 merged as
b393152onmain· read 2026-10-16T16:52Zorigin/mainb393152export function routableObjectNames/export function appRecordPathinpackages/app-shell/src/views/RelatedRecordActionsBridge.tsximport { appRecordPath, routableObjectNames } from './RelatedRecordActionsBridge.js'inpackages/app-shell/src/views/ObjectView.tsxuseHref('/')inObjectView.tsxroutableObjectNames/appRecordPathinpackages/app-shell/src/index.tsandsrc/views/index.tsClause-②: noholds: nothing new on the package entry*12673*test files?from=trail).changeset/12673-list-cross-object-links.mdclaude/issue-12673-evidence(cb648c3)State change: the card closed as completed through
Fixes #12673, andpm:dispatchedis removed in this act. The cloud sessionsession_01CrvmqMe8FLB3kXU3NHq25Tis archived. No contract review is owed (Clause-②: no). The ACCEPT of record is6219955889; the landing note is6220181014.Not filed:
pageRecordActionsValue(views/pageRecordActions.ts) keeps a third copy of the route builder, and thedocumentHrefdocblock still names two hosts. Both are drift with no user-visible defect, recorded in the ACCEPT for whoever next touches those files.Generated by Claude Code
feat(app-shell): console lists link names that point at another objec…