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.

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

Closed

Description

@objectstack-fleet

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/main 96fcf30, 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/main 96fcf30)

Ask

  • Give getSelectFields a rowColor arm through the same known-field and FLS gate its other added fields use.
  • Pin it beside PR fix(plugin-list): ListView projects the row colour's field (objectui#12376) #12392's ListView.rowColorSelect-12376 pin, with a grouped grid whose rowColor.field is not a column. Ablate once.
  • 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.

Dedupe words: ObjectGrid rowColor select grouped; grid owns fetch rowColor field; projection rowColor plugin-grid.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade · bug · priority:p2 · domain:ui · area:records · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T22:54Z

    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.

  2. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Oct 14, 2026
  3. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  5. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — objectui PR #12408 · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-15T01:46Z

    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.
    • Fetch dependency (A2): the fetch effect now names 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): ObjectGrid and ListView harvest $select operands from conditionalFormatting / rowActionDefs / bulkActionDefs (and the grid's $searchFields from searchableFields) outside their fetch effects' dependencies #10689 precedent. A dependency ablation turns only the re-read test red.
    • Ask ②: ListView.gridRowColorSelect-12393 sits beside the plugin-list: ListView's $select harvest has no rowColor arm, 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, whose rowColor.field is not a column; rowColorProjection-12393 covers a standalone grid (6 tests).
    • 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).

    Next: pr_ready + automerge_enable.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-15T02:00Z


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions