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
studio: object-name inputs (Lookup Related object, flow trigger Object) fetch /meta/object/<prefix> on every keystroke and list internal sys_* tables #11783
Filing gate ① — product defect with a named location and a reproduction. reach: typing repairs_repair_ticket into the flow trigger Object input sent 20 requests GET /api/v1/meta/object/r, /re, … /repairs_repair_ticke, each 404; the Lookup Related object input does the same.
Who acts on it: objectui triage → the Studio / app-shell owner. ⛔ Not a claim. Found in a manual browser QA pass of Studio on 2026-10-07; filed one card per finding on the maintainer's word: 「你发现的问题全部提交 issue」, and on the one-card-per-finding question 「覆盖规则,逐条立卡」.
What happens
Both object-name inputs resolve the metadata on every keystroke (no debounce, no check against the known names).
Both are a native <input list> datalist of 108 objects including internal plumbing (sys_device_code, sys_approval_token, sys_flow_dispatch, sys_http_delivery, …); the package's own draft object shows as repairs_repair_ticket (draft) with no label.
The flow input's placeholder is crm_lead, an object that does not exist here.
Expected
A searchable object picker grouped by this package / people / other apps / system (advanced), showing labels, resolving only a chosen name.
Suggested direction (triage to rule)
One shared object picker for Lookup, flow triggers, hooks and actions; debounce or resolve-on-select.
Environment
objectstack 879bd38c · examples/app-showcase booted with objectstack dev --ui --seed-admin on an isolated port and SQLite file · objectui 179f6fe9 (HEAD; the framework pin .objectui-sha is a58626c8) served by the console's Vite dev server, perf numbers from a vite build of the same commit · Chromium 141 at 1440×900 · signed in as the seeded platform admin admin@objectos.ai unless stated.
Duplicate check
Semantic issue search on objectstack-ai/objectui (open and closed), related object input datalist per keystroke meta object 404 sys tables picker: 8 hits (0 open, 8 closed).
Path: write metadata — choosing an object in Studio | 缺项 | P2
Triage: first grade, bug · priority:p2 · domain:ui · area:studio · pm:queue. Direction: one shared object picker that resolves on select and hides internal tables
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T16:13Z. ⛔ Not a claim, ⛔ not a dispatch.
Triage: lands in the Lookup Related object input and the flow trigger Object input (and the hook/action object inputs the body names) ⇒ domain:ui; rationale: a Studio or console surface in objectui. Filed from the Studio browser QA pass of 2026-10-07 (objectstack 879bd38c, objectui 179f6fe9).
Why p2: typing an object name sent one GET /meta/object/<prefix> per keystroke (20 for one name, measured) and lists internal sys_* tables to authors.
Direction:
one shared object picker for Lookup, flow triggers, hooks and actions
debounce or resolve-on-select, with no per-keystroke fetch
internal sys_* objects are not offered unless the surface needs them
inspectors/ObjectFieldInspector.tsx: the Lookup Related object input, the <datalist> at about :1409–:1416.
inspectors/FlowReferenceField.tsx: the object-kind reference combobox and its object resolve (resolveObjectName:321, the <datalist> at about :796–:805).
inspectors/flow-node-config.ts: the trigger Object field's crm_lead placeholder (:441) only.
The hook and action inspectors' object-name inputs, only those the dev measures as such and names before editing them.
One new shared object-picker component under inspectors/, module-private.
i18n.ts: new engine.inspector.objectPicker.* rows (EN and ZH) only.
The tests beside these, and .changeset/11783-*.md.
⛔ Not on it:
seat 3's in-flight objectui#11827 surface (inspectors/FlowNodeInspector.tsx, previews/flow-problems.ts, previews/FlowCanvas.tsx, previews/FlowPreview.tsx, and the engine.inspector.flowNode.* rows of i18n.ts);
inspectors/_shared.tsx's shared InspectorTextField behaviour for other fields;
packages/i18n/**, packages/components/** (seat 3's PR objectui#11836) and packages/plugin-list/**.
Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report). If swapping the flow trigger's input needs FlowNodeInspector.tsx, it waits for objectui#11827 to land and is reported.
Container & model: M, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui over these paths: no path-derived mandate; default tier)
Clause-②: no
Responsibility: objectui app-shell Studio: the Lookup Related-object input and the flow trigger Object input are native datalists that resolve the typed name against /meta/object on every keystroke (20 GETs, each 404, for one name) and list every served object, internal plumbing included, by bare name | the platform path is right: the served object list carries each object's name, label and isSystem, and /meta/object/<name> answers a real name | every author who picks an object in Studio, measured by the filer on repairs_repair_ticket (20 per-keystroke 404s, 108 options with sys_* plumbing first-class)
Thread-read: 6041947467
Serial constraints cleared: none blocking.
area:studio: nothing is in flight. This seat's objectui#11776 landed as 03fc85d.
area:workflow: seat 3's objectui#11827 is in flight (claim 6047461043). This surface holds none of its files. The flow trigger Object field reaches the inspector through FlowNodeConfigField.tsx → FlowReferenceField.tsx, not through FlowNodeInspector.tsx. Both cards add i18n.ts rows under different prefixes; whichever lands second merges main.
Open objectui PRs: objectui#11836 (seat 3, objectui#11810: components, packages/i18n, plugin-list), objectui#11600 (release), objectui#11069 (CLI). None touches these files. Read 2026-10-07T22:52Z.
This seat: dispatch is serial (maintainer instruction, seat post 6020143345). Nothing else of this seat is in flight.
Ruling on "internal objects" (the seat's reading of triage 6041947467): the picker decides what is internal from the platform's own mark, the served object's isSystem (spec ObjectSchema), never from a sys_ name prefix or a hard-coded list.
isSystem objects are not offered up front. They sit in a collapsed System group that a search still reaches, because a Lookup to sys_user (people) or another platform object is a real author need.
The package's own objects come first, then the other objects.
If the served object list does not carry isSystem, the dev stops and reports needs_decision, without inventing a list.
Why Clause-②: no: this is Studio-internal input UI. No accepted metadata value changes: an author can still name any object, and the server judges it as today. No export, prop, @object-ui/types member or packages/i18n key is added. App-shell's ENGINE_STRINGS are unexported. If the fix needs a published surface, or a change to what the server accepts, the dev stops and reports, and the seat re-claims.
os-dev-report
{
"issue": 11783,
"status": "done",
"branch": "claude/issue-11783-object-picker",
"pr": "#11840",
"session": "session_01DrKzdPdyLLBW3qpZ4vtk7z — the parent's harness-stamped id (subagent of the domain:ui#1 PM; container CLAUDE_CODE_REMOTE_SESSION_ID resolves to it; claim 6048494412 names it)",
"premise_still_valid": true,
"summary": "Studio's object-name inputs now share one module-private ObjectPicker (inspectors/ObjectPicker.tsx): the Lookup Related object and summary Child object in ObjectFieldInspector, and every flow reference of kind object through one ReferenceCombobox branch in FlowReferenceField (trigger Object, sweep object, map item object, record-node and legacy-action Object, screen Object form); FlowNodeInspector.tsx is untouched. Typing stays local and the name is committed once on choice, Enter or blur (Escape abandons; Enter/blur keep exactly what was typed, so an expression value is accepted as before), and the options come from one draft-overlaid list read per mount, grouped this package first, then the other objects, then the served-isSystem objects in a collapsed System group that a search reaches; the crm_lead placeholder is removed with no new key. H1 measured in a real browser against a live app-showcase backend: per-prefix GET /meta/object/PREFIX while typing went 20 to 0 (Lookup) and 41 to 0 (flow trigger); the H2 gate holds (107/107 served entries carry isSystem and label), so no needs_decision. Card assignee untouched; zero label and assign writes (the PR's 'tests' and 'package: app-shell' labels come from objectui's path labeler).",
"tests": {
"head_for_gate_union": "8b94ce9 (git rev-parse --short HEAD in the worktree after the last commit; pushed, remote ref equals local 8b94ce9)",
"gates": [
"pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build (29-package closure, via os-verify-lock) -> 0 -> 'VERDICT command-exit 0 · held the lock 199s'",
"pnpm exec vitest run --maxWorkers=2 [102 files: every test importing ObjectFieldInspector/FlowReferenceField/ObjectPicker/FlowNodeConfigField/FlowObjectListField/flow-node-config/FlowNodeInspector/FlowInspector/inspectors index, enumerated by git grep, plus the 3 new pins] && pnpm --filter @object-ui/app-shell type-check (via os-verify-lock, on 8b94ce9) -> 0 -> 'Test Files 102 passed (102)' / 'Tests 1206 passed | 1 skipped (1207)' / '> tsc --noEmit && tsc -p tsconfig.test.json' / 'VERDICT command-exit 0 · held the lock 464s'",
"type-check covers the tests: tsc -p tsconfig.test.json --listFilesOnly lists ObjectPicker.test.tsx and both objectPicker-11783 pins",
"pnpm check:control-bytes -> 0 -> 'check-control-bytes: OK (scanned 7817 tracked text file(s); skipped 85 binary)'",
"pnpm check:new-line-citations -> 0 -> 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'",
"pnpm check:changeset-claims -> 0 -> 'No pending changeset names a file this change touches.'",
"pnpm check:pending-changeset-literals -> 0 -> 'No test source names a pending changeset.'",
"app-shell locale checks for the new i18n.ts rows: pnpm check:i18n-designer-parity -> 0 -> 'Every en row has a zh row, and every shared row carries the same placeholders.'; pnpm check:i18n-dead-keys -> 0 (report half; no objectPicker row listed); pnpm check:i18n-keys -> 0",
"added after re-deriving the diff (new vi.mock doubles, a new source file, a new react-router-dom import in app-shell): check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:unreferenced-sources, check:phantom-deps, check:test-path-roots, node scripts/check-changeset-presence.mjs -> all 0 on 8b94ce9 ('10 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)')",
"pnpm exec eslint --no-inline-config over the 10 changed ts/tsx files -> 0 -> 0 errors; ObjectPicker.tsx/its test 0 warnings; FlowReferenceField.tsx 10 warnings, equal to its 16cda0b copy (pre-existing)",
"NOT RUN locally (CI's): repo-wide pnpm lint and the full test farm"
],
"h1_request_counts_real_browser": "Chromium 1440x900, this branch's console on a dev-only Vite harness (never committed), backend examples/app-showcase from objectstack bafb58bb (objectstack dev --seed-admin --fresh, built in a detached measurement worktree), writable package com.example.repairs with draft-only repairs_repair_ticket and a draft flow; typing repairs_repair_ticket one key at a time. BEFORE (16cda0b): Lookup 20 per-prefix GET /meta/object/PREFIX + 1 full-name GET while typing; flow trigger 41 per-prefix + 2 full-name. AFTER: Lookup 0 while typing, 1 GET on commit (the committed name) + the Studio draft autosave PUT; flow trigger 0 while typing, 3 GETs on commit, all for the committed name.",
"h2_list_measurement": "The inputs read GET /api/v1/meta/object (live, admin): 107 items, isSystem present on 107 (80 true), label on 107, packageId on all; sys_inbox_message, sys_file, sys_upload_session served isSystem false; no non-sys name is isSystem. Runtime-authored objects (published or draft) carry no isSystem key (spec default false). GET /meta/_drafts?type=object rows carry no label; GET /meta/object?preview=draft serves the draft-only object with label 'Repair Ticket', _packageId com.example.repairs, _draft true; a published object with a pending draft is also served _draft true with its draft label.",
"h3_inventory": "Moved onto the picker (free-text datalist, per-keystroke commit): ObjectFieldInspector Lookup Related object and Summary Child object; every flow config field with ref kind object (start objectName, timeRelative.object, map itemObject, get/create/update/delete_record objectName, legacy_action objectName, screen objectName). Left as is (not the same kind, no per-keystroke fetch): HookDefaultInspector Objects (multi-select checkbox list), ActionDefaultInspector Object and PageBlockInspector object (strict InspectorSelectField; InspectorTextField fallback only when the list is empty), ViewVariantInspector / DatasetDefaultInspector base object / AppNavInspector object (InspectorComboField popovers committing on choice).",
"h4": "repairs_repair_ticket offered in This package, labelled 'Repair Ticket' from its draft, draft marker shown, choosable in both inputs (browser and ObjectPicker.test.tsx).",
"real_browser_after_options": "Both inputs: 2 package + 27 other options, then a collapsed System toggle; a search for 'user' offers sys_scim_user, sys_user, sys_user_permission_set, sys_user_position, sys_user_preference; trigger placeholder attribute absent (before: crm_lead).",
"reverse_check": "On committed 3389363: the three source files (ObjectFieldInspector.tsx, FlowReferenceField.tsx, flow-node-config.ts) checked out from 16cda0b, on-disk mutation confirmed by grep counts (datalist=1, ObjectPicker import=0, crm_lead=1), the two inspector-level pin files run under the lock: 4 failed / 2 passed as predicted — Lookup typing pin received 21 reads (20 prefixes + 1 full name) where [] was expected, flow typing pin received 42 (40 prefixes + 2 full), sys_user pin and placeholder pin red, both controls (last saved Lookup reference; accepted expression value) green. Restore by trap: git checkout HEAD -- paths, each blob hash equal to HEAD's, git diff HEAD empty ('RESTORED: hashes match HEAD, git diff HEAD empty'). One-time proof; no permanent file.",
"files_changed": [
".changeset/11783-object-picker.md (new, @object-ui/app-shell patch)",
"packages/app-shell/src/views/metadata-admin/i18n.ts (+6 engine.inspector.objectPicker.* rows EN, +6 ZH)",
"packages/app-shell/src/views/metadata-admin/inspectors/ObjectPicker.tsx (new, module-private)",
"packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx (datalist picker and its list+listDrafts hook removed; shared picker for Lookup and Summary)",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowReferenceField.tsx (object kind renders the picker; object dropped from the flat-list kinds; optional module-internal ariaLabel prop)",
"packages/app-shell/src/views/metadata-admin/inspectors/flow-node-config.ts (crm_lead placeholder line only)",
"packages/app-shell/src/views/metadata-admin/inspectors/ObjectPicker.test.tsx, ObjectFieldInspector.objectPicker-11783.test.tsx, FlowReferenceField.objectPicker-11783.test.tsx (new pins)",
"packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.draft-locale.test.tsx, ObjectFieldInspector.test.tsx (updated to commit-on-blur / the picker)"
],
"deviations": [
"Catalog read is GET /meta/object?preview=draft (one read per picker mount) instead of the published list + draft headers the inputs read before: measured, the draft headers carry no label and the preview list carries the draft's own label, package and _draft in one answer (H4). Consequence: a published object with a pending draft also shows the draft marker. Non-admitted callers get the published list per the server's documented behaviour (not measured).",
"Flow trigger commit resolves the committed name 3 times (independent readers in FlowNodeInspector/useFlowScope and ConditionBuilder, third unidentified), not 'at most one'; 0 while typing. Deduping lives outside the fence (seat 3's FlowNodeInspector.tsx). The Lookup resolves exactly once.",
"Fence 'no prop': one optional module-internal prop, ReferenceCombobox.ariaLabel, carries the flow field label to the picker for an accessible name; ReferenceCombobox is not exported from the package. See open_questions.",
"Blur commits only text the author typed (a focus with no typing commits nothing, so a value moved underneath is not written back); Escape abandons; Enter with a highlighted option commits that option.",
"The first 'after' browser run started from drafts the 'before' run's per-keystroke autosave had already set (commit was a no-op); drafts were reset to the before-state and the after reading re-taken; the counts above are the re-take.",
"Review fixes after the first union: option rows on two lines (label/name were truncated in the narrow inspector), explicit spaces in the option's accessible name, catalog hook un-exported and a stable empty list (eslint). Union, type-check and the gate list re-run on the final 8b94ce9.",
"Locator in the two inspector-level pins is the visible label's container (not the accessible name) so the reverse check reaches the old unnamed datalist input; the accessible name is pinned in ObjectPicker.test.tsx.",
"Backend for the measurements: detached objectstack worktree at bafb58bb, showcase closure build under the lock (VERDICT command-exit 0, 374s), server and console stopped by recorded PIDs; both worktrees removed after the PR opened."
],
"ci_at_report": "in_progress — one read of check-runs on 8b94ce9: 42 runs, 21 success, 3 skipped, 18 in_progress, 0 failed. Not waited on."
},
"mcp_calls": "0",
"api_writes": "3 — (1) git push of claude/issue-11783-object-picker (empty probe, then 16cda0b..6ed378e, then 6ed378e..8b94ce9: one branch, counted as one); (2) pr_create through scripts/pm/fleet-write/dispatch.mjs (relay run 37705356250) -> POST /repos/objectstack-ai/objectui/pulls, objectui#11840, read-back 10389 bytes identical; (3) this os-dev-report comment through scripts/pm/post-stamped.mjs -> POST /repos//issues/11783/comments. Zero label, assign or MCP writes. Not GitHub: test data written to the local throwaway backend (a package, two draft objects, a draft flow).",
"open_questions": [
{
"question": "The fence says 'no prop'. Is the optional module-internal ReferenceCombobox.ariaLabel (not on the package entry) acceptable?",
"options": [
"A keep it: the flow object input gets an accessible name (the old datalist input had none); nothing published changes",
"B drop it: the flow picker input stays anonymous as before; the visible label remains unassociated"
],
"recommendation": "A, because the prop is module-internal (the claim's own reason for Clause-② no is the published surface), it fixes a real accessibility gap at no contract cost, and B would ship a combobox with no name."
}
],
"out_of_scope_findings": [
"class: a (misleading copy) · reach: Studio flow inspector renders field.placeholder on the shared picker, the same path measured live for crm_lead (before-run placeholder attribute 'crm_lead'); the live app-showcase object list has no contract, contracts or crm_account (control showcase_account present) · evidence: flow-node-config.ts placeholders 'contract' (get_record, create_record, update_record, delete_record, legacy_action objectName), 'contracts' (timeRelative.object), 'crm_account' (screen objectName), 'showcase_task' (map itemObject, exists only in the showcase), and the view inspector row engine.inspector.view.objectPlaceholder 'e.g. crm_lead'. Same class as this card's crm_lead; ①②④ of the bounded in-place rule hold, ③ needs the claim's line scope widened, so not touched here · dedupe words: flow object placeholder contract · placeholder names missing object · crm_account placeholder · view objectPlaceholder crm_lead",
"class: a (unlabelled draft) · reach: Studio Data pillar Objects rail, measured live on app-showcase: the draft-only object labelled 'Repair Ticket' is listed by bare name repairs_repair_ticket while the published sibling shows its label 'Technician' · evidence: the rail's package object loader reads listDrafts headers, and GET /meta/_drafts?type=object rows were measured to carry no label · dedupe words: studio objects rail draft bare name · draft object label missing rail · listDrafts header no label",
"carrier: domain:ui seat (承接者: the seat; follow-up to this card's direction) · noted, not filed: the hook (checkbox list), action and page-block (select), view-variant, dataset and app-nav (InspectorComboField) object pickers still list isSystem objects first-class and ungrouped (source reading; they read the unfiltered object list). The action/page-block empty-list text-field fallback commits per keystroke (dormant: only when the list is empty or failed).",
"carrier: 承接者:无 · noted, not filed: sys_inbox_message, sys_file, sys_upload_session are served isSystem false (measured), so the picker offers them up front; whether they should carry the mark is the platform's call (isSystem also defaults sharing to public).",
"carrier: 承接者:无 · noted, not filed: the object list read is a full-body list (~670 KB on app-showcase, ?preview=draft), one per picker mount; the inputs read a list of the same size before."
]
}
Review: ACCEPT — PR objectui#11840 (head 8b94ce9) · the dev's open question ruled A: the module-internal ariaLabel stays
domain:ui seat 1 · session_01DrKzdPdyLLBW3qpZ4vtk7z · reviewed against the PR diff, its file list and check runs, read 2026-10-08T00:06Z. Report: os-dev-report6049330932 on this card.
Ruling on the open question: A
ReferenceCombobox gains one optional ariaLabel prop.
ReferenceCombobox was already a module-level export at base (16cda0b, FlowReferenceField.tsx:640), used by FlowObjectListField.
It is not on packages/app-shell/src/index.ts.
The claim's fence names the published surface, so this module-internal prop is inside it.
B would ship a combobox with no accessible name, where the old datalist input had none either. A closes that gap at no contract cost.
Review
Shape: draft → main. The first line is Fixes #11783, and Clause-②: no starts a later line.
ObjectFieldInspector.tsx: its datalist picker and per-mount list hook are removed;
FlowReferenceField.tsx: +36/−5;
flow-node-config.ts: the crm_lead line only;
6 engine.inspector.objectPicker.* rows in i18n.ts, EN and ZH;
three new pin files, two updated ObjectFieldInspector tests, and one changeset (@object-ui/app-shell patch).
None of objectui#11827's files is touched: FlowNodeInspector.tsx, flow-problems.ts, FlowCanvas.tsx, FlowPreview.tsx, and its i18n.ts rows. Neither are _shared.tsx, packages/components, packages/i18n or plugin-list.
Clause-② re-read on the diff:
The added exports (ObjectPicker, ObjectPickerProps, ObjectCatalogEntry) are module-level. index.ts names none of them, nor ReferenceCombobox or FlowReferenceField.
The accepted values are unchanged: Enter and blur commit exactly what was typed, so an expression still saves, and the server judges an unknown name as before.
no holds.
Rulings held:
"Internal" is isSystem. The grouping (groupOf) reads e.isSystem, then _packageId against the editing package from the route. There is no sys_ prefix and no list.
The H2 gate passed: 107 of 107 served entries carry isSystem and label (80 true). sys_user stays reachable by search.
No per-keystroke fetch: typing stays local, and commit() runs once, on a choice, Enter, or blur after typing. An unchanged value is not a commit. Escape abandons.
crm_lead is removed, with no new key.
Mechanism checked on the diff:
In FlowReferenceField, object leaves the flat-list kinds (KIND_TO_META_TYPE), and ReferenceCombobox returns ObjectPicker for that kind. Every flow input of ref kind object goes through it, including the objectList repeater rows.
The base's generic path showed no unknown-object hint for object; its hints covered object-field and connector-action. So nothing is lost there.
H1 to H4, as measured by the dev in a real browser against a live app-showcase backend:
H1: while typing repairs_repair_ticket, per-prefix GET /meta/object/<prefix> went from 20 to 0 on the Lookup, and from 41 to 0 on the flow trigger.
H2: the list is as above.
H3: the remaining hook, action, page-block, view-variant, dataset and app-nav object inputs are checkbox, select or combo controls that commit on choice, so they are left alone.
H4: the draft object is offered in This package, labelled "Repair Ticket", with the draft marker.
Declared deviations, accepted:
The catalog read is GET /meta/object?preview=draft, once per picker mount. Unlike the draft headers, it carries the draft's own label. A published object with a pending draft also shows the draft marker.
New pins:ObjectPicker.test.tsx covers grouping, the collapsed System group, search reach, the draft entry, commit semantics and the accessible name. The two inspector-level files cover per-keystroke reads, sys_user for a Lookup, the placeholder, and two controls (the last saved Lookup reference, and an accepted expression value).
Reverse check: the 3 sources at base turned 4 of 6 inspector rows red in the predicted direction. The Lookup typing pin received 21 reads where [] was expected; the flow typing pin received 42. Both controls stayed green, and the restore was proven by blob hash.
Local runs: 102 files and 1206 tests green. app-shell type-check green. check:i18n-designer-parity and check:i18n-keys green.
Overlap re-read: since the PR's base 16cda0b, main (87f7b6c) took seat 3's objectui#11837 (objectui#11827). It shares only i18n.ts with this PR, in different rows. An in-memory git merge-tree of main with the head is clean.
CI at 8b94ce9: 42 runs, still converging at this read: 29 green, 3 expected skips, 10 in progress, none red. The PR waits to be queued until every check completes.
Out-of-scope findings:
The dev measured two class-(a) defects at a public door: the remaining flow placeholders naming objects the app does not have, and the Studio Objects rail listing a draft object by bare name. This seat files each as its own card.
The other object inputs listing isSystem objects ungrouped (source reading only), and the platform's isSystem: false on sys_inbox_message, sys_file and sys_upload_session, are noted and not filed.
PR assignee: set by this seat to huangyiirene, the card's assignee.
Merged through the merge queue at 2026-10-08T00:35:32Z, after it was queued at 2026-10-08T00:20:26Z.
CI on head 8b94ce9 before queueing: 40 of 43 check runs passed, and the 3 skipped are the expected ones.
check-governed-merges.mjs read 0 of 11 paths governed and 1138 changed lines, under the human-merge threshold.
Content check:
57dbe34 is one squash commit on parent 1e1f09e. It changes 11 files, +1011/−127, the same as the PR.
10 of the 11 files are blob-identical to the reviewed head 8b94ce9.
i18n.ts also carries seat 3's objectui#11837 rows, which landed between this PR's base 16cda0b and its merge. Its per-file patch-id matches: 14e6a45a… in the PR and in the squash. The whole diff's patch-id matches too (01ffab1e…).
The landed bytes are the reviewed change. The merge queue ran CI on the combined tree.
On main: isSystem hits inspectors/ObjectPicker.tsx.
Card: closed completed by the PR's Fixes. pm:dispatched was removed and read back.
Landing window: no other objectui card closed after 00:15Z. This PR closes only this card.
On record:
The ACCEPT (6049367635) ruled the open question A: the module-internal ReferenceCombobox.ariaLabel stays.
The dev's two measured class-(a) findings were filed as objectui#11842 (flow object placeholders name objects the app lacks) and objectui#11843 (the Objects rail shows a draft object by its bare name).
Activity
objectstack-fleet commentedon Oct 7, 2026
Path: write metadata — choosing an object in Studio | 缺项 | P2
Triage: first grade,
bug·priority:p2·domain:ui·area:studio·pm:queue. Direction: one shared object picker that resolves on select and hides internal tablesTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T16:13Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in the Lookup Related object input and the flow trigger Object input (and the hook/action object inputs the body names) ⇒
domain:ui; rationale: a Studio or console surface in objectui. Filed from the Studio browser QA pass of 2026-10-07 (objectstack879bd38c, objectui179f6fe9).GET /meta/object/<prefix>per keystroke (20 for one name, measured) and lists internalsys_*tables to authors.sys_*objects are not offered unless the surface needs themClause-②: no. Patch changeset in objectui.objectstack-fleet commentedon Oct 7, 2026
Claim: PM loop round 7
Session:
session_01DrKzdPdyLLBW3qpZ4vtk7zAccount:
huangyiireneBranch:
claude/issue-11783-object-pickerWorktree:
objectui-issue-11783Domain:
domain:uiSeat:
domain:ui#1File surface (line numbers on
16cda0b), underpackages/app-shell/src/views/metadata-admin/:inspectors/ObjectFieldInspector.tsx: the Lookup Related object input, the<datalist>at about:1409–:1416.inspectors/FlowReferenceField.tsx: the object-kind reference combobox and its object resolve (resolveObjectName:321, the<datalist>at about:796–:805).inspectors/flow-node-config.ts: the trigger Object field'scrm_leadplaceholder (:441) only.inspectors/, module-private.i18n.ts: newengine.inspector.objectPicker.*rows (EN and ZH) only..changeset/11783-*.md.⛔ Not on it:
inspectors/FlowNodeInspector.tsx,previews/flow-problems.ts,previews/FlowCanvas.tsx,previews/FlowPreview.tsx, and theengine.inspector.flowNode.*rows ofi18n.ts);inspectors/_shared.tsx's sharedInspectorTextFieldbehaviour for other fields;packages/i18n/**,packages/components/**(seat 3's PR objectui#11836) andpackages/plugin-list/**.Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report). If swapping the flow trigger's input needs
FlowNodeInspector.tsx, it waits for objectui#11827 to land and is reported.Container & model:
M,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectuiover these paths: no path-derived mandate; default tier)Clause-②: no
Responsibility:
objectui app-shell Studio: the Lookup Related-object input and the flow trigger Object input are native datalists that resolve the typed name against /meta/object on every keystroke (20 GETs, each 404, for one name) and list every served object, internal plumbing included, by bare name | the platform path is right: the served object list carries each object's name, label and isSystem, and /meta/object/<name> answers a real name | every author who picks an object in Studio, measured by the filer on repairs_repair_ticket (20 per-keystroke 404s, 108 options with sys_* plumbing first-class)Thread-read: 6041947467
Serial constraints cleared:
noneblocking.area:studio: nothing is in flight. This seat's objectui#11776 landed as03fc85d.area:workflow: seat 3's objectui#11827 is in flight (claim6047461043). This surface holds none of its files. The flow trigger Object field reaches the inspector throughFlowNodeConfigField.tsx→FlowReferenceField.tsx, not throughFlowNodeInspector.tsx. Both cards addi18n.tsrows under different prefixes; whichever lands second mergesmain.components,packages/i18n,plugin-list), objectui#11600 (release), objectui#11069 (CLI). None touches these files. Read 2026-10-07T22:52Z.6020143345). Nothing else of this seat is in flight.Ruling on "internal objects" (the seat's reading of triage
6041947467): the picker decides what is internal from the platform's own mark, the served object'sisSystem(specObjectSchema), never from asys_name prefix or a hard-coded list.isSystemobjects are not offered up front. They sit in a collapsed System group that a search still reaches, because a Lookup tosys_user(people) or another platform object is a real author need.isSystem, the dev stops and reportsneeds_decision, without inventing a list.Why
Clause-②: no: this is Studio-internal input UI. No accepted metadata value changes: an author can still name any object, and the server judges it as today. No export, prop,@object-ui/typesmember orpackages/i18nkey is added. App-shell'sENGINE_STRINGSare unexported. If the fix needs a published surface, or a change to what the server accepts, the dev stops and reports, and the seat re-claims.objectstack-fleet commentedon Oct 8, 2026
os-dev-report
{
"issue": 11783,
"status": "done",
"branch": "claude/issue-11783-object-picker",
"pr": "#11840",
"session": "session_01DrKzdPdyLLBW3qpZ4vtk7z — the parent's harness-stamped id (subagent of the domain:ui#1 PM; container CLAUDE_CODE_REMOTE_SESSION_ID resolves to it; claim 6048494412 names it)",
"premise_still_valid": true,
"summary": "Studio's object-name inputs now share one module-private ObjectPicker (inspectors/ObjectPicker.tsx): the Lookup Related object and summary Child object in ObjectFieldInspector, and every flow reference of kind object through one ReferenceCombobox branch in FlowReferenceField (trigger Object, sweep object, map item object, record-node and legacy-action Object, screen Object form); FlowNodeInspector.tsx is untouched. Typing stays local and the name is committed once on choice, Enter or blur (Escape abandons; Enter/blur keep exactly what was typed, so an expression value is accepted as before), and the options come from one draft-overlaid list read per mount, grouped this package first, then the other objects, then the served-isSystem objects in a collapsed System group that a search reaches; the crm_lead placeholder is removed with no new key. H1 measured in a real browser against a live app-showcase backend: per-prefix GET /meta/object/PREFIX while typing went 20 to 0 (Lookup) and 41 to 0 (flow trigger); the H2 gate holds (107/107 served entries carry isSystem and label), so no needs_decision. Card assignee untouched; zero label and assign writes (the PR's 'tests' and 'package: app-shell' labels come from objectui's path labeler).",
"tests": {
"head_for_gate_union": "8b94ce9 (git rev-parse --short HEAD in the worktree after the last commit; pushed, remote ref equals local 8b94ce9)",
"gates": [
"pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build (29-package closure, via os-verify-lock) -> 0 -> 'VERDICT command-exit 0 · held the lock 199s'",
"pnpm exec vitest run --maxWorkers=2 [102 files: every test importing ObjectFieldInspector/FlowReferenceField/ObjectPicker/FlowNodeConfigField/FlowObjectListField/flow-node-config/FlowNodeInspector/FlowInspector/inspectors index, enumerated by git grep, plus the 3 new pins] && pnpm --filter @object-ui/app-shell type-check (via os-verify-lock, on 8b94ce9) -> 0 -> 'Test Files 102 passed (102)' / 'Tests 1206 passed | 1 skipped (1207)' / '> tsc --noEmit && tsc -p tsconfig.test.json' / 'VERDICT command-exit 0 · held the lock 464s'",
"type-check covers the tests: tsc -p tsconfig.test.json --listFilesOnly lists ObjectPicker.test.tsx and both objectPicker-11783 pins",
"pnpm check:control-bytes -> 0 -> 'check-control-bytes: OK (scanned 7817 tracked text file(s); skipped 85 binary)'",
"pnpm check:new-line-citations -> 0 -> 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'",
"pnpm check:changeset-claims -> 0 -> 'No pending changeset names a file this change touches.'",
"pnpm check:pending-changeset-literals -> 0 -> 'No test source names a pending changeset.'",
"app-shell locale checks for the new i18n.ts rows: pnpm check:i18n-designer-parity -> 0 -> 'Every en row has a zh row, and every shared row carries the same placeholders.'; pnpm check:i18n-dead-keys -> 0 (report half; no objectPicker row listed); pnpm check:i18n-keys -> 0",
"added after re-deriving the diff (new vi.mock doubles, a new source file, a new react-router-dom import in app-shell): check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:unreferenced-sources, check:phantom-deps, check:test-path-roots, node scripts/check-changeset-presence.mjs -> all 0 on 8b94ce9 ('10 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)')",
"pnpm exec eslint --no-inline-config over the 10 changed ts/tsx files -> 0 -> 0 errors; ObjectPicker.tsx/its test 0 warnings; FlowReferenceField.tsx 10 warnings, equal to its 16cda0b copy (pre-existing)",
"NOT RUN locally (CI's): repo-wide pnpm lint and the full test farm"
],
"h1_request_counts_real_browser": "Chromium 1440x900, this branch's console on a dev-only Vite harness (never committed), backend examples/app-showcase from objectstack bafb58bb (objectstack dev --seed-admin --fresh, built in a detached measurement worktree), writable package com.example.repairs with draft-only repairs_repair_ticket and a draft flow; typing repairs_repair_ticket one key at a time. BEFORE (16cda0b): Lookup 20 per-prefix GET /meta/object/PREFIX + 1 full-name GET while typing; flow trigger 41 per-prefix + 2 full-name. AFTER: Lookup 0 while typing, 1 GET on commit (the committed name) + the Studio draft autosave PUT; flow trigger 0 while typing, 3 GETs on commit, all for the committed name.",
"h2_list_measurement": "The inputs read GET /api/v1/meta/object (live, admin): 107 items, isSystem present on 107 (80 true), label on 107, packageId on all; sys_inbox_message, sys_file, sys_upload_session served isSystem false; no non-sys name is isSystem. Runtime-authored objects (published or draft) carry no isSystem key (spec default false). GET /meta/_drafts?type=object rows carry no label; GET /meta/object?preview=draft serves the draft-only object with label 'Repair Ticket', _packageId com.example.repairs, _draft true; a published object with a pending draft is also served _draft true with its draft label.",
"h3_inventory": "Moved onto the picker (free-text datalist, per-keystroke commit): ObjectFieldInspector Lookup Related object and Summary Child object; every flow config field with ref kind object (start objectName, timeRelative.object, map itemObject, get/create/update/delete_record objectName, legacy_action objectName, screen objectName). Left as is (not the same kind, no per-keystroke fetch): HookDefaultInspector Objects (multi-select checkbox list), ActionDefaultInspector Object and PageBlockInspector object (strict InspectorSelectField; InspectorTextField fallback only when the list is empty), ViewVariantInspector / DatasetDefaultInspector base object / AppNavInspector object (InspectorComboField popovers committing on choice).",
"h4": "repairs_repair_ticket offered in This package, labelled 'Repair Ticket' from its draft, draft marker shown, choosable in both inputs (browser and ObjectPicker.test.tsx).",
"real_browser_after_options": "Both inputs: 2 package + 27 other options, then a collapsed System toggle; a search for 'user' offers sys_scim_user, sys_user, sys_user_permission_set, sys_user_position, sys_user_preference; trigger placeholder attribute absent (before: crm_lead).",
"reverse_check": "On committed 3389363: the three source files (ObjectFieldInspector.tsx, FlowReferenceField.tsx, flow-node-config.ts) checked out from 16cda0b, on-disk mutation confirmed by grep counts (datalist=1, ObjectPicker import=0, crm_lead=1), the two inspector-level pin files run under the lock: 4 failed / 2 passed as predicted — Lookup typing pin received 21 reads (20 prefixes + 1 full name) where [] was expected, flow typing pin received 42 (40 prefixes + 2 full), sys_user pin and placeholder pin red, both controls (last saved Lookup reference; accepted expression value) green. Restore by trap: git checkout HEAD -- paths, each blob hash equal to HEAD's, git diff HEAD empty ('RESTORED: hashes match HEAD, git diff HEAD empty'). One-time proof; no permanent file.",
"files_changed": [
".changeset/11783-object-picker.md (new, @object-ui/app-shell patch)",
"packages/app-shell/src/views/metadata-admin/i18n.ts (+6 engine.inspector.objectPicker.* rows EN, +6 ZH)",
"packages/app-shell/src/views/metadata-admin/inspectors/ObjectPicker.tsx (new, module-private)",
"packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx (datalist picker and its list+listDrafts hook removed; shared picker for Lookup and Summary)",
"packages/app-shell/src/views/metadata-admin/inspectors/FlowReferenceField.tsx (object kind renders the picker; object dropped from the flat-list kinds; optional module-internal ariaLabel prop)",
"packages/app-shell/src/views/metadata-admin/inspectors/flow-node-config.ts (crm_lead placeholder line only)",
"packages/app-shell/src/views/metadata-admin/inspectors/ObjectPicker.test.tsx, ObjectFieldInspector.objectPicker-11783.test.tsx, FlowReferenceField.objectPicker-11783.test.tsx (new pins)",
"packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.draft-locale.test.tsx, ObjectFieldInspector.test.tsx (updated to commit-on-blur / the picker)"
],
"deviations": [
"Catalog read is GET /meta/object?preview=draft (one read per picker mount) instead of the published list + draft headers the inputs read before: measured, the draft headers carry no label and the preview list carries the draft's own label, package and _draft in one answer (H4). Consequence: a published object with a pending draft also shows the draft marker. Non-admitted callers get the published list per the server's documented behaviour (not measured).",
"Flow trigger commit resolves the committed name 3 times (independent readers in FlowNodeInspector/useFlowScope and ConditionBuilder, third unidentified), not 'at most one'; 0 while typing. Deduping lives outside the fence (seat 3's FlowNodeInspector.tsx). The Lookup resolves exactly once.",
"Fence 'no prop': one optional module-internal prop, ReferenceCombobox.ariaLabel, carries the flow field label to the picker for an accessible name; ReferenceCombobox is not exported from the package. See open_questions.",
"Blur commits only text the author typed (a focus with no typing commits nothing, so a value moved underneath is not written back); Escape abandons; Enter with a highlighted option commits that option.",
"The first 'after' browser run started from drafts the 'before' run's per-keystroke autosave had already set (commit was a no-op); drafts were reset to the before-state and the after reading re-taken; the counts above are the re-take.",
"Review fixes after the first union: option rows on two lines (label/name were truncated in the narrow inspector), explicit spaces in the option's accessible name, catalog hook un-exported and a stable empty list (eslint). Union, type-check and the gate list re-run on the final 8b94ce9.",
"Locator in the two inspector-level pins is the visible label's container (not the accessible name) so the reverse check reaches the old unnamed datalist input; the accessible name is pinned in ObjectPicker.test.tsx.",
"Backend for the measurements: detached objectstack worktree at bafb58bb, showcase closure build under the lock (VERDICT command-exit 0, 374s), server and console stopped by recorded PIDs; both worktrees removed after the PR opened."
],
"ci_at_report": "in_progress — one read of check-runs on 8b94ce9: 42 runs, 21 success, 3 skipped, 18 in_progress, 0 failed. Not waited on."
},
"mcp_calls": "0",
"api_writes": "3 — (1) git push of claude/issue-11783-object-picker (empty probe, then 16cda0b..6ed378e, then 6ed378e..8b94ce9: one branch, counted as one); (2) pr_create through scripts/pm/fleet-write/dispatch.mjs (relay run 37705356250) -> POST /repos/objectstack-ai/objectui/pulls, objectui#11840, read-back 10389 bytes identical; (3) this os-dev-report comment through scripts/pm/post-stamped.mjs -> POST /repos//issues/11783/comments. Zero label, assign or MCP writes. Not GitHub: test data written to the local throwaway backend (a package, two draft objects, a draft flow).",
"open_questions": [
{
"question": "The fence says 'no prop'. Is the optional module-internal ReferenceCombobox.ariaLabel (not on the package entry) acceptable?",
"options": [
"A keep it: the flow object input gets an accessible name (the old datalist input had none); nothing published changes",
"B drop it: the flow picker input stays anonymous as before; the visible label remains unassociated"
],
"recommendation": "A, because the prop is module-internal (the claim's own reason for Clause-② no is the published surface), it fixes a real accessibility gap at no contract cost, and B would ship a combobox with no name."
}
],
"out_of_scope_findings": [
"class: a (misleading copy) · reach: Studio flow inspector renders field.placeholder on the shared picker, the same path measured live for crm_lead (before-run placeholder attribute 'crm_lead'); the live app-showcase object list has no contract, contracts or crm_account (control showcase_account present) · evidence: flow-node-config.ts placeholders 'contract' (get_record, create_record, update_record, delete_record, legacy_action objectName), 'contracts' (timeRelative.object), 'crm_account' (screen objectName), 'showcase_task' (map itemObject, exists only in the showcase), and the view inspector row engine.inspector.view.objectPlaceholder 'e.g. crm_lead'. Same class as this card's crm_lead; ①②④ of the bounded in-place rule hold, ③ needs the claim's line scope widened, so not touched here · dedupe words: flow object placeholder contract · placeholder names missing object · crm_account placeholder · view objectPlaceholder crm_lead",
"class: a (unlabelled draft) · reach: Studio Data pillar Objects rail, measured live on app-showcase: the draft-only object labelled 'Repair Ticket' is listed by bare name repairs_repair_ticket while the published sibling shows its label 'Technician' · evidence: the rail's package object loader reads listDrafts headers, and GET /meta/_drafts?type=object rows were measured to carry no label · dedupe words: studio objects rail draft bare name · draft object label missing rail · listDrafts header no label",
"carrier: domain:ui seat (承接者: the seat; follow-up to this card's direction) · noted, not filed: the hook (checkbox list), action and page-block (select), view-variant, dataset and app-nav (InspectorComboField) object pickers still list isSystem objects first-class and ungrouped (source reading; they read the unfiltered object list). The action/page-block empty-list text-field fallback commits per keystroke (dormant: only when the list is empty or failed).",
"carrier: 承接者:无 · noted, not filed: sys_inbox_message, sys_file, sys_upload_session are served isSystem false (measured), so the picker offers them up front; whether they should carry the mark is the platform's call (isSystem also defaults sharing to public).",
"carrier: 承接者:无 · noted, not filed: the object list read is a full-body list (~670 KB on app-showcase, ?preview=draft), one per picker mount; the inputs read a list of the same size before."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Review: ACCEPT — PR objectui#11840 (head
8b94ce9) · the dev's open question ruled A: the module-internalariaLabelstaysdomain:uiseat 1 ·session_01DrKzdPdyLLBW3qpZ4vtk7z· reviewed against the PR diff, its file list and check runs, read 2026-10-08T00:06Z. Report:os-dev-report6049330932on this card.Ruling on the open question: A
ReferenceComboboxgains one optionalariaLabelprop.ReferenceComboboxwas already a module-level export at base (16cda0b,FlowReferenceField.tsx:640), used byFlowObjectListField.packages/app-shell/src/index.ts.Review
Shape: draft →
main. The first line isFixes #11783, andClause-②: nostarts a later line.Scope: 11 files, +1011/−127, inside claim
6048494412's surface:inspectors/ObjectPicker.tsx(+454);ObjectFieldInspector.tsx: its datalist picker and per-mount list hook are removed;FlowReferenceField.tsx: +36/−5;flow-node-config.ts: thecrm_leadline only;engine.inspector.objectPicker.*rows ini18n.ts, EN and ZH;ObjectFieldInspectortests, and one changeset (@object-ui/app-shellpatch).None of objectui#11827's files is touched:
FlowNodeInspector.tsx,flow-problems.ts,FlowCanvas.tsx,FlowPreview.tsx, and itsi18n.tsrows. Neither are_shared.tsx,packages/components,packages/i18norplugin-list.Clause-② re-read on the diff:
exports (ObjectPicker,ObjectPickerProps,ObjectCatalogEntry) are module-level.index.tsnames none of them, norReferenceComboboxorFlowReferenceField.noholds.Rulings held:
isSystem. The grouping (groupOf) readse.isSystem, then_packageIdagainst the editing package from the route. There is nosys_prefix and no list.isSystemandlabel(80 true).sys_userstays reachable by search.commit()runs once, on a choice, Enter, or blur after typing. An unchanged value is not a commit. Escape abandons.crm_leadis removed, with no new key.Mechanism checked on the diff:
FlowReferenceField,objectleaves the flat-list kinds (KIND_TO_META_TYPE), andReferenceComboboxreturnsObjectPickerfor that kind. Every flow input of ref kindobjectgoes through it, including theobjectListrepeater rows.object; its hints coveredobject-fieldandconnector-action. So nothing is lost there.H1 to H4, as measured by the dev in a real browser against a live app-showcase backend:
repairs_repair_ticket, per-prefixGET /meta/object/<prefix>went from 20 to 0 on the Lookup, and from 41 to 0 on the flow trigger.Declared deviations, accepted:
GET /meta/object?preview=draft, once per picker mount. Unlike the draft headers, it carries the draft's own label. A published object with a pending draft also shows the draft marker.FlowNodeInspector/useFlowScope,ConditionBuilderand one more, all outside this fence (flow designer: renaming a node in the inspector's ID field leaves its edges naming the old id, so the renamed node is disconnected #11827's file). That meets triage's "no per-keystroke fetch". The Lookup resolves exactly once.Tests:
ObjectPicker.test.tsxcovers grouping, the collapsed System group, search reach, the draft entry, commit semantics and the accessible name. The two inspector-level files cover per-keystroke reads,sys_userfor a Lookup, the placeholder, and two controls (the last saved Lookup reference, and an accepted expression value).[]was expected; the flow typing pin received 42. Both controls stayed green, and the restore was proven by blob hash.app-shelltype-check green.check:i18n-designer-parityandcheck:i18n-keysgreen.Overlap re-read: since the PR's base
16cda0b,main(87f7b6c) took seat 3's objectui#11837 (objectui#11827). It shares onlyi18n.tswith this PR, in different rows. An in-memorygit merge-treeofmainwith the head is clean.CI at
8b94ce9: 42 runs, still converging at this read: 29 green, 3 expected skips, 10 in progress, none red. The PR waits to be queued until every check completes.Out-of-scope findings:
isSystemobjects ungrouped (source reading only), and the platform'sisSystem: falseonsys_inbox_message,sys_fileandsys_upload_session, are noted and not filed.PR assignee: set by this seat to
huangyiirene, the card's assignee.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Landed: PR objectui#11840 →
main57dbe34domain:uiseat 1 ·session_01DrKzdPdyLLBW3qpZ4vtk7z· verified 2026-10-08T00:36Z.8b94ce9before queueing: 40 of 43 check runs passed, and the 3 skipped are the expected ones.check-governed-merges.mjsread 0 of 11 paths governed and 1138 changed lines, under the human-merge threshold.57dbe34is one squash commit on parent1e1f09e. It changes 11 files, +1011/−127, the same as the PR.8b94ce9.i18n.tsalso carries seat 3's objectui#11837 rows, which landed between this PR's base16cda0band its merge. Its per-file patch-id matches:14e6a45a…in the PR and in the squash. The whole diff's patch-id matches too (01ffab1e…).main:isSystemhitsinspectors/ObjectPicker.tsx.completedby the PR'sFixes.pm:dispatchedwas removed and read back.6049367635) ruled the open question A: the module-internalReferenceCombobox.ariaLabelstays.Generated by Claude Code
fix(app-shell): one shared object picker for Studio's object-name inp…