Observed by the os-dev executing #14406 (session session_01G4138K1EG7kQ81FNba5Kp4) while re-deriving that card's census. Filed unassigned for triage; ⛔ not folded into #14406 — that card's ruling text and both of its measurements are about the one FilterConditionSchema door, and these four are a different declaration (z.unknown()), a different consumer family (the object-* blocks' toFilterNode lowering) and a different question.
Measured on origin/main (be2594e66), packages/spec/src/ui/component.zod.ts
Top-level filter keys in ComponentPropsMap, by declaration:
| entry |
declaration |
line |
record:related_list |
z.array(ViewFilterRuleSchema) |
:1121 |
element:number |
z.array(ViewFilterRuleSchema) (#12039 Key 2) |
:1851 |
element:record_picker |
FilterConditionSchema → array in #14406 |
:2184 (base) |
object-grid |
z.unknown() — "Base query filter (ObjectQL filter array/AST) — lowered to the wire $filter" |
:2456 |
object-metric |
z.unknown() — "Filter the aggregation is scoped by" |
:2613 |
object-kanban |
z.unknown() — "Base query filter, handed to the wire $filter" |
:2657 |
object-calendar |
z.unknown() — "Base query filter" |
:2712 |
#14406's body says "Every other filter input in the map declares the platform's array-of-rules orthography … object-grid, object-metric, plugin-list, data-list". The narrow claim triage graded (exactly one FilterConditionSchema door) holds; the wider one does not: four doors declare no orthography, plugin-list / data-list have no ComponentPropsMap row at all (the array they carry is ListView.filters on the objectui react tier), and the census pin #14406 adds (component.test.ts, "no top-level filter door refuses the rule array") deliberately classifies z.unknown() as not-a-holdout because it accepts both forms.
Why it may be a finding rather than a fact
Maintainer ruling objectui#6206-B (2026-08-25, verbatim 「同意」): one filter orthography platform-wide. z.unknown() is silence, not an orthography: an author (or an AI) writing filter: { status: 'open' } on an object-grid gets a success receipt, and what happens next depends on what toFilterNode (objectui plugin-grid, mergeFilterNodes) makes of a record on that particular renderer — the accept-anything shape the four-axis frame's third axis names as the AI-error incubator. The .describe() strings already say "ObjectQL filter array/AST", i.e. the authors of these entries believed they were declaring the array.
What this card does not decide
Whether ui#6206-B reaches z.unknown() doors as written, and if so whether they converge to z.array(ViewFilterRuleSchema) (one D3 entry for the family, consumer-first measurement per renderer — plugin-grid, plugin-kanban, plugin-calendar, the metric widget — exactly the discipline #14406 ran for the picker) or are recorded as a reasoned exception (the object-* blocks were declared from renderer read points in #7751 and pass the value to the wire verbatim). Triage decides; the sequencing lesson from #12039 Key 2 and #14406 applies either way: measure each read path before any of the four declarations moves.
Refs: #14406 · #12039 (Key 2, PR #14404) · objectui#6206 (the ruling) · #7751 (the object-* family's declaration from read points) · #15442 (the binding-level dataSource.filter sibling, filed alongside).
Observed by the os-dev executing #14406 (session
session_01G4138K1EG7kQ81FNba5Kp4) while re-deriving that card's census. Filed unassigned for triage; ⛔ not folded into #14406 — that card's ruling text and both of its measurements are about the oneFilterConditionSchemadoor, and these four are a different declaration (z.unknown()), a different consumer family (theobject-*blocks'toFilterNodelowering) and a different question.Measured on
origin/main(be2594e66),packages/spec/src/ui/component.zod.tsTop-level
filterkeys inComponentPropsMap, by declaration:record:related_listz.array(ViewFilterRuleSchema):1121element:numberz.array(ViewFilterRuleSchema)(#12039 Key 2):1851element:record_pickerFilterConditionSchema→ array in #14406:2184(base)object-gridz.unknown()— "Base query filter (ObjectQL filter array/AST) — lowered to the wire$filter":2456object-metricz.unknown()— "Filter the aggregation is scoped by":2613object-kanbanz.unknown()— "Base query filter, handed to the wire$filter":2657object-calendarz.unknown()— "Base query filter":2712#14406's body says "Every other
filterinput in the map declares the platform's array-of-rules orthography …object-grid,object-metric,plugin-list,data-list". The narrow claim triage graded (exactly oneFilterConditionSchemadoor) holds; the wider one does not: four doors declare no orthography,plugin-list/data-listhave noComponentPropsMaprow at all (the array they carry isListView.filterson the objectui react tier), and the census pin #14406 adds (component.test.ts, "no top-levelfilterdoor refuses the rule array") deliberately classifiesz.unknown()as not-a-holdout because it accepts both forms.Why it may be a finding rather than a fact
Maintainer ruling objectui#6206-B (2026-08-25, verbatim 「同意」): one filter orthography platform-wide.
z.unknown()is silence, not an orthography: an author (or an AI) writingfilter: { status: 'open' }on anobject-gridgets a success receipt, and what happens next depends on whattoFilterNode(objectuiplugin-grid,mergeFilterNodes) makes of a record on that particular renderer — the accept-anything shape the four-axis frame's third axis names as the AI-error incubator. The.describe()strings already say "ObjectQL filter array/AST", i.e. the authors of these entries believed they were declaring the array.What this card does not decide
Whether ui#6206-B reaches
z.unknown()doors as written, and if so whether they converge toz.array(ViewFilterRuleSchema)(one D3 entry for the family, consumer-first measurement per renderer —plugin-grid,plugin-kanban,plugin-calendar, the metric widget — exactly the discipline #14406 ran for the picker) or are recorded as a reasoned exception (theobject-*blocks were declared from renderer read points in #7751 and pass the value to the wire verbatim). Triage decides; the sequencing lesson from #12039 Key 2 and #14406 applies either way: measure each read path before any of the four declarations moves.Refs: #14406 · #12039 (Key 2, PR #14404) · objectui#6206 (the ruling) · #7751 (the
object-*family's declaration from read points) · #15442 (the binding-leveldataSource.filtersibling, filed alongside).