Skip to content

finding(plugin-list): on a gantt view the toolbar offers Filter and UserFilters chips, but neither reaches the chart — the authored schema.filter is all that is written onto the node #10037

Description

@os-tesla

Path: P2 | gantt 视图上提供不适用的控件 | 同文件有必中对照

Filed by the domain:ui#2 execution seat (PM session session_018HrVaotisyhgmot9o2MLRq) out of the objectui#7237 measurement dispatch. ⛔ Not graded here.

The reading

packages/plugin-list/src/ListView.tsx, on objectui origin/main 030a675b0 at 2026-09-19T19:00Z, verified by the filing seat:

  1. The controls ARE offered on a gantt view. The toolbar guard is showSort: ua?.sort !== false / showFilters: ua?.filter !== false — ⛔ neither carries a view-type test. ⭐ The must-hit control is in the same file: a view-gated sibling does exist (the inline-edit button, guarded on currentView === 'grid'), so the absence above is a reading, not a dark instrument.
  2. What actually reaches the chart is only the AUTHORED filter. The object-gantt node is built by spreading baseProps, and baseProps carries filter: schema.filter and sort: currentSort — ⛔ no currentFilters, ⛔ no userFilterConditions.
  3. The chart issues its own query (the registered object-gantt renderer forwards only schema and dataSource; that much is already documented in ListView itself and pinned in ObjectGantt.hostDataProp-7210.test.tsx).

⇒ On a gantt view, the toolbar's Filter control and its UserFilters chips change what ListView fetched and nothing the user can see.

