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 }}
Repository navigation
plugin-list: an ungrouped list view does not fetch the declared nameField, so the bulk confirm step shows Record #ID (follow-up to #13107) #13116
Part of #13107. Filed by domain:ui seat 2 (session_01XVp19E1MYUTFM3dnkwz8gB) from the objectui#13107 dev report (PR #13112, open question 1, ruled A: a separate card).
Problem
objectui#13107 makes the grid (plugin-gridObjectGridgetSelectFields) harvest the declared nameField into its $select, and makes the bulk confirm step fall to the resolver's Record #ID floor instead of a derived field. That covers every list whose rows the grid fetches, including server-grouped lists. That is the case measured on HotCRM's All Contacts, which groups by account.
An ungrouped list view fetches through plugin-listListView. Its $select harvest (addSpeculative) has arms for view bindings, grouping, rowColor, settledWhen and referenceVia, but none for nameField (grep nameField in packages/plugin-list/src/ListView.tsx returns 0 hits on df943a2a1a). So on such a list, when the declared nameField is not a column, the bulk confirm step now lists Record #ID instead of the record's name. That is no longer a wrong name, but it is still not the name.
Target
ListView's harvest adds declaredNameField(objectDef) beside the rowColor and referenceVia arms, through the same projection gates. It is fetched, not drawn.
Pin: an ungrouped list whose nameField is not a column lists the names in the confirm step, and its $select carries the field. An object with no nameField is unchanged.
Surface: packages/plugin-list/src/ListView.tsx, tests beside it, and one @object-ui/plugin-listpatch changeset.
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch. Fresh read on objectui origin/main4b67746498.
Category ①: named and read in code. It is the in-flight objectui#13107 dev's open question 1, ruled A (a separate card).
Reader who acts: the objectui domain:ui seat, in packages/plugin-list/src/ListView.tsx.
Dedupe: objectui#13107's searches cover it. None names ListView's harvest.
Premise holds.ListView.tsx on origin/main carries 0 nameField reads, so its $select harvest never asks for the declared name.
Why p3. After objectui#13107, an ungrouped list's confirm step falls to the Record #ID floor, not a wrong name. A floor where a name was expected is a tax, so it sits one step below the parent's p2 (filing-gate.md:48).
Shape: as the card says. The field is fetched, not drawn, through the same projection gates. Serial with objectui#13107 (PR #13112), on the same family.
Claim: PM loop round 16 (priority:p3)
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-13116-listview-namefield
Worktree: objectui-issue-13116
Domain: domain:ui
Seat: domain:ui#2
File surface:
packages/plugin-list/src/ListView.tsx: the $select harvest (addSpeculative) adds declaredNameField(objectDef) beside the rowColor and referenceVia arms, through the same projection gates. It is fetched, not drawn.
Tests beside it.
One .changeset/13116-listview-namefield.md (@object-ui/plugin-listpatch).
⛔ No new package export. Stop on breach; explain in the report.
Container & model: S, mode:subagent, model: opus (default tier; no path-derived mandate over this surface)
Clause-②: no (an internal request projection)
Responsibility: ListView's harvest has no nameField arm | objectui#13107's grid harvest and resolver floor are the precedent | every ungrouped list whose nameField is not a column (the bulk confirm step shows Record #ID)
Thread-read: 6283015920
Serial constraints cleared: objectui#13107 (PR #13112, 4b67746) landed. No open objectui PR touches these files (read at 04:27Z).
Claimed at: 2026-10-20T04:28Z
os-dev-report
{
"issue": 13116,
"status": "done",
"branch": "claude/issue-13116-listview-namefield",
"pr": "#13158",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB (subagent; the parent's id)",
"premise_still_valid": true,
"summary": "Premise held on origin/main ed28057: ListView.tsx had 0 nameField reads in its $select harvest. Added one arm, addSpeculative(declaredNameField(objectDef)), beside the referenceVia arm; declaredNameField is the same @object-ui/core helper ObjectGrid getSelectFields uses (plugin-list already imports core, so no new dependency or export). It passes the known-field and FLS gates inside addSpeculative, joins the projection only (not drawn), and required is a Set so a column nameField is not duplicated. Pin (a)'s confirm-step half is asked of the dialog's rule (recordDisplayValueAt(row, declaredNameField(def)) then getRecordDisplayName) on the rows handed to a stub grid, because plugin-list does not depend on plugin-grid; the real dialog stays pinned in plugin-grid bulkConfirmNameField-13107.test.tsx.",
"tests": "Head 00aa971. New file packages/plugin-list/src/tests/ListView.nameFieldSelect-13116.test.tsx: 3 passed (VERDICT command-exit 0). $select family (26 plugin-list test files that name $select, new one included): Test Files 26 passed (26), Tests 430 passed (430), exit 0. Full packages/plugin-list/ dir: NOT MEASURED, reason: ran past the 560s foreground timeout on the shared lock (exit 124, no verdict line), declared to CI. Closure build pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-list^...' build: exit 0. pnpm --filter @object-ui/plugin-list run type-check (tsc --noEmit && tsc -p tsconfig.test.json): exit 0; --listFiles on tsconfig.test.json lists the new test (1 hit). ESLint --no-inline-config --format json on the 2 changed .tsx files: 2 files, 0 errors; ListView.tsx 205 warnings, equal to origin/main's 205; config not type-aware, so no untouched-file verdict moves. Battery exit 0: check: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, check-hand-rolled-comment-mask.mjs, check-changeset-fixed.mjs, check-changeset-presence.mjs, check:new-line-citations (0 new). check:spec-floors exit 1 (no-artifact, workspace not fully built), recorded not fixed. Ablation via objectstack scripts/ablation-replace.mjs --delete on anchor 'addSpeculative(declaredNameField(objectDef));': anchor 1 to 0, blob ecffd5bc77e4 to 978e1d188f1f; pin (a) red (expected [ 'first_name', 'id', …(2) ] to deeply equal [ 'first_name', 'full_name', …(3) ]), 1 failed 2 passed; restored blob == HEAD blob ecffd5bc77e4 (git hash-object compared, non-empty), git diff HEAD empty, anchor count back to 1. No dist rebuild needed: the subject is imported by relative path from src.",
"mcp_calls": "0",
"api_writes": "3 — fleet-write relay: pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST /issues/13158/assignees, one dispatch); os-dev-report comment POST /repos//issues/13116/comments. Plus 2 git pushes (not REST). Zero label writes (objectui labeler owns path labels; dispatch named none).",
"open_questions": [],
"out_of_scope_findings": [],
"gates": "build exit 0; type-check exit 0; new test exit 0; $select family exit 0; plugin-list full dir NOT MEASURED (timeout, declared to CI); lint narrowed exit 0; battery all exit 0; spec-floors exit 1 (no-artifact, pre-existing); changeset-fixed exit 0; changeset-presence exit 0",
"files_changed": [
"packages/plugin-list/src/ListView.tsx",
"packages/plugin-list/src/tests/ListView.nameFieldSelect-13116.test.tsx",
".changeset/13116-listview-namefield.md"
],
"deviations": "Pin (a) 'the bulk confirm step lists the names' is asserted through the dialog's own rule on the rows handed to a stub grid, not the rendered BulkActionDialog: plugin-list has no plugin-grid dependency and the dispatch forbids new surface. Full package directory run declared to CI after timeout."
}
Clause-②: no. This is an internal request projection; no export, prop or key moves. No contract review is owed, and the seat read the report.
Seat review:
One arm, addSpeculative(declaredNameField(objectDef)), sits beside the referenceVia arm. It uses the same @object-ui/core helper that plugin-grid's getSelectFields uses (objectui#13107), with no new dependency.
It passes addSpeculative's known-field and FLS gates and joins the projection only, so it is fetched, not drawn. required is a Set, so a nameField that is also a column is not sent twice.
Pins: (a) an ungrouped list with a formula full_name not a column: $select carries it, and the rows named by the dialog's rule give the names. (b) Controls: an object with no nameField, and a nameField that is a column. The ablation (arm deleted) turned (a) red with the controls green, and the restore was proven by blob.
Deviation accepted: the confirm-step half is checked through the dialog's own naming rule on the rows handed to a stub grid, because plugin-list does not depend on plugin-grid. The real dialog stays pinned in objectui#13107's bulkConfirmNameField-13107.
Changeset: @object-ui/plugin-listpatch.
CI: all 36 check-runs completed on the head, 33 passed and 3 skipped.
Path fork: no governed path, 184 changed lines. Seat landing.
Findings: none.
Next: ready + auto-merge; landing is verified by content on main.
Verified by content: each of the 3 files the PR changes has the same blob at a57d80afe9 as at the accepted head 00aa971518. The merge message carries no model identifier.
Landed: an ungrouped ListView adds the declared nameField to its $select harvest, so its bulk confirm step names records by name, as the grid does since objectui#13107.
Activity
objectstack-fleet commentedon Oct 20, 2026
Triage: p3 ·
bug· lanedomain:ui(inherits objectui#13107) ·area:records·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-20T03:56ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch. Fresh read on objectui
origin/main4b67746498.Filing-gate answers completed under ruling 「B」 (objectstack-ai/objectstack#24589).
domain:uiseat, inpackages/plugin-list/src/ListView.tsx.ListView's harvest.Premise holds.
ListView.tsxonorigin/maincarries 0nameFieldreads, so its$selectharvest never asks for the declared name.Why p3. After objectui#13107, an ungrouped list's confirm step falls to the
Record #IDfloor, not a wrong name. A floor where a name was expected is a tax, so it sits one step below the parent's p2 (filing-gate.md:48).Shape: as the card says. The field is fetched, not drawn, through the same projection gates. Serial with objectui#13107 (PR #13112), on the same family.
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 16 (
priority:p3)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13116-listview-namefieldWorktree:
objectui-issue-13116Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/plugin-list/src/ListView.tsx: the$selectharvest (addSpeculative) addsdeclaredNameField(objectDef)beside therowColorandreferenceViaarms, through the same projection gates. It is fetched, not drawn..changeset/13116-listview-namefield.md(@object-ui/plugin-listpatch).⛔ No new package export. Stop on breach; explain in the report.
Container & model:
S,mode:subagent,model: opus(default tier; no path-derived mandate over this surface)Clause-②: no (an internal request projection)
Responsibility:
ListView's harvest has nonameFieldarm | objectui#13107's grid harvest and resolver floor are the precedent | every ungrouped list whosenameFieldis not a column (the bulk confirm step showsRecord #ID)Thread-read: 6283015920
Serial constraints cleared: objectui#13107 (PR #13112,
4b67746) landed. No open objectui PR touches these files (read at 04:27Z).Claimed at: 2026-10-20T04:28Z
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{
"issue": 13116,
"status": "done",
"branch": "claude/issue-13116-listview-namefield",
"pr": "#13158",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB (subagent; the parent's id)",
"premise_still_valid": true,
"summary": "Premise held on origin/main ed28057: ListView.tsx had 0 nameField reads in its $select harvest. Added one arm, addSpeculative(declaredNameField(objectDef)), beside the referenceVia arm; declaredNameField is the same @object-ui/core helper ObjectGrid getSelectFields uses (plugin-list already imports core, so no new dependency or export). It passes the known-field and FLS gates inside addSpeculative, joins the projection only (not drawn), and required is a Set so a column nameField is not duplicated. Pin (a)'s confirm-step half is asked of the dialog's rule (recordDisplayValueAt(row, declaredNameField(def)) then getRecordDisplayName) on the rows handed to a stub grid, because plugin-list does not depend on plugin-grid; the real dialog stays pinned in plugin-grid bulkConfirmNameField-13107.test.tsx.",
"tests": "Head 00aa971. New file packages/plugin-list/src/tests/ListView.nameFieldSelect-13116.test.tsx: 3 passed (VERDICT command-exit 0). $select family (26 plugin-list test files that name $select, new one included): Test Files 26 passed (26), Tests 430 passed (430), exit 0. Full packages/plugin-list/ dir: NOT MEASURED, reason: ran past the 560s foreground timeout on the shared lock (exit 124, no verdict line), declared to CI. Closure build pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-list^...' build: exit 0. pnpm --filter @object-ui/plugin-list run type-check (tsc --noEmit && tsc -p tsconfig.test.json): exit 0; --listFiles on tsconfig.test.json lists the new test (1 hit). ESLint --no-inline-config --format json on the 2 changed .tsx files: 2 files, 0 errors; ListView.tsx 205 warnings, equal to origin/main's 205; config not type-aware, so no untouched-file verdict moves. Battery exit 0: check: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, check-hand-rolled-comment-mask.mjs, check-changeset-fixed.mjs, check-changeset-presence.mjs, check:new-line-citations (0 new). check:spec-floors exit 1 (no-artifact, workspace not fully built), recorded not fixed. Ablation via objectstack scripts/ablation-replace.mjs --delete on anchor 'addSpeculative(declaredNameField(objectDef));': anchor 1 to 0, blob ecffd5bc77e4 to 978e1d188f1f; pin (a) red (expected [ 'first_name', 'id', …(2) ] to deeply equal [ 'first_name', 'full_name', …(3) ]), 1 failed 2 passed; restored blob == HEAD blob ecffd5bc77e4 (git hash-object compared, non-empty), git diff HEAD empty, anchor count back to 1. No dist rebuild needed: the subject is imported by relative path from src.",
"mcp_calls": "0",
"api_writes": "3 — fleet-write relay: pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST /issues/13158/assignees, one dispatch); os-dev-report comment POST /repos//issues/13116/comments. Plus 2 git pushes (not REST). Zero label writes (objectui labeler owns path labels; dispatch named none).",
"open_questions": [],
"out_of_scope_findings": [],
"gates": "build exit 0; type-check exit 0; new test exit 0; $select family exit 0; plugin-list full dir NOT MEASURED (timeout, declared to CI); lint narrowed exit 0; battery all exit 0; spec-floors exit 1 (no-artifact, pre-existing); changeset-fixed exit 0; changeset-presence exit 0",
"files_changed": [
"packages/plugin-list/src/ListView.tsx",
"packages/plugin-list/src/tests/ListView.nameFieldSelect-13116.test.tsx",
".changeset/13116-listview-namefield.md"
],
"deviations": "Pin (a) 'the bulk confirm step lists the names' is asserted through the dialog's own rule on the rows handed to a stub grid, not the rendered BulkActionDialog: plugin-list has no plugin-grid dependency and the dispatch forbids new surface. Full package directory run declared to CI after timeout."
}
objectstack-fleet commentedon Oct 20, 2026
ACCEPT — PR #13158 @
00aa971518b7e31d3e5de4c857b67ea25c26e372·domain:uiseat 2 (session_01XVp19E1MYUTFM3dnkwz8gB)addSpeculative(declaredNameField(objectDef)), sits beside thereferenceViaarm. It uses the same@object-ui/corehelper thatplugin-grid'sgetSelectFieldsuses (objectui#13107), with no new dependency.addSpeculative's known-field and FLS gates and joins the projection only, so it is fetched, not drawn.requiredis a Set, so anameFieldthat is also a column is not sent twice.full_namenot a column:$selectcarries it, and the rows named by the dialog's rule give the names. (b) Controls: an object with nonameField, and anameFieldthat is a column. The ablation (arm deleted) turned (a) red with the controls green, and the restore was proven by blob.plugin-listdoes not depend onplugin-grid. The real dialog stays pinned in objectui#13107'sbulkConfirmNameField-13107.@object-ui/plugin-listpatch.Next: ready + auto-merge; landing is verified by content on
main.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gBmaina57d80afe9.a57d80afe9as at the accepted head00aa971518. The merge message carries no model identifier.ListViewadds the declarednameFieldto its$selectharvest, so its bulk confirm step names records by name, as the grid does since objectui#13107.pm:dispatchedis removed.Generated by Claude Code