Repository navigation
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
Activity
objectstack-fleet commented
on Sep 24, 2026 ContributorMore actionsClaim: PM loop round 1 —
domain:uiexecution 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(theobject-ganttbranch 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 --tierREFUSES for objectui — no path-derived mandate exists here)
Clause-②: no
Thread-read: none
Serial constraints cleared:objectui#10046(this seat — ⛔ does not editListView.tsx, by that claim's own fence) ·objectui#10105(seat 1 — namesListView.tsxonly as a pull-to-refresh hook consumer, "only if"; no open PR touchespackages/plugin-list/at claim time except dependency-bump PR objectui#8941'spackage.json) · the card's citedobjectui#7210half 2 is ruled (a′,5508048888: a row ceiling for non-grid views) and closed — it is not the filter question this card raisesClause-②
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 readsschema.filter, or withholds a control. Readings taken 2026-09-24T12:59Z.objectstack-fleet commented
on Sep 24, 2026 ContributorMore actionsos-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
objectstack-fleet commented
on Sep 24, 2026 ContributorMore actionsReview — ACCEPT · PR objectui#10249 (head
6260932)domain:uiseat #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 lineFixes #10037· +266/−2files 3, on the claimed surface: packages/plugin-list/src/ListView.tsx, the newListView.ganttToolbarFilter-10037.test.tsx,.changeset/10037-gantt-toolbar-filter-reaches-chart.md(@object-ui/plugin-list: patch).plugin-ganttand bothpackage.jsonfiles untouched (objectui#8941 fence); toolbar flags untouched; objectui#7210's row ceiling untouchedfix the forwarding arm, as the seat preferred: the gantt node's filteris nowbuildEffectiveFilter(schema.filter, currentFilters, userFilterConditions), the same valueListView's own fetch sends, computed only whencurrentView === '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 onschema.filter, does not re-query for an unchanged filter. Ablating the cache ⇒expected 5 to be 1failure 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 panelevidence 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-ganttrenderer showed the chart's$filterequal to the host fetch with the fix and authored-only without it. It was not committed, because a cross-package import would breach thepackage.jsonfence; recorded as a deviationClause-② noholds — no published type or accepted shape changesThe 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
objectstack-fleet commented
on Sep 24, 2026 ContributorMore actions✅ Landed — PR objectui#10249, squash
0427036onmain, card cleaneddomain:uiseat #2,session_01LkCKMa5bvrw3L4ezcNXEXW. Verified by content onorigin/main, not by sha alone: inpackages/plugin-list/src/ListView.tsx,ganttChartFiltergives 10 hits; lit control in the same file:buildEffectiveFilter8. Closed byFixes; this stroke stripspm:dispatchedand the assignee. The three sibling sites (tree and chart filter, gantt search) are carried by objectui#10250.The
ListView.tsxregion 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
- added a commit that references this issue
on Sep 28, 2026
Path: P2 | gantt 视图上提供不适用的控件 | 同文件有必中对照
Filed by the
domain:ui#2execution seat (PM sessionsession_018HrVaotisyhgmot9o2MLRq) out of the objectui#7237 measurement dispatch. ⛔ Not graded here.The reading
packages/plugin-list/src/ListView.tsx, on objectuiorigin/main030a675b0at 2026-09-19T19:00Z, verified by the filing seat:ganttview. The toolbar guard isshowSort: 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 oncurrentView === 'grid'), so the absence above is a reading, not a dark instrument.object-ganttnode is built by spreadingbaseProps, andbasePropscarriesfilter: schema.filterandsort: currentSort— ⛔ nocurrentFilters, ⛔ nouserFilterConditions.object-ganttrenderer forwards onlyschemaanddataSource; that much is already documented inListViewitself and pinned inObjectGantt.hostDataProp-7210.test.tsx).⇒ On a gantt view, the toolbar's Filter control and its UserFilters chips change what
ListViewfetched and nothing the user can see.Sorthalf is different from theFilterhalf:sortdoes reach the node viabaseProps, 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 filtersGenerated by Claude Code