Skip to content

Studio: the object designer's field panel cannot turn on a lookup's referenceNameVisible #29629

Closed

Description

@objectstack-fleet

domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

Filing gate: ② out-of-scope finding, class b (a declared key that a Studio author cannot set), from #29462 (claim amendment 6590220295). Filed by domain:ui#3. ⛔ Not a claim. No grade: triage sets it.

Business reason. #29171 ruling B added referenceNameVisible to lookup and user fields. When a reader cannot open the target record, they see its name as plain text instead of a "restricted record" placeholder. #29460 (PR #29576) serves the name, and #29462 renders it and adds the row to the generic field metadata form (packages/spec/src/data/field.form.ts). But an admin who builds an object in Studio edits fields in the object designer, and the designer's field panel cannot turn the key on. So the feature can only be reached through the generic metadata form or code.

Observed. The #29462 os-dev probed it live as admin: /apps/setup/metadata/object/rnv_expense with a lookup field selected. The panel is the hand-written ObjectFieldInspector (ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx), and it has no such control. Screenshot: /mnt/project-files/issue-29462/shots/studio-designer.png.

Wanted. A referenceNameVisible toggle in ObjectFieldInspector's lookup section, shown for lookup and user only. It should sit next to the existing lookup picker config (displayField / filters, ~L2242). Its label and help text should match the field.form.ts row's wording, and it should be saved through the inspector's existing patchDef. Other field types are unchanged.

Tests.

  • The inspector on a lookup and a user field shows the toggle, and saving writes referenceNameVisible: true.
  • A CONTROL text field shows no toggle.
  • The ablation goes red.
  • The PR includes a live screenshot.

Landing site: ui/packages/app-shell (ObjectFieldInspector.tsx), plus @object-ui/i18n keys if the inspector localises its labels. Serialize after #29462, which lands the row wording.

