Terminal predicate: a grid can opt into a search toolbar whose scoped term search, visible filter state and single reset work on fully loaded local data, and the issues showcase searches its Title and Summary through it.
Problem scope
The per-column value picker shipped in #19643, but a grid still has no record search.
- No text path. The issues showcase's main content, Title and Summary, carries
columnMenu: false. Its text has no filter path, and resetting means clearing each menu in turn.
- Invisible filter state. On
examples/grid/bigData, a picker selection stays active after the header field is cleared, while the header looks unfiltered. The cause is the menu's closed-surface early return.
The operator moved the optional toolbar into v13.3 on 2026-10-16. This needs an epic, not a single ticket, because three surfaces must compose, and each lands as its own PR: the data contract the search writes, the header's active state, and the toolbar with its summary.
Intended solution shape
The converged contract is the body of #19786 (SHA-256 72b90388…). In short:
- One Store-owned search contribution
{ownerRole: 'grid-search', property: null, filterBy} carrying declared fields. An explicit null marks the columnless slot. The owned-key validator resolves the property the Filter actually exposes, so absence keeps the id default.
- Matching splits the query into whitespace terms, and every term must match at least one searched field. The match is case-insensitive unless toggled. Raw items are read directly, without hydration or renderers. An empty query disables the contribution and keeps its scope.
- Counting:
getFilterValues honours declared fields, so picker counts follow the search.
- Visible state: a generic
Filter.effective read lets headers mark filtered columns, and the toolbar's summary lists what has no header. Clear removes only the grid's own roles.
- The toolbar is a
searchToolbar_ descriptor config on grid.Container, mirroring footerToolbar_, and is null by default.
Signal Ledger
- Claude:
[AUTHOR_SIGNAL by @neo-opus-grace @ DC_kwDODSospM4BIXC3 + body 2026-10-16T09:39Z]
- GPT:
[GRADUATION_APPROVED by @neo-gpt-emmy @ 72b90388e55ebad77ab5819c9ad5036b984551ff7d6e06bdfaa6b0675d8115b9] (DC_kwDODSospM4BIXEa)
- Quorum per §6.2: two active families signing, and one non-author family approving. Emmy's §5.2 STEP_BACK (
DC_kwDODSospM4BIXC3) raised two blockers, both resolved before her signal.
Unresolved Dissent
None.
Unresolved Liveness
None. The Gemini family was active but not polled; the §6.2 floor does not need a third family for this feature class.
Discussion Criteria Mapping
| D#19786 item |
Owner in this epic |
| Contract 1 (owner key, settings, empty-query disable), 2 (matching, write-time validation), 3 (counting), A2 field list |
the data-contract leaf |
| Contract 5, header part (option H) |
the header active-state leaf |
| Contract 4 (scope selector), 5 summary part (option I), 6 (toolbar), J (clear by enumeration), showcase witness |
the toolbar leaf |
| OQ4 regex, OQ6 tree grids, OQ8 header-filter layout, option D (remote) |
deferred: no leaf here |
Decision Record: NOT_NEEDED. The only seam change is the owner-key validator normalization, which the seam's owner endorsed and the data-contract leaf pins.
Out of scope
Regular expressions (#19786 OQ4: a sampled pre-check cannot bound RegExp.test in the App Worker). Also: remote Stores and TreeStores, which are refused visibly; the header-filter layout (OQ8); the display-policy menu (#19645); and the Table header's click-sort bug (#19790).
Avoided traps
Rejected in #19786:
- per-view search, which needs a projection layer nothing else pays for;
- header text filters as the only path;
- matching rendered cell text, which would mean stateful renderers;
- a clear-all that also drops application predicates;
- the
id slot, a filter named id that never filters by id;
- sampled regex admission.
Related: #19786 · #19643 · #19646 · #19788
Origin Session ID: bb2e8968-a6d6-4ef7-a4ed-5ab3157b1ac8
Retrieval Hint: "grid record search toolbar effective filter state grid-search contribution"
Terminal predicate: a grid can opt into a search toolbar whose scoped term search, visible filter state and single reset work on fully loaded local data, and the issues showcase searches its Title and Summary through it.
Problem scope
The per-column value picker shipped in
#19643, but a grid still has no record search.columnMenu: false. Its text has no filter path, and resetting means clearing each menu in turn.examples/grid/bigData, a picker selection stays active after the header field is cleared, while the header looks unfiltered. The cause is the menu's closed-surface early return.The operator moved the optional toolbar into v13.3 on 2026-10-16. This needs an epic, not a single ticket, because three surfaces must compose, and each lands as its own PR: the data contract the search writes, the header's active state, and the toolbar with its summary.
Intended solution shape
The converged contract is the body of #19786 (SHA-256
72b90388…). In short:{ownerRole: 'grid-search', property: null, filterBy}carrying declaredfields. An explicitnullmarks the columnless slot. The owned-key validator resolves the property the Filter actually exposes, so absence keeps theiddefault.getFilterValueshonours declaredfields, so picker counts follow the search.Filter.effectiveread lets headers mark filtered columns, and the toolbar's summary lists what has no header. Clear removes only the grid's own roles.searchToolbar_descriptor config ongrid.Container, mirroringfooterToolbar_, and is null by default.Signal Ledger
[AUTHOR_SIGNAL by @neo-opus-grace @ DC_kwDODSospM4BIXC3 + body 2026-10-16T09:39Z][GRADUATION_APPROVED by @neo-gpt-emmy @ 72b90388e55ebad77ab5819c9ad5036b984551ff7d6e06bdfaa6b0675d8115b9](DC_kwDODSospM4BIXEa)DC_kwDODSospM4BIXC3) raised two blockers, both resolved before her signal.Unresolved Dissent
None.
Unresolved Liveness
None. The Gemini family was active but not polled; the §6.2 floor does not need a third family for this feature class.
Discussion Criteria Mapping
Decision Record: NOT_NEEDED. The only seam change is the owner-key validator normalization, which the seam's owner endorsed and the data-contract leaf pins.
Out of scope
Regular expressions (#19786 OQ4: a sampled pre-check cannot bound
RegExp.testin the App Worker). Also: remote Stores and TreeStores, which are refused visibly; the header-filter layout (OQ8); the display-policy menu (#19645); and the Table header's click-sort bug (#19790).Avoided traps
Rejected in #19786:
idslot, a filter namedidthat never filters by id;Related: #19786 · #19643 · #19646 · #19788
Origin Session ID: bb2e8968-a6d6-4ef7-a4ed-5ab3157b1ac8 Retrieval Hint: "grid record search toolbar effective filter state grid-search contribution"