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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
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
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 main9840695):
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-shellpatch).
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.
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-automationnotify-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"
]
}
#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.
Activity
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 3 (
priority:p3,bug)Session:
session_014MXhk1yjWh37d634hLy3p7Account:
huangyiirene(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13152-pickers-hide-internalWorktree:
objectui-issue-13152Domain:
domain:uiSeat:
domain:ui#1File surface (all in
packages/app-shell/src/views/, read at objectuimain9840695):metadata-admin/previews/useObjectFields.ts: it recordshiddenbut does not filter;studio-design/ObjectListViewInspector.tsx(fieldCatalog, the "Add field" column picker) andmetadata-admin/inspectors/FlowReferenceField.tsx(ReferenceComboboxoptions, the Notify node's "Record field" recipient picker);.changeset/13152-pickers-hide-internal.md(@object-ui/app-shellpatch).Stop on breach; explain in the report.
Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuiover this surface reads no path-derived mandate)Clause-②: no
Responsibility: the risk is produced by objectui's own Studio pickers, which offer the internal
__searchfield 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__searchand 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
objectstack-fleet commentedon Oct 20, 2026
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 predicateisStudioHiddenSystemField(system AND hidden, objectui#11780): no third rule.useObjectFieldsnow carries the servedsystemmark as an optional flag, exactly as it carriesrequired, 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 mapsfieldCatalogto 'Add field', but on the tree 'Add field' readsfieldsviaobjectFieldsOverrideandfieldCatalogfeeds the filter and kanban widgets; both now derive from the one filtered list.","tests": "Head 55f9051, root-form
pnpm exec vitest run --maxWorkers=2 PATHSthrough 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 emptygit 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'ssystemcarry 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=20 (28 of 28 tasks);pnpm --filter @object-ui/app-shell type-check0;pnpm --filter @object-ui/app-shell lint0 (no errors; no warning on a line this diff adds);pnpm check:new-line-citations0 (VERDICT 0 new citations);pnpm check:control-bytes0;pnpm check:changeset-claims0;node scripts/check-changeset-presence.mjs0;node scripts/check-changeset-no-major.mjs0. 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 --testover 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, executingPOST /repos/objectstack-ai/objectui/pulls(draft forced) andPOST /repos/objectstack-ai/objectui/issues/13201/assignees, read back 8268 bytes sent = 8268 stored, assignee huangyiirene; (2) comment, executingPOST /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
systemflag to the internalObjectFieldInfo(not on the package entry; no exported prop carries it), set only when the served definition sayssystem: trueand 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 needssystem, and every other caller's output is unchanged","B drop the flag and filter on
hiddenalone (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:
resolveRecipientsin objectstackservice-automationnotify-node.tsfails the node on a non-string value ('not a recipient') and passes any string on as a recipient · evidence: the spec'sNotifyRecipientsSlotSchemadeclares the recipient VALUE (string user id or audience selector, list, CEL envelope) and no field type, and objectui'sFlowReferenceSpecdeclares 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):
FieldValueMapFieldinFlowNodeConfigField, the metadata-admin view designer's column pickers (ViewVariantInspector,ViewColumnInspector),useFlowScope's trigger refs, and the runtimeViewConfigPanel.mapObjectFields(carrieshiddenonly); 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
objectstack-fleet commentedon Oct 20, 2026
LANDED ·
domain:uiseat 1 ·session_014MXhk1yjWh37d634hLy3p7· 2026-10-20T09:24Z ·pm:dispatchedcleared5666e19has one parent (5129caa), andgit merge-base --is-ancestorplaces it onorigin/main(exit 0)gh-readonly-queue/main/pr-13201-*branch remainsorigin/main,ObjectListViewInspector.tsxreadsisStudioHiddenSystemField(3) and holdsfunction fieldNamesHeldBy(1).FlowReferenceField.tsxreadsisStudioHiddenSystemField(3), anduseObjectFields.tscarriessystem: true(1). Positive control: therequired: truecarry beside it is kept (1)6286657954, dev report6287363931on this card, ACCEPT6287403663on PR #13201 (no contract-review face hit; the dev's open question was answered A in the ACCEPT, §4)completedat 2026-10-20T09:24Z through the PR'sFixes #13152;pm:dispatchedis removed in this actStudio's list-view properties panel and the flow reference picker no longer offer
__search,owning_business_unit_idororganization_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):
FieldValueMapField,ViewVariantInspectorandViewColumnInspector,useFlowScope,ViewConfigPanel.mapObjectFields) were read from source only.fix(app-shell): Studio field pickers leave out the platform's hidden …