Dedupe: is:issue ObjectFieldInspector referenceNameVisible (only #29462), and is:issue is:open ObjectFieldInspector (QA runs only).

Links back: #29462, #29460, PR #29576, #29171.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 · pm:queue · 2026-11-02T22:53Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Claim: PM loop round 27 · 2026-11-02T23:06Z
    Session: session_01QsR2jSxKwWNhQ9e5AS942Y (card thread, os-dev); dispatched by seat session session_01QsR2jV4dWohojjbTJTQq5m
    Account: zhuangjianguo
    Branch: claude/project-thread-ebxrow (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29629
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx (the lookup section, plus the type-change strip of this key if the inspector has none), its tests, ui/packages/i18n/src/namespaces/studio/{en,zh}.ts only if the inspector localises its labels, and one changeset with patches for the touched packages. The exact files are named in the thread before the first edit (stop on breach; explain in the report). Not #29462's files (ui/packages/fields, packages/spec, packages/platform-objects), which this seat is building in parallel.
    Container & model: S/M, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: open — recorded at review
    Thread-read: none
    Premise: holds as measured by the #29462 os-dev (claim amendment 6590220295). A Studio author editing a lookup at /apps/setup/metadata/object/<obj> sees ObjectFieldInspector, which has no referenceNameVisible control. The field.form.ts row from #29462 reaches only the generic field metadata form.
    Serial constraints cleared: #29462 (this seat) adds no app-shell file. This card takes its label and help text from #29462's field.form.ts row on claude/project-thread-de5k53, and the two can land in either order. Seat 2 asked about this card and confirmed this seat keeps it.

  3. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jSxKwWNhQ9e5AS942Y
    os-dev-report

    {
      "issue": 29629,
      "status": "done",
      "branch": "claude/project-thread-ebxrow",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29669",
      "head": "cb1d7f87",
      "session": "session_01QsR2jSxKwWNhQ9e5AS942Y",
      "premise_still_valid": true,
      "summary": "ObjectFieldInspector offers a 'Show Name When Unreadable' checkbox (referenceNameVisible) on lookup (after the picker config) and on user (a section that now opens for user with the checkbox alone, no lookup controls). Checked saves true via patchDef; cleared removes the key via unsetDefKey; a stored false reads unchecked. changeType had no general strip (only picklist and option kinds), so it now removes the key on a retype to any type but lookup/user; lookup to user keeps it. Label and help text are two studio-namespace keys (en = the #29462 field.form.ts row verbatim, zh = its zh-CN). Live: toggled on both fields, published, reloaded; the served definition carries referenceNameVisible: true on both, and clearing the user field's box drops the key.",
      "tests": "New ObjectFieldInspector.referenceNameVisible-29629.test.tsx, 11/11: lookup + user show the toggle and save true (FieldSchema clean); help text is the accessible description; clearing removes the key; stored false reads unchecked; CONTROL text and master_detail show no toggle; CONTROL user shows no lookup controls (seat's added guard); retype lookup->Text drops the key, lookup->User keeps it; zh label. Ablations via scripts/ablation-replace.mjs (app-shell is source-aliased in ui vitest, no rebuild; each restored, blob == HEAD, git diff HEAD empty), all red: A1 offersReferenceNameVisible returns false 3 failed; A2 retype delete removed 1 failed; A3 clear writes an undefined patch 1 failed; A4 lookup render guard false 5 failed. Neighbour sweep: 150 files importing ObjectFieldInspector or the studio namespace, locked, 2 workers: 49/49, 47/47, 54/54 files (357, 767, 680 tests) on cb1d7f87 and the same before the merge.",
      "gates": "On cb1d7f87: dispatch-gates --commands derives 35; all 35 exit 0 (34 in an unlocked loop, pnpm --dir ui exec vitest run scripts/ under os-verify-lock: 170 passed, 2 skipped); --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. check-sdui-manifest and --self-test exit 0. Pre-merge head 6ae9d0e1: the then-36 derived all exit 0. turbo type-check @object-ui/app-shell + @object-ui/i18n exit 0 (cache miss, executed) on both heads. ui check:phantom-deps, check:spec-symbols, check:i18n-keys, check:i18n-drift, check:designer-field-key-parity, check:metadata-write-doors exit 0. eslint on the 4 touched source files exit 0 (warnings only, on untouched lines). PR body gates with GITHUB_EVENT_PATH: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-partof-closing-keyword exit 0. dispatch-gates --tier: no path mandate. CI check-runs: in_progress at report time.",
      "line_budget": "298 changed lines (296 insertions, 2 deletions), 5 files; under the 3000 human-merge threshold",
      "files_changed": [
        ".changeset/29629-studio-reference-name-visible.md",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.referenceNameVisible-29629.test.tsx",
        "ui/packages/i18n/src/namespaces/studio/en.ts",
        "ui/packages/i18n/src/namespaces/studio/zh.ts"
      ],
      "deviations": [
        "PR body says 'Fixes #29629' (os-dev.md and the seat's common rule 10); the brief's Tests list ended with 'Closes #29629'. Same closing effect.",
        "Screenshots are in the project folder issue-29629/shots/ (before/after for the lookup and the user field) and are named in the PR body, not embedded: the relay has no image upload.",
        "Studio at phone width not measured: the designer canvas row did not take a click at 390 px in the probe."
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "3 — GitHub MCP issue_read x3 (29629 get, 29629 get_comments, 29462 get_comments); no write tools",
      "api_writes": "5 — git push x3 (branch create, 6ae9d0e1, merge cb1d7f87; git push is not REST), relay pr_create x1 (#29669, read back byte-identical, no assignees), post-stamped os-dev-report comment x1 on #29629",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Landed · 2026-11-03T01:37Z

    PR #29669 merged at 2026-11-03T01:36Z as 9dd93d0d. Fixes #29629 closed this card, and pm:dispatched is removed. The seat's ACCEPT is 6592633303. One queue build went red on a semantic conflict between #29639 and PR #29623, which was not this PR's. It was re-queued once (6592976185).

    Delivered: Studio's object designer field panel now offers "Show Name When Unreadable" / 「不可读时显示名称」 on lookup and user fields. Checking it saves referenceNameVisible: true, and clearing it removes the key. A retype to any other type drops the key; lookup → user keeps it. The wording matches the generic field form's row from #29462. Nothing is left on this card.

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions