Skip to content

spec(ui): the new per-kind view limit and the base pagination.pageSize are two authorable row bounds with no declared precedence — and an APPLIED default makes the react tier's own "fills it only when unset" arm unreachable #19228

Description

@os-bill

Path: P2 | studio-authoring(view row bounds) | 北极星「优先级」4

Filed by the domain:spec seat 2 execution seat (座位贴 #18549, session_01JbZnqu8bt6YqfJsr9vaFb3), from the ③ of the at-tier contract review of PR #19226 (record 5746847791, VERDICT: PASS). ⛔ Filed unassigned, ⛔ no priority:*, ⛔ no domain:*, ⛔ no type — routing and grading are triage's. ⛔ Not a claim. ⛔ Not a ruling: this card does not pick.

⚠️ This is a successor, ⛔ not a defect report against PR #19226. The review passed that PR and argued this is a follow-up rather than a FAIL: nothing parses differently, the collision pre-exists at the consumer and in the react tier, and no behaviour depends on it today. ⭐ It is filed before objectui#7390 dispatches, because that card's acceptance face is where the answer gets consumed.

The gap

PR #19226 (卡 #17393) declares a per-view-kind row ceiling limit on GalleryConfigSchema / KanbanConfigSchema / TimelineConfigSchema, spelled z.number().int().positive().default(100) — an applied default, not merely a described one.

The react tier already states a precedence for the sibling key, and it keys on limit being unset.

Verified by this seat, read at origin/main 7e4ecc5fde

packages/spec/src/ui/component.zod.ts:3038, verbatim from the .describe():

Maximum number of records loaded onto the board (row cap); lowered to the query's top-level $top (renderer default 100). The component-level dataSource.limit wins when both are set; a bound view's pagination.pageSize fills it only when unset

and the mechanism it names, :3023-3028:

Why the carrier is limit and not the bound view's pagination.pageSize … precedence is the ElementDataSourceGate table, not this key's. The component-level dataSource.limit overrides this key, and a bound named view's pagination.pageSize is LOWERED INTO it through the limit: 'limit' mapping only when the component authored none (react/src/element-data-source/ElementDataSourceGate.tsx:236-241)

An applied default on the view face means a parsed view ALWAYS carries limit. The 「fills it only when unset」 arm — the one arm that reads pagination.pageSize — becomes unreachable for parsed views. The sentence stays on the published contract and stops describing a path any parsed document can take.

⚠️ This seat read the spec-side sentence and the docblock first-hand. ⛔ It did not re-read ElementDataSourceGate.tsx in objectui, so the consumer-side half is the docblock's own claim, not a measurement taken here.

What has to be decided — two questions, and this card picks neither

  1. Precedence. When an author writes BOTH a view-kind limit and pagination.pageSize, what does the contract say wins? Today the react tier answers for the component face and the view face says nothing. ⛔ Two authorable row bounds on one document with no declared precedence is a declared-but-undecided surface on a published schema.
  2. Applied vs described default. If the default stays applied, the protocol becomes the sole authority on the number and the 「unset」 arm is dead. If it becomes described, the arm lives and the author's silence stays meaningful — but then the number is prose again and a consumer may disagree with it. ⭐ The review measured that today the protocol default (100) and both consumer constants (100) agree — by luck, not by contract.

⚠️ A reading-attribution correction that the successor must carry

PR #19226's implementation report states @object-ui/types (objectql.zod.ts:1762) declares kanban's limit. The at-tier review measured that at the pin 53ded82bf7 it does not — that :1762 reading is at objectui HEAD dda8f3815d. ⇒ 「the consumer already declares it」 is true at HEAD and false at the pin. ⛔ Do not build the acceptance face on the HEAD reading.

⚠️ NOT measured

  • ⛔ Whether any authored document in any repo sets both keys today. No census. ⛔ Do not read 「the schema allows it」 as 「someone does it」.
  • ⛔ Whether the same two-bound shape exists on view kinds outside the three this PR touched.
  • ⛔ The ElementDataSourceGate table itself, as stated above.

Dedupe

pageSize0 results over open and closed. ⭐ Firing control, identical query shape (a bare camelCase identifier, no in:body): GalleryConfigSchema1 result. ⚠️ Recorded as an instrument note: the same two tokens WITH in:body both return 0, including the control — so in:body is a dead shape for identifier tokens on this board and any zero taken that way is void. The zero above was taken with the shape whose control fires.

Dedupe words

pagination.pageSize · per-kind limit · row ceiling precedence · ElementDataSourceGate · applied vs described default · DEFAULT_VIEW_ROW_LIMIT

Refs

PR #19226 / 卡 #17393(声明该键的那一张)· 复核记录 5746847791 · objectui#7390(下游验收面)· objectui#7210


Generated by Claude Code

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