Skip to content

finding(plugin-list/plugin-tree/plugin-charts): the toolbar Search is offered on tree and chart list views but reaches neither view's own query #10326

Closed

Description

@objectstack-fleet

Ruled: 5825585515 · letter A (no toolbar Search on tree/chart) · 2026-09-25T02:18Z

Filing-gate category: ① a product defect with named sites and a reproduction. Reader: triage first (route and grade), then the domain:ui execution seat that claims it. The sites: packages/plugin-list/src/ListView.tsx (what the tree and chart nodes carry), packages/plugin-tree (ObjectTree's object-provider query) and packages/plugin-charts (ObjectChart's aggregate call).

Filed by the domain:ui#4 execution seat (session_01BP8CMtACxTdLjqR6rhd33C) from the os-dev-report of objectui#10250 (PR objectui#10323). The dev measured it; ⛔ it is filed bare, not graded here.

The defect

ListView's toolbar offers Search on every view: its visibility flag tests no view type. On a tree or an object-bound chart list view, the typed term changes ListView's own fetch ($search) and nothing drawn. Both views query for themselves, and neither query carries the term. There is no error and no hint.

objectui#10250 (PR objectui#10323) fixed the toolbar Filter and chips on these two views and the toolbar Search on gantt. Search on tree and chart was left out on purpose, because neither is a one-line forwarding:

view what its own query does with the term what a fix needs
tree ObjectTree's object-provider find carries $filter, $top and $expand, but no $search a declared ObjectTreeSchema key plus a plugin-tree read, or Search withheld on tree views
object-bound chart ObjectChart's aggregate call (field, function, groupBy, filter) has no search parameter at all a data-layer search on aggregate, or Search withheld on chart views. ⚠️ Which one is a product choice

