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
docs(spec): record the per-kind view limit as read by nobody, and state the gate guard the gate implements
#19228, prose + pins only. ⛔ No `.default()` moves and no precedence is
picked — both are contract directions this card is explicitly not allowed
to take.
Measured first-hand at the objectui pin `87af769e9` (2026-09-21T06:30-06:40Z),
over all 8,228 files tracked at that commit:
- `.kanban.limit` / `.gallery.limit` / `.timeline.limit` -> 0 read points,
against 8 for the identically-shaped `.kanban.groupByField` /
`.gallery.coverField` / `.timeline.scale` control on the same instrument.
- The row caps objectui does read are `savedViewLimit` (a view's
`pagination.pageSize`, else its flat `limit`) and the element block's own
flat `limit`. `ListView`'s `baseProps` carries no `limit` on any branch.
- `ElementDataSourceGate`'s arm is `!fromView || !isUsableRowLimit(authored)`,
reading the ELEMENT-face key, which is `.optional()` with no applied
default. The arm is reachable; the view-face default never lands on it.
So the published «fills it only when unset» was narrower than the guard, and
the per-kind key #19226 declared reaches no consumer at all. Both are now
recorded where an author and an auditor read them.
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UDXER3sdqfeVYpEWZs5mZx
* a schema default would materialize `limit: 100` on every parsed board.
3107
3129
*/
3108
3130
limit: z.number().int().positive().optional()
3109
-
.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"),
3131
+
.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 row cap (`pagination.pageSize`, else that view's flat `limit`) fills this key unless it already carries a USABLE cap — a cap the contract refuses (zero, negative, fractional) is displaced by the view's and reported, not honoured"),
3110
3132
data: z.array(z.unknown()).optional().describe('Static inline cards — bypasses the object query'),
3111
3133
cardTitle: z.string().optional().describe('Field rendered as each card title'),
3112
3134
titleField: z.string().optional().describe('Legacy fallback for `cardTitle` (the board reads `cardTitle || titleField`). Prefer `cardTitle`'),
.describe('Object this timeline binds to. Optional because the component-level `dataSource` binding can supply the object instead — this block registers through `ElementDataSourceGate`, which lowers the binding onto this key before the renderer sees the node'),
3994
4032
timeline: TimelineConfigSchema.optional()
3995
-
.describe('Timeline configuration, the author face — the same block `ListViewSchema.timeline` declares: { startDateField, endDateField, titleField, groupByField, colorField, scale}. The flat top-level spellings beside it are the runtime handoff, not a second authoring spelling'),
4033
+
.describe('Timeline configuration, the author face — the same block `ListViewSchema.timeline` declares: { startDateField, endDateField, titleField, groupByField, colorField, scale, limit }. The flat top-level spellings beside it are the runtime handoff, not a second authoring spelling. ⚠️ `limit` is the one member of that block NO renderer reads: this face queries off the FLAT `limit` beside this key, and a `timeline.limit` written here is accepted, defaulted to 100 by the block, and then dropped'),
3996
4034
/** Base query filter — the family's one `ViewFilterRule` array orthography (#15449). */
0 commit comments