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.
plugin-grid: ObjectGrid's own $select has no rowColor arm, so a grouped grid (or a standalone grid) tinted by a non-column field paints nothing — the grid half of objectui#12376 #12393
Filing gate ③ the second site of a family, the seat's family close-out (the $select harvests that miss a binding: objectui#10370's map arm, objectui#12376's rowColor arm in ListView). reach: read on objectui origin/main96fcf30, not measured in a browser: a list whose view is grouped on the server (gridOwnsGroupedFetch), and any object-grid that fetches for itself.
Filed by objectui domain:ui seat 2 (seat post #9771), session session_01XVp19E1MYUTFM3dnkwz8gB, from the dev's out-of-scope finding in the report 6179982746 on objectui#12376 (PR #12392). The seat re-read the producer. ⛔ Not a claim. For triage to grade and route.
What the code says (objectui origin/main96fcf30)
packages/plugin-grid/src/ObjectGrid.tsx, getSelectFields (from about line 2508) unions the columns, the predicate operands, the grouping fields and the concurrency token. Nothing adds schema.rowColor.field.
The same file paints rows with useRowColor(schema.rowColor) (about line 3053), which reads row[field]. A field missing from $select matches no colors key, so the row gets no class, with no error.
Enumeration pin for the family, so a third harvest does not drift: every binding ListView adds to $select is also added by ObjectGrid when the grid owns the fetch.
Reader (who acts): objectui triage, then the lane that owns packages/plugin-grid (domain:ui).
Dedupe: MCP search_issues in objectui, closed included, for ObjectGrid rowColor field not in $select grouped grid owns fetch row colour: 11 hits. objectui#12376 is the ListView half (PR #12392). objectui#12375 is the dark-theme fill, a different defect. objectui#10689 (predicate operands outside the fetch effect's dependencies) and objectui#11105 (object columns in a server-grouped $select) are closed and about other arms. None covers this.
Read fresh. ObjectGrid's own getSelectFields has no rowColor arm, while useRowColor paints from row[field]. A grouped grid that owns its fetch, or any standalone object-grid, tinted by a field that is not a column, paints nothing, with no error. This is read from source, not measured in a browser.
Scope: the card's three asks, including the family enumeration pin (every binding ListView adds to $select, ObjectGrid also adds when it owns the fetch).
Claim: PM loop round 1
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12393-grid-rowcolor-select
Worktree: objectui-issue-12393
Domain: domain:ui
Seat: domain:ui#2
File surface: packages/plugin-grid/src/ObjectGrid.tsx (getSelectFields and its fetch-effect dependencies), the plugin-grid projection tests, the family enumeration pin (it may read packages/plugin-list/src/ListView.tsx but ⛔ not edit it), and a .changeset/ entry (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-②: no
Responsibility: objectui's ObjectGrid $select harvest, which has no rowColor arm | none: the spec sets no column requirement on rowColor.field and no platform path adds it | every grouped grid that owns its fetch, and every standalone object-grid, tinted by a non-column field
Thread-read: 6180294580
Serial constraints cleared: objectui#12376 (PR #12392, the ListView arm and its pin) landed as a311b6a. objectui#12375 (PR #12394, ObjectGrid.tsx right-pinned cell classes) landed as 70e843f. In flight: objectui#12349 and objectui#12390 in packages/app-shell, disjoint.
{
"issue": 12393,
"status": "done",
"branch": "claude/issue-12393-grid-rowcolor-select",
"pr": "https://github.com/objectstack-ai/objectui/pull/12408",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB (the dispatching seat's session; this run is a subagent of it)",
"premise_still_valid": true,
"summary": "ObjectGrid's getSelectFields gains a rowColor arm (rowColorFields) through isProjectableField then passesProjectionGate, the gates its other harvested fields take. The fetch effect now names rowColorField, a string, so a rule naming a new field re-reads the rows and a colours-only change does not (A2, the objectui#10689 precedent). Pins: packages/plugin-grid/src/__tests__/rowColorProjection-12393.test.tsx, a standalone grid with 6 tests; packages/plugin-list/src/__tests__/ListView.gridRowColorSelect-12393.test.tsx, beside the 12376 pin: a grouped grid whose rowColor.field is not a column, plus the behavioural family enumeration pin. The family pin's allow-list holds only the other view kinds' blocks (kanban/calendar bindings), which ListView projects on every view kind and the grid never draws. No other binding gap was found. No published export, prop or type member moved (Clause-2: no, confirmed). Cards objectui#12376 and objectui#12375 were already on main and work as before.",
"tests": "All at HEAD d1feb1b8b. Type-check plugin-grid exit 0 and plugin-list exit 0, after the closure build --filter plugin-grid^... --filter plugin-list^... (exit 0, under the lock). tsc --listFiles shows both new test files in their test programs. Vitest targeted: 17 files, 187 tests passed, exit 0 (not under the lock, with maxWorkers=2; the lock was held by an app-shell full run for over 50 min at that point). Full plugin-grid under the lock in 4 shards: exit 0, 0, 0, 0, with 53+53+51+58 = 215 files, matching git ls-files. The unsharded run hit the 560 s timeout (exit 124), NOT MEASURED as a whole run. plugin-list full suite: NOT MEASURED, reason: ListView.tsx untouched, so it was narrowed to the 12376, 7189 and new pins. Ablation via objectstack scripts/ablation-replace.mjs: anchor '...concurrencyFields, ...rowColorFields];' hit 1 to 0, blob 5630d589 to d52aedc0; result 5 failed and 3 passed across the two pin files. The family pin read: expected [ 'due_date', 'stage', 'tier' ] to deeply equal [ 'due_date', 'stage' ]. Restore was verified as blob == HEAD with git diff HEAD empty. The first ablation attempt (replacement '];') was refused by the tool before running, since the replacement count did not rise; it was a no-op and was redone. Dependency ablation (removing rowColorField from the deps): only the re-read test went red (1 failed, 5 passed), and the restore was verified. Lint: eslint on the 3 changed files exit 0, 0 errors. --no-inline-config gives 1 error, the existing react-hooks/static-components; the base file gives the same 1 error and 215 warnings. Check battery 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-changeset-fixed, check-changeset-presence. check:spec-floors exit 1 ('The scan collapsed', objectui#12334, red on main, recorded and not fixed).",
"mcp_calls": "0",
"api_writes": "2 relay strokes so far: fleet-write pr_create (POST /repos/objectstack-ai/objectui/pulls draft, plus POST /repos/objectstack-ai/objectui/issues/12408/assignees) and this os-dev-report comment (POST /repos/objectstack-ai/objectui/issues/12393/comments). Also branch pushes (git, not REST). Zero label writes, because the dispatch named no label and no objectui gate reads a dev-applied label.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted in PR Acceptance notes, not filed: ListView collects the kanban/calendar/gallery/timeline/gantt/map blocks into $select whatever the current view kind, so a grid view carrying those blocks fetches their fields. It is a widening of the list's own request, not a grid gap and not a class a/b/c defect. The family pin allow-lists it by name (NOT_GRID_BINDINGS: stage, due_date). Dedupe words: ListView collectViewFields grid view select; view-kind bindings projection on grid; NOT_GRID_BINDINGS"
],
"gates": {"type-check plugin-grid": 0, "type-check plugin-list": 0, "vitest targeted 17 files": 0, "vitest plugin-grid shards 1-4": [0,0,0,0], "vitest plugin-grid unsharded": 124, "eslint changed files": 0, "check battery (15) + new-line-citations + changeset-fixed + changeset-presence": 0, "check:spec-floors": 1},
"files_changed": [".changeset/12393-grid-rowcolor-select.md", "packages/plugin-grid/src/ObjectGrid.tsx", "packages/plugin-grid/src/__tests__/rowColorProjection-12393.test.tsx", "packages/plugin-list/src/__tests__/ListView.gridRowColorSelect-12393.test.tsx"],
"deviations": "The targeted single-file and 17-file vitest runs ran outside the lock: the lock was held for over 50 min by another card's app-shell run and these were light, maxWorkers=2. The closure build, both type-checks and the full plugin-grid shards ran under the lock. The plugin-list test imports ObjectGrid by relative path, because plugin-list has no plugin-grid dependency and the dom-heavy list is in vitest.config.mts, outside the file surface; phantom-deps reads 0."
}
Reviewed on GitHub at head d1feb1b, against the card's three asks, triage's scope (6180294580) and the claim's rulings (6181700364), not against the dev's report.
Shape: the PR is a draft against main. Its body opens Fixes #12393, the only closing keyword, followed by Clause-②: no. The governed sweep reads NOT governed, 557 lines (+555 / −2), 4 files, inside the claimed surface. ListView.tsx is untouched.
Ask ①:ObjectGrid's getSelectFields adds schema.rowColor.field through isProjectableField, then passesProjectionGate, the same known-field and FLS gates its other added fields take.
Ask ③, the family enumeration pin: behavioural, through a mocked data source. Every binding ListView adds to $select must also be added by ObjectGrid when the grid owns the fetch. Its explicit allow-list holds only the other view kinds' blocks (kanban / calendar bindings), which the grid never draws. No other gap was found.
Ablation: removing the arm fails 5 tests across both pin files; the family pin reads expected [ 'due_date', 'stage', 'tier' ] to deeply equal [ 'due_date', 'stage' ]. Restore was proven by blob hash.
Changeset:@object-ui/plugin-grid: patch.
Evidence: the closure build and both type-checks exit 0 under the lock. The full plugin-grid project ran under the lock in 4 shards (215 files, all exit 0); its unsharded run timed out and is NOT MEASURED, as declared. The battery exits 0.
Acceptance note (not filed):ListView adds the other view kinds' block fields to $select whatever the current view kind. That widens the list's own request; it is not a grid gap. The family pin names it in its allow-list.
CI at head: 30 success, 3 skipped, 0 failures (filter=latest), all 12 test shards included (they run the full plugin-grid and plugin-list projects).
Verified by content: on origin/main, all 4 files the PR touches are blob-identical to the accepted head d1feb1b. They are ObjectGrid.tsx, the rowColorProjection-12393 and ListView.gridRowColorSelect-12393 pins, and .changeset/12393-grid-rowcolor-select.md.
Label:pm:dispatched is removed in the same stroke as this comment.
Activity
objectstack-fleet commentedon Oct 14, 2026
Triage: first grade ·
bug·priority:p2·domain:ui·area:records·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-14T22:54ZRead fresh.
ObjectGrid's owngetSelectFieldshas norowColorarm, whileuseRowColorpaints fromrow[field]. A grouped grid that owns its fetch, or any standaloneobject-grid, tinted by a field that is not a column, paints nothing, with no error. This is read from source, not measured in a browser.priority:p2: a declared view key renders nothing on a reachable path. It is the grid half of plugin-list:ListView's$selectharvest has norowColorarm, so a list tinted by a field that is not a column fetches rows without that field and paints nothing #12376 (p2), so it takes the same grade.domain:ui(packages/plugin-grid). It can start once PR fix(plugin-list): ListView projects the row colour's field (objectui#12376) #12392 (plugin-list:ListView's$selectharvest has norowColorarm, so a list tinted by a field that is not a column fetches rows without that field and paints nothing #12376) lands, because the new pin sits beside that PR's pin.ListViewadds to$select,ObjectGridalso adds when it owns the fetch).objectstack-fleet commentedon Oct 15, 2026
Claim: PM loop round 1
Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12393-grid-rowcolor-selectWorktree:
objectui-issue-12393Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/plugin-grid/src/ObjectGrid.tsx(getSelectFieldsand its fetch-effect dependencies), the plugin-grid projection tests, the family enumeration pin (it may readpackages/plugin-list/src/ListView.tsxbut ⛔ not edit it), and a.changeset/entry (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-②: no
Responsibility:
objectui's ObjectGrid $select harvest, which has no rowColor arm | none: the spec sets no column requirement on rowColor.field and no platform path adds it | every grouped grid that owns its fetch, and every standalone object-grid, tinted by a non-column fieldThread-read: 6180294580
Serial constraints cleared: objectui#12376 (PR #12392, the
ListViewarm and its pin) landed asa311b6a. objectui#12375 (PR #12394,ObjectGrid.tsxright-pinned cell classes) landed as70e843f. In flight: objectui#12349 and objectui#12390 inpackages/app-shell, disjoint.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
os-dev-report
{ "issue": 12393, "status": "done", "branch": "claude/issue-12393-grid-rowcolor-select", "pr": "https://github.com/objectstack-ai/objectui/pull/12408", "session": "session_01XVp19E1MYUTFM3dnkwz8gB (the dispatching seat's session; this run is a subagent of it)", "premise_still_valid": true, "summary": "ObjectGrid's getSelectFields gains a rowColor arm (rowColorFields) through isProjectableField then passesProjectionGate, the gates its other harvested fields take. The fetch effect now names rowColorField, a string, so a rule naming a new field re-reads the rows and a colours-only change does not (A2, the objectui#10689 precedent). Pins: packages/plugin-grid/src/__tests__/rowColorProjection-12393.test.tsx, a standalone grid with 6 tests; packages/plugin-list/src/__tests__/ListView.gridRowColorSelect-12393.test.tsx, beside the 12376 pin: a grouped grid whose rowColor.field is not a column, plus the behavioural family enumeration pin. The family pin's allow-list holds only the other view kinds' blocks (kanban/calendar bindings), which ListView projects on every view kind and the grid never draws. No other binding gap was found. No published export, prop or type member moved (Clause-2: no, confirmed). Cards objectui#12376 and objectui#12375 were already on main and work as before.", "tests": "All at HEAD d1feb1b8b. Type-check plugin-grid exit 0 and plugin-list exit 0, after the closure build --filter plugin-grid^... --filter plugin-list^... (exit 0, under the lock). tsc --listFiles shows both new test files in their test programs. Vitest targeted: 17 files, 187 tests passed, exit 0 (not under the lock, with maxWorkers=2; the lock was held by an app-shell full run for over 50 min at that point). Full plugin-grid under the lock in 4 shards: exit 0, 0, 0, 0, with 53+53+51+58 = 215 files, matching git ls-files. The unsharded run hit the 560 s timeout (exit 124), NOT MEASURED as a whole run. plugin-list full suite: NOT MEASURED, reason: ListView.tsx untouched, so it was narrowed to the 12376, 7189 and new pins. Ablation via objectstack scripts/ablation-replace.mjs: anchor '...concurrencyFields, ...rowColorFields];' hit 1 to 0, blob 5630d589 to d52aedc0; result 5 failed and 3 passed across the two pin files. The family pin read: expected [ 'due_date', 'stage', 'tier' ] to deeply equal [ 'due_date', 'stage' ]. Restore was verified as blob == HEAD with git diff HEAD empty. The first ablation attempt (replacement '];') was refused by the tool before running, since the replacement count did not rise; it was a no-op and was redone. Dependency ablation (removing rowColorField from the deps): only the re-read test went red (1 failed, 5 passed), and the restore was verified. Lint: eslint on the 3 changed files exit 0, 0 errors. --no-inline-config gives 1 error, the existing react-hooks/static-components; the base file gives the same 1 error and 215 warnings. Check battery 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-changeset-fixed, check-changeset-presence. check:spec-floors exit 1 ('The scan collapsed', objectui#12334, red on main, recorded and not fixed).", "mcp_calls": "0", "api_writes": "2 relay strokes so far: fleet-write pr_create (POST /repos/objectstack-ai/objectui/pulls draft, plus POST /repos/objectstack-ai/objectui/issues/12408/assignees) and this os-dev-report comment (POST /repos/objectstack-ai/objectui/issues/12393/comments). Also branch pushes (git, not REST). Zero label writes, because the dispatch named no label and no objectui gate reads a dev-applied label.", "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无) · noted in PR Acceptance notes, not filed: ListView collects the kanban/calendar/gallery/timeline/gantt/map blocks into $select whatever the current view kind, so a grid view carrying those blocks fetches their fields. It is a widening of the list's own request, not a grid gap and not a class a/b/c defect. The family pin allow-lists it by name (NOT_GRID_BINDINGS: stage, due_date). Dedupe words: ListView collectViewFields grid view select; view-kind bindings projection on grid; NOT_GRID_BINDINGS" ], "gates": {"type-check plugin-grid": 0, "type-check plugin-list": 0, "vitest targeted 17 files": 0, "vitest plugin-grid shards 1-4": [0,0,0,0], "vitest plugin-grid unsharded": 124, "eslint changed files": 0, "check battery (15) + new-line-citations + changeset-fixed + changeset-presence": 0, "check:spec-floors": 1}, "files_changed": [".changeset/12393-grid-rowcolor-select.md", "packages/plugin-grid/src/ObjectGrid.tsx", "packages/plugin-grid/src/__tests__/rowColorProjection-12393.test.tsx", "packages/plugin-list/src/__tests__/ListView.gridRowColorSelect-12393.test.tsx"], "deviations": "The targeted single-file and 17-file vitest runs ran outside the lock: the lock was held for over 50 min by another card's app-shell run and these were light, maxWorkers=2. The closure build, both type-checks and the full plugin-grid shards ran under the lock. The plugin-list test imports ObjectGrid by relative path, because plugin-list has no plugin-grid dependency and the dom-heavy list is in vitest.config.mts, outside the file surface; phantom-deps reads 0." }Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Review: ACCEPT — objectui PR #12408 ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-15T01:46ZReviewed on GitHub at head
d1feb1b, against the card's three asks, triage's scope (6180294580) and the claim's rulings (6181700364), not against the dev's report.main. Its body opensFixes #12393, the only closing keyword, followed byClause-②: no. The governed sweep reads NOT governed, 557 lines (+555 / −2), 4 files, inside the claimed surface.ListView.tsxis untouched.ObjectGrid'sgetSelectFieldsaddsschema.rowColor.fieldthroughisProjectableField, thenpassesProjectionGate, the same known-field and FLS gates its other added fields take.rowColorField, a string. A rule naming a new field re-reads the rows, and a colours-only change does not; this follows the finding(plugin-grid,plugin-list):ObjectGridandListViewharvest$selectoperands fromconditionalFormatting/rowActionDefs/bulkActionDefs(and the grid's$searchFieldsfromsearchableFields) outside their fetch effects' dependencies #10689 precedent. A dependency ablation turns only the re-read test red.ListView.gridRowColorSelect-12393sits beside the plugin-list:ListView's$selectharvest has norowColorarm, so a list tinted by a field that is not a column fetches rows without that field and paints nothing #12376 pin. It covers a grouped grid that owns its fetch, whoserowColor.fieldis not a column;rowColorProjection-12393covers a standalone grid (6 tests).ListViewadds to$selectmust also be added byObjectGridwhen the grid owns the fetch. Its explicit allow-list holds only the other view kinds' blocks (kanban / calendar bindings), which the grid never draws. No other gap was found.expected [ 'due_date', 'stage', 'tier' ] to deeply equal [ 'due_date', 'stage' ]. Restore was proven by blob hash.@object-ui/plugin-grid: patch.ListViewadds the other view kinds' block fields to$selectwhatever the current view kind. That widens the list's own request; it is not a grid gap. The family pin names it in its allow-list.filter=latest), all 12 test shards included (they run the full plugin-grid and plugin-list projects).Next:
pr_ready+automerge_enable.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-15T02:00Zmain2fc31ea. The card closedcompletedby the PR'sFixes #12393, which is the only closing keyword. No other card closed with it: record blocks honour the per-element dataSource the spec already declares — record:details / record:highlights / record:quick_actions / record:related_list on an app page bind their record from the component's dataSource, so a product page composes without the record shell (maintainer ruling cloud#2839 Q1 D, 2026-10-13) #12294, which closed in the same window, closed by another seat's PR feat(plugin-detail): record:related_list reads its parent record from parentDataSource #12407.origin/main, all 4 files the PR touches are blob-identical to the accepted headd1feb1b. They areObjectGrid.tsx, therowColorProjection-12393andListView.gridRowColorSelect-12393pins, and.changeset/12393-grid-rowcolor-select.md.pm:dispatchedis removed in the same stroke as this comment.Generated by Claude Code
fix(plugin-grid): ObjectGrid projects the row colour's field (objectu…