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.
List user-filter chips draw the raw field key ("category") until the object definition arrives: UserFilters resolves the label from objectDef, which ListView holds at null until getObjectSchema answers #12890
Filing gate ①: a measured defect with a named site. Filed by repo:cloud seat 2 (seat post objectstack-ai/objectstack#24145, session session_01Cbdek8SKSHxddGqTPZXdqX) from the cloud#2915 dev's measured split (its report on objectstack-ai/cloud#2915; cloud PR objectstack-ai/cloud#2972 fixes cloud's half and adds no override for these). ⛔ Not a claim; no assignee. Grading is triage's.
Reader who acts: the lane that owns packages/plugin-list (one dev round). Pull: objectstack-ai/cloud#2915 item 2 (the maintainer's 2026-10-16 walk, zh-CN): 我的软件包's group selector "reads the raw field name category before translations arrive (分类 after)". Measured: it is the object definition it waits for, not the bundle.
Dedupe: REST enumeration of this repository's issues updated since 2026-08-15 (735 issues, open and closed; control objectui#12294 found), grepped for data-list.tsx, repeater … Loading, elements.tsx:6xx, element:number … loading, UserFilters, raw field name, ConnectionStatus, 已连接. The nearest hits: objectui#11880 (page elements bind through node-level dataSource), #12345 (the repeater's retired flat spec), #12784 (the date-range chip's hard-coded From / To), #12295 (the chip never shows a mid-session outage) and the open parent #12308. None names this.
What happens (read at ef71a09f9e5f)
Cloud's page (packages/service-tenant/src/pages/sys-package.page.ts:100-110) declares userFilters.fields: [{ field: 'category' }] with no label; the field's label is Category and zh-CN carries 分类.
packages/plugin-list/src/ListView.tsx:2210 sets objectDef to null until getObjectSchema resolves (:2221). Meanwhile packages/plugin-list/src/UserFilters.tsx:461 reads objectName = objectDef?.name (undefined), :351resolvedLabel = f.label ?? objectLabel (both undefined), and :679 draws f.label || f.field — the raw key.
Wanted
While the object definition is pending, a user-filter chip whose field carries no authored label draws a placeholder (or nothing), never the machine key; once the definition arrives it draws the field's translated label. Done when a test beside UserFilters.tsx renders a chip with a pending definition and asserts no raw key is drawn.
Dedupe words: userFilters raw field name, filter chip field key before schema, UserFilters objectDef null label, dropdown chip category
Claim: PM loop round 3 (priority:p2, triage scope 6235382361)
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12890-userfilter-pending-label
Worktree: objectui-issue-12890
Domain: domain:ui
Seat: domain:ui#2
File surface: packages/plugin-list/src/UserFilters.tsx (all four f.label || f.field draw sites: while the object definition is pending, a chip with no authored label draws a placeholder or nothing, never the key; once it arrives, the field's translated label; an authored label unchanged); packages/plugin-list/src/ListView.tsx only to hand objectDefLoaded (or equivalent) down, if needed; tests beside UserFilters.tsx; one .changeset/12890-*.md (@object-ui/plugin-list: minor; amended in place from patch, see Clause-②). Stop on breach; explain in the report.
Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate)
Clause-②: yes
Clause-② reason: amended in place after review of PR #12905. The measured fix adds an optional objectDefPending member to UserFiltersProps, which @object-ui/plugin-list's entry exports (export type { UserFiltersProps }), so a published prop surface widens. It owes one CONTRACT_REVIEW_TIER review, and the changeset levels minor.
Responsibility: objectui's own user-filter chip, which falls back to the machine key | the list already tracks whether the object definition is loaded (objectDefLoaded) | every viewer of a list with unlabelled user filters, on each load (cloud 我的软件包)
Thread-read: 6235382361
Serial constraints cleared: no open objectui PR touches UserFilters.tsx or ListView.tsx, and no pm:dispatched claim names them (read at claim). objectui#12784 (the date-range chip) is a different site in the same file family; it is not in flight. This seat's objectui#12889 and objectui#12892 are disjoint.
Claimed at: 2026-10-17T16:07Z
{
"issue": 12890,
"status": "done",
"branch": "claude/issue-12890-userfilter-pending-label",
"pr": "https://github.com/objectstack-ai/objectui/pull/12905",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Premise held on origin/main c999d4c017. Four `f.label || f.field` sites in UserFilters.tsx drew the key: the dropdown chip (also used for the More overflow), LookupValuePicker field.label, the text placeholder and the toggle button. ListView's objectDefLoaded was never passed down (A1: a new optional prop was needed). ListView now passes objectDefPending={!objectDefLoaded}; UserFiltersProps gains an optional objectDefPending (default false). While it is pending, those sites draw the label if there is one, otherwise a Skeleton (chip and toggle) or an empty string (placeholder and picker label). resolveFields/useSafeFieldLabel are unchanged. Once settled the key fallback is unchanged: a field the settled definition does not name, or a failed getObjectSchema (settles with objectDef null), still draws the key, as does a host that omits the prop.",
"tests": "All at head 85588ab6ce. New UserFilters.pendingLabel-12890.test.tsx (5 tests: PENDING all dropdown sites incl. overflow/placeholder/picker; PENDING toggle; CONTROL authored label while pending; SETTLED key as before; ARRIVAL via ListView with zh resources and a gated getObjectSchema: skeleton, then 分类). Ablation via objectstack scripts/ablation-replace.mjs in wrap mode: restored the chip site to {f.label || f.field}. Anchor x1 -> x0; blob ee06df6d9966 -> ad54466e63dc. Result: 'Tests 2 failed | 3 passed (5)'; PENDING and ARRIVAL failed with 'expected category not to contain category'. Restore proved: blob after == HEAD == ee06df6d9966, git diff HEAD empty. No build is needed for this ablation: the tests import ../UserFilters by relative path, i.e. source. pnpm exec vitest run --maxWorkers=1 packages/plugin-list/ under the lock: Test Files 150 passed (150), Tests 1523 passed (1523), VERDICT command-exit 0. Closure build turbo run build --filter=@object-ui/plugin-list^... exit 0; plugin-list type-check (tsc --noEmit && tsc -p tsconfig.test.json) exit 0, and --listFiles counts the new test (1). eslint narrowed to the 3 changed source files (root flat config, --format json): 3 files, 0 errors. Pre-existing warnings only; the diff adds 0 any. Type-aware linting is not enabled, so the verdict on untouched files cannot move. Battery all exit 0: phantom-deps self-import unreferenced-sources doc-example-readers handler-key-reads side-effects-array element-data-source-declaration spec-symbols action-forward-parity designer-field-key-parity icon-record-names i18n-keys i18n-drift i18n-designer-parity control-bytes new-line-citations, check-hand-rolled-comment-mask, check-changeset-fixed, check-changeset-presence ('3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'). check:spec-floors exit 1 'no-artifact' (workspace not fully built): NOT MEASURED, expected per dispatch. CI: in_progress, not awaited.",
"mcp_calls": "0",
"api_writes": "3 so far — git push of the branch (empty probe and then the commit; git, not REST); 1 relay pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST /issues/12905/assignees, fleet-write request fw-20261017T163624Z-22b85c, read-back identical 4313/4313 bytes, assignees baozhoutao); 1 relay comment (POST /repos/objectstack-ai/objectui/issues/12890/comments, this report). Labels: zero writes (objectui, not named by the dispatch).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted in PR Acceptance notes, not filed · the deprecated toggle mode never receives objectDef, so after the definition settles an unlabelled toggle chip still draws the key (before and after this PR); stored toggle configs only, no producer measured · dedupe words: toggle user filter label objectDef, ToggleFilters field key, deprecated toggle chip label"
],
"gates": {"closure_build": 0, "type_check_plugin_list": 0, "vitest_new_file": 0, "vitest_plugin_list_dir": 0, "eslint_changed_files": 0, "battery_16_named_plus_new_line_citations": 0, "check_hand_rolled_comment_mask": 0, "check_changeset_fixed": 0, "check_changeset_presence": 0, "check_spec_floors": "1 (no-artifact; NOT MEASURED)"},
"files_changed": ["packages/plugin-list/src/UserFilters.tsx", "packages/plugin-list/src/ListView.tsx", "packages/plugin-list/src/__tests__/UserFilters.pendingLabel-12890.test.tsx", ".changeset/12890-userfilter-pending-label.md"],
"deviations": ["The test lives in packages/plugin-list/src/__tests__/, where every existing UserFilters.*.test.tsx lives, read as 'beside UserFilters.tsx'.", "Worktree removed after the PR opened."]
}
Reviewed on GitHub at head 5d0f34e, against the card's Wanted, the triage scope (6235382361) and the claim (6236336823, amended in place: Clause-②: yes and minor, after this seat's review found the new prop on an exported type).
Shape: the body says Fixes #12890; the second line is Clause-②: yes. The changeset is @object-ui/plugin-list: minor (patch round 5d0f34e; it was patch). The body's Published surface section names the one widening.
The change (packages/plugin-list):
Pending, not the key.ListView hands its objectDefLoaded state down as objectDefPending. While it is set, every site that named a chip f.label || f.field draws the label if there is one and otherwise a skeleton or no text:
the dropdown chip, also used for the More overflow;
the person-picker's label;
the text-search placeholder;
the deprecated toggle button.
One helper, chipName, is the single rule; resolveFields and useSafeFieldLabel are unchanged.
Settled, as before. Once the definition settles, a field the definition does not name, or a failed getObjectSchema, still falls back to the key. A host that omits the prop keeps the previous behaviour.
Published surface:UserFiltersProps (exported from the package entry) gains the optional objectDefPending?: boolean, default false. That is a widening, so Clause-②: yes.
Pins:UserFilters.pendingLabel-12890 (5 tests):
PENDING: every dropdown site, including overflow, placeholder and picker; PENDING toggle;
CONTROL: an authored label is drawn while pending;
SETTLED: the key as before;
ARRIVAL: through the real ListView with zh resources and a gated getObjectSchema, a skeleton, then 分类.
Ablation: restoring the chip site's f.label || f.field turns PENDING and ARRIVAL red; the restore was proven by blob hash. packages/plugin-list (150 files, 1523 tests) is green; type-check exits 0; the changeset gates exit 0 on 5d0f34e.
Out-of-scope finding: the deprecated toggle mode is never handed objectDef, so after the definition settles an unlabelled toggle chip still draws the key, before and after this PR. Acceptance notes, not filed: only stored toggle configs reach it, and no producer was measured.
Process note: the dev declined the PR-body PATCH, per its role file (a dev writes the body once, at opening); this seat wrote the replacement body it prepared.
Trailers: both commits carry only the model-free pair.
Contract review: PASS at this head, CONTRACT_REVIEW_TIER, by an isolated reviewer and adopted by this seat (PR comment 6236904013). Its two non-blocking notes: while pending, an unlabelled chip button has no accessible name (the skeleton is aria-hidden), which is "nothing" under the card's scope; and a host with inline data shows the skeleton for one first commit before the effect settles.
CI at head: 33 success, 3 skipped, 0 failures (filter=latest, 36 runs), including Bundle Analysis (performance budget PASS), after one re-run of the per-shard Test gate (it read the shards while shard 8 was still running; stand-down 6237517319). Not governed (path audit).
PR #12905 merged through the merge queue as 1b88645, which is on main; Fixes #12890 closed this card. Verified by content: all 4 of the PR's files on main are blob-identical to the accepted head 5d0f34e. The merge commit's message names no model.
What landed:
While a list's object definition is loading, an unlabelled user-filter chip draws a skeleton (or no text) instead of the raw field key, at every site that drew f.label || f.field. Once the definition arrives it draws the field's translated label; an authored label is drawn throughout.
UserFiltersProps gains the optional objectDefPending (default false; omitted = previous behaviour). The contract review (CONTRACT_REVIEW_TIER) PASSed (PR comment 6236904013).
Released as @object-ui/plugin-list: minor.
For objectstack-ai/cloud#2915 (item 2, 我的软件包's category chip): cloud sees this once its .objectui-sha covers the merge commit above. This seat now removes pm:dispatched.
Activity
objectstack-fleet commentedon Oct 17, 2026
Triage: p2 ·
area:i18n·domain:ui·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-17T14:56ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
origin/maind2b21a1225: the defect holds.packages/plugin-list/src/ListView.tsx:1727holdsobjectDefatnull, and:2301resets it.UserFilters.tsxstill falls back to the machine key at four draw sites::762,:788,:845and:1282(f.label || f.field).objectDefLoaded(ListView.tsx:1728) already says whether the definition is pending.categorybefore 分类.labelis unchanged.UserFilters.tsxpins the pending render.domain:ui(packages/plugin-list).Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Claim: PM loop round 3 (
priority:p2, triage scope6235382361)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12890-userfilter-pending-labelWorktree:
objectui-issue-12890Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/plugin-list/src/UserFilters.tsx(all fourf.label || f.fielddraw sites: while the object definition is pending, a chip with no authored label draws a placeholder or nothing, never the key; once it arrives, the field's translated label; an authoredlabelunchanged);packages/plugin-list/src/ListView.tsxonly to handobjectDefLoaded(or equivalent) down, if needed; tests besideUserFilters.tsx; one.changeset/12890-*.md(@object-ui/plugin-list: minor; amended in place frompatch, see Clause-②). Stop on breach; explain in the report.Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate)Clause-②: yes
Clause-② reason: amended in place after review of PR #12905. The measured fix adds an optional
objectDefPendingmember toUserFiltersProps, which@object-ui/plugin-list's entry exports (export type { UserFiltersProps }), so a published prop surface widens. It owes oneCONTRACT_REVIEW_TIERreview, and the changeset levelsminor.Responsibility:
objectui's own user-filter chip, which falls back to the machine key | the list already tracks whether the object definition is loaded (objectDefLoaded) | every viewer of a list with unlabelled user filters, on each load (cloud 我的软件包)Thread-read: 6235382361
Serial constraints cleared: no open objectui PR touches
UserFilters.tsxorListView.tsx, and nopm:dispatchedclaim names them (read at claim). objectui#12784 (the date-range chip) is a different site in the same file family; it is not in flight. This seat's objectui#12889 and objectui#12892 are disjoint.Claimed at: 2026-10-17T16:07Z
objectstack-fleet commentedon Oct 17, 2026
os-dev-report
{ "issue": 12890, "status": "done", "branch": "claude/issue-12890-userfilter-pending-label", "pr": "https://github.com/objectstack-ai/objectui/pull/12905", "session": "session_01XVp19E1MYUTFM3dnkwz8gB", "premise_still_valid": true, "summary": "Premise held on origin/main c999d4c017. Four `f.label || f.field` sites in UserFilters.tsx drew the key: the dropdown chip (also used for the More overflow), LookupValuePicker field.label, the text placeholder and the toggle button. ListView's objectDefLoaded was never passed down (A1: a new optional prop was needed). ListView now passes objectDefPending={!objectDefLoaded}; UserFiltersProps gains an optional objectDefPending (default false). While it is pending, those sites draw the label if there is one, otherwise a Skeleton (chip and toggle) or an empty string (placeholder and picker label). resolveFields/useSafeFieldLabel are unchanged. Once settled the key fallback is unchanged: a field the settled definition does not name, or a failed getObjectSchema (settles with objectDef null), still draws the key, as does a host that omits the prop.", "tests": "All at head 85588ab6ce. New UserFilters.pendingLabel-12890.test.tsx (5 tests: PENDING all dropdown sites incl. overflow/placeholder/picker; PENDING toggle; CONTROL authored label while pending; SETTLED key as before; ARRIVAL via ListView with zh resources and a gated getObjectSchema: skeleton, then 分类). Ablation via objectstack scripts/ablation-replace.mjs in wrap mode: restored the chip site to {f.label || f.field}. Anchor x1 -> x0; blob ee06df6d9966 -> ad54466e63dc. Result: 'Tests 2 failed | 3 passed (5)'; PENDING and ARRIVAL failed with 'expected category not to contain category'. Restore proved: blob after == HEAD == ee06df6d9966, git diff HEAD empty. No build is needed for this ablation: the tests import ../UserFilters by relative path, i.e. source. pnpm exec vitest run --maxWorkers=1 packages/plugin-list/ under the lock: Test Files 150 passed (150), Tests 1523 passed (1523), VERDICT command-exit 0. Closure build turbo run build --filter=@object-ui/plugin-list^... exit 0; plugin-list type-check (tsc --noEmit && tsc -p tsconfig.test.json) exit 0, and --listFiles counts the new test (1). eslint narrowed to the 3 changed source files (root flat config, --format json): 3 files, 0 errors. Pre-existing warnings only; the diff adds 0 any. Type-aware linting is not enabled, so the verdict on untouched files cannot move. Battery all exit 0: phantom-deps self-import unreferenced-sources doc-example-readers handler-key-reads side-effects-array element-data-source-declaration spec-symbols action-forward-parity designer-field-key-parity icon-record-names i18n-keys i18n-drift i18n-designer-parity control-bytes new-line-citations, check-hand-rolled-comment-mask, check-changeset-fixed, check-changeset-presence ('3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'). check:spec-floors exit 1 'no-artifact' (workspace not fully built): NOT MEASURED, expected per dispatch. CI: in_progress, not awaited.", "mcp_calls": "0", "api_writes": "3 so far — git push of the branch (empty probe and then the commit; git, not REST); 1 relay pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST /issues/12905/assignees, fleet-write request fw-20261017T163624Z-22b85c, read-back identical 4313/4313 bytes, assignees baozhoutao); 1 relay comment (POST /repos/objectstack-ai/objectui/issues/12890/comments, this report). Labels: zero writes (objectui, not named by the dispatch).", "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无) · noted in PR Acceptance notes, not filed · the deprecated toggle mode never receives objectDef, so after the definition settles an unlabelled toggle chip still draws the key (before and after this PR); stored toggle configs only, no producer measured · dedupe words: toggle user filter label objectDef, ToggleFilters field key, deprecated toggle chip label" ], "gates": {"closure_build": 0, "type_check_plugin_list": 0, "vitest_new_file": 0, "vitest_plugin_list_dir": 0, "eslint_changed_files": 0, "battery_16_named_plus_new_line_citations": 0, "check_hand_rolled_comment_mask": 0, "check_changeset_fixed": 0, "check_changeset_presence": 0, "check_spec_floors": "1 (no-artifact; NOT MEASURED)"}, "files_changed": ["packages/plugin-list/src/UserFilters.tsx", "packages/plugin-list/src/ListView.tsx", "packages/plugin-list/src/__tests__/UserFilters.pendingLabel-12890.test.tsx", ".changeset/12890-userfilter-pending-label.md"], "deviations": ["The test lives in packages/plugin-list/src/__tests__/, where every existing UserFilters.*.test.tsx lives, read as 'beside UserFilters.tsx'.", "Worktree removed after the PR opened."] }Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Review: ACCEPT — objectui PR #12905 ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-17T17:24ZReviewed on GitHub at head
5d0f34e, against the card's Wanted, the triage scope (6235382361) and the claim (6236336823, amended in place:Clause-②: yesandminor, after this seat's review found the new prop on an exported type).Shape: the body says
Fixes #12890; the second line isClause-②: yes. The changeset is@object-ui/plugin-list: minor(patch round5d0f34e; it waspatch). The body'sPublished surfacesection names the one widening.The change (
packages/plugin-list):ListViewhands itsobjectDefLoadedstate down asobjectDefPending. While it is set, every site that named a chipf.label || f.fielddraws the label if there is one and otherwise a skeleton or no text:chipName, is the single rule;resolveFieldsanduseSafeFieldLabelare unchanged.getObjectSchema, still falls back to the key. A host that omits the prop keeps the previous behaviour.UserFiltersProps(exported from the package entry) gains the optionalobjectDefPending?: boolean, defaultfalse. That is a widening, soClause-②: yes.Pins:
UserFilters.pendingLabel-12890(5 tests):ListViewwith zh resources and a gatedgetObjectSchema, a skeleton, then分类.Ablation: restoring the chip site's
f.label || f.fieldturns PENDING and ARRIVAL red; the restore was proven by blob hash.packages/plugin-list(150 files, 1523 tests) is green; type-check exits 0; the changeset gates exit 0 on5d0f34e.Out-of-scope finding: the deprecated toggle mode is never handed
objectDef, so after the definition settles an unlabelled toggle chip still draws the key, before and after this PR. Acceptance notes, not filed: only stored toggle configs reach it, and no producer was measured.Process note: the dev declined the PR-body PATCH, per its role file (a dev writes the body once, at opening); this seat wrote the replacement body it prepared.
Trailers: both commits carry only the model-free pair.
Contract review: PASS at this head,
CONTRACT_REVIEW_TIER, by an isolated reviewer and adopted by this seat (PR comment6236904013). Its two non-blocking notes: while pending, an unlabelled chip button has no accessible name (the skeleton isaria-hidden), which is "nothing" under the card's scope; and a host with inline data shows the skeleton for one first commit before the effect settles.CI at head: 33 success, 3 skipped, 0 failures (
filter=latest, 36 runs), including Bundle Analysis (performance budget PASS), after one re-run of the per-shardTestgate (it read the shards while shard 8 was still running; stand-down6237517319). Not governed (path audit).Next:
pr_ready+automerge_enable.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-17T17:40ZPR #12905 merged through the merge queue as
1b88645, which is onmain;Fixes #12890closed this card. Verified by content: all 4 of the PR's files onmainare blob-identical to the accepted head5d0f34e. The merge commit's message names no model.What landed:
f.label || f.field. Once the definition arrives it draws the field's translated label; an authoredlabelis drawn throughout.UserFiltersPropsgains the optionalobjectDefPending(defaultfalse; omitted = previous behaviour). The contract review (CONTRACT_REVIEW_TIER) PASSed (PR comment6236904013).@object-ui/plugin-list: minor.For objectstack-ai/cloud#2915 (item 2, 我的软件包's
categorychip): cloud sees this once its.objectui-shacovers the merge commit above. This seat now removespm:dispatched.Generated by Claude Code
fix(plugin-list): an unlabelled user-filter chip draws a skeleton, no…