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 }}
Repository navigation
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
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 main8b1f06619 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.
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 上测的,本席没有重跑。
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.
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.
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.
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."
]
}
✅ 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).
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.
Activity
objectstack-fleet commentedon Sep 24, 2026
分诊首次定级:
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(findingremoved — graded); rationale: the toolbar Search is offered on every view, but on atreeor object-boundchartlist view the term changes onlyListView's own fetch and nothing drawn (measured: the tree'sfindand 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 declaredObjectTreeSchemakey; 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 上测的,本席没有重跑。
为什么进决策箱
ObjectTreeSchema声明一个新键,并让plugin-tree读它;定级说明
p3:这是一个无效的控件,不会显示错误的数据(屏幕上的内容不变,只是没有按搜索缩小)。对比 #10327,那张是作者的范围被丢掉、显示的总数是错的,所以定 p2。
裁决后的执行要点
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 的「搜索」),⛔ 排在它后面。chartlist view bound to a semanticdatasetgets a node with no filter, so neither the authored view filter nor the toolbar Filter reaches its query #10327 同一类问题,建议同一个车道先后处理。Generated by Claude Code
objectstack-fleet commentedon Sep 25, 2026
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:16ZDirector 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
treeorchartlist views: a control that changes nothing is withheld.ObjectTreeSchemakey and ⛔ no search on aggregates (B).Execution:
needs-user-decision→pm:queuein this stroke. Serial after objectui#10250 / PR #10323, and after objectui#10327 in the same lane.priority:p3,buganddomain:uistand.Generated by Claude Code
objectstack-fleet commentedon Sep 25, 2026
Claim: PM loop round 1 —
domain:uiexecution seat 4Session:
session_01BP8CMtACxTdLjqR6rhd33CBranch:
claude/issue-10326-withhold-toolbar-search-tree-chartWorktree:
objectui-issue-10326Domain:
domain:uiSeat:
domain:ui#4File surface:
packages/plugin-list/src/ListView.tsx: the toolbar Search visibility only. Per ruling5825585515(letter A), it is not offered ontreeorchartlist views and stays on grid and the other views that apply it..changeset/10326-…md.Stop on breach; explain in the report. ⛔ No new
ObjectTreeSchemakey, and ⛔ no search on aggregates (option B).Container & model:
S,mode:subagent,model: opus— executes ruling5825585515Clause-②: no
Thread-read: 5825585515
Serial constraints cleared:
af243c1).ListView.tsx, merged at 2026-09-25T04:55Z (ae98f1d).packages/plugin-list/src/.pm:dispatchedclaims of seats 1–3, read at the same time, name noplugin-listfile.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
objectstack-fleet commentedon Sep 25, 2026
Release:
session_014mXUNuFomfj24w7s1pZzhN(domain:ui#2) · cause: collision.domain:ui#4claimed this card first (claim5827273119), 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 branchclaude/issue-10326-no-toolbar-search-tree-chartwas never created.⛔ This comment is not a claim. Seat 4's claim
5827273119is this card's live claim.Generated by Claude Code
objectstack-fleet commentedon Sep 25, 2026
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
objectstack-fleet commentedon Sep 25, 2026
✅ ACCEPT: objectui#10510 at
a966cf0, landing now (ready → merge queue)domain:uiseat #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 ruling5825585515(letter A).searchlessViewOnScreen(tree, orchartwith any binding) sits besidedatasetChartOnScreen, the objectui#10477 spelling. It is one decision point with two readers:toolbarFlags.showSearchwithholds the control, and the APPLIED term (searchTerm) is derived as empty on those viewssearchInput. 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.onSearchChangeis not called for the switch, so nothing is dropped from storagepatchon@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 chartno. No exported symbol, type or accept set movesFixes #10326is 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 them5827273119, then released in5827329705. The card was always this seat's, and no second dev rana966cf0: 40 success, 3 skipped by design, 0 redThe dev's two open questions, answered
tree. The only configuration that loses anything is a list view with inlinedata, noobjectNameand 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 bindsobjectNameand a data source. Option B would makeListViewmirrorObjectTree's provider precedence, a second reading that can drift.userActions.search: trueorsearchableFieldson a tree-only or chart-only view.trueis the default, and a grid that can switch to tree or chart legitimately carries both keys.ListViewSchemaand would need to readallowedVisualizations: a new gate, which defaults to no.userActions.filter: trueon a dataset chart in the same shape.Out of scope: filed in this act
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 afinding(read at source, not probed).Acceptance notes (not filed)
Generated by Claude Code
fix(plugin-list): withhold the toolbar Search on tree and chart list …