Reproduction (the dev's real-renderer probe, on main 8b1f06619 and on PR head 3bd041e6a, not committed)

  • tree: host fetch sends $search: "needle"; the tree's own find is { $filter: [and, …], $top: 2001, $expand: [parent] } with no $search.
  • chart: host fetch sends $search: "needle"; the aggregate call carries no search.
  • ⚠️ These readings are the dev's, relayed by the seat, ⛔ not re-run by the seat.

Grading notes (for triage, not a grade)

  • Same user-visible shape as objectui#10250 and objectui#10037: a control that changes nothing on screen.
  • The chart half has a design fork (search the aggregate, or withhold the control). Triage may route that half to the decision box.

Dedupe

REST page walk over the 1000 most recently updated objectui items, pattern (tree|chart) … search … (lost|never|not reach|ignor|drop) / $search … (ObjectTree|object-tree|aggregate) / searchTerm … (tree|chart) ⇒ 1 hit, a seat registration post (noise). Control pattern toolbar Filter never reaches ⇒ objectui#10250, the must-hit control, which did hit. ⇒ No duplicate.

Dedupe words: tree view toolbar search · ObjectTree $search · object-chart aggregate search · ListView searchTerm tree chart · self-querying view search


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    ContributorAuthor

    分诊首次定级:priority:p3 · bug · domain:ui · needs-user-decision —— 树视图和图表视图上也显示工具栏「搜索」,但输入的词既不进树的查询也不进图表的聚合,界面上什么都不变;是给它们接上搜索还是干脆不提供,需要维护者定

    Path: packages/plugin-list/src/ListView.tsx(工具栏「搜索」的可见性不看视图类型)· packages/plugin-tree(ObjectTree 的对象查询只带 $filter / $top / $expand)· packages/plugin-charts(ObjectChart 的聚合调用没有搜索参数)

    Triage: lands in @object-ui/plugin-list / plugin-tree / plugin-charts ⇒ domain:ui, bug, priority:p3, needs-user-decision (finding removed — graded); rationale: the toolbar Search is offered on every view, but on a tree or object-bound chart list view the term changes only ListView's own fetch and nothing drawn (measured: the tree's find and the chart's aggregate carry no search) — a control that changes nothing, the same user-visible shape as objectui#10250 / #10037; the repair forks per view — wire search into each view's query (a new declared ObjectTreeSchema key; a data-layer search on aggregates) or withhold the control on those views — which is a product choice.

    分诊席 #6015,2026-09-24T19:30Z。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论)。卡面的探针是 #10250 的开发在 main 和 PR #10323 的 head 上测的,本席没有重跑。

    为什么进决策箱

    • A(本席建议):树和图表视图上不提供「搜索」。
      • 今天的毛病是「一个控件什么都不改」,最直接、最诚实的修法是不提供它。
      • 对图表来说,「在聚合结果里搜索」本身就不是一个清楚的概念。对树来说,搜索会打断层级,要处理「命中的节点其祖先要不要显示」这类问题。
    • B:给它们接上搜索。
      • 树:给 ObjectTreeSchema 声明一个新键,并让 plugin-tree 读它;
      • 图表:数据层要支持对聚合做搜索。
      • 这会加宽 objectui 自己的契约,工作量明显更大。
    • 也可以分开裁:例如树接上搜索、图表不提供。

    定级说明

    p3:这是一个无效的控件,不会显示错误的数据(屏幕上的内容不变,只是没有按搜索缩小)。对比 #10327,那张是作者的范围被丢掉、显示的总数是错的,所以定 p2。

    裁决后的执行要点

    1. ListView.tsx 正被 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 的 PR fix(plugin-list,plugin-gantt,types): toolbar Filter and chips reach the tree and chart queries; toolbar Search reaches the gantt query (objectui#10250) #10323 修改(它修了这两种视图上的工具栏「筛选」和 gantt 的「搜索」),⛔ 排在它后面。
    2. 与 finding(plugin-list): a chart list view bound to a semantic dataset gets a node with no filter, so neither the authored view filter nor the toolbar Filter reaches its query #10327 同一类问题,建议同一个车道先后处理。
    3. 钉住:按裁决的方向,树视图和图表视图上的「搜索」要么不出现,要么真的缩小了画出来的内容。

    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Sep 24, 2026
  3. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #224 item 3 · letter A (do not offer toolbar Search on tree and chart list views) · maintainer 「批 #224 同意」 (chat, director seat summon #29, session_01EcrTi7s5oDYPHS4Pi7h31d) 2026-09-25T02:16Z

    Director seat, summon #29. Presented with recommendation A (fallback: tree wired, chart withheld); the maintainer agreed. Thread re-read to its last comment (5820815529) in this act.

    Ruled: A. The toolbar Search is not offered on tree or chart list views: a control that changes nothing is withheld.

    • ⛔ No new ObjectTreeSchema key and ⛔ no search on aggregates (B).
    • Pins: Search is absent on tree and chart and present on grid (control).
    • If a producer ever asks for tree search, that is a new card with its own contract.

    Execution: needs-user-decision → pm:queue in this stroke. Serial after objectui#10250 / PR #10323, and after objectui#10327 in the same lane. priority:p3, bug and domain:ui stand.


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 — domain:ui execution seat 4
    Session: session_01BP8CMtACxTdLjqR6rhd33C
    Branch: claude/issue-10326-withhold-toolbar-search-tree-chart
    Worktree: objectui-issue-10326
    Domain: domain:ui
    Seat: domain:ui#4
    File surface:

    • packages/plugin-list/src/ListView.tsx: the toolbar Search visibility only. Per ruling 5825585515 (letter A), it is not offered on tree or chart list views and stays on grid and the other views that apply it.
    • Tests beside it, and one .changeset/10326-…md.

    Stop on breach; explain in the report. ⛔ No new ObjectTreeSchema key, and ⛔ no search on aggregates (option B).
    Container & model: S, mode:subagent, model: opus — executes ruling 5825585515
    Clause-②: no
    Thread-read: 5825585515
    Serial constraints cleared:

    • objectui#10250's PR objectui#10323 is merged (af243c1).
    • objectui#10327's PR objectui#10477, the last holder of ListView.tsx, merged at 2026-09-25T04:55Z (ae98f1d).
    • The open-PR file lists read 2026-09-25T05:23Z show no open PR touching packages/plugin-list/src/.
    • The live pm:dispatched claims of seats 1–3, read at the same time, name no plugin-list file.

    Clause-②: no. A control that changes nothing is withheld on two view types. No declared key, schema, export or accept set moves.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Release: session_014mXUNuFomfj24w7s1pZzhN (domain:ui#2) · cause: collision. domain:ui#4 claimed this card first (claim 5827273119), and this seat's claim came about 30 seconds later without re-reading the assignee. · destination: the card stays with seat 4. This seat's assignee is removed in the same stroke. No dev was dispatched from this seat, and branch claude/issue-10326-no-toolbar-search-tree-chart was never created.

    ⛔ This comment is not a claim. Seat 4's claim 5827273119 is this card's live claim.


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 10326,
    "status": "done",
    "branch": "claude/issue-10326-withhold-toolbar-search-tree-chart",
    "pr": "#10510",
    "session": "session_01BP8CMtACxTdLjqR6rhd33C — read from the container (CLAUDE_CODE_REMOTE_SESSION_ID, as fleet-write --route resolved it). A subagent run, so this is the dispatching seat's id.",
    "premise_still_valid": true,
    "summary": "Ruling 5825585515 letter A is implemented in packages/plugin-list/src/ListView.tsx. searchlessViewOnScreen (currentView is tree or chart, whatever the chart binding) is declared beside datasetChartOnScreen and has two readers. The first is toolbarFlags.showSearch, which withholds the control. The second is the APPLIED term: state renamed to searchInput, searchTerm derived as empty on those views. So a term that is already set (initialSearchTerm restored by app-shell ObjectView per-view storage, or typed before an in-list switch) no longer narrows ListView's own fetch or export invisibly. The term is kept and applies again on a switch back, and onSearchChange is not called. Mechanism assumptions: A1 holds (one flag, the objectui#10477 spelling). A2: on main a dataset-bound chart still offered Search, because objectui#10477 withheld Filter and chips only; now withheld for every binding, pinned. A3: no key can force Search on (legacy showSearch folds into userActions.search, read as !== false), and an authored true on tree/chart is now accepted and not honoured, with no refusal (open question). A4 applied and is pinned. A5 pinned for kanban, calendar, gallery, timeline, map and gantt. Also in this PR: the new changeset (plugin-list patch), and a body-only correction to the pending objectui#10250 changeset's last sentence, which presupposed a Search box on tree/chart (frontmatter byte-identical, md5 compared).",
    "tests": "All at a966cf0 unless noted. (1) New file ListView.searchWithheldTreeChart-10326.test.tsx: 17 passed. (2) Targeted vitest union of 29 files (10250/10327/10037/7544/relationalSort suites, every plugin-list suite naming the toolbar search, the source-reading pins over ListView.tsx in app-shell/plugin-grid/types/core/react/plugin-calendar/scripts): 29 files, 875 tests passed, VERDICT command-exit 0. (3) vitest packages/plugin-list/: 92 files, 1094 tests passed. (4) Closure build pnpm --workspace-concurrency=2 --filter @object-ui/plugin-list^... build: 12 packages Done, exit 0. Then pnpm --filter @object-ui/plugin-list type-check (tsc --noEmit and tsc -p tsconfig.test.json): exit 0. An earlier run went red (TS2739 on the test double), which shows the test project compiles the new file; fixed in a966cf0. (5) check-changeset-presence, -no-major, -fixed, -overwrite (reports the 10250 body edit as case 2, report-only), -claims (7 pending changesets naming ListView.tsx, each paragraph read, none falsified), check-new-cross-file-line-citations (0 new), check-control-bytes, check-test-path-roots, check-pending-changeset-literals, check:unreferenced-sources: all exit 0. Governed guard --test on the 4 paths: NOT GOVERNED. (6) Lint, a proven narrowing: population = the package lint script (eslint . under the root eslint.config.js, no package config). eslint --format json counted 2 files: 0 errors; ListView.tsx 183 warnings, per-rule counts identical to the base blob linted through stdin; test file 0. Invariance: no parserOptions.project or projectService, no rule that reads other files. NOT MEASURED: check:sdui-registration-pins, exit 2 with prerequisite unmet (needs a console build); the diff adds no shipped registration. Reverse proof on the committed tree via ablation-replace.mjs, each leg restored to the HEAD blob with git diff HEAD empty. Both halves removed: 9 red (3 tree/chart absence, 2 userActions.search true, 3 restored-term, the switch case), 8 green (both grid CONTROLs, 6 other view kinds). Visibility only: 6 red, 11 green. Applied term only: 4 red, 13 green. The first ablation attempt was a no-op (shell quoting, exit 2, lock held 0s, nothing mutated) and was re-run through a script file. Uncommitted probe (deleted): a tree view on an inline-data ListView with no objectName and no data source, restored term Alpha. Withhold removed: Search present and the non-matching row hidden. HEAD: Search absent and both rows drawn.",
    "mcp_calls": "0 — no MCP GitHub calls",
    "api_writes": "2 through the fleet-write relay (one repository_dispatch each to objectstack-ai/objectstack, executed as objectstack-fleet[bot]): POST /repos/objectstack-ai/objectui/pulls (draft, #10510) and POST /repos//issues/10326/comments (this report). Plus 2 git pushes of the branch (the empty write-route probe, then the three commits). No label writes (none named for objectui).",
    "open_questions": [
    {
    "question": "Boundary of ruling A, measured and not presented at ruling time. On a tree view of a ListView with inline data and no objectName or data source, ObjectTree draws the host data, which ListView's client-side search does narrow (and in doing so cuts the hierarchy). This PR withholds Search there too. Nothing in examples, docs or apps authors a tree list view, and the console always binds objectName and a data source. Keep the withhold unconditional on tree?",
    "options": [
    "A keep it unconditional (this PR): the ruling's letter, one decision point. Cost: that inline configuration loses a search that narrowed the drawn rows but broke the hierarchy.",
    "B withhold on tree only when the tree queries for itself (objectName and a data source): ListView would have to mirror ObjectTree's provider precedence (dataSource from schema context), a second reading of it that can drift."
    ],
    "recommendation": "A: it keeps one decision on the view kind and matches the ruling. The configuration B would serve is not authored anywhere in this repository, and its search already breaks the hierarchy (the triage comment's concern)."
    },
    {
    "question": "A3: userActions.search true (or legacy showSearch true), and searchableFields, on a view that is only a tree or only a chart are now accepted and not honoured on that view. No refusal or warning exists. objectui#10477 left userActions.filter true on a dataset chart in the same shape. Add an authoring refusal?",
    "options": [
    "A no refusal: true is the default, a grid that can switch to tree/chart legitimately carries both keys, and the runtime withholding where nothing can be reached is the ruling.",
    "B an objectui-side ListViewSchema check refusing userActions.search true / searchableFields when viewType is tree or chart and no other visualization is allowed: a new authoring refusal and a widened contract (a decision, not a dev call)."
    ],
    "recommendation": "A, for the reasons above and for consistency with the objectui#10477 precedent. B would be its own card if a producer is ever seen writing these keys on a search-less view."
    }
    ],
    "out_of_scope_findings": [
    "none: nothing in class a, b or c was found outside this card. The two items above are consequences of the ruling and are raised as open questions, not filed."
    ]
    }


    Generated by Claude Code

  7. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: objectui#10510 at a966cf0, landing now (ready → merge queue)

    domain:ui seat #4, session_01BP8CMtACxTdLjqR6rhd33C. I read the dev report and checked it against the diff, the tree and CI. The contract-review record is on the PR. This executes ruling 5825585515 (letter A).

    Implemented-by:  claude/issue-10326-withhold-toolbar-search-tree-chart
    Reviewed-by:     session_01BP8CMtACxTdLjqR6rhd33C
    
    item reading
    the fix searchlessViewOnScreen (tree, or chart with any binding) sits beside datasetChartOnScreen, the objectui#10477 spelling. It is one decision point with two readers: toolbarFlags.showSearch withholds the control, and the APPLIED term (searchTerm) is derived as empty on those views
    the held term A term restored by app-shell's per-view storage, or typed before a switch, is kept in searchInput. It narrows nothing on tree or chart, whether the fetch, the export or the empty-state copy. It applies again on a switch back, with the keyword on the trigger. onSearchChange is not called for the switch, so nothing is dropped from storage
    other views grid, kanban, calendar, gallery, timeline, map and gantt keep today's Search byte-for-byte. Six are pinned present, and grid is the control twice
    pins 17 cases. The reverse proofs (9 / 6 / 4 red) re-derive exactly from the case list. None is vacuous
    changesets Every sentence is true. patch on @object-ui/plugin-list. Ratified here: the body correction to the pending .changeset/10250-self-querying-views-toolbar-state.md (frontmatter sha256 identical at base and head), which is forced because its last sentence presupposed a Search box on tree and chart
    Clause-② no. No exported symbol, type or accept set moves
    boundary Fixes #10326 is the only closing keyword, and there are no model identifiers. The surface is the claim plus the 10250 correction: 4 files. No open PR touches them
    collision Seat 2 claimed about 30 seconds after this seat's claim 5827273119, then released in 5827329705. The card was always this seat's, and no second dev ran
    CI 43 check-runs on a966cf0: 40 success, 3 skipped by design, 0 red

    The dev's two open questions, answered

    • Q1: A. The withhold stays unconditional on tree. The only configuration that loses anything is a list view with inline data, no objectName and no data source, drawn as a tree. There, client-side search narrowed the drawn rows but cut the hierarchy, which is the triage's own concern. That shape is authored nowhere in this tree: viewType: 'tree' appears only in two test files, and the console always binds objectName and a data source. Option B would make ListView mirror ObjectTree's provider precedence, a second reading that can drift.
    • Q2: A. No new authoring refusal for userActions.search: true or searchableFields on a tree-only or chart-only view.
      • true is the default, and a grid that can switch to tree or chart legitimately carries both keys.
      • A refusal would widen ListViewSchema and would need to read allowedVisualizations: a new gate, which defaults to no.
      • objectui#10477 left userActions.filter: true on a dataset chart in the same shape.
      • If a producer is ever seen writing these keys on a search-less view, that is its own card.

    Out of scope: filed in this act

    • On a dataset-bound chart, objectui#10477 withholds the Filter CONTROL but not the applied filter. A restored Filter state still narrows ListView's own fetch, and so the record-count bar, with nothing on screen to show or clear it. This PR closes exactly that shape for Search. Filed as a finding (read at source, not probed).

    Acceptance notes (not filed)

    • On tree or chart a held Search term cannot be cleared until the user returns to a view that offers Search. The changeset states it. It is the direct consequence of keeping the term without applying it.

    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:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions