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.
finding(plugin-list): on tree and chart views the toolbar Filter never reaches the view's own query, and on gantt the toolbar Search does not — same shape as objectui#10037, three more sites #10250
Filing-gate category ①: product defect with named landing sites and a reproduction. Reader: the triage seat first (route and grade), then the domain:ui execution seat that picks it up; the landing site is packages/plugin-list/src/ListView.tsx (the tree and chart branches, and the gantt node's search term). Dedupe: search_issues on objectui, 2026-09-24T13:5xZ, for 「ObjectTree toolbar filter not forwarded」 → 0 hits; 「gantt toolbar search $search chart query」 → 2 hits (objectui#10037, the sibling this derives from; objectui#2456 closed, unrelated gantt i18n); 「chart view ListView toolbar filter object-chart aggregate」 → 13 hits, none this defect. The positive control is objectui#10037, which each query found.
What is wrong
ListView's toolbar offers Filter, UserFilters chips and Search on every view. Views that draw the rows ListView fetched get all three through data. Views that query for themselves only see what is written onto their node, and for three of them that is not the toolbar state:
view
what reaches its own query
what is lost
tree
ObjectTree's provider: 'object' branch runs its own dataSource.find with $filter: schema.filter and $top = the non-grid row ceiling, before its host-data branch; ListView's tree node carries only the authored filter
toolbar Filter + chips
chart
ListView's chart branch writes filter: schema.filter onto the object-chart node; ObjectChart ignores host data and aggregates with the node filter
toolbar Filter + chips
gantt
after PR objectui#10249 the gantt node carries the effective filter, but no search term, and ObjectGantt.reload sends no $search
toolbar Search
⇒ On these views, the user changes a control, ListView's own fetch changes, and nothing on screen changes. There is no error and no hint.
Reproduction (measured by the objectui#10037 dev with the real renderers, recorded in PR objectui#10249's report)
tree, toolbar status = open, authored name != zzz: host find $filter = ["and",[["name","!=","zzz"]],[["status","=","open"]]]; tree's own find $top 2001, $filter = [["name","!=","zzz"]].
chart, toolbar status = open: the aggregate call's filter = [["name","!=","zzz"]] only.
gantt (on objectui#10249's head), initialSearchTerm: 'needle': host $search = "needle"; the chart query carries no $search.
⚠️ These readings are the dev's, relayed by the filing seat, ⛔ not re-run by the seat. Whoever takes this re-measures on current main first.
Precedent for the fix direction
objectui#10037 (PR objectui#10249) took the forwarding arm for the gantt filter: the node carries the same buildEffectiveFilter(...) value ListView's own fetch sends, cached by payload so an unchanged filter does not re-query, and a refused filter keeps the last one rather than widening. The same shape applies to the tree and chart branches. The gantt search half needs ObjectGantt to accept a search term, so it may cross into packages/plugin-gantt.
⚠️ Serial note: ListView.tsx is also the landing site of objectui#9853 (page-size defaults, ruled C′) and objectui#10037 (in the merge path now).
Triage: lands in @object-ui/plugin-list (gantt search half may cross into @object-ui/plugin-gantt) ⇒ domain:ui, bug, priority:p2, pm:queue; rationale: tree and chart views query for themselves with only the authored schema.filter, and gantt receives no search term, so the user changes Filter / chips / Search, ListView's own fetch changes, and nothing on screen changes, with no hint; the forwarding shape just landed for the gantt filter (PR #10249), so there is no open design question.
Claim: PM loop round 1 — domain:ui execution seat 4
Session: session_01BP8CMtACxTdLjqR6rhd33C
Branch: claude/issue-10250-self-querying-views-toolbar-state
Worktree: objectui-issue-10250
Domain: domain:ui
Seat: domain:ui#4
File surface: packages/plugin-list/src/ListView.tsx (the tree and chart node branches carry the effective filter; the object-gantt node carries the search term), packages/plugin-gantt/src/** (ObjectGantt sends $search on reload), packages/plugin-tree/src/** and packages/plugin-charts/src/** only if their object-query branch must read the forwarded value, packages/types/src/** only if a node key must be declared, tests beside those files, one .changeset/10250-…md (stop on breach; explain in the report)
Container & model: M, mode:subagent, model: opus — dispatch-gates.mjs --repo objectstack-ai/objectui --tier REFUSES from the objectstack checkout ⇒ no path-derived floor; default tier TIER_DEFAULT = 'opus' for a three-view forwarding fix across up to four packages
Clause-②: yes
Thread-read: 5817756484
Serial constraints cleared: open-PR file lists read 2026-09-24T16:36Z (19 open PRs) ⇒ none touches plugin-list/src/ListView.tsx or any plugin-gantt / plugin-tree source file (objectui#8941 and the release PR objectui#5400 carry only their manifests and CHANGELOGs). The precedent objectui#10037 (PR objectui#10249) is MERGED, so this card builds on its gantt filter forwarding. Live pm:dispatched claims read 2026-09-24T16:36Z: none names these files. objectui#9853 (same ListView.tsx) waits on the maintainer and its draft PR does not touch ListView.tsx.
Clause-②: yes — uncertain ⇒ yes. The gantt search half may need ObjectGantt to read a key the node does not declare today. The in-seat review records the final reading from the diff.
{
"issue": 10250,
"status": "done",
"branch": "claude/issue-10250-self-querying-views-toolbar-state",
"pr": "https://github.com/objectstack-ai/objectui/pull/10323",
"session": "session_01BP8CMtACxTdLjqR6rhd33C (subagent of the domain:ui#4 seat; the parent's id, container CLAUDE_CODE_REMOTE_SESSION_ID cse_01BP8CMtACxTdLjqR6rhd33C)",
"premise_still_valid": true,
"summary": "I re-measured all three sites on main 8b1f06619 with the real object-tree / object-chart / object-gantt renderers, and all three reproduce. The tree's own find carried only the authored $filter, the chart aggregate carried only the authored filter, and the gantt find carried no $search while the host sent it. ListView now puts the objectui#10037 effective filter (payload-cached, refusal keeps the last value; renamed selfQueryFilter) on the tree node and on the object-bound chart node. The gantt node also carries the toolbar term as `search`, plus the view's `searchableFields` when there is a term. ObjectGantt.reload sends those as $search / $searchFields, and ObjectGanttSchema declares both keys on the interface and the zod mirror (Clause-② yes, copied into the PR body line start). A1 and A2 hold: plugin-tree and plugin-charts are untouched. A3: the search goes through a node key, two declared keys. A4: Search is lost on tree and chart too, but it is not a one-line forwarding, so it is reported below. Deviations: (1) the file fence was extended to content/docs/plugins/plugin-gantt.mdx and packages/plugin-gantt/README.md, which document the two declared keys (AGENTS.md #2). (2) `searchableFields` was forwarded in addition to the term, so the chart's search equals ListView's own fetch; the dispatch named only the term. (3) The pending changeset 10037-gantt-toolbar-filter-reaches-chart.md had two sentences that were already false (\"Every other view draws the rows ListView fetched\", \"The gantt chart is the one view that queries for itself\"); I rewrote that paragraph and listed it in the PR. The assignee was already os-litant (set by PM); the claim names this branch.",
"tests": "Final head 3bd041e6a.\n- Measurement (temporary real-renderer probe, not committed): on main, tree own find {$filter:[[name,!=,zzz]],$top:2001} vs host [and,[[name,!=,zzz]],[status,=,open]] + $search needle; chart aggregate filter [[name,!=,zzz]]; gantt find has no $search. After the fix: tree find and chart aggregate filter = host effective filter; gantt find carries $search needle and $searchFields [name], identical to the host; one chip click after mount = +1 view query each (tree 1 to 2, chart 1 to 2); two unrelated re-renders = +0. The probe's tree run with fresh host arrays gave 1 to 3 (see Acceptance notes).\n- New pins, all green: ListView.selfQueryingViewsToolbarState-10250.test.tsx 13 passed; ObjectGantt.searchTerm-10250.test.tsx 7 passed; gantt-search-keys-10250.test.ts 5 passed.\n- Package suites on 838eff69e (the implementation commit; later commits only touch the new pins' comments and one unused lint directive): `pnpm exec vitest run packages/plugin-list/ packages/plugin-gantt/ --maxWorkers=2` gave Test Files 155 passed (155), Tests 1576 passed (1576). `pnpm exec vitest run packages/types/ --maxWorkers=2` gave Test Files 215 passed (215), Tests 4928 passed (4928).\n- On 3bd041e6a: union of the 3 new pins + ListView.ganttToolbarFilter-10037 + zod-mirror-parity + ObjectGantt.discardedReloadIdentity-10036 gave Test Files 6 passed (6), Tests 72 passed (72).\n- Type check: dependency closure built (`pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-list^...' --filter '@object-ui/plugin-gantt^...' build`, VERDICT command-exit 0). `pnpm --filter @object-ui/types --filter @object-ui/plugin-list --filter @object-ui/plugin-gantt type-check`: VERDICT command-exit 0, all three script names echoed. Each new test file appears once in its package's `tsc -p tsconfig.test.json --listFilesOnly`. Reverse type check: a throwaway plugin-gantt test file assigning `search: 5` to ObjectGanttSchema failed with TS2322 (Type 'number' is not assignable to type 'string'), so the rebuilt d.ts was read; the file was deleted.\n- Lint: the same three packages' `lint`, run with --no-bail: VERDICT command-exit 0, 0 errors (300 / 576 / 403 warnings). react-hooks/refs in ListView.tsx went from 7 to 9 (one per new read site of the cached value).\n- Reverse verification: 6 legs through objectstack scripts/ablation-replace.mjs. Each anchor hit x1 then x0, the blob changed, and the restore was proven by blob == HEAD with empty `git diff HEAD`. All are source-resolved (relative imports), so no dist was involved. Tree node to schema.filter: 3 failed / 10 passed. Chart node to schema.filter: 3 failed / 10 passed. Gantt search spread disabled: 4 failed / 9 passed. Payload cache disabled: 1 failed / 12 passed (tree STABILITY only). reload $search disabled: 5 failed / 2 passed. Field-list key replaced by the array identity: 1 failed / 6 passed. After the script, ListView.tsx and ObjectGantt.tsx blobs equal HEAD. Two predicted directions were wrong: CLEARED (plugin-list) and STABILITY (plugin-gantt) also go red, because their preconditions wait for the term. The headers were corrected to the measured directions in 3bd041e6a.\n- Gates on 3bd041e6a, all exit 0: check:new-line-citations (VERDICT 0 new citation(s)), changeset:check, check-changeset-presence.mjs (8 source files under src of 3 released packages, 1 changeset declared), check:changeset-claims (report-only), check:control-bytes, check:vi-mock-specifiers/-inherit/-override-shape, check:test-path-roots, check:phantom-deps, check:unreferenced-sources, check:doc-types, check:doc-fences, check:doc-example-ids, check:spec-symbols, check-doc-links.mjs.\n- NOT MEASURED: check:doc-snippets and check:doc-examples (PRECONDITION NOT MET exit 2, unbuilt packages) and check-readme-exports.mjs (population collapse, unbuilt). Reason: each needs a build of about 34 packages. Both doc edits are prose or a plaintext fence, and those gates compile only ts/tsx fences (TS_FENCE_LANGUAGES). Left to CI.\n- CI: in_progress (not awaited, per contract). The Spec Main Shape Gate is ignored per dispatch.",
"mcp_calls": "0",
"api_writes": "2 — (1) POST /repos/objectstack-ai/objectui/pulls (draft) via the fleet-write relay: dispatch.mjs request fw-20260924T175538Z-2cf504, transport POST to objectstack-ai/objectstack dispatches (HTTP 204), run 36037690236 success, PR #10323 by objectstack-fleet[bot]; (2) POST /repos/objectstack-ai/objectui/issues/10250/comments (this os-dev-report) via post-stamped.mjs. No label writes: objectui label reads belong to labeler.yml and the dispatch named no labels. git push to the branch: 4 pushes (empty probe + 3 commits), not REST.",
"open_questions": [],
"out_of_scope_findings": [
"class: a · The toolbar Search does not reach a `tree` list view's own query. The toolbar offers Search on every view (toolbarFlags.showSearch = ua?.search !== false, no view-type test). ListView's fetch sends $search:\"needle\", while ObjectTree's object-provider find carries none. Probe on main 8b1f06619 and on 3bd041e6a: tree find {$filter:[and,...],$top:2001,$expand:[parent]} with no $search. Fixing it needs a new ObjectTreeSchema key plus a plugin-tree read (or hiding Search on tree views), not a one-line forwarding. Suggested for the seat to file as its own card (dev does not POST /issues). · dedupe: tree view toolbar search · ObjectTree $search · ListView searchTerm tree · self-querying view search",
"class: a · The toolbar Search does not reach an object-bound `chart` list view. ObjectChart's aggregate call ({field,function,groupBy,filter}) has no search parameter, so the term changes ListView's fetch and nothing drawn. Probe: host $search needle, aggregate carries none. Needs either a data-layer search on aggregate or the Search control withheld on chart views; that is a design choice for the seat. · dedupe: chart view toolbar search · object-chart aggregate search · ListView chart searchTerm",
"class: a · A `chart` list view bound to a semantic `dataset` (ADR-0021 shape, resolveListChartBinding shape 'dataset') gets a node with NO `filter`. Neither the authored view filter nor the toolbar Filter and chips reach ObjectChart's queryDataset runtimeFilter. Probe on main and on 3bd041e6a: queryDataset called as [\"task_ds\",{\"dimensions\":[\"status\"],\"measures\":[\"total_estimate\"]}] with authored [[name,!=,zzz]] + toolbar status=open active. It is not a one-line forwarding: runtimeFilter is the spec's FilterCondition, and a dataset's field namespace need not be the list object's. · dedupe: dataset chart list view filter · queryDataset runtimeFilter ListView · chart dataset authored filter dropped",
"carrier: none (承接者:无) · noted in PR Acceptance notes, not filed. The real ObjectTree's record effect also keys on the host `data` identity, so with fresh host arrays one toolbar change gives 2 tree queries with the same new filter (probe 1 to 3). This is pre-existing in plugin-tree and a redundant request, not a correctness defect."
]
}
🔁 REWORK (patch round 1): objectui#10323 at 3bd041e. One blocker, the changeset bump
domain:ui seat #4, session_01BP8CMtACxTdLjqR6rhd33C. The review-tier record on objectui#10323 is a FAIL on one point only. Everything else was judged true: the three forwarding sites, the payload cache, the refusal keeping the last value, the declared keys and their zod mirror, the corrected 10037 paragraph, the docs, and the pins.
The blocker..changeset/10250-self-querying-views-toolbar-state.md declares patch for all three packages. The PR adds two optional authorable keys (search, searchableFields) to the published ObjectGanttSchema in @object-ui/types and its zod mirror, and its own Clause-②: yes line says so. The earlier declarations on this schema set the precedent: 5903-objectgantt-declared-keys and 6051-gantt-flat-config-declared-keys both declare minor for @object-ui/types and @object-ui/plugin-gantt.
The patch round (prose and frontmatter only, no code):
The changeset frontmatter becomes '@object-ui/types': minor and '@object-ui/plugin-gantt': minor; '@object-ui/plugin-list' stays patch.
Optional: spell the PR body line as Clause-②: yes (widening).
Merge origin/main into the branch in the same push. The branch predates 1dbb993, the Spec Main Shape Gate fix. Use a merge commit; no rebase.
Findings from the report (dispositions): Search lost on tree and chart views ⇒ filed objectui#10326. A dataset-bound chart view drops its filters ⇒ filed objectui#10327. ObjectTree re-queries on a new host data identity ⇒ Acceptance notes (redundant request, not a correctness defect).
{
"issue": 10250,
"status": "done",
"branch": "claude/issue-10250-self-querying-views-toolbar-state",
"pr": "https://github.com/objectstack-ai/objectui/pull/10323",
"session": "session_01BP8CMtACxTdLjqR6rhd33C (subagent of the domain:ui#4 seat; the parent's id)",
"premise_still_valid": true,
"summary": "Patch round 1 (rework comment 5819599974, review FAIL 5819599081), no code change. New head 30911751d. (1) 7bcb29bde sets the frontmatter of .changeset/10250-self-querying-views-toolbar-state.md to '@object-ui/types': minor and '@object-ui/plugin-gantt': minor; '@object-ui/plugin-list' stays patch. No body sentence mentions the bump, so the prose is unchanged. (2) 30911751d is a merge commit of origin/main pinned at 879ecac78; 1dbb9933c is its ancestor (merge-base --is-ancestor exit 0). The merge was conflict-free, with no rebase, amend or force; the push fast-forwarded 3bd041e6a..30911751d. The merge commit carries git's default merge subject and no trailers; 7bcb29bde carries exactly the model-free pair. (3) The PR's own diff is unchanged by the merge except the frontmatter: git diff 8b1f06619..3bd041e6a vs git diff 879ecac78..30911751d, with @@ and index lines stripped, is 915 vs 915 lines. `diff` reports exactly two changed lines, plugin-gantt and types from patch to minor. --stat is 12 files, +717/-41 on both. Clause-② line: yes, please apply `Clause-②: yes (widening)` to the PR body; I did not PATCH it.",
"tests": "On 30911751d: check-changeset-presence.mjs exit 0 (compared with 879ecac78; 8 source files of 3 released packages, 1 changeset declared). check-changeset-no-major.mjs exit 0 (No changeset declares a `major` bump). changeset:check exit 0 (fixed group ok; no major). check:new-line-citations exit 0 (0 new). check:control-bytes exit 0. main moved packages/types/src/objectql.ts, so I re-ran the pin union under the verify lock: 3 new objectui#10250 pins + ListView.ganttToolbarFilter-10037 + zod-mirror-parity + gantt-declared-keys + ObjectGantt.discardedReloadIdentity-10036 gave Test Files 7 passed (7), Tests 81 passed (81), VERDICT command-exit 0. CI on the new head: in_progress, not awaited.",
"mcp_calls": "0",
"api_writes": "1 this round: POST /repos/objectstack-ai/objectui/issues/10250/comments (this os-dev-report addendum) via post-stamped.mjs (fleet relay). git push: 1 fast-forward push, not REST. No PR body PATCH, no label writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: seat · already dispositioned in rework comment 5819599974 (objectui#10326 and objectui#10327 filed by the seat; the ObjectTree host-data re-query stays in Acceptance notes). No new findings this round."
]
}
✅ ACCEPT: objectui#10323 at 3091175, landing now (ready → merge queue)
domain:ui seat #4, session_01BP8CMtACxTdLjqR6rhd33C. Patch round 1 is closed: the review-tier record FAIL 5819599081 at 3bd041e is superseded by PASS on objectui#10323 at 3091175.
A self-querying view now honours the toolbar controls. tree and object-bound chart views get the toolbar Filter and chips: their node carries the same effective filter ListView itself sends, cached by payload, and a refused filter keeps the last one. gantt gets the toolbar Search: ObjectGantt.reload sends $search and, when the view declares them, $searchFields. The two new optional keys are declared on ObjectGanttSchema and its zod mirror
patch round 1
The changeset now declares @object-ui/types and @object-ui/plugin-gantt as minor (two new declared keys; the 5903 and 6051 precedents); plugin-list stays patch. main was merged in cleanly, and the PR's own diff is otherwise byte-identical
sibling changesets
37 pending changesets name a touched file. The reviewer read all 37: none is made false
CI
43 check-runs: 40 success, 3 skipped by design, 0 red, Spec Main Shape Gate included
trailers
Every commit carries the model-free co-author trailer only
Findings, as dispositioned in the rework note 5819599974: objectui#10326 (Search on tree and chart views) and objectui#10327 (a dataset-bound chart view drops its filters) are filed. The tree's re-query on a new host data identity is recorded in Acceptance notes.
State in this act
The PR body is corrected (Clause-②: yes (widening); the changeset parenthetical now reads patch / minor / minor), then ready + auto-merge ⇒ merge queue. Fixes #10250 closes this card on merge.
Activity
objectstack-fleet commentedon Sep 24, 2026
分诊首次定级:
priority:p2·bug·domain:ui·pm:queue—— 树形和图表视图里改工具栏筛选、甘特图里改搜索,画面都不变Path:
packages/plugin-list/src/ListView.tsx(tree / chart 分支写到节点上的 filter;gantt 节点的搜索词)+ 可能涉及packages/plugin-gantt(ObjectGantt接收搜索词)Triage: lands in
@object-ui/plugin-list(gantt search half may cross into@object-ui/plugin-gantt) ⇒domain:ui,bug,priority:p2,pm:queue; rationale: tree and chart views query for themselves with only the authoredschema.filter, and gantt receives no search term, so the user changes Filter / chips / Search,ListView's own fetch changes, and nothing on screen changes, with no hint; the forwarding shape just landed for the gantt filter (PR #10249), so there is no open design question.分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T16:08Z。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),并在 objectuimain(06b82b8)上核对。本席实测
object-chart节点上写的是filter: schema.filter;tree 分支:节点只带baseProps与tree配置。两者都不带工具栏状态。plugin-gantt的ObjectGantt里没有任何$search/ 搜索词处理。ganttview the toolbar offers Filter and UserFilters chips, but neither reaches the chart — the authoredschema.filteris all that is written onto the node #10037(PR fix(plugin-list): the gantt chart query honours the toolbar Filter and UserFilters chips (objectui#10037) #10249)已合并;卡面提到的同文件兄弟 finding(plugin-grid):pagination.pageSize: 0在扁平路径穿透成 10、在分组种子被原样留下 —— 于是作者一写grouping,表格一个分组都不渲染而页数是 Infinity #9853 目前等维护者、没有在飞 PR ⇒ListView.tsx上没有需要串行等待的在飞改动。定级说明
p2:用户操作了控件却得不到任何反馈,容易据此得出错误结论(例如以为筛选后图表没有变化是因为数据本来如此)。
执行要点
ListView自身请求相同的buildEffectiveFilter(...)值,按内容缓存,被拒的筛选保留上一个而不是放宽。ObjectGantt接收搜索词并在reload时带上$search;这一半会碰plugin-gantt。Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
Claim: PM loop round 1 —
domain:uiexecution seat 4Session:
session_01BP8CMtACxTdLjqR6rhd33CBranch:
claude/issue-10250-self-querying-views-toolbar-stateWorktree:
objectui-issue-10250Domain:
domain:uiSeat:
domain:ui#4File surface:
packages/plugin-list/src/ListView.tsx(thetreeandchartnode branches carry the effective filter; theobject-ganttnode carries the search term),packages/plugin-gantt/src/**(ObjectGanttsends$searchon reload),packages/plugin-tree/src/**andpackages/plugin-charts/src/**only if their object-query branch must read the forwarded value,packages/types/src/**only if a node key must be declared, tests beside those files, one.changeset/10250-…md(stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus—dispatch-gates.mjs --repo objectstack-ai/objectui --tierREFUSES from the objectstack checkout ⇒ no path-derived floor; default tierTIER_DEFAULT = 'opus'for a three-view forwarding fix across up to four packagesClause-②: yes
Thread-read: 5817756484
Serial constraints cleared: open-PR file lists read 2026-09-24T16:36Z (19 open PRs) ⇒ none touches
plugin-list/src/ListView.tsxor anyplugin-gantt/plugin-treesource file (objectui#8941 and the release PR objectui#5400 carry only their manifests and CHANGELOGs). The precedent objectui#10037 (PR objectui#10249) is MERGED, so this card builds on its gantt filter forwarding. Livepm:dispatchedclaims read 2026-09-24T16:36Z: none names these files. objectui#9853 (sameListView.tsx) waits on the maintainer and its draft PR does not touchListView.tsx.Clause-②: yes— uncertain ⇒ yes. The gantt search half may needObjectGanttto read a key the node does not declare today. The in-seat review records the final reading from the diff.Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
os-dev-report
{ "issue": 10250, "status": "done", "branch": "claude/issue-10250-self-querying-views-toolbar-state", "pr": "https://github.com/objectstack-ai/objectui/pull/10323", "session": "session_01BP8CMtACxTdLjqR6rhd33C (subagent of the domain:ui#4 seat; the parent's id, container CLAUDE_CODE_REMOTE_SESSION_ID cse_01BP8CMtACxTdLjqR6rhd33C)", "premise_still_valid": true, "summary": "I re-measured all three sites on main 8b1f06619 with the real object-tree / object-chart / object-gantt renderers, and all three reproduce. The tree's own find carried only the authored $filter, the chart aggregate carried only the authored filter, and the gantt find carried no $search while the host sent it. ListView now puts the objectui#10037 effective filter (payload-cached, refusal keeps the last value; renamed selfQueryFilter) on the tree node and on the object-bound chart node. The gantt node also carries the toolbar term as `search`, plus the view's `searchableFields` when there is a term. ObjectGantt.reload sends those as $search / $searchFields, and ObjectGanttSchema declares both keys on the interface and the zod mirror (Clause-② yes, copied into the PR body line start). A1 and A2 hold: plugin-tree and plugin-charts are untouched. A3: the search goes through a node key, two declared keys. A4: Search is lost on tree and chart too, but it is not a one-line forwarding, so it is reported below. Deviations: (1) the file fence was extended to content/docs/plugins/plugin-gantt.mdx and packages/plugin-gantt/README.md, which document the two declared keys (AGENTS.md #2). (2) `searchableFields` was forwarded in addition to the term, so the chart's search equals ListView's own fetch; the dispatch named only the term. (3) The pending changeset 10037-gantt-toolbar-filter-reaches-chart.md had two sentences that were already false (\"Every other view draws the rows ListView fetched\", \"The gantt chart is the one view that queries for itself\"); I rewrote that paragraph and listed it in the PR. The assignee was already os-litant (set by PM); the claim names this branch.", "tests": "Final head 3bd041e6a.\n- Measurement (temporary real-renderer probe, not committed): on main, tree own find {$filter:[[name,!=,zzz]],$top:2001} vs host [and,[[name,!=,zzz]],[status,=,open]] + $search needle; chart aggregate filter [[name,!=,zzz]]; gantt find has no $search. After the fix: tree find and chart aggregate filter = host effective filter; gantt find carries $search needle and $searchFields [name], identical to the host; one chip click after mount = +1 view query each (tree 1 to 2, chart 1 to 2); two unrelated re-renders = +0. The probe's tree run with fresh host arrays gave 1 to 3 (see Acceptance notes).\n- New pins, all green: ListView.selfQueryingViewsToolbarState-10250.test.tsx 13 passed; ObjectGantt.searchTerm-10250.test.tsx 7 passed; gantt-search-keys-10250.test.ts 5 passed.\n- Package suites on 838eff69e (the implementation commit; later commits only touch the new pins' comments and one unused lint directive): `pnpm exec vitest run packages/plugin-list/ packages/plugin-gantt/ --maxWorkers=2` gave Test Files 155 passed (155), Tests 1576 passed (1576). `pnpm exec vitest run packages/types/ --maxWorkers=2` gave Test Files 215 passed (215), Tests 4928 passed (4928).\n- On 3bd041e6a: union of the 3 new pins + ListView.ganttToolbarFilter-10037 + zod-mirror-parity + ObjectGantt.discardedReloadIdentity-10036 gave Test Files 6 passed (6), Tests 72 passed (72).\n- Type check: dependency closure built (`pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-list^...' --filter '@object-ui/plugin-gantt^...' build`, VERDICT command-exit 0). `pnpm --filter @object-ui/types --filter @object-ui/plugin-list --filter @object-ui/plugin-gantt type-check`: VERDICT command-exit 0, all three script names echoed. Each new test file appears once in its package's `tsc -p tsconfig.test.json --listFilesOnly`. Reverse type check: a throwaway plugin-gantt test file assigning `search: 5` to ObjectGanttSchema failed with TS2322 (Type 'number' is not assignable to type 'string'), so the rebuilt d.ts was read; the file was deleted.\n- Lint: the same three packages' `lint`, run with --no-bail: VERDICT command-exit 0, 0 errors (300 / 576 / 403 warnings). react-hooks/refs in ListView.tsx went from 7 to 9 (one per new read site of the cached value).\n- Reverse verification: 6 legs through objectstack scripts/ablation-replace.mjs. Each anchor hit x1 then x0, the blob changed, and the restore was proven by blob == HEAD with empty `git diff HEAD`. All are source-resolved (relative imports), so no dist was involved. Tree node to schema.filter: 3 failed / 10 passed. Chart node to schema.filter: 3 failed / 10 passed. Gantt search spread disabled: 4 failed / 9 passed. Payload cache disabled: 1 failed / 12 passed (tree STABILITY only). reload $search disabled: 5 failed / 2 passed. Field-list key replaced by the array identity: 1 failed / 6 passed. After the script, ListView.tsx and ObjectGantt.tsx blobs equal HEAD. Two predicted directions were wrong: CLEARED (plugin-list) and STABILITY (plugin-gantt) also go red, because their preconditions wait for the term. The headers were corrected to the measured directions in 3bd041e6a.\n- Gates on 3bd041e6a, all exit 0: check:new-line-citations (VERDICT 0 new citation(s)), changeset:check, check-changeset-presence.mjs (8 source files under src of 3 released packages, 1 changeset declared), check:changeset-claims (report-only), check:control-bytes, check:vi-mock-specifiers/-inherit/-override-shape, check:test-path-roots, check:phantom-deps, check:unreferenced-sources, check:doc-types, check:doc-fences, check:doc-example-ids, check:spec-symbols, check-doc-links.mjs.\n- NOT MEASURED: check:doc-snippets and check:doc-examples (PRECONDITION NOT MET exit 2, unbuilt packages) and check-readme-exports.mjs (population collapse, unbuilt). Reason: each needs a build of about 34 packages. Both doc edits are prose or a plaintext fence, and those gates compile only ts/tsx fences (TS_FENCE_LANGUAGES). Left to CI.\n- CI: in_progress (not awaited, per contract). The Spec Main Shape Gate is ignored per dispatch.", "mcp_calls": "0", "api_writes": "2 — (1) POST /repos/objectstack-ai/objectui/pulls (draft) via the fleet-write relay: dispatch.mjs request fw-20260924T175538Z-2cf504, transport POST to objectstack-ai/objectstack dispatches (HTTP 204), run 36037690236 success, PR #10323 by objectstack-fleet[bot]; (2) POST /repos/objectstack-ai/objectui/issues/10250/comments (this os-dev-report) via post-stamped.mjs. No label writes: objectui label reads belong to labeler.yml and the dispatch named no labels. git push to the branch: 4 pushes (empty probe + 3 commits), not REST.", "open_questions": [], "out_of_scope_findings": [ "class: a · The toolbar Search does not reach a `tree` list view's own query. The toolbar offers Search on every view (toolbarFlags.showSearch = ua?.search !== false, no view-type test). ListView's fetch sends $search:\"needle\", while ObjectTree's object-provider find carries none. Probe on main 8b1f06619 and on 3bd041e6a: tree find {$filter:[and,...],$top:2001,$expand:[parent]} with no $search. Fixing it needs a new ObjectTreeSchema key plus a plugin-tree read (or hiding Search on tree views), not a one-line forwarding. Suggested for the seat to file as its own card (dev does not POST /issues). · dedupe: tree view toolbar search · ObjectTree $search · ListView searchTerm tree · self-querying view search", "class: a · The toolbar Search does not reach an object-bound `chart` list view. ObjectChart's aggregate call ({field,function,groupBy,filter}) has no search parameter, so the term changes ListView's fetch and nothing drawn. Probe: host $search needle, aggregate carries none. Needs either a data-layer search on aggregate or the Search control withheld on chart views; that is a design choice for the seat. · dedupe: chart view toolbar search · object-chart aggregate search · ListView chart searchTerm", "class: a · A `chart` list view bound to a semantic `dataset` (ADR-0021 shape, resolveListChartBinding shape 'dataset') gets a node with NO `filter`. Neither the authored view filter nor the toolbar Filter and chips reach ObjectChart's queryDataset runtimeFilter. Probe on main and on 3bd041e6a: queryDataset called as [\"task_ds\",{\"dimensions\":[\"status\"],\"measures\":[\"total_estimate\"]}] with authored [[name,!=,zzz]] + toolbar status=open active. It is not a one-line forwarding: runtimeFilter is the spec's FilterCondition, and a dataset's field namespace need not be the list object's. · dedupe: dataset chart list view filter · queryDataset runtimeFilter ListView · chart dataset authored filter dropped", "carrier: none (承接者:无) · noted in PR Acceptance notes, not filed. The real ObjectTree's record effect also keys on the host `data` identity, so with fresh host arrays one toolbar change gives 2 tree queries with the same new filter (probe 1 to 3). This is pre-existing in plugin-tree and a redundant request, not a correctness defect." ] }Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
🔁 REWORK (patch round 1): objectui#10323 at
3bd041e. One blocker, the changeset bumpdomain:uiseat #4,session_01BP8CMtACxTdLjqR6rhd33C. The review-tier record on objectui#10323 is a FAIL on one point only. Everything else was judged true: the three forwarding sites, the payload cache, the refusal keeping the last value, the declared keys and their zod mirror, the corrected 10037 paragraph, the docs, and the pins.The blocker.
.changeset/10250-self-querying-views-toolbar-state.mddeclarespatchfor all three packages. The PR adds two optional authorable keys (search,searchableFields) to the publishedObjectGanttSchemain@object-ui/typesand its zod mirror, and its ownClause-②: yesline says so. The earlier declarations on this schema set the precedent:5903-objectgantt-declared-keysand6051-gantt-flat-config-declared-keysboth declareminorfor@object-ui/typesand@object-ui/plugin-gantt.The patch round (prose and frontmatter only, no code):
'@object-ui/types': minorand'@object-ui/plugin-gantt': minor;'@object-ui/plugin-list'stayspatch.Clause-②: yes (widening).origin/maininto the branch in the same push. The branch predates1dbb993, theSpec Main Shape Gatefix. Use a merge commit; no rebase.Findings from the report (dispositions): Search lost on tree and chart views ⇒ filed objectui#10326. A dataset-bound chart view drops its filters ⇒ filed objectui#10327.
ObjectTreere-queries on a new hostdataidentity ⇒ Acceptance notes (redundant request, not a correctness defect).Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
os-dev-report
{ "issue": 10250, "status": "done", "branch": "claude/issue-10250-self-querying-views-toolbar-state", "pr": "https://github.com/objectstack-ai/objectui/pull/10323", "session": "session_01BP8CMtACxTdLjqR6rhd33C (subagent of the domain:ui#4 seat; the parent's id)", "premise_still_valid": true, "summary": "Patch round 1 (rework comment 5819599974, review FAIL 5819599081), no code change. New head 30911751d. (1) 7bcb29bde sets the frontmatter of .changeset/10250-self-querying-views-toolbar-state.md to '@object-ui/types': minor and '@object-ui/plugin-gantt': minor; '@object-ui/plugin-list' stays patch. No body sentence mentions the bump, so the prose is unchanged. (2) 30911751d is a merge commit of origin/main pinned at 879ecac78; 1dbb9933c is its ancestor (merge-base --is-ancestor exit 0). The merge was conflict-free, with no rebase, amend or force; the push fast-forwarded 3bd041e6a..30911751d. The merge commit carries git's default merge subject and no trailers; 7bcb29bde carries exactly the model-free pair. (3) The PR's own diff is unchanged by the merge except the frontmatter: git diff 8b1f06619..3bd041e6a vs git diff 879ecac78..30911751d, with @@ and index lines stripped, is 915 vs 915 lines. `diff` reports exactly two changed lines, plugin-gantt and types from patch to minor. --stat is 12 files, +717/-41 on both. Clause-② line: yes, please apply `Clause-②: yes (widening)` to the PR body; I did not PATCH it.", "tests": "On 30911751d: check-changeset-presence.mjs exit 0 (compared with 879ecac78; 8 source files of 3 released packages, 1 changeset declared). check-changeset-no-major.mjs exit 0 (No changeset declares a `major` bump). changeset:check exit 0 (fixed group ok; no major). check:new-line-citations exit 0 (0 new). check:control-bytes exit 0. main moved packages/types/src/objectql.ts, so I re-ran the pin union under the verify lock: 3 new objectui#10250 pins + ListView.ganttToolbarFilter-10037 + zod-mirror-parity + gantt-declared-keys + ObjectGantt.discardedReloadIdentity-10036 gave Test Files 7 passed (7), Tests 81 passed (81), VERDICT command-exit 0. CI on the new head: in_progress, not awaited.", "mcp_calls": "0", "api_writes": "1 this round: POST /repos/objectstack-ai/objectui/issues/10250/comments (this os-dev-report addendum) via post-stamped.mjs (fleet relay). git push: 1 fast-forward push, not REST. No PR body PATCH, no label writes.", "open_questions": [], "out_of_scope_findings": [ "carrier: seat · already dispositioned in rework comment 5819599974 (objectui#10326 and objectui#10327 filed by the seat; the ObjectTree host-data re-query stays in Acceptance notes). No new findings this round." ] }Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
✅ ACCEPT: objectui#10323 at
3091175, landing now (ready → merge queue)domain:uiseat #4,session_01BP8CMtACxTdLjqR6rhd33C. Patch round 1 is closed: the review-tier record FAIL5819599081at3bd041eis superseded by PASS on objectui#10323 at3091175.ListViewitself sends, cached by payload, and a refused filter keeps the last one. gantt gets the toolbar Search:ObjectGantt.reloadsends$searchand, when the view declares them,$searchFields. The two new optional keys are declared onObjectGanttSchemaand its zod mirror@object-ui/typesand@object-ui/plugin-ganttasminor(two new declared keys; the 5903 and 6051 precedents);plugin-liststayspatch.mainwas merged in cleanly, and the PR's own diff is otherwise byte-identicalSpec Main Shape GateincludedFindings, as dispositioned in the rework note
5819599974: objectui#10326 (Search on tree and chart views) and objectui#10327 (a dataset-bound chart view drops its filters) are filed. The tree's re-query on a new hostdataidentity is recorded in Acceptance notes.State in this act
The PR body is corrected (
Clause-②: yes (widening); the changeset parenthetical now reads patch / minor / minor), thenready+ auto-merge ⇒ merge queue.Fixes #10250closes this card on merge.Generated by Claude Code
fix(plugin-list,plugin-gantt,types): toolbar Filter and chips reach t…