⚠️ Two honest boundaries

  • ⛔ This is not a proposal to forward the host filters. Whether host props may reach a non-grid chart is, on the filing seat's reading, plausibly the same question objectui#7210 half 2 holds open as a maintainer decision. ⛔ The filing seat does not dedupe (that is the triage seat's act) — it hands the words over.
  • The Sort half is different from the Filter half: sort does reach the node via baseProps, so touching Sort on a gantt has an effect (it is the objectui#7237 teardown path). It is the Filter affordance that is dead.

查重词

ListView user filters gantt · currentFilters not forwarded · object-gantt host props · objectui#7210 half 2 · non-grid view filters


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1 — domain:ui execution seat 2
    Session: session_01LkCKMa5bvrw3L4ezcNXEXW
    Branch: claude/issue-10037-gantt-toolbar-filter
    Worktree: objectui-issue-10037
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/plugin-list/src/ListView.tsx (the object-gantt branch and the toolbar-flag block only), its tests, packages/plugin-gantt/src/ only if the chart cannot take the filter it is handed, one .changeset/10037-…md (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (default judgement tier; dispatch-gates.mjs --tier REFUSES for objectui — no path-derived mandate exists here)
    Clause-②: no
    Thread-read: none
    Serial constraints cleared: objectui#10046 (this seat — ⛔ does not edit ListView.tsx, by that claim's own fence) · objectui#10105 (seat 1 — names ListView.tsx only as a pull-to-refresh hook consumer, "only if"; no open PR touches packages/plugin-list/ at claim time except dependency-bump PR objectui#8941's package.json) · the card's cited objectui#7210 half 2 is ruled (a′, 5508048888: a row ceiling for non-grid views) and closed — it is not the filter question this card raises

    Clause-② no: whichever arm is taken, no published type or accepted shape changes — the fix either routes the toolbar's own filter state to a chart that already reads schema.filter, or withholds a control. Readings taken 2026-09-24T12:59Z.

  2. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 10037,
      "status": "done",
      "branch": "claude/issue-10037-gantt-toolbar-filter",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10249",
      "session": "session_01LkCKMa5bvrw3L4ezcNXEXW",
      "premise_still_valid": true,
      "summary": "The card's reading holds on origin/main a78cd37. The gantt node spread baseProps (filter: schema.filter only), and the registered object-gantt renderer queries for itself with $filter: schema.filter, so the toolbar Filter and the UserFilters chips never reached the chart. Forwarding arm taken: ListView.tsx now computes ganttChartFilter (only on the gantt view), which is the same buildEffectiveFilter value ListView's own fetch sends. It is cached by its serialised payload in a ref, so ObjectGantt's reload effect, keyed on schema.filter, does not re-query for an unchanged filter (AGENTS.md #10). A FilterOperatorError keeps the last filter rather than widening to no filter. The gantt branch writes filter: ganttChartFilter. Toolbar flags are unchanged, the objectui#7210 row ceiling is untouched, and plugin-gantt is untouched. PM ZONE-2 item 2 was partly falsified by measurement: tree and chart ALSO ignore the toolbar filter (see out_of_scope_findings). Item 3's stale 'open maintainer decision' sentences are outside the edited blocks and are recorded as a PR Acceptance note. Assignee field was not touched. The claim 5814595736 was confirmed as the newest Claim and names this branch. No labels were written: the dispatch named none, and in objectui no gate reads them.",
      "tests": "Final head 6260932 (merge of origin/main 0aacecc08, no plugin-list/plugin-gantt overlap). NEW pin packages/plugin-list/src/__tests__/ListView.ganttToolbarFilter-10037.test.tsx: 4 passed. Its object-gantt stand-in reads { schema } only and queries $filter: schema.filter, keyed on schema.filter; the assertions read the CHART query. ABLATION 1 (ablation-replace.mjs --delete of 'filter: ganttChartFilter,', anchor 1->0, blob 08cd0ca4 -> 2fa76934, restored blob == HEAD, git diff HEAD empty): 3 failed / 1 passed. Both FORWARDS cases failed, and STABILITY failed too because its precondition waits for the forwarded condition; I had predicted only the two FORWARDS cases would fail, so this is the direction actually observed. CONTROL stayed green. ABLATION 2 (cache disabled, anchor 1->0, restored == HEAD): 1 failed / 3 passed, STABILITY 'expected 5 to be 1'. One-time REAL-renderer proof (a temporary probe importing @object-ui/plugin-gantt, deleted, not committed): with the fix, the chart $filter was [\"and\",[[\"owner\",\"=\",\"ada\"]],[\"status\",\"=\",\"open\"],[\"priority\",\"=\",\"high\"]], equal to the host fetch; with the defect (the same deletion), the chart $filter was [[\"owner\",\"=\",\"ada\"]] while the host carried all three. GATES on 6260932, exit codes captured to files: vitest run packages/plugin-list/ exit 0 (83 files / 1009 tests passed); pnpm --filter @object-ui/plugin-list type-check exit 0 after building the dependency closure with turbo build --filter='@object-ui/plugin-list^...' (exit 0); tsconfig.test.json lists the new test (--listFilesOnly count 1); pnpm --filter @object-ui/plugin-list lint exit 0 (0 errors, 558 pre-existing warnings); check:vi-mock-specifiers 0, check:vi-mock-inherit 0, check:vi-mock-override-shape 0, check:changeset-claims 0 (report-only; the listed paragraphs about ListView.tsx were re-read and none is falsified), check:new-line-citations 0 ('0 new citation(s)'), check:control-bytes 0, check:test-path-roots 0, check:phantom-deps 0, changeset:check 0, check:unreferenced-sources 0, check-changeset-presence.mjs 0 ('2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset'). NOT MEASURED: the full CI farm (e2e, dist, other packages' shards) is left to CI; PR CI state at report time: in_progress.",
      "mcp_calls": "0 — no MCP GitHub tool used",
      "api_writes": "2 — (1) POST /repos/objectstack-ai/objectui/pulls (draft, via fleet-write relay run 36006798586, as objectstack-fleet[bot]) -> PR 10249; (2) POST /repos/objectstack-ai/objectui/issues/10037/comments (this os-dev-report, via post-stamped). Plus git push of the branch (not REST).",
      "gates": "vitest packages/plugin-list 0; plugin-list type-check 0; plugin-list lint 0; check:vi-mock-specifiers 0; check:vi-mock-inherit 0; check:vi-mock-override-shape 0; check:changeset-claims 0; check:new-line-citations 0; check:control-bytes 0; check:test-path-roots 0; check:phantom-deps 0; changeset:check 0; check:unreferenced-sources 0; check-changeset-presence 0 — all on 6260932",
      "files_changed": [
        "packages/plugin-list/src/ListView.tsx (modified)",
        "packages/plugin-list/src/__tests__/ListView.ganttToolbarFilter-10037.test.tsx (added)",
        ".changeset/10037-gantt-toolbar-filter-reaches-chart.md (added, '@object-ui/plugin-list': patch)"
      ],
      "line_budget": "not applicable — no skills/** or governed surface touched",
      "deviations": "Real-renderer end-to-end proof kept as a one-time probe, not a committed test: a committed plugin-list test importing @object-ui/plugin-gantt would be an undeclared cross-package import, and package.json is fenced by objectui#8941. The committed pin uses a contract stand-in instead. Otherwise none.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a · tree list view ignores the toolbar Filter: ObjectTree's provider 'object' branch runs its own dataSource.find with $filter: schema.filter and $top NON_GRID_ROW_CEILING_TOP BEFORE the host-data branch, and ListView's tree node carries only the authored filter. Probe (real plugin-tree renderer, toolbar status equals open, authored name != zzz): host find $filter [\"and\",[[\"name\",\"!=\",\"zzz\"]],[\"status\",\"=\",\"open\"]], tree's own find $top 2001 $filter [[\"name\",\"!=\",\"zzz\"]]. Same shape as objectui#10037; the fix here is gantt-only, and the same effective-filter forwarding would apply to the tree branch. The record-count footer on tree also describes the host page rather than the drawn query (the objectui#7210 footer class). · dedupe: ListView tree toolbar filter · ObjectTree own query schema.filter · tree view currentFilters not forwarded · non-grid view filters",
        "class: a · chart list view ignores the toolbar Filter: ListView's chart branch writes filter: schema.filter onto the object-chart node, and ObjectChart ignores host data (it reads only schema.data or bound data) and aggregates with the node filter. Probe (real plugin-charts renderer, toolbar status equals open): aggregate call filter [[\"name\",\"!=\",\"zzz\"]] only. · dedupe: ListView chart view toolbar filter · object-chart filter schema.filter · chart view currentFilters",
        "class: a · toolbar Search on a gantt view does not reach the chart: ListView's fetch sends $search, the gantt node carries no search term and ObjectGantt.reload sends no $search. Probe on the fixed head with initialSearchTerm 'needle': host $search \"needle\", chart query $search absent. The toolbar search flag (ua?.search !== false) has no view-type test. · dedupe: gantt toolbar search · ListView searchTerm gantt · object-gantt \\$search"
      ]
    }

    Generated by Claude Code

  3. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Review — ACCEPT · PR objectui#10249 (head 6260932)

    domain:ui seat #2, session_01LkCKMa5bvrw3L4ezcNXEXW. Checked against GitHub (PR metadata, file list and diff), not against the report's own account.

    check reading
    form draft · base main · body first line Fixes #10037 · +266/−2
    files 3, on the claimed surface: packages/plugin-list/src/ListView.tsx, the new ListView.ganttToolbarFilter-10037.test.tsx, .changeset/10037-gantt-toolbar-filter-reaches-chart.md (@object-ui/plugin-list: patch). plugin-gantt and both package.json files untouched (objectui#8941 fence); toolbar flags untouched; objectui#7210's row ceiling untouched
    fix the forwarding arm, as the seat preferred: the gantt node's filter is now buildEffectiveFilter(schema.filter, currentFilters, userFilterConditions), the same value ListView's own fetch sends, computed only when currentView === 'gantt'
    stability the forwarded value is cached by its serialised payload in a ref (not by memo identity, AGENTS.md §5 #10), so ObjectGantt's reload effect, keyed on schema.filter, does not re-query for an unchanged filter. Ablating the cache ⇒ expected 5 to be 1
    failure mode a refused filter (FilterOperatorError) keeps the last forwarded filter, or the authored one before any; it never widens to no filter. ListView's own fetch raises the same refusal into its load-error panel
    evidence the pin reads the chart's query. Ablating the forwarding line ⇒ 3 red / control green. A one-time probe against the real @object-ui/plugin-gantt renderer showed the chart's $filter equal to the host fetch with the fix and authored-only without it. It was not committed, because a cross-package import would breach the package.json fence; recorded as a deviation
    Clause-② no holds — no published type or accepted shape changes

    The PM's Zone-2 item 2 was partly falsified, and recorded here as such: the gantt is not the only view that ignores the toolbar. Tree and chart do too, and the gantt also ignores toolbar search. These are class-a findings outside this card's acceptance; the seat files them as one card (same defect form, three sites) rather than widening this PR.

    Acceptance note: ListView.tsx's older comment calling objectui#7210 half 2 "an open maintainer decision" is stale (ruled a′, 5508048888). It sits outside the edited blocks and is left for the next edit of that block.

    readings taken 2026-09-24T13:39Z


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    ✅ Landed — PR objectui#10249, squash 0427036 on main, card cleaned

    domain:ui seat #2, session_01LkCKMa5bvrw3L4ezcNXEXW. Verified by content on origin/main, not by sha alone: in packages/plugin-list/src/ListView.tsx, ganttChartFilter gives 10 hits; lit control in the same file: buildEffectiveFilter 8. Closed by Fixes; this stroke strips pm:dispatched and the assignee. The three sibling sites (tree and chart filter, gantt search) are carried by objectui#10250.

    The ListView.tsx region this seat held is released ⇒ objectui#9853 (deferred behind it) is now dispatchable by this seat.

    readings taken 2026-09-24T14:02Z


    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

No one assigned

    Labels

    bugSomething 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