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 }}
Repository navigation
console: record-page lookup links carry no /_console base path, so open-in-new-tab or a copied link lands on ENDPOINT_NOT_FOUND (objectui#12211 item 4) #12233
Filing gate ①: a reproduced product defect, split from list card #12211 (item 4) as triage 6121957396 directs ("The dispatching seat splits it per item into sub-issues"). This card carries item 4 only. The parent keeps the items not yet split and closes when every item is split and closed.
Parent: #12211. Domain and priority are inherited from the parent (domain:ui, priority:p3); area:records per triage.
Reader: the domain:ui seat 2 (session_01G5TSaEwbEQsKMjhzTB4rEd), which split it and dispatches it.
Dedupe: the parent's table, item 4: link href _console, 13 hits, nearest objectui#11769 (closed: the public-form URL). No newer card covers it (the parent was filed 2026-10-12).
What happens (from the parent, item 4)
Source: the 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), zh-CN.
Reach: the 转化 section links (account, contact) and the owner (sys_user) links on a lead page.
The href reads …:5650/apps/app.objectstack.hotcrm/crm_account/record/RECORD_ID?from=…. It is missing /_console.
A left-click works, because the SPA router intercepts it.
Open-in-new-tab, a middle-click or a copied link lands on a page whose whole body is {"success":false,"error":{"code":"ENDPOINT_NOT_FOUND","message":"Not found"}}. The direct open was measured once. The bad hrefs were seen on account, contact and user links.
Acceptance
Record-page lookup links carry the console base path, so the same href works from a left-click, a new tab and a copied link.
Claim: PM loop round 2 (item 4 of objectui#12211: record-page lookup links carry the console base path, so a left-click, a new tab and a copied link all reach the record)
Session: session_01G5TSaEwbEQsKMjhzTB4rEd
Account: os-warren
Branch: claude/issue-12233-lookup-link-base-path
Worktree: objectui-issue-12233
Domain: domain:ui
Seat: domain:ui#2
File surface, on objectui maina491b64, measured by the dev before editing:
The likely producer: the recordHref that packages/app-shell/src/views/RelatedRecordActionsBridge.tsx supplies to @object-ui/fields (:277 builds BASE/OBJECT/record/ID with no router basename). The console mounts under BrowserRouter basename (apps/console/src/App.tsx), which a router Link applies but a raw href does not.
Its readers in @object-ui/fields that render a record link as a plain anchor. The dev measures which widget draws the 转化 and owner links, and whether RecordDetailView.tsx (:633, :870) feeds the same path.
Co-located tests, and .changeset/12233-lookup-link-base-path.md (patch on the packages touched).
⛔ The fix goes where the base path is dropped, once. Not a second prefixing rule in each widget.
⛔ Not packages/app-shell/src/layout/** (objectui#12201's PR is in the merge queue).
(Stop on breach; explain in the report.)
Container & model: M, mode:subagent, model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"
Clause-②: no
Responsibility: objectui's record-page lookup links (the recordHref host function in @object-ui/app-shell and the @object-ui/fields widgets that render it as a raw href), which build an href without the console's router basename | a left-click already works because the router intercepts it, and the console's BrowserRouter carries the basename | every user who opens a lookup link in a new tab, middle-clicks it or copies it, on any console mounted under a base path such as /_console (measured on hosted HotCRM 4.0.1: account, contact and owner links on a lead page)
Thread-read: none
Serial constraints cleared: read at 2026-10-12T10:57Z on objectui maina491b64:
Duplicates: no remote branch or open PR for this card. The parent objectui#12211's dedupe table covers item 4.
Neighbours: objectui#12227 (this seat, in the merge queue) touches RecordDetailView.tsx with a comment only. objectui#12225 (this seat, in the merge queue) touches packages/app-shell/src/layout/. Seat 1's in-flight claims were read: none names RelatedRecordActionsBridge.tsx or packages/fields/src/widgets/. objectui#12220 (seat 1) edits RecordDetailView.tsx near lines 1486–1491 (the approval lock); if this card touches that file it stays at the record-href sites (:633, :870), a disjoint region, and the later lander merges main.
{
"issue": 12233,
"status": "done",
"branch": "claude/issue-12233-lookup-link-base-path",
"pr": "#12239",
"session": "session_01G5TSaEwbEQsKMjhzTB4rEd",
"premise_still_valid": true,
"summary": "The record page's lookup anchors (ReferencedRecordLink in @object-ui/fields, which LookupCellRenderer uses for the account, contact and sys_user owner links) take their href from RelatedRecordActionsBridge.recordHref in @object-ui/app-shell, which returned the bare router path; the measured ?from= trail is added only there, which pins the producer. Fixed once in that producer: the bridge keeps one router path (recordPath), openRecord navigates by it, and recordHref returns it joined to useHref('/'), the router's root href with the basename, which equals the href react-router's Link renders; no widget change and no /_console or BASE_URL literal. Published-contract measurement: the type of RelatedRecordActionsValue.recordHref (@object-ui/react) is unchanged and its doc already calls the value an anchor href for new tab and copy link; the bridge is not exported from @object-ui/app-shell; so Clause-② no holds. RecordDetailView's two record-route literals (favourite, recent item) are router paths read through navigate and router Links, so they are correct and untouched; draft PR at HEAD 3a5e795 with assignee os-warren, worktree removed.",
"tests": "New packages/app-shell/src/views/tests/RelatedRecordActionsBridge.basenameHref-12233.test.tsx (real bridge and real LookupCellRenderer under MemoryRouter; basename /_console vs a react-router Link oracle, left-click destination, no-basename control): 3 passed. Narrowed consuming set at HEAD 3a5e795, repo-root form pnpm exec vitest run --maxWorkers=2 FILES over 194 files under os-verify-lock: Test Files 194 passed (194), Tests 1882 passed (1882), VERDICT command-exit 0. Ablations from the committed fix 3a5e795 through objectstack scripts/ablation-replace.mjs (anchor x1 to x0, blob changed, in-run grep -c of the marker = 1, restore proven: blob 2c4c04a000d1 == HEAD, git diff HEAD empty): A1 recordHref back to the bare path gives Tests 2 failed | 1 passed (3) with expected '/apps/hotcrm/crm_account/record/A-1' to be '/_console/apps/hotcrm/crm_account/record/A-1', control green; A2 the naive fix (openRecord navigates with the prefixed href) gives Tests 1 failed | 2 passed (3) with Received '/_console/apps/hotcrm/crm_account/record/A-1' (doubled basename). No dist in the resolution path: the test imports the bridge by relative path and @object-ui/fields through the root vitest alias to src. CI at report time: 42 check-runs, 21 success, 3 skipped, 18 in_progress, 0 failed.",
"mcp_calls": "0 — none",
"api_writes": "2 — two fleet-write relay strokes, each POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/12239/assignees [os-warren], read back identical (7627 bytes); (2) comment → POST /repos//issues/12233/comments (this os-dev-report). Plus git push x2 (empty-branch probe, fix commit), which are not REST. No label writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · pageRecordActionsValue (packages/app-shell/src/views/pageRecordActions.ts) publishes the bare router path as recordHref for blocks on a custom page, so a lookup or a grid link column on a custom page under a basename should get the same bare href. Read from source only, no public-door measurement, so not filed; a different producer from this card's, left out per the dispatch; the same documentHref shape fixes it. In the PR's Acceptance notes · dedupe words: pageRecordActions recordHref basename · custom page lookup link _console · page record navigator href",
"carrier: 承接者:无 · the contract doc of RelatedRecordActionsValue.recordHref (@object-ui/react) does not say the value carries the host router's basename; one sentence there would name the class for every producer. Outside the claim's file surface. In the PR's Acceptance notes · noted, not filed"
],
"gates": [
{
"command": "turbo run build --filter='@object-ui/app-shell^...' --concurrency=2 (under os-verify-lock)",
"exit": 0,
"verdict": "Tasks: 28 successful, 28 total; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/app-shell type-check",
"exit": 0,
"verdict": "tsc --noEmit && tsc -p tsconfig.test.json, no diagnostics; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/app-shell lint",
"exit": 0,
"verdict": "0 errors; no warning on a changed line; VERDICT command-exit 0"
},
{
"command": "pnpm exec vitest run --maxWorkers=2 (194 narrowed files)",
"exit": 0,
"verdict": "Test Files 194 passed (194); Tests 1882 passed (1882)"
},
{
"command": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK"
},
{
"command": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only"
},
{
"command": "node scripts/check-changeset-no-major.mjs",
"exit": 0,
"verdict": "No changeset declares a major bump."
},
{
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)"
},
{
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "No pending changeset names a file this change touches."
},
{
"command": "pnpm check:pending-changeset-literals / check:test-path-roots / check:vi-mock-specifiers / check:vi-mock-inherit / check:vi-mock-override-shape / check:phantom-deps / check:unreferenced-sources / check:lint-rule-coverage",
"exit": 0,
"verdict": "each OK"
}
],
"line_budget": "n/a",
"deviations": [
"origin/main had moved from a491b64 to 6eca5b5 when the worktree was cut; the premise was re-read there.",
"Tests ran in the repo-root form AGENTS.md prescribes (pnpm exec vitest run FILES), narrowed to 194 files that can mount the bridge (declared in the PR body); the full @object-ui/app-shell suite (1290 files) is left to CI's Test shards.",
"Commit trailer: the AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude) was used instead of the harness reminder's model-named trailer, per AGENTS.md's precedence rule."
],
"files_changed": [
".changeset/12233-lookup-link-base-path.md",
"packages/app-shell/src/views/RelatedRecordActionsBridge.tsx",
"packages/app-shell/src/views/tests/RelatedRecordActionsBridge.basenameHref-12233.test.tsx"
]
}
Amends claim 6122888590; same session, branch and PR (objectui#12239). ⛔ Not a new claim.
The round-1 report found a second producer of the same defect: pageRecordActionsValue (packages/app-shell/src/views/pageRecordActions.ts) publishes the bare router path /apps/APP/OBJECT/record/ID as recordHref for the blocks on a custom page. A lookup or grid link column there then has the same bare href under a base path. The seat fixes it in place, because all four conditions hold:
it is the same defect class;
the fix is mechanical and its form is already pinned (round 1's documentHref);
no other claim holds the file;
the same gate family covers it.
The surface grows to exactly these:
packages/app-shell/src/views/pageRecordActions.ts: recordHref carries the router's basename; openRecord keeps navigating by the router path.
packages/app-shell/src/views/PageView.tsx: only the pageRecordActionsValue(...) call site, which passes the router's root href. objectui#12198 (this seat) pins PageView's pencil in tests only; the regions are disjoint.
The round-1 documentHref helper moves to one internal module that both producers import. It is ⛔ not re-exported from the package entry.
@object-ui/react: one sentence in the RelatedRecordActionsValue.recordHref doc, saying the value is a document href that carries the host router's basename. It names the class for every producer; the type does not change.
Co-located tests, and the changeset.
Clause-②: no stands: no type, export or accepted value set changes.
{
"issue": 12233,
"status": "done",
"branch": "claude/issue-12233-lookup-link-base-path",
"pr": "#12239",
"head": "cc0777aa616b91e1fa07229f55b0881ad039624d",
"session": "session_01G5TSaEwbEQsKMjhzTB4rEd",
"premise_still_valid": true,
"summary": "Patch round 2 under surface amendment 6123360584. origin/main 334f0cf merged (no rebase, no force), then: documentHref moved to the internal module packages/app-shell/src/views/documentHref.ts, imported by RelatedRecordActionsBridge and pageRecordActions; measured unreachable from the entry (package.json exports only '.' and './styles.css'; src/index.ts, views/index.ts and utils/index.ts carry no export * and name neither documentHref nor pageRecordActions, while PageView in the same barrels is a positive control). pageRecordActionsValue takes routerRootHref from its caller: recordHref returns the document href, openRecord navigates by the router path; PageView reads useHref('/') beside its other router hooks and passes it at the pageRecordActionsValue call site, pencil code untouched. One doc sentence added to RelatedRecordActionsValue.recordHref in @object-ui/react (type unchanged), changeset now patch on @object-ui/app-shell and @object-ui/react; Clause-② no stands (no published type, export or value set moved; the only signature change is on the internal pageRecordActionsValue). Coordination: objectui#12198's branch adds a PageView test whose react-router-dom factory mock lacks useHref, so whichever of the two lands second needs a useHref entry returning '/' in that mock (see out_of_scope_findings).",
"tests": "At head cc0777a: narrowed set of 317 files (every app-shell and apps/console test naming the bridge, RecordDetailView, recordHref, openRecord, LookupCellRenderer, ReferencedRecordLink, AppContent, ConsoleShell, useRelatedRecordActions, RelatedRecordActionsProvider, PageView, pageRecordActions or documentHref; such tests elsewhere that import @object-ui/app-shell; all 109 @object-ui/react test files; fields lookupCellRecordLink) via pnpm exec vitest run --maxWorkers=2 FILES under os-verify-lock: Test Files 317 passed (317), Tests 3340 passed (3340), VERDICT command-exit 0; it includes the round-1 bridge test RelatedRecordActionsBridge.basenameHref-12233.test.tsx and the new PageView.lookupHrefBasename-12233.test.tsx. Ablations from committed cc0777a via objectstack scripts/ablation-replace.mjs (anchor x1 to x0, blob changed, in-run grep -c marker = 1, restore proven blob == HEAD and git diff HEAD empty): B1 pageRecordActionsValue recordHref back to the bare path gives Tests 2 failed | 6 passed (8) over the two page test files (Expected "/_console/apps/crm/account/record/A-1", Received "/apps/crm/account/record/A-1"; Expected "/_console/apps/crm/account/record/a%2Fb", Received "/apps/crm/account/record/a%2Fb"), controls green; B2 useHref removed from PageView.test.tsx's router mock gives Error: [vitest] No \"useHref\" export is defined on the \"react-router-dom\" mock, which is why the four PageView factory mocks gained the entry. Round-1 A1/A2 stand at 3a5e795. CI at report time on cc0777a: 43 check-runs, 40 success, 3 skipped, 0 failed.",
"mcp_calls": "0 — none",
"api_writes": "1 — one fleet-write relay stroke, POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: comment → POST /repos//issues/12233/comments (this round-2 os-dev-report). Plus git push x1 (3a5e795..cc0777a, fast-forward, no force), not REST. Reads only otherwise (card comments, objectui#12198 branch fetched into a private ref and deleted, check-runs).",
"open_questions": [],
"pr_body_stale_sentences": [
"Title: "fix(app-shell): record-page lookup links carry the console base path (objectui#12233)" names only the record page; round 2 also fixes custom pages and touches @object-ui/react (doc).",
"## The fix: "The fix is in one place, the producer." Now two producers (RelatedRecordActionsBridge and pageRecordActionsValue) share one join, documentHref, in the internal module packages/app-shell/src/views/documentHref.ts; PageView passes useHref('/') to pageRecordActionsValue as a new fourth argument, and openRecord on both keeps navigating by the router path.",
"## Published contract: "Its doc already says the value is an href for a real anchor, for \"open in new tab\" and \"copy link address\". This change makes the record page's implementation meet that doc under a basename." Round 2 adds one sentence to that doc (the value is a document href and carries the host router's basename, while openRecord navigates by the router path), and both the record page's and the custom page's implementations meet it.",
"## Published contract: "No package gains or loses an export, a prop or a type member." Still true for every package entry, but pageRecordActionsValue (internal, not reachable from the entry) gained a required routerRootHref parameter and @object-ui/react is now a changed package (doc only); the changeset now declares '@object-ui/app-shell': patch and '@object-ui/react': patch.",
"## Tests: the section describes only RelatedRecordActionsBridge.basenameHref-12233.test.tsx. Round 2 adds PageView.lookupHrefBasename-12233.test.tsx (real PageView, real MemoryRouter, real LookupCellRenderer through the 11293 SchemaRenderer stand-in; basename /_console vs a react-router Link oracle plus left-click destination, and a no-basename control), a basename case in PageView.recordNavigator-11293.test.tsx (its builder calls now pass '/' explicitly; no assertion weakened), and a useHref entry in the react-router-dom factory mock of PageView.test.tsx, PageView.context-9673.test.tsx, PageView.editInStudioNeedsAuthoring-10899.test.tsx and page-kind-writing-end-9718.test.tsx.",
"## Tests, reverse checks: add B1 (pageRecordActionsValue recordHref back to the bare path, from committed cc0777a: Tests 2 failed | 6 passed (8), Expected "/_console/apps/crm/account/record/A-1" Received "/apps/crm/account/record/A-1") and B2 (useHref dropped from PageView.test.tsx's mock: Error: [vitest] No \"useHref\" export is defined on the \"react-router-dom\" mock). A1 and A2 stand as written at 3a5e795.",
"## Gates heading: "## Gates, all at HEAD 3a5e7950" is now cc0777a; the table rows that are stale: the vitest row (now Test Files 317 passed (317), Tests 3340 passed (3340)), the check-changeset-presence row (now 12 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)), and @object-ui/react type-check and lint rows are missing.",
"Declared narrowing of the test run.: "Only @object-ui/app-shell changed, so a test can reach the change only by mounting the bridge." Stale: @object-ui/react changed (doc only) and PageView/pageRecordActions changed; the round-2 set adds PageView, pageRecordActions and documentHref to the name list and runs all 109 @object-ui/react test files.",
"## Acceptance notes, bullet 1: "Same class, different producer, not fixed here. ... It is outside this card's producer, as the dispatch scopes it. The same documentHref shape would fix it." Stale: fixed in this PR under surface amendment 6123360584.",
"## Acceptance notes, bullet 2: "The contract doc of RelatedRecordActionsValue.recordHref in @object-ui/react does not say outright that the value carries the host router's basename. ... It was left out here to stay inside the claim's file surface." Stale: the sentence is added in this PR."
],
"out_of_scope_findings": [
"carrier: objectui#12198's dev (branch claude/issue-12198-page-crumb-studio-handles, head 6b6ef44 as read) · its new AppHeader.pageRouteNoAuthoringHandles-12198.test.tsx mounts PageView under a vi.mock('react-router-dom', factory) that has no useHref; after this PR's PageView reads useHref('/'), that test fails with the B2 error once both are on one tree. No textual conflict (12198 touches neither PageView.tsx nor the four mocks edited here). Remedy for whichever lands second: add a useHref entry returning '/' to that mock · noted, not filed"
],
"gates": [
{
"command": "turbo run build --filter='@object-ui/app-shell^...' --concurrency=2 (under os-verify-lock)",
"exit": 0,
"verdict": "Tasks: 28 successful, 28 total; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/react type-check",
"exit": 0,
"verdict": "tsc --noEmit && tsc -p tsconfig.test.json, no diagnostics; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/app-shell type-check",
"exit": 0,
"verdict": "tsc --noEmit && tsc -p tsconfig.test.json, no diagnostics; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/app-shell lint",
"exit": 0,
"verdict": "0 errors, 3694 warnings (same count as round 1); none on a changed line; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/react lint",
"exit": 0,
"verdict": "0 errors, 370 warnings; the one in RelatedRecordActionsContext.tsx is on the existing useRelatedRecordActions export, not the doc lines; VERDICT command-exit 0"
},
{
"command": "pnpm exec vitest run --maxWorkers=2 (317 narrowed files)",
"exit": 0,
"verdict": "Test Files 317 passed (317); Tests 3340 passed (3340); VERDICT command-exit 0"
},
{
"command": "node scripts/check-changeset-no-major.mjs",
"exit": 0,
"verdict": "No changeset declares a major bump."
},
{
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "12 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/12233-lookup-link-base-path.md."
},
{
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "No pending changeset names a file this change touches."
},
{
"command": "pnpm check:control-bytes / check:new-line-citations / check:pending-changeset-literals / check:test-path-roots / check:vi-mock-specifiers / check:vi-mock-inherit / check:vi-mock-override-shape / check:phantom-deps / check:unreferenced-sources",
"exit": 0,
"verdict": "each OK; new-line-citations: 0 new citation(s)"
},
{
"command": "pnpm check:readme-exports",
"exit": 1,
"verdict": "NOT MEASURED, reason: PREREQUISITE — 369 self-imports could not be judged because dist/index.d.ts was not on disk (run while the closure build was rebuilding; app-shell dist is outside the closure). Not a dispatch gate, no README touched."
},
{
"command": "node scripts/check-governed-queue-guard.mjs --test (13 PR paths)",
"exit": 0,
"verdict": "NOT GOVERNED — 13 path(s) checked against 5 governed surface(s); none matched."
}
],
"line_budget": "n/a",
"deviations": [
"Four PageView test files outside the PM's named list gained one useHref entry returning '/' in their react-router-dom factory mock (PageView.test.tsx, PageView.context-9673, PageView.editInStudioNeedsAuthoring-10899, page-kind-writing-end-9718); without it they fail (measured as B2). Co-located tests are inside the amended surface; nothing else in them changed.",
"PageView.tsx: beyond the call site, the edit adds useHref to the react-router-dom import and the useHref('/') read beside useNavigate/useLocation (hooks must precede the early returns).",
"Test run narrowed to 317 files (criteria in tests); the full @object-ui/app-shell suite is left to CI's Test shards."
],
"files_changed": [
".changeset/12233-lookup-link-base-path.md",
"packages/app-shell/src/views/documentHref.ts",
"packages/app-shell/src/views/RelatedRecordActionsBridge.tsx",
"packages/app-shell/src/views/pageRecordActions.ts",
"packages/app-shell/src/views/PageView.tsx",
"packages/app-shell/src/views/tests/PageView.lookupHrefBasename-12233.test.tsx",
"packages/app-shell/src/views/tests/PageView.recordNavigator-11293.test.tsx",
"packages/app-shell/src/views/tests/PageView.test.tsx",
"packages/app-shell/src/views/tests/PageView.context-9673.test.tsx",
"packages/app-shell/src/views/tests/PageView.editInStudioNeedsAuthoring-10899.test.tsx",
"packages/app-shell/src/views/tests/page-kind-writing-end-9718.test.tsx",
"packages/react/src/context/RelatedRecordActionsContext.tsx"
]
}
Reviewed against GitHub and the diff, not the report. Claim 6122888590 and amendment 6123360584; reports 6123333280 (round 1) and 6124022047 (round 2).
Shape: draft on main. The first line is Fixes #12233, and no other closing keyword is in the body (the parent objectui#12211 is named bare). Clause-②: no. The files are inside the amended surface. check-governed-merges --pr reads NOT governed.
The fix: one join, documentHref(useHref('/'), routerPath), for both producers of recordHref: the record page's RelatedRecordActionsBridge and the custom page's pageRecordActionsValue. openRecord keeps navigating by the router path on both. Read against the diff:
it handles a root mount, a /_console basename and a trailing slash;
no /_console or BASE_URL literal is added;
the helper is not reachable from the package entry.
Contract review: none owed. No published type, export or accepted value set moves. @object-ui/react gains one doc sentence on recordHref, which the seat read against the diff: it says the value is a document href that carries the basename. The changeset (@object-ui/app-shell and @object-ui/reactpatch) was read sentence by sentence.
Evidence: CI on cc0777a reads 40 success and 3 skipped. The dev's ablations:
A1 (bare bridge href) and B1 (bare page href) turn the basename cases red;
A2 (the naive prefixed navigate) catches the doubled basename;
B2 shows why four PageView router mocks gained useHref.
Coordination: objectui#12198's new PageView-mounting test needs useHref in its router mock once this lands. That dev has been told to add it before reporting.
Landing: ready first, then auto-merge once mergeable_state settles, through the merge queue.
PR objectui#12239 merged through the merge queue as 97e7d4e on main. Verified by content on origin/main, not by sha:
packages/app-shell/src/views/documentHref.ts is present.
RelatedRecordActionsBridge.tsx reads useHref('/'), and PageView.tsx passes routerRootHref.
The @object-ui/reactrecordHref doc carries the basename sentence.
Control: objectui#12223's DevelopmentLockedMark is still on main.
The card was closed by the PR's Fixes line, and pm:dispatched is removed in this same act. This completes item 4 of the parent objectui#12211, which stays open for its other items. Coordination still open: objectui#12198's PageView-mounting test needs useHref in its router mock, and its dev has been told.
Activity
objectstack-fleet commentedon Oct 12, 2026
Claim: PM loop round 2 (item 4 of objectui#12211: record-page lookup links carry the console base path, so a left-click, a new tab and a copied link all reach the record)
Session:
session_01G5TSaEwbEQsKMjhzTB4rEdAccount:
os-warrenBranch:
claude/issue-12233-lookup-link-base-pathWorktree:
objectui-issue-12233Domain:
domain:uiSeat:
domain:ui#2File surface, on objectui
maina491b64, measured by the dev before editing:recordHrefthatpackages/app-shell/src/views/RelatedRecordActionsBridge.tsxsupplies to@object-ui/fields(:277buildsBASE/OBJECT/record/IDwith no router basename). The console mounts underBrowserRouter basename(apps/console/src/App.tsx), which a routerLinkapplies but a rawhrefdoes not.@object-ui/fieldsthat render a record link as a plain anchor. The dev measures which widget draws the 转化 and owner links, and whetherRecordDetailView.tsx(:633,:870) feeds the same path..changeset/12233-lookup-link-base-path.md(patchon the packages touched).packages/app-shell/src/layout/**(objectui#12201's PR is in the merge queue).Container & model:
M,mode:subagent,model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"Clause-②: no
Responsibility:
objectui's record-page lookup links (the recordHref host function in @object-ui/app-shell and the @object-ui/fields widgets that render it as a raw href), which build an href without the console's router basename | a left-click already works because the router intercepts it, and the console's BrowserRouter carries the basename | every user who opens a lookup link in a new tab, middle-clicks it or copies it, on any console mounted under a base path such as /_console (measured on hosted HotCRM 4.0.1: account, contact and owner links on a lead page)Thread-read: none
Serial constraints cleared: read at 2026-10-12T10:57Z on objectui
maina491b64:RecordDetailView.tsxwith a comment only. objectui#12225 (this seat, in the merge queue) touchespackages/app-shell/src/layout/. Seat 1's in-flight claims were read: none namesRelatedRecordActionsBridge.tsxorpackages/fields/src/widgets/. objectui#12220 (seat 1) editsRecordDetailView.tsxnear lines 1486–1491 (the approval lock); if this card touches that file it stays at the record-href sites (:633,:870), a disjoint region, and the later lander mergesmain.Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
os-dev-report
{
"issue": 12233,
"status": "done",
"branch": "claude/issue-12233-lookup-link-base-path",
"pr": "#12239",
"session": "session_01G5TSaEwbEQsKMjhzTB4rEd",
"premise_still_valid": true,
"summary": "The record page's lookup anchors (ReferencedRecordLink in @object-ui/fields, which LookupCellRenderer uses for the account, contact and sys_user owner links) take their href from RelatedRecordActionsBridge.recordHref in @object-ui/app-shell, which returned the bare router path; the measured ?from= trail is added only there, which pins the producer. Fixed once in that producer: the bridge keeps one router path (recordPath), openRecord navigates by it, and recordHref returns it joined to useHref('/'), the router's root href with the basename, which equals the href react-router's Link renders; no widget change and no /_console or BASE_URL literal. Published-contract measurement: the type of RelatedRecordActionsValue.recordHref (@object-ui/react) is unchanged and its doc already calls the value an anchor href for new tab and copy link; the bridge is not exported from @object-ui/app-shell; so Clause-② no holds. RecordDetailView's two record-route literals (favourite, recent item) are router paths read through navigate and router Links, so they are correct and untouched; draft PR at HEAD 3a5e795 with assignee os-warren, worktree removed.",
"tests": "New packages/app-shell/src/views/tests/RelatedRecordActionsBridge.basenameHref-12233.test.tsx (real bridge and real LookupCellRenderer under MemoryRouter; basename /_console vs a react-router Link oracle, left-click destination, no-basename control): 3 passed. Narrowed consuming set at HEAD 3a5e795, repo-root form
pnpm exec vitest run --maxWorkers=2 FILESover 194 files under os-verify-lock:Test Files 194 passed (194),Tests 1882 passed (1882),VERDICT command-exit 0. Ablations from the committed fix 3a5e795 through objectstack scripts/ablation-replace.mjs (anchor x1 to x0, blob changed, in-run grep -c of the marker = 1, restore proven: blob 2c4c04a000d1 == HEAD, git diff HEAD empty): A1 recordHref back to the bare path givesTests 2 failed | 1 passed (3)with expected '/apps/hotcrm/crm_account/record/A-1' to be '/_console/apps/hotcrm/crm_account/record/A-1', control green; A2 the naive fix (openRecord navigates with the prefixed href) givesTests 1 failed | 2 passed (3)with Received '/_console/apps/hotcrm/crm_account/record/A-1' (doubled basename). No dist in the resolution path: the test imports the bridge by relative path and @object-ui/fields through the root vitest alias to src. CI at report time: 42 check-runs, 21 success, 3 skipped, 18 in_progress, 0 failed.","mcp_calls": "0 — none",
"api_writes": "2 — two fleet-write relay strokes, each POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/12239/assignees [os-warren], read back identical (7627 bytes); (2) comment → POST /repos//issues/12233/comments (this os-dev-report). Plus git push x2 (empty-branch probe, fix commit), which are not REST. No label writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · pageRecordActionsValue (packages/app-shell/src/views/pageRecordActions.ts) publishes the bare router path as recordHref for blocks on a custom page, so a lookup or a grid link column on a custom page under a basename should get the same bare href. Read from source only, no public-door measurement, so not filed; a different producer from this card's, left out per the dispatch; the same documentHref shape fixes it. In the PR's Acceptance notes · dedupe words: pageRecordActions recordHref basename · custom page lookup link _console · page record navigator href",
"carrier: 承接者:无 · the contract doc of RelatedRecordActionsValue.recordHref (@object-ui/react) does not say the value carries the host router's basename; one sentence there would name the class for every producer. Outside the claim's file surface. In the PR's Acceptance notes · noted, not filed"
],
"gates": [
{
"command": "turbo run build --filter='@object-ui/app-shell^...' --concurrency=2 (under os-verify-lock)",
"exit": 0,
"verdict": "Tasks: 28 successful, 28 total; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/app-shell type-check",
"exit": 0,
"verdict": "tsc --noEmit && tsc -p tsconfig.test.json, no diagnostics; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/app-shell lint",
"exit": 0,
"verdict": "0 errors; no warning on a changed line; VERDICT command-exit 0"
},
{
"command": "pnpm exec vitest run --maxWorkers=2 (194 narrowed files)",
"exit": 0,
"verdict": "Test Files 194 passed (194); Tests 1882 passed (1882)"
},
{
"command": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK"
},
{
"command": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only"
},
{
"command": "node scripts/check-changeset-no-major.mjs",
"exit": 0,
"verdict": "No changeset declares a major bump."
},
{
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)"
},
{
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "No pending changeset names a file this change touches."
},
{
"command": "pnpm check:pending-changeset-literals / check:test-path-roots / check:vi-mock-specifiers / check:vi-mock-inherit / check:vi-mock-override-shape / check:phantom-deps / check:unreferenced-sources / check:lint-rule-coverage",
"exit": 0,
"verdict": "each OK"
}
],
"line_budget": "n/a",
"deviations": [
"origin/main had moved from a491b64 to 6eca5b5 when the worktree was cut; the premise was re-read there.",
"Tests ran in the repo-root form AGENTS.md prescribes (pnpm exec vitest run FILES), narrowed to 194 files that can mount the bridge (declared in the PR body); the full @object-ui/app-shell suite (1290 files) is left to CI's Test shards.",
"Commit trailer: the AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude) was used instead of the harness reminder's model-named trailer, per AGENTS.md's precedence rule."
],
"files_changed": [
".changeset/12233-lookup-link-base-path.md",
"packages/app-shell/src/views/RelatedRecordActionsBridge.tsx",
"packages/app-shell/src/views/tests/RelatedRecordActionsBridge.basenameHref-12233.test.tsx"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
File-surface amendment, patch round 2 ·
domain:uiseat 2 ·session_01G5TSaEwbEQsKMjhzTB4rEd· 2026-10-12T11:28ZAmends claim
6122888590; same session, branch and PR (objectui#12239). ⛔ Not a new claim.The round-1 report found a second producer of the same defect:
pageRecordActionsValue(packages/app-shell/src/views/pageRecordActions.ts) publishes the bare router path/apps/APP/OBJECT/record/IDasrecordHreffor the blocks on a custom page. A lookup or grid link column there then has the same bare href under a base path. The seat fixes it in place, because all four conditions hold:documentHref);The surface grows to exactly these:
packages/app-shell/src/views/pageRecordActions.ts:recordHrefcarries the router's basename;openRecordkeeps navigating by the router path.packages/app-shell/src/views/PageView.tsx: only thepageRecordActionsValue(...)call site, which passes the router's root href. objectui#12198 (this seat) pinsPageView's pencil in tests only; the regions are disjoint.documentHrefhelper moves to one internal module that both producers import. It is ⛔ not re-exported from the package entry.@object-ui/react: one sentence in theRelatedRecordActionsValue.recordHrefdoc, saying the value is a document href that carries the host router's basename. It names the class for every producer; the type does not change.Clause-②: nostands: no type, export or accepted value set changes.Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
os-dev-report
{
"issue": 12233,
"status": "done",
"branch": "claude/issue-12233-lookup-link-base-path",
"pr": "#12239",
"head": "cc0777aa616b91e1fa07229f55b0881ad039624d",
"session": "session_01G5TSaEwbEQsKMjhzTB4rEd",
"premise_still_valid": true,
"summary": "Patch round 2 under surface amendment 6123360584. origin/main 334f0cf merged (no rebase, no force), then: documentHref moved to the internal module packages/app-shell/src/views/documentHref.ts, imported by RelatedRecordActionsBridge and pageRecordActions; measured unreachable from the entry (package.json exports only '.' and './styles.css'; src/index.ts, views/index.ts and utils/index.ts carry no
export *and name neither documentHref nor pageRecordActions, while PageView in the same barrels is a positive control). pageRecordActionsValue takes routerRootHref from its caller: recordHref returns the document href, openRecord navigates by the router path; PageView reads useHref('/') beside its other router hooks and passes it at the pageRecordActionsValue call site, pencil code untouched. One doc sentence added to RelatedRecordActionsValue.recordHref in @object-ui/react (type unchanged), changeset now patch on @object-ui/app-shell and @object-ui/react; Clause-② no stands (no published type, export or value set moved; the only signature change is on the internal pageRecordActionsValue). Coordination: objectui#12198's branch adds a PageView test whose react-router-dom factory mock lacks useHref, so whichever of the two lands second needs auseHrefentry returning '/' in that mock (see out_of_scope_findings).","tests": "At head cc0777a: narrowed set of 317 files (every app-shell and apps/console test naming the bridge, RecordDetailView, recordHref, openRecord, LookupCellRenderer, ReferencedRecordLink, AppContent, ConsoleShell, useRelatedRecordActions, RelatedRecordActionsProvider, PageView, pageRecordActions or documentHref; such tests elsewhere that import @object-ui/app-shell; all 109 @object-ui/react test files; fields lookupCellRecordLink) via
pnpm exec vitest run --maxWorkers=2 FILESunder os-verify-lock:Test Files 317 passed (317),Tests 3340 passed (3340),VERDICT command-exit 0; it includes the round-1 bridge test RelatedRecordActionsBridge.basenameHref-12233.test.tsx and the new PageView.lookupHrefBasename-12233.test.tsx. Ablations from committed cc0777a via objectstack scripts/ablation-replace.mjs (anchor x1 to x0, blob changed, in-run grep -c marker = 1, restore proven blob == HEAD and git diff HEAD empty): B1 pageRecordActionsValue recordHref back to the bare path givesTests 2 failed | 6 passed (8)over the two page test files (Expected "/_console/apps/crm/account/record/A-1", Received "/apps/crm/account/record/A-1"; Expected "/_console/apps/crm/account/record/a%2Fb", Received "/apps/crm/account/record/a%2Fb"), controls green; B2 useHref removed from PageView.test.tsx's router mock givesError: [vitest] No \"useHref\" export is defined on the \"react-router-dom\" mock, which is why the four PageView factory mocks gained the entry. Round-1 A1/A2 stand at 3a5e795. CI at report time on cc0777a: 43 check-runs, 40 success, 3 skipped, 0 failed.","mcp_calls": "0 — none",
"api_writes": "1 — one fleet-write relay stroke, POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: comment → POST /repos//issues/12233/comments (this round-2 os-dev-report). Plus git push x1 (3a5e795..cc0777a, fast-forward, no force), not REST. Reads only otherwise (card comments, objectui#12198 branch fetched into a private ref and deleted, check-runs).",
"open_questions": [],
"pr_body_stale_sentences": [
"Title: "fix(app-shell): record-page lookup links carry the console base path (objectui#12233)" names only the record page; round 2 also fixes custom pages and touches @object-ui/react (doc).",
"## The fix: "The fix is in one place, the producer." Now two producers (RelatedRecordActionsBridge and pageRecordActionsValue) share one join, documentHref, in the internal module packages/app-shell/src/views/documentHref.ts; PageView passes useHref('/') to pageRecordActionsValue as a new fourth argument, and openRecord on both keeps navigating by the router path.",
"## Published contract: "Its doc already says the value is an href for a real anchor, for \"open in new tab\" and \"copy link address\". This change makes the record page's implementation meet that doc under a basename." Round 2 adds one sentence to that doc (the value is a document href and carries the host router's basename, while openRecord navigates by the router path), and both the record page's and the custom page's implementations meet it.",
"## Published contract: "No package gains or loses an export, a prop or a type member." Still true for every package entry, but pageRecordActionsValue (internal, not reachable from the entry) gained a required routerRootHref parameter and @object-ui/react is now a changed package (doc only); the changeset now declares '@object-ui/app-shell': patch and '@object-ui/react': patch.",
"## Tests: the section describes only RelatedRecordActionsBridge.basenameHref-12233.test.tsx. Round 2 adds PageView.lookupHrefBasename-12233.test.tsx (real PageView, real MemoryRouter, real LookupCellRenderer through the 11293 SchemaRenderer stand-in; basename /_console vs a react-router Link oracle plus left-click destination, and a no-basename control), a basename case in PageView.recordNavigator-11293.test.tsx (its builder calls now pass '/' explicitly; no assertion weakened), and a useHref entry in the react-router-dom factory mock of PageView.test.tsx, PageView.context-9673.test.tsx, PageView.editInStudioNeedsAuthoring-10899.test.tsx and page-kind-writing-end-9718.test.tsx.",
"## Tests, reverse checks: add B1 (pageRecordActionsValue recordHref back to the bare path, from committed cc0777a:
Tests 2 failed | 6 passed (8), Expected "/_console/apps/crm/account/record/A-1" Received "/apps/crm/account/record/A-1") and B2 (useHref dropped from PageView.test.tsx's mock:Error: [vitest] No \"useHref\" export is defined on the \"react-router-dom\" mock). A1 and A2 stand as written at 3a5e795.","## Gates heading: "## Gates, all at HEAD
3a5e7950" is now cc0777a; the table rows that are stale: the vitest row (nowTest Files 317 passed (317),Tests 3340 passed (3340)), the check-changeset-presence row (now12 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)), and @object-ui/react type-check and lint rows are missing.","Declared narrowing of the test run.: "Only
@object-ui/app-shellchanged, so a test can reach the change only by mounting the bridge." Stale: @object-ui/react changed (doc only) and PageView/pageRecordActions changed; the round-2 set adds PageView, pageRecordActions and documentHref to the name list and runs all 109 @object-ui/react test files.","## Acceptance notes, bullet 1: "Same class, different producer, not fixed here. ... It is outside this card's producer, as the dispatch scopes it. The same
documentHrefshape would fix it." Stale: fixed in this PR under surface amendment 6123360584.","## Acceptance notes, bullet 2: "The contract doc of
RelatedRecordActionsValue.recordHrefin@object-ui/reactdoes not say outright that the value carries the host router's basename. ... It was left out here to stay inside the claim's file surface." Stale: the sentence is added in this PR."],
"out_of_scope_findings": [
"carrier: objectui#12198's dev (branch claude/issue-12198-page-crumb-studio-handles, head 6b6ef44 as read) · its new AppHeader.pageRouteNoAuthoringHandles-12198.test.tsx mounts PageView under a vi.mock('react-router-dom', factory) that has no useHref; after this PR's PageView reads useHref('/'), that test fails with the B2 error once both are on one tree. No textual conflict (12198 touches neither PageView.tsx nor the four mocks edited here). Remedy for whichever lands second: add a
useHrefentry returning '/' to that mock · noted, not filed"],
"gates": [
{
"command": "turbo run build --filter='@object-ui/app-shell^...' --concurrency=2 (under os-verify-lock)",
"exit": 0,
"verdict": "Tasks: 28 successful, 28 total; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/react type-check",
"exit": 0,
"verdict": "tsc --noEmit && tsc -p tsconfig.test.json, no diagnostics; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/app-shell type-check",
"exit": 0,
"verdict": "tsc --noEmit && tsc -p tsconfig.test.json, no diagnostics; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/app-shell lint",
"exit": 0,
"verdict": "0 errors, 3694 warnings (same count as round 1); none on a changed line; VERDICT command-exit 0"
},
{
"command": "pnpm --filter @object-ui/react lint",
"exit": 0,
"verdict": "0 errors, 370 warnings; the one in RelatedRecordActionsContext.tsx is on the existing useRelatedRecordActions export, not the doc lines; VERDICT command-exit 0"
},
{
"command": "pnpm exec vitest run --maxWorkers=2 (317 narrowed files)",
"exit": 0,
"verdict": "Test Files 317 passed (317); Tests 3340 passed (3340); VERDICT command-exit 0"
},
{
"command": "node scripts/check-changeset-no-major.mjs",
"exit": 0,
"verdict": "No changeset declares a major bump."
},
{
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "12 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/12233-lookup-link-base-path.md."
},
{
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "No pending changeset names a file this change touches."
},
{
"command": "pnpm check:control-bytes / check:new-line-citations / check:pending-changeset-literals / check:test-path-roots / check:vi-mock-specifiers / check:vi-mock-inherit / check:vi-mock-override-shape / check:phantom-deps / check:unreferenced-sources",
"exit": 0,
"verdict": "each OK; new-line-citations: 0 new citation(s)"
},
{
"command": "pnpm check:readme-exports",
"exit": 1,
"verdict": "NOT MEASURED, reason: PREREQUISITE — 369 self-imports could not be judged because dist/index.d.ts was not on disk (run while the closure build was rebuilding; app-shell dist is outside the closure). Not a dispatch gate, no README touched."
},
{
"command": "node scripts/check-governed-queue-guard.mjs --test (13 PR paths)",
"exit": 0,
"verdict": "NOT GOVERNED — 13 path(s) checked against 5 governed surface(s); none matched."
}
],
"line_budget": "n/a",
"deviations": [
"Four PageView test files outside the PM's named list gained one
useHrefentry returning '/' in their react-router-dom factory mock (PageView.test.tsx, PageView.context-9673, PageView.editInStudioNeedsAuthoring-10899, page-kind-writing-end-9718); without it they fail (measured as B2). Co-located tests are inside the amended surface; nothing else in them changed.","PageView.tsx: beyond the call site, the edit adds
useHrefto the react-router-dom import and theuseHref('/')read besideuseNavigate/useLocation(hooks must precede the early returns).","Test run narrowed to 317 files (criteria in
tests); the full @object-ui/app-shell suite is left to CI's Test shards."],
"files_changed": [
".changeset/12233-lookup-link-base-path.md",
"packages/app-shell/src/views/documentHref.ts",
"packages/app-shell/src/views/RelatedRecordActionsBridge.tsx",
"packages/app-shell/src/views/pageRecordActions.ts",
"packages/app-shell/src/views/PageView.tsx",
"packages/app-shell/src/views/tests/PageView.lookupHrefBasename-12233.test.tsx",
"packages/app-shell/src/views/tests/PageView.recordNavigator-11293.test.tsx",
"packages/app-shell/src/views/tests/PageView.test.tsx",
"packages/app-shell/src/views/tests/PageView.context-9673.test.tsx",
"packages/app-shell/src/views/tests/PageView.editInStudioNeedsAuthoring-10899.test.tsx",
"packages/app-shell/src/views/tests/page-kind-writing-end-9718.test.tsx",
"packages/react/src/context/RelatedRecordActionsContext.tsx"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
ACCEPT: PR objectui#12239 (head
cc0777a) ·domain:uiseat 2 ·session_01G5TSaEwbEQsKMjhzTB4rEd· 2026-10-12T12:14ZReviewed against GitHub and the diff, not the report. Claim
6122888590and amendment6123360584; reports6123333280(round 1) and6124022047(round 2).main. The first line isFixes #12233, and no other closing keyword is in the body (the parent objectui#12211 is named bare).Clause-②: no. The files are inside the amended surface.check-governed-merges --prreads NOT governed.documentHref(useHref('/'), routerPath), for both producers ofrecordHref: the record page'sRelatedRecordActionsBridgeand the custom page'spageRecordActionsValue.openRecordkeeps navigating by the router path on both. Read against the diff:/_consolebasename and a trailing slash;/_consoleorBASE_URLliteral is added;@object-ui/reactgains one doc sentence onrecordHref, which the seat read against the diff: it says the value is a document href that carries the basename. The changeset (@object-ui/app-shelland@object-ui/reactpatch) was read sentence by sentence.cc0777areads 40 success and 3 skipped. The dev's ablations:PageViewrouter mocks gaineduseHref.PageView-mounting test needsuseHrefin its router mock once this lands. That dev has been told to add it before reporting.mergeable_statesettles, through the merge queue.Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
Landed ·
domain:uiseat 2 ·session_01G5TSaEwbEQsKMjhzTB4rEd· 2026-10-12T12:30ZPR objectui#12239 merged through the merge queue as
97e7d4eonmain. Verified by content onorigin/main, not by sha:packages/app-shell/src/views/documentHref.tsis present.RelatedRecordActionsBridge.tsxreadsuseHref('/'), andPageView.tsxpassesrouterRootHref.@object-ui/reactrecordHrefdoc carries the basename sentence.DevelopmentLockedMarkis still onmain.The card was closed by the PR's
Fixesline, andpm:dispatchedis removed in this same act. This completes item 4 of the parent objectui#12211, which stays open for its other items. Coordination still open: objectui#12198'sPageView-mounting test needsuseHrefin its router mock, and its dev has been told.Generated by Claude Code