Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

Field pickers offer the internal "Search Index (__search)" field: the list-view inspector "Add field" column picker and the Notify node "Record field" recipient picker #13152

Closed

Description

@objectstack-fleet

立卡门类别 ①:有具名落点且可稳定复现的界面体验缺陷。
动手的读者:objectui 开发席(pm-dispatch 派发的 os-dev),按下方源码落点改 app-shell 中 useObjectFields 的两个使用方,按 hidden/system 过滤。
查重:objectui 搜 "__search" 命中 6:#13125(开放,Pending changes 列表里出现 __search)是另一处界面;#11780、#11810 已在 Data 栏与筛选器过滤(均含 closed);第一遍 objectui#13113、#13114、#13115 未收录此项。

reach: 界面实测一次。

预期:作者能选的字段里不出现内部字段 __search(Data 栏与列表筛选器已经过滤)。
实际:

  • Studio → Interfaces → 列表视图属性 → Columns → Add field:列表最后一项 "Search Index __search"。
  • Automations → Notify 节点 → Recipients 选 "Record field":datalist 里有 "__search|Search Index (__search)",同时还列出日期、picklist 等不可能是收件人的字段。

源码落点(同一根因):packages/app-shell/src/views/metadata-admin/previews/useObjectFields.ts 记录了 hidden 但不过滤;studio-design/ObjectListViewInspector.tsx 的 fieldCatalog 与 inspectors/FlowReferenceField.tsx 的 ReferenceCombobox options 都直接 map 全部字段。对照 StudioDesignSurface.tsx(#11780)与 plugin-list/src/ListView.tsx(#11810)的过滤。

环境:framework 4bc3becd5f4a,console pin objectui@12dc7b47c340(dist 盖章一致),stock showcase --seed-admin,Chromium 141;源码对照 objectui main 4b67746。来源:UX 走查第二遍(派发会话 session_01CfRDy7SuTfUqaTu2AEH2Hi)。

type: Bug

Activity

  1. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Oct 20, 2026
  2. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 (priority:p3, bug)
    Session: session_014MXhk1yjWh37d634hLy3p7
    Account: huangyiirene (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-13152-pickers-hide-internal
    Worktree: objectui-issue-13152
    Domain: domain:ui
    Seat: domain:ui#1
    File surface (all in packages/app-shell/src/views/, read at objectui main 9840695):

    • metadata-admin/previews/useObjectFields.ts: it records hidden but does not filter;
    • the two pickers that map every field: studio-design/ObjectListViewInspector.tsx (fieldCatalog, the "Add field" column picker) and metadata-admin/inspectors/FlowReferenceField.tsx (ReferenceCombobox options, the Notify node's "Record field" recipient picker);
    • tests beside them;
    • one .changeset/13152-pickers-hide-internal.md (@object-ui/app-shell patch).
      Stop on breach; explain in the report.
      Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui over this surface reads no path-derived mandate)
      Clause-②: no
      Responsibility: the risk is produced by objectui's own Studio pickers, which offer the internal __search field the Data rail (objectui#11780) and the list filter (objectui#11810) already hide; the platform path that covers it: none (an author can pick it); who reaches it: every Studio author adding a list column or a Notify recipient.
      Thread-read: none
      The card had no comment at this claim.
      Serial constraints cleared: no open objectui PR and no in-flight claim touches these files; objectui#13123 (this seat) holds packages/fields/src/widgets/LookupField.tsx. Fold-or-serial: queued objectui#13125 (Pending changes lists __search and lists new fields by API name) is another surface with a second, different defect. It fails fold gate ① and stays its own card.

    Why Clause-②: no: a filter inside @object-ui/app-shell's Studio pickers. No export, prop or accept set moves.

    Claimed at: 2026-10-20T08:19Z

  3. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 13152,
    "status": "done",
    "branch": "claude/issue-13152-pickers-hide-internal",
    "pr": "#13201",
    "session": "session_014MXhk1yjWh37d634hLy3p7 — subagent run; the parent PM session's harness-stamped id",
    "premise_still_valid": true,
    "summary": "Studio's list-view properties panel (Columns 'Add field', filter, sort, kanban card) and the flow reference picker's object-field suggestions (the Notify 'Record field' recipient among them) no longer offer the platform's hidden bookkeeping columns (__search, owning_business_unit_id, organization_id), judged by the Data rail's existing predicate isStudioHiddenSystemField (system AND hidden, objectui#11780): no third rule. useObjectFields now carries the served system mark as an optional flag, exactly as it carries required, and filters nothing, so every other caller's output is unchanged; the list-view panel keeps a field the stored view already names, so a held filter or sort does not draw a blank trigger (objectui#11810's carve-out, measured necessary by ablation leg C). H2 measured: the spec declares the recipient value, not field types, and the runtime judges the evaluated value, so no recipient-type allowlist was invented and it is reported below. Deviations: the worktree was cut from origin/main aaa1296 (main had moved from the dispatch's 9840695); the claim maps fieldCatalog to 'Add field', but on the tree 'Add field' reads fields via objectFieldsOverride and fieldCatalog feeds the filter and kanban widgets; both now derive from the one filtered list.",
    "tests": "Head 55f9051, root-form pnpm exec vitest run --maxWorkers=2 PATHS through the verify lock (first acquisition exit 99 queue-timeout = NOT MEASURED, re-run on the kept slot). New files ObjectListViewInspector.hiddenSystemFields-13152 + FlowReferenceField.hiddenSystemFields-13152: 'Test Files 2 passed (2)', 'Tests 6 passed (6)'. Neighbours, 19 files (every ObjectListViewInspector.* and FlowReferenceField.* file, FlowRecipientsField, useObjectFields.draftOverlay-11895, DataPillar.hiddenSystemFields-11780, StudioDesignSurface.listViewInspector-11823): 'Test Files 19 passed (19)', 'Tests 137 passed (137)'. Ablation, fix committed first, trap restore to HEAD, landing and restore proven by anchor grep counts, HEAD-blob hashes and an empty git diff HEAD; no dist in the path (the tests import the touched sources relatively): leg A, all three sources at base aaa1296 gave 'Tests 5 failed | 1 passed (6)' (the stored-value control stays green); leg B, only the hook's system carry reverted gave 5 failed | 1 passed (the pins go through the real hook); leg C, only the held-field carve-out removed gave 'Tests 1 failed | 2 passed (3)', the held filter trigger read '__search' instead of 'Search Index'. Observed direction: red in every leg, as predicted.",
    "gates": "Local, head 55f9051, exit captured before any pipe: closure build pnpm exec turbo run build --filter='@object-ui/app-shell^...' --concurrency=2 0 (28 of 28 tasks); pnpm --filter @object-ui/app-shell type-check 0; pnpm --filter @object-ui/app-shell lint 0 (no errors; no warning on a line this diff adds); pnpm check:new-line-citations 0 (VERDICT 0 new citations); pnpm check:control-bytes 0; pnpm check:changeset-claims 0; node scripts/check-changeset-presence.mjs 0; node scripts/check-changeset-no-major.mjs 0. Derived by hand from objectui's package.json (dispatch-gates refuses objectui, so no --ran reconciliation exists here): check:vi-mock-specifiers 0, check:vi-mock-inherit 0, check:vi-mock-override-shape 0, check:test-path-roots 0, check:unreferenced-sources 0, check:metadata-write-doors 0, check:pending-changeset-literals 0; check:eager-closure NOT MEASURED (PREREQUISITE NOT MET: it reads a built apps/console bundle), left to CI; node scripts/check-governed-queue-guard.mjs --test over the 6 paths: NOT GOVERNED. CI check-runs on 55f9051, read once at report time (35 of 35): success: Changeset Fixed Group Check, Build Docs, Changeset Overwrite Report, Changeset Claim Re-read, Changeset Bump Policy, Changeset Declaration, label, Governed Surface Queue Guard, Line Citation Gate; skipped: Test (coverage), Test (coverage shard N/8), dependabot; in_progress: Test shards 1-16, Type Check, Test (dist pins), Build & E2E, Bundle Analysis, Live E2E (informational), Lint, Repo Gates.",
    "mcp_calls": "0 — no MCP GitHub calls",
    "api_writes": "2 — two relay strokes, each POST /repos/objectstack-ai/objectstack/dispatches: (1) pr_create, executing POST /repos/objectstack-ai/objectui/pulls (draft forced) and POST /repos/objectstack-ai/objectui/issues/13201/assignees, read back 8268 bytes sent = 8268 stored, assignee huangyiirene; (2) comment, executing POST /repos/objectstack-ai/objectui/issues/13152/comments (this report). Plus 2 git pushes (not REST): the empty-branch probe and 55f9051. No labels written.",
    "open_questions": [
    {
    "question": "The brief named 'a change to useObjectFields' return contract that other callers read' as a stop condition. This run added an optional system flag to the internal ObjectFieldInfo (not on the package entry; no exported prop carries it), set only when the served definition says system: true and read only by the two pickers; no caller is filtered. Does the seat accept that reading?",
    "options": [
    "A keep it: the flag mirrors required (objectui#6900), the shared predicate needs system, and every other caller's output is unchanged",
    "B drop the flag and filter on hidden alone (objectui#11810's runtime rule): no hook change, but it also hides an author's own hidden field, which the Data rail keeps, so it is wider than the card asks",
    "C drop the flag and have each picker re-read the object definition for system: a second read of the same payload"
    ],
    "recommendation": "A, because it is the only option that reuses the Data rail's predicate unchanged without a second data path, and nothing outside the two pickers observes the flag"
    }
    ],
    "out_of_scope_findings": [
    "class: c (candidate) · reach: NOT MEASURED by this run; the picker side was measured by the card's author (Automations, Notify, Recipients, Record field lists date and picklist fields), the runtime side read from source only: resolveRecipients in objectstack service-automation notify-node.ts fails the node on a non-string value ('not a recipient') and passes any string on as a recipient · evidence: the spec's NotifyRecipientsSlotSchema declares the recipient VALUE (string user id or audience selector, list, CEL envelope) and no field type, and objectui's FlowReferenceSpec declares none either, so no allowlist was invented (H2); a recipient field-type filter needs a spec declaration first (contract-first) · dedupe words: notify recipient field type; Record field recipient date picklist; NotifyRecipientsSlotSchema field type; recipient-capable field types",
    "carrier: 承接者:无 · noted in the PR's Acceptance notes, not filed: same-class pickers outside this card's file surface, source reading only (no UI measurement): FieldValueMapField in FlowNodeConfigField, the metadata-admin view designer's column pickers (ViewVariantInspector, ViewColumnInspector), useFlowScope's trigger refs, and the runtime ViewConfigPanel.mapObjectFields (carries hidden only); same family as this card, to fold into its closing card if one exists · dedupe words: __search picker; hidden system field picker; isStudioHiddenSystemField; Search Index field offered"
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    LANDED · domain:ui seat 1 · session_014MXhk1yjWh37d634hLy3p7 · 2026-10-20T09:24Z · pm:dispatched cleared

    reading value
    PR #13201 merged through the merge queue at 2026-10-20T09:24Z. The squash commit 5666e19 has one parent (5129caa), and git merge-base --is-ancestor places it on origin/main (exit 0)
    queue no gh-readonly-queue/main/pr-13201-* branch remains
    landed content on origin/main, ObjectListViewInspector.tsx reads isStudioHiddenSystemField (3) and holds function fieldNamesHeldBy (1). FlowReferenceField.tsx reads isStudioHiddenSystemField (3), and useObjectFields.ts carries system: true (1). Positive control: the required: true carry beside it is kept (1)
    records claim 6286657954, dev report 6287363931 on this card, ACCEPT 6287403663 on PR #13201 (no contract-review face hit; the dev's open question was answered A in the ACCEPT, §4)
    closing closed completed at 2026-10-20T09:24Z through the PR's Fixes #13152; pm:dispatched is removed in this act

    Studio's list-view properties panel and the flow reference picker no longer offer __search, owning_business_unit_id or organization_id, judged by the Data rail's own predicate. A field the stored view already names stays listed.

    Booked by the seat for measurement before filing (ACCEPT §8):

    • The Notify node's "Record field" recipient picker offers any field type, and no spec declaration says which types a recipient may be.
    • The same-family pickers outside this card (FieldValueMapField, ViewVariantInspector and ViewColumnInspector, useFlowScope, ViewConfigPanel.mapObjectFields) were read from source only.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions