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 ⌘K 最近访问: each recent item carries its type (组织 / 环境 / 页面) and its object's icon, so two items with the same name are never drawn alike (ruling cloud#2942 Q1 A) #12852
Filing gate: ③ a task the maintainer directed. The maintainer ruled objectstack-ai/cloud#2942 Q1 letter A, 「同意」 2026-10-17 (ruling 6229051541). The cloud home keeps the hostname as the environment card's title, and ⌘K recent items gain a type label, as an objectui card the seat files. Filed by the repo:cloud#1 seat (seat post objectstack-ai/objectstack#6026, session session_01WVbr5J6u8BHh8EyFtcWciH). ⛔ Not a claim.
Dedupe: the 200 most recent open objectui issues carry no card on recent items' type labels.
What the user sees
The 2026-10-16 walk (cloud#2913 Source) found ⌘K › 最近访问 listing "Objectstack", "Objectstack", "Release Check 0928" and "2531 hotcrm 验收". Each row has the same search icon and no type. The two "Objectstack" rows are the organisation and its production environment, which share a name, and they cannot be told apart.
Done when
Each recent item shows its type on the right (组织 / 环境 / 页面, or the object's label for a record; four locales) and its object's icon on the left.
Two items of different types never render identically.
A test renders two same-named items of different types and asserts they differ.
The source is the console's recent-items provider (RecentItemsProvider.tsx, and the command palette that lists it). If the stored recent entry lacks the type, say whether it can be derived from the stored route, and do not invent one.
Dedupe words: command palette recent items type label; ⌘K 最近访问 same name organisation environment.
Why p2: the maintainer ruled it (objectstack-ai/cloud#2942 Q1, letter A, 「同意」), and the fleet runs only p1/p2. Two same-named recent items (the organisation and its environment) cannot be told apart today.
Why domain:ui: the console's RecentItemsProvider.tsx and the command palette.
Scope is the card's own: derive the type from the stored route where it can be, ⛔ never invent one.
Claim: PM loop round 3 (priority:p2 enhancement; maintainer-directed, objectstack-ai/cloud#2942 Q1 letter A, 「同意」, ruling 6229051541; filed by the repo:cloud#1 seat and graded by the triage seat, 6229901647; serial after objectui#12811, which landed as PR #12871)
Session: session_01SJn1GEkrbbBQkhGC26wEDw
Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12852-recent-item-type
Worktree: objectui-issue-12852 (in the cloud session's own container)
Domain: domain:ui
Seat: domain:ui#4
File surface:
packages/app-shell/src/chrome/CommandPalette.tsx: the recent group's rows show the item's object icon on the left and its type on the right, a record's object label or the kind's label.
packages/app-shell/src/console/home/recentItemTypeLabel.ts: only if its existing recentItemObject / recentItemTypeLabel helpers need moving to a shared home or a small extension.
packages/app-shell/src/hooks/useRecentItemLabel.ts: only if the label hook needs the type beside it.
Tests beside each, and one .changeset/12852-*.md (@object-ui/app-shell patch).
⛔ RecentItemsProvider.tsx's stored entry shape stays: the type is derived from what is stored, never invented. packages/components/src/ui/** stays out.
Stop on breach; explain in the report.
Container & model: S, 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: one chrome component's rendering and the helpers it reads inside @object-ui/app-shell. No exported type, prop or stored shape moves, and no @object-ui/i18n key is expected.
Responsibility: n/a — two same-named recent items (an organisation and its environment) cannot be told apart in ⌘K
Thread-read: 6229901647
Serial constraints cleared:
No open objectui PR touches CommandPalette.tsx, recentItemTypeLabel.ts or useRecentItemLabel.ts, and no pm:dispatched objectui claim names them (read at dispatch).
{
"issue": 12852,
"status": "done",
"branch": "claude/issue-12852-recent-item-type",
"pr": 12877,
"head": "210ce40",
"session": "session_01SRHG3vksxM8h9PHq9mPEUW (dispatched by PM seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw)",
"premise_still_valid": true,
"summary": "Each row in the command palette's recently-viewed group now shows its object's label as muted text on the right (useNavTargetLabel object label in the viewer's language, else the object's machine name, same as Home's Recently accessed trail) and its object's icon on the left (getIcon of the object's declared icon, else Home's record glyph FileText), replacing the shared Search glyph. The object comes only from the stored href through the existing recentItemObject; an entry whose href is not /apps/APP/OBJECT/record/ID shows no type and the neutral FileText glyph. Live on hotcrm (zh-CN): two recent records both titled 'Objectstack' (crm_opportunity and crm_task) render identically on main and as 商机 with a dollar-sign icon and 任务 with a square-check icon on the branch. All four PM mechanism assumptions held on main 5ff64ef. One regression was found and fixed during gating: reading useMetadata().objects at render started the object list's load while the palette was closed (CommandPalette.studioScope-11863 'reads nothing until the palette opens'), so the read now happens only inside the row function. No change to RecentItemsProvider, recentItemTypeLabel.ts, useRecentItemLabel.ts, i18n packs or packages/components/src/ui. The feature worktree /home/user/objectui-issue-12852 is kept because no PR is open yet (os-dev cleanup runs after the PR).",
"tests": "New file packages/app-shell/src/chrome/CommandPalette.recentItemType-12852.test.tsx, 5 tests: (1) two records titled 'Objectstack' of sys_organization and sys_environment show type Organization/Environment and icons Building2/Server, and the two rows differ; (2) under zh-CN the types are 组织/环境; (3) CONTROL: hrefs '/apps/cloud/record/x' and '/settings/profile' show no type and the FileText glyph; (4) CONTROL: an object the metadata does not hold is typed by its machine name and drawn with FileText; (5) CONTROL: from a mixed list (object, page, 7 records) the group lists exactly the first five records in order under 'Recently viewed', and clicking row 3 navigates to its href and closes the palette. Final run on 210ce40, through os-verify-lock: `pnpm exec vitest run --maxWorkers=2` over every CommandPalette*, useRecentItemLabel*, HomeItemTypeLabel.parity, HomePage.recentlyAccessed-12604, HomeRail.*, RecentApps.labelAtRender-11678, StarredApps.navExclusion and RecordDetailView.recordsRecentVisit-12604 test (no test file is named recentItemTypeLabel*): VERDICT command-exit 0, Test Files 15 passed (15), Tests 76 passed (76). Ablations, all on committed HEAD with trap-restore and a hash check against HEAD; the tests import ./CommandPalette from source, so no dist is involved: A1 icon forced to FileText -> 1 failed (same-title test); A2 type span suppressed -> 3 failed; A3 type = machine name instead of label -> 2 failed (en + zh-CN); A4 non-derivable entry given a guessed type and icon -> 1 failed (control 3); A5 slice(0,5) changed to slice(0,6) -> 1 failed (control 5). Every run printed 'on-disk: old=0 new=1' before the run, then 'restored: hash matches HEAD' and 'git diff HEAD: [0 bytes]'.",
"gates": "On 210ce40 unless noted: lock-wrapped targeted vitest (above) exit 0; `pnpm --filter @object-ui/app-shell type-check && pnpm --filter @object-ui/app-shell build` exit 0 (VERDICT command-exit 0, 'dist completeness: 1 package(s) complete'); `pnpm exec eslint` on the two touched .tsx files exit 0, 0 errors, warnings all on lines this diff does not touch; package `pnpm lint` (eslint .) exit 0, run on 4661c94 before the merge, 0 errors; dependency closure `pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build` exit 0 (on 4661c94); `pnpm check:i18n-keys` exit 0; `pnpm check:i18n-drift` exit 0; `node scripts/check-changeset-presence.mjs` exit 0 (1 changeset declared); `pnpm check:new-line-citations` exit 0 (0 new citations); control-byte self-scan of the 3 changed files gave no hits. `node scripts/check-nul-bytes.mjs` gave MODULE_NOT_FOUND (an objectstack script that objectui does not have), so it was not a measurement and the manual scan stands in for it. `scripts/pm/dispatch-gates.mjs --commands/--ran` does not exist in objectui; the gate list was derived by hand from the dispatch and objectui AGENTS.md. CI check-runs: NOT MEASURED, reason: no PR open yet (the PM opens it).",
"mcp_calls": "6 — mcp__claude-code-remote__add_repo x2 (objectstack, hotcrm; access read; both answered read_available, nothing attached); mcp__github__issue_read x2 (get, get_comments on #12852); mcp__github__pull_request_read x2 (get_files on #12687, #12871). No write tool.",
"api_writes": "0 REST writes. git push only: claude/issue-12852-recent-item-type (empty branch first, then 4661c94, the fix commit and merge 210ce40) and claude/issue-12852-evidence (7122f5c). Local-only data edits went to the --fresh hotcrm dev DB (renamed records via localhost PATCH; deleted when the server stopped).",
"files_changed": [
"packages/app-shell/src/chrome/CommandPalette.tsx",
"packages/app-shell/src/chrome/CommandPalette.recentItemType-12852.test.tsx",
".changeset/12852-command-palette-recent-item-type.md"
],
"screenshots": [
"before (main 5ff64ef, light, zh-CN): https://github.com/objectstack-ai/objectui/blob/7122f5c6beb9d32605e6862d4797adddf4ad3a94/docs/design/findings/12852/before-main-recent-zh-CN.png?raw=true",
"after (branch, light, zh-CN): https://github.com/objectstack-ai/objectui/blob/7122f5c6beb9d32605e6862d4797adddf4ad3a94/docs/design/findings/12852/after-branch-recent-zh-CN.png?raw=true"
],
"line_budget": "n/a",
"deviations": [
"os-dev.md says dev opens the draft PR and posts the os-dev-report comment, through scripts/pm and the fleet-write relay. This container cannot reach the relay (403 per the dispatch), so per the dispatch's degraded channel: no PR, no comment, pr_body_draft below. This is a capability gap, not a contract choice; the PM opens the PR and posts the report.",
"To recreate the branch as a fresh worktree, I detached HEAD of the shared /home/user/objectui checkout (it had claude/issue-12852-recent-item-type checked out with no commits of its own) and deleted that local branch. No files were edited in the shared checkout.",
"objectui has no scripts/check-nul-bytes.mjs, scripts/ablation-replace.mjs or scripts/ablation-dist-preflight.mjs. Ablation landed on disk through an anchor-count-checked python replace with a printed on-disk grep count, plus trap restore and a HEAD-hash check. Dist preflight does not apply because the test imports source.",
"The feature worktree is not removed yet: os-dev cleanup is 'after the PR opens', and the PM opens it. The main-comparison and evidence worktrees were removed."
],
"open_questions": [
{
"question": "Which glyph does a row draw when its object cannot be derived, or the object declares no icon?",
"options": [
"A FileText, the record glyph of Home's RECENT_ICON, so palette and Home agree",
"B keep the old Search glyph"
],
"recommendation": "A (implemented). Ruling 1 says to match what Home's RecentApps draws, and a search glyph on a recent row says nothing about what the row is. Four axes: business — Home already ships it; long-term — one icon rule across both recent surfaces; AI-error — no second convention; startup — zero new surface."
},
{
"question": "Ruling 1's non-record branch (the kind label through recentItemTypeLabel) — implement it in a records-only group?",
"options": [
"A not written: the group filters to type === 'record', so it is unreachable and untestable through the palette",
"B write it for a future widened group"
],
"recommendation": "A (implemented). Measured: the group keeps `recentItems.filter(it => it.type === 'record').slice(0, 5)`, so the card's 页面 example cannot appear in it; neither can 组织 or 环境 as kinds, only as record object labels. Startup axis: no speculative branch. If the group is widened later, that card adds the recentItemTypeLabel branch next to Home's identical use."
},
{
"question": "Do the cloud console's 'Objectstack' organisation and environment rows get a type?",
"options": [
"A yes, if the cloud console stores them as /apps/APP/OBJECT/record/ID (the only shape objectui's RecordDetailView writes)",
"B no, if cloud stores another href shape: then they show no type and FileText, per ruling 2"
],
"recommendation": "Measure in the cloud repo, which is not in this session. objectui writes record entries in exactly one place (RecordDetailView: href `/apps/${appName}/${objectName}/record/${pureRecordId}`), and that shape always yields a type. Any other stored href — another producer writing into the synced sys_user_preference, a hand-written entry, a non-/apps route — cannot carry a type, because ruling 2 bars reading the id or the label."
},
{
"question": "The row's lookup reads useMetadata().objects, the same source as Home's recent rows and useNavTargetLabel. In an app whose object list has not been read, that read can start the full object-registry load, which objectui#12811 narrowed at console open. Accept?",
"options": [
"A accept: the read happens only when the palette is open with recent rows, never at console open or with the palette closed (pinned by studioScope-11863)",
"B read the palette's app-scoped `objects` prop instead"
],
"recommendation": "A (implemented). Live: zero /api/v1/meta requests between opening ⌘K and the screenshot, on main and on the branch. B would give records of other apps' objects a machine-name type, because recent items are cross-app, and would add a second label source beside Home's."
}
],
"out_of_scope_findings": [],
"pr_title_draft": "feat(app-shell): ⌘K recent rows show their object's type and icon (objectui#12852)",
"pr_body_draft": "(elided here: it is the body of objectstack-ai/objectui#12877, the dev's draft verbatim)"
}
Relayed by seat domain:ui#4 (session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final report (degraded channel: the session pushed and returned pr: null). The seat opened #12877 from claude/issue-12852-recent-item-type at 210ce40 and set pr above; the title is the dev's draft, which already names the card. The seat's rulings on the four open questions are in the ACCEPT on the PR.
State change: the card closed as completed through Fixes #12852. This act removes pm:dispatched. The cloud session session_01SRHG3vksxM8h9PHq9mPEUW is archived.
Activity
objectstack-fleet commentedon Oct 17, 2026
Triage: grade
priority:p3→p2·domain:ui·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-17T04:58ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
domain:ui: the console'sRecentItemsProvider.tsxand the command palette.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Claim: PM loop round 3 (
priority:p2enhancement; maintainer-directed, objectstack-ai/cloud#2942 Q1 letter A, 「同意」, ruling6229051541; filed by therepo:cloud#1seat and graded by the triage seat,6229901647; serial after objectui#12811, which landed as PR #12871)Session:
session_01SJn1GEkrbbBQkhGC26wEDwAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12852-recent-item-typeWorktree:
objectui-issue-12852(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#4File surface:
packages/app-shell/src/chrome/CommandPalette.tsx: the recent group's rows show the item's object icon on the left and its type on the right, a record's object label or the kind's label.packages/app-shell/src/console/home/recentItemTypeLabel.ts: only if its existingrecentItemObject/recentItemTypeLabelhelpers need moving to a shared home or a small extension.packages/app-shell/src/hooks/useRecentItemLabel.ts: only if the label hook needs the type beside it..changeset/12852-*.md(@object-ui/app-shellpatch).@object-ui/i18nkey is expected. If one is needed, it lands in all ten packs, merged after fix(app-shell): one neutral sentence for a refused activity read on Home and the bell #12875, which writes the same packs.RecentItemsProvider.tsx's stored entry shape stays: the type is derived from what is stored, never invented.packages/components/src/ui/**stays out.Stop on breach; explain in the report.
Container & model:
S,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: one chrome component's rendering and the helpers it reads inside
@object-ui/app-shell. No exported type, prop or stored shape moves, and no@object-ui/i18nkey is expected.Responsibility: n/a — two same-named recent items (an organisation and its environment) cannot be told apart in ⌘K
Thread-read: 6229901647
Serial constraints cleared:
5ff64ef), and this branch is cut after it.CommandPalette.tsx,recentItemTypeLabel.tsoruseRecentItemLabel.ts, and nopm:dispatchedobjectui claim names them (read at dispatch).domain:ui#2) writes the locale packs, which this claim expects not to touch.objectstack-fleet commentedon Oct 17, 2026
os-dev-report
{ "issue": 12852, "status": "done", "branch": "claude/issue-12852-recent-item-type", "pr": 12877, "head": "210ce40", "session": "session_01SRHG3vksxM8h9PHq9mPEUW (dispatched by PM seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw)", "premise_still_valid": true, "summary": "Each row in the command palette's recently-viewed group now shows its object's label as muted text on the right (useNavTargetLabel object label in the viewer's language, else the object's machine name, same as Home's Recently accessed trail) and its object's icon on the left (getIcon of the object's declared icon, else Home's record glyph FileText), replacing the shared Search glyph. The object comes only from the stored href through the existing recentItemObject; an entry whose href is not /apps/APP/OBJECT/record/ID shows no type and the neutral FileText glyph. Live on hotcrm (zh-CN): two recent records both titled 'Objectstack' (crm_opportunity and crm_task) render identically on main and as 商机 with a dollar-sign icon and 任务 with a square-check icon on the branch. All four PM mechanism assumptions held on main 5ff64ef. One regression was found and fixed during gating: reading useMetadata().objects at render started the object list's load while the palette was closed (CommandPalette.studioScope-11863 'reads nothing until the palette opens'), so the read now happens only inside the row function. No change to RecentItemsProvider, recentItemTypeLabel.ts, useRecentItemLabel.ts, i18n packs or packages/components/src/ui. The feature worktree /home/user/objectui-issue-12852 is kept because no PR is open yet (os-dev cleanup runs after the PR).", "tests": "New file packages/app-shell/src/chrome/CommandPalette.recentItemType-12852.test.tsx, 5 tests: (1) two records titled 'Objectstack' of sys_organization and sys_environment show type Organization/Environment and icons Building2/Server, and the two rows differ; (2) under zh-CN the types are 组织/环境; (3) CONTROL: hrefs '/apps/cloud/record/x' and '/settings/profile' show no type and the FileText glyph; (4) CONTROL: an object the metadata does not hold is typed by its machine name and drawn with FileText; (5) CONTROL: from a mixed list (object, page, 7 records) the group lists exactly the first five records in order under 'Recently viewed', and clicking row 3 navigates to its href and closes the palette. Final run on 210ce40, through os-verify-lock: `pnpm exec vitest run --maxWorkers=2` over every CommandPalette*, useRecentItemLabel*, HomeItemTypeLabel.parity, HomePage.recentlyAccessed-12604, HomeRail.*, RecentApps.labelAtRender-11678, StarredApps.navExclusion and RecordDetailView.recordsRecentVisit-12604 test (no test file is named recentItemTypeLabel*): VERDICT command-exit 0, Test Files 15 passed (15), Tests 76 passed (76). Ablations, all on committed HEAD with trap-restore and a hash check against HEAD; the tests import ./CommandPalette from source, so no dist is involved: A1 icon forced to FileText -> 1 failed (same-title test); A2 type span suppressed -> 3 failed; A3 type = machine name instead of label -> 2 failed (en + zh-CN); A4 non-derivable entry given a guessed type and icon -> 1 failed (control 3); A5 slice(0,5) changed to slice(0,6) -> 1 failed (control 5). Every run printed 'on-disk: old=0 new=1' before the run, then 'restored: hash matches HEAD' and 'git diff HEAD: [0 bytes]'.", "gates": "On 210ce40 unless noted: lock-wrapped targeted vitest (above) exit 0; `pnpm --filter @object-ui/app-shell type-check && pnpm --filter @object-ui/app-shell build` exit 0 (VERDICT command-exit 0, 'dist completeness: 1 package(s) complete'); `pnpm exec eslint` on the two touched .tsx files exit 0, 0 errors, warnings all on lines this diff does not touch; package `pnpm lint` (eslint .) exit 0, run on 4661c94 before the merge, 0 errors; dependency closure `pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build` exit 0 (on 4661c94); `pnpm check:i18n-keys` exit 0; `pnpm check:i18n-drift` exit 0; `node scripts/check-changeset-presence.mjs` exit 0 (1 changeset declared); `pnpm check:new-line-citations` exit 0 (0 new citations); control-byte self-scan of the 3 changed files gave no hits. `node scripts/check-nul-bytes.mjs` gave MODULE_NOT_FOUND (an objectstack script that objectui does not have), so it was not a measurement and the manual scan stands in for it. `scripts/pm/dispatch-gates.mjs --commands/--ran` does not exist in objectui; the gate list was derived by hand from the dispatch and objectui AGENTS.md. CI check-runs: NOT MEASURED, reason: no PR open yet (the PM opens it).", "mcp_calls": "6 — mcp__claude-code-remote__add_repo x2 (objectstack, hotcrm; access read; both answered read_available, nothing attached); mcp__github__issue_read x2 (get, get_comments on #12852); mcp__github__pull_request_read x2 (get_files on #12687, #12871). No write tool.", "api_writes": "0 REST writes. git push only: claude/issue-12852-recent-item-type (empty branch first, then 4661c94, the fix commit and merge 210ce40) and claude/issue-12852-evidence (7122f5c). Local-only data edits went to the --fresh hotcrm dev DB (renamed records via localhost PATCH; deleted when the server stopped).", "files_changed": [ "packages/app-shell/src/chrome/CommandPalette.tsx", "packages/app-shell/src/chrome/CommandPalette.recentItemType-12852.test.tsx", ".changeset/12852-command-palette-recent-item-type.md" ], "screenshots": [ "before (main 5ff64ef, light, zh-CN): https://github.com/objectstack-ai/objectui/blob/7122f5c6beb9d32605e6862d4797adddf4ad3a94/docs/design/findings/12852/before-main-recent-zh-CN.png?raw=true", "after (branch, light, zh-CN): https://github.com/objectstack-ai/objectui/blob/7122f5c6beb9d32605e6862d4797adddf4ad3a94/docs/design/findings/12852/after-branch-recent-zh-CN.png?raw=true" ], "line_budget": "n/a", "deviations": [ "os-dev.md says dev opens the draft PR and posts the os-dev-report comment, through scripts/pm and the fleet-write relay. This container cannot reach the relay (403 per the dispatch), so per the dispatch's degraded channel: no PR, no comment, pr_body_draft below. This is a capability gap, not a contract choice; the PM opens the PR and posts the report.", "To recreate the branch as a fresh worktree, I detached HEAD of the shared /home/user/objectui checkout (it had claude/issue-12852-recent-item-type checked out with no commits of its own) and deleted that local branch. No files were edited in the shared checkout.", "objectui has no scripts/check-nul-bytes.mjs, scripts/ablation-replace.mjs or scripts/ablation-dist-preflight.mjs. Ablation landed on disk through an anchor-count-checked python replace with a printed on-disk grep count, plus trap restore and a HEAD-hash check. Dist preflight does not apply because the test imports source.", "The feature worktree is not removed yet: os-dev cleanup is 'after the PR opens', and the PM opens it. The main-comparison and evidence worktrees were removed." ], "open_questions": [ { "question": "Which glyph does a row draw when its object cannot be derived, or the object declares no icon?", "options": [ "A FileText, the record glyph of Home's RECENT_ICON, so palette and Home agree", "B keep the old Search glyph" ], "recommendation": "A (implemented). Ruling 1 says to match what Home's RecentApps draws, and a search glyph on a recent row says nothing about what the row is. Four axes: business — Home already ships it; long-term — one icon rule across both recent surfaces; AI-error — no second convention; startup — zero new surface." }, { "question": "Ruling 1's non-record branch (the kind label through recentItemTypeLabel) — implement it in a records-only group?", "options": [ "A not written: the group filters to type === 'record', so it is unreachable and untestable through the palette", "B write it for a future widened group" ], "recommendation": "A (implemented). Measured: the group keeps `recentItems.filter(it => it.type === 'record').slice(0, 5)`, so the card's 页面 example cannot appear in it; neither can 组织 or 环境 as kinds, only as record object labels. Startup axis: no speculative branch. If the group is widened later, that card adds the recentItemTypeLabel branch next to Home's identical use." }, { "question": "Do the cloud console's 'Objectstack' organisation and environment rows get a type?", "options": [ "A yes, if the cloud console stores them as /apps/APP/OBJECT/record/ID (the only shape objectui's RecordDetailView writes)", "B no, if cloud stores another href shape: then they show no type and FileText, per ruling 2" ], "recommendation": "Measure in the cloud repo, which is not in this session. objectui writes record entries in exactly one place (RecordDetailView: href `/apps/${appName}/${objectName}/record/${pureRecordId}`), and that shape always yields a type. Any other stored href — another producer writing into the synced sys_user_preference, a hand-written entry, a non-/apps route — cannot carry a type, because ruling 2 bars reading the id or the label." }, { "question": "The row's lookup reads useMetadata().objects, the same source as Home's recent rows and useNavTargetLabel. In an app whose object list has not been read, that read can start the full object-registry load, which objectui#12811 narrowed at console open. Accept?", "options": [ "A accept: the read happens only when the palette is open with recent rows, never at console open or with the palette closed (pinned by studioScope-11863)", "B read the palette's app-scoped `objects` prop instead" ], "recommendation": "A (implemented). Live: zero /api/v1/meta requests between opening ⌘K and the screenshot, on main and on the branch. B would give records of other apps' objects a machine-name type, because recent items are cross-app, and would add a second label source beside Home's." } ], "out_of_scope_findings": [], "pr_title_draft": "feat(app-shell): ⌘K recent rows show their object's type and icon (objectui#12852)", "pr_body_draft": "(elided here: it is the body of objectstack-ai/objectui#12877, the dev's draft verbatim)" }Relayed by seat
domain:ui#4(session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final report (degraded channel: the session pushed and returnedpr: null). The seat opened #12877 fromclaude/issue-12852-recent-item-typeat210ce40and setprabove; the title is the dev's draft, which already names the card. The seat's rulings on the four open questions are in the ACCEPT on the PR.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Landed · PR #12877 merged as
0e98991onmain· read 2026-10-17T11:24Zorigin/main0e98991recentItemObjectinCommandPalette.tsx../console/home/recentItemTypeLabel.js(:52), not copied; called per row (:250)/apps/APP/OBJECT/record/IDyields no object, so no type and no object iconicon ? getIcon(icon) : FileText(:342)data-testid="palette-recent-type"(:353)data-testidis unchangedCommandPalette.recentItemType-12852.test.tsx.changeset/12852-command-palette-recent-item-type.md@object-ui/app-shellpatchState change: the card closed as completed through
Fixes #12852. This act removespm:dispatched. The cloud sessionsession_01SRHG3vksxM8h9PHq9mPEUWis archived.Records of this card:
6233095508;6233106945;6233205503.Generated by Claude Code