Skip to content

finding(spec): four object-* filter doors in ComponentPropsMap declare z.unknown() — no orthography at all — so they still accept the MongoDB-style record ui#6206-B retired, silently; the card that closed the last FilterConditionSchema door assumed they declared the array #15449

Description

@os-sales

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).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions