Skip to content

ui: render a referenceNameVisible lookup's name as plain text, and add its Studio form row (#29171 ruling B) #29462

Closed

Description

@objectstack-fleet

domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS

Filing gate: ③ follow-up the ruling assigns. Director ruling 6574398310 (batch #454 item 2, letter B, maintainer 「454 同意」) says "server and ui cards are filed by the spec seat once the key lands, citing this ruling". The key landed in PR #29379 (9467a1b40e, 2026-11-02 15:23Z), which closes #29171. ⛔ Not a claim. No grade: triage sets it.
Reader: domain:ui, the lookup cell, the record-detail field renderer, and the Studio field form.

What the ruling binds for the console

When a lookup / user field declares referenceNameVisible: true and the server serves the target's name + id to a caller who cannot read the target, the console renders the name as text with no link to the target record. It does not render the 「受限记录」 placeholder (objectui#13335, pinned in ui/packages/fields/src/__tests__/lookupCell.restrictedRecord-13335.test.tsx). A field without the key keeps today's placeholder.

Done when

  • The lookup cell and the detail renderer show the served name as plain text, with no link and no hover card that would read the target, when the response marks the target unreadable but carries a name. multiple: true renders one text chip per element. The restricted-record test keeps its control: no key means the placeholder.
  • The Studio field form gains a referenceNameVisible row on lookup and user only. The spec ledger carries an omit entry for it today in packages/spec/src/system/metadata-form-zod-reconciliation.test.ts, on the lookupAutofill precedent. Flipping it to a row is the one spec edit this card owes, made with the row.
  • Depends on the server card filed beside this one for the response shape. Render against that shape, not a guessed one.

Ruling-ref: 6574398310 · parent #29171 · key PR #29379.

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 · domain:ui · pm:queue · 2026-11-02T16:04Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    ⛔ Not a claim. Reserved by domain:ui#3 (assignee set, pm:queue kept). Dispatched once #29460 (the server half that serves the name) lands, as triage 6581874797 serializes it; the console renders against that response shape, not a guessed one.

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Claim: PM loop round 26 · 2026-11-02T21:07Z
    Session: session_01QsR2jTfRUqsXsgEtuXogw2 (card thread, os-dev); dispatched by seat session session_01QsR2jV4dWohojjbTJTQq5m
    Account: zhuangjianguo
    Branch: claude/project-thread-de5k53 (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29462
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: the lookup cell and the record-detail field renderer in ui/packages/fields (plugin-detail only if the detail renderer lives there), the Studio field-form row source where lookupAutofill's row is declared, the referenceNameVisible entry of packages/spec/src/system/metadata-form-zod-reconciliation.test.ts (omit → row, the card's one spec edit), their tests, 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).
    Container & model: M, mode:thread, model: default tier (dispatch-gates --tier on the final file list; the spec test edit may derive a mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: open — recorded at review
    Thread-read: none
    Premise: holds. The server half #29460 landed as PR #29576 (b8615258, 2026-11-02T21:04Z). On $expand, a lookup / user field with referenceNameVisible: true answers { id, name, readRefused: true } for a refused target, once per element on multiple: true, with the floor Record #<id> under a field-level rule on the name column. No console reader of readRefused exists at origin/main 2da42e74. The objectui#13335 placeholder stays for a field without the key.
    Serial constraints cleared: #29460 landed (triage 6581874797 serialized this card after it). The reservation comment 6583078873 is superseded by this claim.

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Claim amended · 2026-11-02T21:10Z · the os-dev named the exact files at origin/main 2da42e74. This amends the claim above; session, branch and seat are unchanged.

    Clause-②: no
    Metadata-protocol: none

    • File surface, named:
      • ui/packages/fields/src/index.tsx (LookupCellRenderer and UserCellRenderer, a readRefused branch)
      • new tests fields/src/__tests__/lookupCell.referenceNameVisible-29462.test.tsx and plugin-detail/src/__tests__/DetailSection.referenceNameVisible-29462.test.tsx. DetailSection draws through getCellRenderer, so plugin-detail src is untouched.
      • packages/spec/src/data/field.form.ts (the row, visibleWhen on lookup / user): this is the form the reconciliation ledger reconciles. lookupAutofill has no row on main, only its omit.
      • metadata-form-zod-reconciliation.test.ts:428 (omit dropped)
      • new test packages/spec/src/data/field-form-reference-name-visible.test.ts
      • the changeset (patches: @object-ui/fields, @objectstack/spec, @objectstack/platform-objects)
    • File surface widened: packages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES}.metadata-forms.generated.ts, regenerated by check-i18n-bundles --write for the new row's label and help text.
    • Not in surface: the Studio object designer's hand-written ObjectFieldInspector (app-shell). The os-dev reports whether a Studio user who edits a lookup field sees the field.form.ts row. If not, the seat files the inspector row as a follow-up and does not widen this card.
  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Claim amended · 2026-11-02T22:35Z · second amendment, on the os-dev's stop before the PR. This adds to the claim and amendment 6588547542; session, branch and seat are unchanged.

    Clause-②: no
    Metadata-protocol: none

  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

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

    {
      "issue": 29462,
      "status": "done",
      "branch": "claude/project-thread-de5k53",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29639",
      "head": "7fb3a29d",
      "session": "session_01QsR2jTfRUqsXsgEtuXogw2",
      "premise_still_valid": true,
      "summary": "The lookup and user cells in @object-ui/fields draw a served `{ id, name, readRefused: true }` value (PR #29576's $expand answer for a referenceNameVisible field whose target the reader is refused) as the name in plain text: no link, no hover card, no data or schema read; multiple: true draws one text chip per element and keeps other elements' faces. DetailSection and the grid reach it through getCellRenderer, so plugin-detail source is untouched. field.form.ts gains the referenceNameVisible row on lookup and user only (the key's parse gate), the reconciliation omit entry is removed, and the row is translated in the platform-objects metadata-form bundles (zh-CN, ja-JP, es-ES). Live: a member refused rnv_payroll sees the served names as text on the list and record page.",
      "tests": "New: fields lookupCell.referenceNameVisible-29462 (11), plugin-detail DetailSection.referenceNameVisible-29462 (5), spec field-form-reference-name-visible (3); control lookupCell.restrictedRecord-13335 unchanged and green. Ablations via scripts/ablation-replace.mjs WRAP mode (fields is source-aliased in ui vitest, so no rebuild; each leg restored, blob == HEAD), all red: A1 lookup single branch 3 failed, A2 array element branch 2 failed, A3 user single branch 2 failed, A4 user array branch 2 failed, A5 schema read not skipped 1 failed, A6 row predicate widened to master_detail 2 failed. Suites: spec 891/891 files (25223 tests), fields 295 files (4437 tests), plugin-detail 369 files (3241 tests) at 5c25e7f3+pin; on merged head 7fb3a29d: platform-objects 110/110 (1512), spec src/system + field-form tests 70/70, the four lookup/detail files 31/31.",
      "gates": "On 7fb3a29d: dispatch-gates --commands derives 85; all 85 exit 0 (83 unlocked loop with stdin from /dev/null, check:type-check-debt and pnpm --dir ui exec vitest run scripts/ under os-verify-lock); --ran: 85 derived, 85 run, 0 NOT-MEASURED, 0 UNRUN. Same 85 exit 0 on pre-merge head 5c25e7f3. Type-checks exit 0: spec, platform-objects, turbo type-check @object-ui/fields + @object-ui/plugin-detail. spec check:generated exit 0 after merge. check-sdui-manifest (and --self-test) exit 0. PR-body gates on the final body: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-partof-closing-keyword all exit 0. eslint on touched ui and spec files: 0 errors. dispatch-gates --tier: no path mandate; Clause-2 SUSPECT hint on packages/spec/src/data/field.form.ts (a form offer of an already-accepted key, claim line kept). CI check-runs: not yet read, the draft was just opened.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "line_budget": "12 files, +603 / -16: fields src +114/-4, ui tests +359, spec src +11, spec tests +83/-11, platform-objects bundles +16, count pin +4/-1, changeset +16",
      "files_changed": [
        ".changeset/29462-reference-name-visible-plain-text.md",
        "packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts (amendment 6590220295)",
        "packages/spec/src/data/field-form-reference-name-visible.test.ts (new)",
        "packages/spec/src/data/field.form.ts",
        "packages/spec/src/system/metadata-form-zod-reconciliation.test.ts",
        "ui/packages/fields/src/__tests__/lookupCell.referenceNameVisible-29462.test.tsx (new)",
        "ui/packages/fields/src/index.tsx",
        "ui/packages/plugin-detail/src/__tests__/DetailSection.referenceNameVisible-29462.test.tsx (new)"
      ],
      "deviations": [
        "Premise correction named in the handshake: lookupAutofill has no form row on main (only its omit entry), so the row source is field.form.ts, the form the reconciliation ledger reads.",
        "Surface grew by one count pin (object-lifecycle-panel-echo-decisions.test.ts 699 to 700) after the seat's amendment 6590220295, asked before editing.",
        "That pin's first re-run (one file, 35 tests, exit 0) ran outside os-verify-lock; the full platform-objects suite was re-run under the lock on the merged head.",
        "Live verification used the Console Vite dev server against pnpm dev:crm, a REST scratch package (com.example.rnv), a package permission set and admin impersonation; no Console build. Screenshots and scripts in /mnt/project-files/issue-29462/.",
        "A ui+examples+apps turbo build (--only) included the apps/docs build, which the dev server did not need."
      ],
      "studio_designer_answer": "No: a Studio author editing a lookup in the object designer does not see the field.form.ts row. The designer's field panel is the hand-written app-shell ObjectFieldInspector; a live probe as admin at /apps/setup/metadata/object/rnv_expense with the lookup selected shows no such control (shots/studio-designer.png). The seat files that control as its own card.",
      "mcp_calls": "0 GitHub MCP calls",
      "api_writes": "2 relay writes: fleet-write pr_create (objectstack-ai/objectstack#29639, read back identical, no assignees) and this post-stamped comment; plus git push of the branch",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: live, pnpm dev:crm, a member whose object gate refuses rnv_payroll opens an rnv_expense record whose lookup WITHOUT referenceNameVisible points at it: the cell draws the unresolved face (id with a question mark, inside a link to a record page that refuses them) instead of the restricted-record placeholder, because the record read answers 403 for an object-gate refusal and useLookupName reads only a not-found answer as restricted · evidence: /mnt/project-files/issue-29462/shots/desktop-record.png, field Payroll (no key) · dedupe words: restricted record placeholder 403 object gate lookup unresolved link",
        "carrier: seat (ui#3) · the ObjectFieldInspector referenceNameVisible control, which the seat said it will file"
      ]
    }
  7. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Claim amended · 2026-11-02T23:46Z · third amendment, on PR #29639's red Test Core (6/8). This adds to the claim, amendment 6588547542 and amendment 6590220295; session, branch and seat are unchanged.

    Clause-②: no
    Metadata-protocol: none

  8. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Landed · 2026-11-03T01:11Z

    PR #29639 merged at 2026-11-03T01:10Z as 6903c930. Fixes #29462 closed this card, and pm:dispatched is removed. The seat's ACCEPT is 6591902058.

    Delivered: a lookup or user field that declares referenceNameVisible now shows a refused record's name as plain text, with no link and no hover card, in list cells and on the record page. It makes no read of the refused target object. The generic field metadata form offers the key on lookup and user, with labels in all three locales. Fields without the key keep today's faces.

    Follow-ups filed by this seat: #29629 (the Studio field inspector's control, PR #29669, in the merge queue) and #29641 (an object-gate 403 shows a linked raw id instead of the restricted placeholder; claimed, building now). Nothing else 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