Skip to content
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
This repository was archived by the owner on Oct 26, 2026. It is now read-only.

[Decision] 控制台列表中指向其他对象的名称是否可点击打开 #12673

Closed

Description

@objectstack-fleet

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 listRecordActionsValue on main f78efdd: "recordHref addresses 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; control lookup in docs/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:ui card 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

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    on Oct 16, 2026
  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    席位意见(增量)· director seat (summon #43 continuation 2, session_01QJC7i981TSs9L1CGJK59Ax), read as batch #357 item 2, 2026-10-16T13:30Z

    On the domain:ui seat'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/main f78efdd1e3:

    1. packages/app-shell/src/views/ObjectView.tsx:634 「recordHref addresses THIS view's object only」 — the list host's limit. Holds.
    2. packages/app-shell/src/views/RelatedRecordActionsBridge.tsx:316 const recordHref = useCallback( — the detail page's any-object builder exists. Holds.
    3. recordHref in objectstack docs/adr and content/docs: 0 hits — no ADR governs this. Holds.
    • The spec is untouched by every option; no metadata key moves.

    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:

    1. The console list host publishes the same any-object recordHref / openRecord the detail bridge holds, so lookup cells and referenceVia cells in every console list link to the target record (⌘-click or middle-click opens a new tab).
    2. First measurement (the card's two confidence gaps): whether the list host can reach the routable-object set the detail bridge reads, and the click areas of row click versus in-cell links in dense grids (objectui setup: Invitations grid nests <a> inside <a>, Invite User gives no success feedback, and param dialogs share a generic subtitle #11817's nested-anchor tests are the rule). A premise_still_valid: false report on the first falls back to C with no new box visit.
    3. Pins: a lookup cell and a referenceVia cell 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.
    4. Clause-②: as the claim measures (likely no: the host contract already carries the two callbacks for the detail page).

    Workload: A = domain:ui · 1 card (this card becomes it), app-shell ObjectView and 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:queue with priority:p2 in the ruling act (domain:ui and area:records are already on it), the two measurements as its first step; no second card.

    os-decision-facets

    • ① 项目长远合理性:同意 —— A 去掉列表页「只给本对象生成链接」的特例,三处共用一个链接生成;B 在同一张表里造两种链接行为。
    • ② 实际业务拉动:同意 —— 审批人要从审批请求列表打开被审批记录,CRM 列表的客户查找字段也点不开。
    • ③ 防 AI 犯错:同意 —— 不加元数据键;无权限目标显示响亮的无权限状态。
    • ④ 创业阶段不扩散:同意 —— A 删一个限制、不加契约,一张卡。

    自检:只看①选 A;②③④ 是否翻转:否。

  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #357 item 2 · letter A · maintainer 「12673 同意」 2026-10-16T13:42Z

    Director seat, summon #43 continuation 2, session_01QJC7i981TSs9L1CGJK59Ax, on the domain:ui seat's card (recommendation A, fallback C), the director delta 6216590672 and the premise re-run on objectui origin/main f78efdd1e3 (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):

    1. The console list host (packages/app-shell/src/views/ObjectView.tsx, listRecordActionsValue) publishes the same any-object recordHref / openRecord that the detail page's RelatedRecordActionsBridge holds, so lookup cells and referenceVia cells in every console list link to the target record; ⌘-click or middle-click opens a new tab.
    2. First measurement, before the change: whether the list host can reach the routable-object set the detail bridge reads, and the click areas of row click versus in-cell links in dense grids (objectui setup: Invitations grid nests <a> inside <a>, Invite User gives no success feedback, and param dialogs share a generic subtitle #11817's nested-anchor tests are the rule). A premise_still_valid: false report on the first falls back to letter C (status quo) with no new box visit.
    3. Pins: a lookup cell and a referenceVia cell 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.
    4. No metadata key and no spec change; 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-shell ObjectView and tests · no measured precedent.

    Execution: this card is the execution card: needs-user-decision removed; pm:queue and priority:p2 added in this act (domain:ui and area:records stay); the body's first line carries Ruled:. The domain:ui lane claims it; no second card.

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 (priority:p2; the ruling 6216810282 on this card, letter A, the maintainer's 「12673 同意」 recorded by the director seat)
    Session: session_01SJn1GEkrbbBQkhGC26wEDw
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12673-list-cross-object-links
    Worktree: objectui-issue-12673 (in the cloud session's own container)
    Domain: domain:ui
    Seat: domain:ui#4
    Ruling-ref: 6216810282
    File surface: packages/app-shell/src/views/ObjectView.tsx (listRecordActionsValue and 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 in packages/plugin-grid/src/ObjectGrid.tsx / RecordPointerCell.tsx and the lookup cell in packages/fields/src/index.tsx only 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 main f0e760a: listRecordActionsValue is exported from ObjectView.tsx for its pin test but not from @object-ui/app-shell's entry (src/index.ts names neither it nor RelatedRecordActionsBridge), and RelatedRecordActionsValue (@object-ui/react) already carries recordHref and openRecord, 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 to yes.
    Responsibility: n/a — a ruled console behaviour change
    Thread-read: 6216810282
    Serial constraints cleared: PR #12662 (objectui#12606, this seat) edits ObjectView.tsx in another region (the Setup list chrome, about :3650); PR #12646 (another seat) edits ObjectGrid.tsx for its widgets. The regions differ; the later lander merges main.

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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 returned pr: null; the seat opened #12738 from pr_title_draft and pr_body_draft, and set pr above).


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · PR #12738 merged as b393152 on main · read 2026-10-16T16:52Z

    probe on origin/main b393152 reading control
    export function routableObjectNames / export function appRecordPath in packages/app-shell/src/views/RelatedRecordActionsBridge.tsx 2 exports the bridge's one builder, shared
    import { appRecordPath, routableObjectNames } from './RelatedRecordActionsBridge.js' in packages/app-shell/src/views/ObjectView.tsx 1 the list host reuses the builder; no second copy
    useHref('/') in ObjectView.tsx 1 call the list's document href carries the console base path
    routableObjectNames / appRecordPath in packages/app-shell/src/index.ts and src/views/index.ts 0 Clause-②: no holds: nothing new on the package entry
    *12673* test files 2 the list-cell pins and the host pins (CONTROL: the record page's ?from= trail)
    .changeset/12673-list-cross-object-links.md present —
    PNG files in the merge's diff 0 the screenshots stay on claude/issue-12673-evidence (cb648c3)

    State change: the card closed as completed through Fixes #12673, and pm:dispatched is removed in this act. The cloud session session_01CrvmqMe8FLB3kXU3NHq25T is archived. No contract review is owed (Clause-②: no). The ACCEPT of record is 6219955889; the landing note is 6220181014.

    Not filed: pageRecordActionsValue (views/pageRecordActions.ts) keeps a third copy of the route builder, and the documentHref docblock 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions