From 270d0c293866b0854195dc25990ffc40472a64bb Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 25 Aug 2026 08:32:56 +0000 Subject: [PATCH 1/4] feat(spec): converge ComponentPropsMap object-grid data onto ViewDataSchema (objectui-6207 Option A) Accept-set change on one props-map entry: data was z.array(z.unknown()), now ViewDataSchema (provider-discriminated object). Static inline rows move to { provider: 'value', items: [...] }. ADR-0087 semantic entry object-grid-data-view-data-converged carries the prescription; sweep found zero bare-array authors in first-party corpora. The element:number.filter sibling key of the same card is deliberately untouched (measurement-first fork; see the card report). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01NDGG54XF5gbTLdQzCtnaVV --- .../object-grid-data-view-data-converged.md | 42 +++++++++++++++++ ...18.object-grid-data-view-data-converged.ts | 45 +++++++++++++++++++ packages/spec/src/migrations/registry.ts | 41 +++++++++++++++++ packages/spec/src/ui/component.test.ts | 28 ++++++++++++ packages/spec/src/ui/component.zod.ts | 21 +++++++-- 5 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 .changeset/object-grid-data-view-data-converged.md create mode 100644 packages/spec/src/migrations/entries/semantic/18.object-grid-data-view-data-converged.ts diff --git a/.changeset/object-grid-data-view-data-converged.md b/.changeset/object-grid-data-view-data-converged.md new file mode 100644 index 0000000000..694454e796 --- /dev/null +++ b/.changeset/object-grid-data-view-data-converged.md @@ -0,0 +1,42 @@ +--- +"@objectstack/spec": minor +--- + +feat(spec): `ComponentPropsMap['object-grid'].data` converges onto `ViewDataSchema` (#12039, objectui#6207 Option A) + +**BREAKING** accept-set change on one props-map entry, shipped as `minor` under +the repo's launch-window convention for breaking changes. + +Two spec authorities disagreed on the KIND of `object-grid`'s `data`: +`ViewDataSchema` — the authority objectui#5090 ruled the registry declaration +against, and what `ObjectGridSchema.data` resolves to — is an object +discriminated on `provider` (`object` / `api` / `value` / `schema`), while +`ComponentPropsMap['object-grid'].data` said `z.array(z.unknown())`. Measured +on `@objectstack/spec@17.2.0`: `{ provider: 'value', items: [] }` — the +pinned-legal form — was refused by the props-map entry while the bare array +parsed. Maintainer ruling (2026-08-25, objectui#6207, Option A): the props-map +entry converges onto `ViewDataSchema`; the bare-array form is the deprecated +`staticData` shortcut the objectui#4648 carve-out already refuses to publish. + +Migration — FROM → TO, one wrapping object: + +```ts +// before (refused now) +data: [{ id: 1, title: 'Inline row' }] +// after +data: { provider: 'value', items: [{ id: 1, title: 'Inline row' }] } +``` + +The ruled migration check ran with the change: the sweep of generated +artifacts, templates and first-party corpora (examples/, skills/, +create-objectstack, spec fixtures) found zero bare-array `data` authors, so no +rewrite ships. `staticData` (the legacy bare-array shortcut the renderer still +reads) keeps its shape but is not the prescription. + +`ComponentPropsMap['element:number'].filter` (the sibling key of #12039 / +objectui#6206) is NOT changed here: the ruling's binding measurement-first +precondition measured the pinned adapter/runtime refusing the raw +`ViewFilterRule[]` form on the element's primary (analytics) read path, which +forks that key back to triage. objectui#6206 remains open. + + diff --git a/packages/spec/src/migrations/entries/semantic/18.object-grid-data-view-data-converged.ts b/packages/spec/src/migrations/entries/semantic/18.object-grid-data-view-data-converged.ts new file mode 100644 index 0000000000..cedd05e8ca --- /dev/null +++ b/packages/spec/src/migrations/entries/semantic/18.object-grid-data-view-data-converged.ts @@ -0,0 +1,45 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +import type { SemanticMigration } from '../../types.js'; + +export const entry: SemanticMigration = { + id: 'object-grid-data-view-data-converged', + surface: + "`object-grid` component props — `data` (the KIND: bare array `z.array(z.unknown())` " + + 'vs the `ViewDataSchema` provider object)', + replacement: + "`ViewDataSchema` — the provider-discriminated object (`provider: 'object' | 'api' | " + + "'value' | 'schema'`). Static inline rows move from `data: [...]` to " + + "`data: { provider: 'value', items: [...] }` — the same rows, wrapped in the one " + + 'arm that means "hardcoded data array". The other three arms are unchanged ' + + '`ViewDataSchema` semantics; `staticData` (the deprecated bare-array shortcut the ' + + 'renderer still reads) keeps its shape but is not the prescription', + reason: + 'Two entries of one contract disagreed on the KIND (objectui#6207, contract-vs-' + + "contract): `ComponentPropsMap['object-grid'].data` said bare array ('Static inline " + + "rows — bypasses the object query') while `ViewDataSchema` — the authority " + + 'objectui#5090 ruled the registry declaration against, pinned by ' + + '`gridDataInputContract.test.ts`, and what `ObjectGridSchema.data` resolves to — is ' + + "an object discriminated on `provider`. Measured on @objectstack/spec@17.2.0: " + + "`{ provider: 'value', items: [] }` — the pinned-legal form — was REFUSED by the " + + 'props-map entry (`expected array, received object`) while the bare array parsed. ' + + 'Whichever authority a value satisfied, the other refused it, and the objectui ' + + 'parity gate had to carry the reasoned exemption `object-grid.data:object` to look ' + + 'away. The maintainer ruling (2026-08-25, batch adjudication batch 4; verbatim: ' + + '「同意」, Option A) converged the props-map entry onto `ViewDataSchema`; the ' + + 'bare-array form is the deprecated `staticData` shortcut the objectui#4648 ' + + 'carve-out already refuses to publish. The ruled migration check ran with the ' + + 'change: the sweep of generated artifacts, templates and first-party corpora ' + + '(examples/, skills/, create-objectstack, spec fixtures) found ZERO bare-array ' + + '`data` authors, so no rewrite ships — this entry carries the prescription for ' + + 'authors outside the repo.', + acceptanceCriteria: + "`ComponentPropsMap['object-grid'].safeParse({ data: { provider: 'value', items: [] } })` " + + 'succeeds (and the other `ViewDataSchema` arms parse through the same entry); a ' + + 'bare-array `data: [...]` is refused at the `data` path. An author carrying ' + + "`data: [...]` writes `data: { provider: 'value', items: [...] }` — same rows, " + + 'one wrapping object. Downstream (objectui, after a released spec version reaches ' + + 'the pin): the `object-grid.data:object` exemption entry in ' + + '`registry-inputs-spec-parity.test.ts` becomes deletable, which is what closes ' + + 'objectui#6207.', +}; diff --git a/packages/spec/src/migrations/registry.ts b/packages/spec/src/migrations/registry.ts index 390c03117e..fc4f75cce4 100644 --- a/packages/spec/src/migrations/registry.ts +++ b/packages/spec/src/migrations/registry.ts @@ -6058,6 +6058,47 @@ const step18: MigrationStep = { + 'set stays exactly `DEFAULT_METADATA_TYPE_REGISTRY` plus item-population growth, ' + 'before and after.', }, + { + id: 'object-grid-data-view-data-converged', + surface: + "`object-grid` component props — `data` (the KIND: bare array `z.array(z.unknown())` " + + 'vs the `ViewDataSchema` provider object)', + replacement: + "`ViewDataSchema` — the provider-discriminated object (`provider: 'object' | 'api' | " + + "'value' | 'schema'`). Static inline rows move from `data: [...]` to " + + "`data: { provider: 'value', items: [...] }` — the same rows, wrapped in the one " + + 'arm that means "hardcoded data array". The other three arms are unchanged ' + + '`ViewDataSchema` semantics; `staticData` (the deprecated bare-array shortcut the ' + + 'renderer still reads) keeps its shape but is not the prescription', + reason: + 'Two entries of one contract disagreed on the KIND (objectui#6207, contract-vs-' + + "contract): `ComponentPropsMap['object-grid'].data` said bare array ('Static inline " + + "rows — bypasses the object query') while `ViewDataSchema` — the authority " + + 'objectui#5090 ruled the registry declaration against, pinned by ' + + '`gridDataInputContract.test.ts`, and what `ObjectGridSchema.data` resolves to — is ' + + "an object discriminated on `provider`. Measured on @objectstack/spec@17.2.0: " + + "`{ provider: 'value', items: [] }` — the pinned-legal form — was REFUSED by the " + + 'props-map entry (`expected array, received object`) while the bare array parsed. ' + + 'Whichever authority a value satisfied, the other refused it, and the objectui ' + + 'parity gate had to carry the reasoned exemption `object-grid.data:object` to look ' + + 'away. The maintainer ruling (2026-08-25, batch adjudication batch 4; verbatim: ' + + '「同意」, Option A) converged the props-map entry onto `ViewDataSchema`; the ' + + 'bare-array form is the deprecated `staticData` shortcut the objectui#4648 ' + + 'carve-out already refuses to publish. The ruled migration check ran with the ' + + 'change: the sweep of generated artifacts, templates and first-party corpora ' + + '(examples/, skills/, create-objectstack, spec fixtures) found ZERO bare-array ' + + '`data` authors, so no rewrite ships — this entry carries the prescription for ' + + 'authors outside the repo.', + acceptanceCriteria: + "`ComponentPropsMap['object-grid'].safeParse({ data: { provider: 'value', items: [] } })` " + + 'succeeds (and the other `ViewDataSchema` arms parse through the same entry); a ' + + 'bare-array `data: [...]` is refused at the `data` path. An author carrying ' + + "`data: [...]` writes `data: { provider: 'value', items: [...] }` — same rows, " + + 'one wrapping object. Downstream (objectui, after a released spec version reaches ' + + 'the pin): the `object-grid.data:object` exemption entry in ' + + '`registry-inputs-spec-parity.test.ts` becomes deletable, which is what closes ' + + 'objectui#6207.', + }, { id: 'object-index-unknown-keys-refused', surface: 'object `indexes[]` entries (`IndexSchema`) — undeclared keys', diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index 00c7e777c7..0ec320e132 100644 --- a/packages/spec/src/ui/component.test.ts +++ b/packages/spec/src/ui/component.test.ts @@ -2121,6 +2121,34 @@ describe('#7751 — object-* block props schemas', () => { expect(parsed.filter).toEqual([['owner_id', '=', '{current_user_id}']]); }); + it("object-grid `data` takes the ViewDataSchema provider object — the ui#6207 convergence (Option A)", () => { + // The #5090-pinned authority: static inline rows are `{ provider: 'value', + // items }`. Before the 2026-08-25 ruling this exact value was REFUSED by + // this entry ("expected array, received object") while being the + // pinned-legal form of the authority the objectui declaration is held to. + const inline = ComponentPropsMap['object-grid'].safeParse({ + data: { provider: 'value', items: [] }, + }); + expect(inline.success).toBe(true); + // A second arm of the union, to prove the whole discriminated authority is + // reachable through this entry rather than one hardcoded branch. + const bound = ComponentPropsMap['object-grid'].safeParse({ + data: { provider: 'object', object: 'showcase_task' }, + }); + expect(bound.success).toBe(true); + }); + + it('the bare-array `data` — the deprecated `staticData` shortcut — is REFUSED at the `data` path', () => { + // Reverse verification of the convergence: the value this entry used to + // accept (`z.array(z.unknown())`) no longer parses. The #4648 carve-out + // already refuses to publish the bare-array author; this closes the spec + // entry that still advertised it. Migration: + // `object-grid-data-view-data-converged`. + const r = ComponentPropsMap['object-grid'].safeParse({ data: [{ id: 1 }] }); + expect(r.success).toBe(false); + expect(r.error!.issues.some((i: { path: (string | number)[] }) => i.path[0] === 'data')).toBe(true); + }); + it('`defaultFilters` stays HONOURED — it is a read legacy fallback, not an inert spelling', () => { // ObjectGrid.tsx reads it and lowers it to `$filter` when `filter` is // absent (the routed finding on #7751 verified the read point). Only the diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index 2383799958..884b27e760 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -2,7 +2,7 @@ import { z } from 'zod'; import { FilterConditionSchema } from '../data/filter.zod'; -import { ViewFilterRuleSchema } from './view.zod'; +import { ViewFilterRuleSchema, ViewDataSchema } from './view.zod'; import { InlineActionSchema, ActionLocationSchema } from './action.zod'; import { I18nLabelSchema, AriaPropsSchema } from './i18n.zod'; import { FeedItemType, FeedFilterMode } from '../data/feed.zod'; @@ -2263,8 +2263,23 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ showColumnTypeIcons: z.boolean().optional().describe('Show field-type icons in column headers'), exportOptions: z.unknown().optional().describe('Export config ({ formats, streaming })'), operations: z.unknown().optional().describe('Operation toggles ({ export: false, … })'), - data: z.array(z.unknown()).optional().describe('Static inline rows — bypasses the object query'), - staticData: z.array(z.unknown()).optional().describe('Alternate spelling of `data` the renderer also reads'), + /** + * Data source binding — `ViewDataSchema`, the #5090-pinned authority the + * objectui registry declares against (`plugin-grid/src/index.tsx:225` + * `type: 'object'`, held by `gridDataInputContract.test.ts`). Until the + * ui#6207 ruling (2026-08-25, Option A: 「同意」) this entry said + * `z.array(z.unknown())` — the bare-array spelling of the deprecated + * `staticData` shortcut — so the two spec authorities refused each other's + * legal values: this entry accepted `data: [{…}]` and refused + * `{ provider: 'value', items: [] }`, while `ViewDataSchema` (what + * `ObjectGridSchema.data` resolves to, and what the designer publishes) + * ruled the opposite. Static inline rows live at + * `{ provider: 'value', items: [...] }`; the migration prescription is the + * `object-grid-data-view-data-converged` semantic entry. + */ + data: ViewDataSchema.optional() + .describe("Data source binding (ViewDataSchema — discriminated on `provider`: object | api | value | schema). Static inline rows live at `{ provider: 'value', items: [...] }`; the bare-array shortcut is refused — see migration `object-grid-data-view-data-converged`"), + staticData: z.array(z.unknown()).optional().describe("Deprecated bare-array static-rows shortcut the renderer still reads. Prefer `data: { provider: 'value', items: [...] }`"), })); /** Author state (ADR-0122: the bare name is the author state). */ export type ObjectGridProps = z.input; From 1871dfab95f71f7f85f65a96f484486aded0507e Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 25 Aug 2026 09:09:20 +0000 Subject: [PATCH 2/4] =?UTF-8?q?feat(spec):=20ObjectGridPropsParsed=20alias?= =?UTF-8?q?=20=E2=80=94=20object-grid=20leaves=20the=20default-free=20pin?= =?UTF-8?q?=20family=20(ADR-0122)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ViewDataSchema's own input/infer split rides into ObjectGridPropsSchema, so Iso839 is deleted per its comment's prescription and the Parsed alias is declared. Regenerates api-surface, export-origins and docs references. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01NDGG54XF5gbTLdQzCtnaVV --- content/docs/references/ui/component.mdx | 4 ++-- packages/spec/api-surface/ui.json | 1 + packages/spec/export-origins/ui.json | 1 + packages/spec/src/type-alias-convention.pin.test.ts | 6 ++++-- packages/spec/src/ui/component.test.ts | 2 +- packages/spec/src/ui/component.zod.ts | 8 ++++++++ 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/content/docs/references/ui/component.mdx b/content/docs/references/ui/component.mdx index af792121d9..cd24bf7ea8 100644 --- a/content/docs/references/ui/component.mdx +++ b/content/docs/references/ui/component.mdx @@ -302,8 +302,8 @@ const result = AIChatWindowProps.parse(data); | **showColumnTypeIcons** | `boolean` | optional | Show field-type icons in column headers | | **exportOptions** | `any` | optional | Export config (`{ formats, streaming }`) | | **operations** | `any` | optional | Operation toggles (`{ export: false, … }`) | -| **data** | `any[]` | optional | Static inline rows — bypasses the object query | -| **staticData** | `any[]` | optional | Alternate spelling of `data` the renderer also reads | +| **data** | `{ provider: 'object'; object: string } \| { provider: 'api'; read?: object; write?: object } \| { provider: 'value'; items: any[] } \| { provider: 'schema'; schemaId: string; schema?: Record }` | optional | Data source binding (ViewDataSchema — discriminated on `provider`: object \| api \| value \| schema). Static inline rows live at `{ provider: 'value', items: [...] }`; the bare-array shortcut is refused — see migration `object-grid-data-view-data-converged` | +| **staticData** | `any[]` | optional | Deprecated bare-array static-rows shortcut the renderer still reads. Prefer `data: { provider: 'value', items: [...] }` | --- diff --git a/packages/spec/api-surface/ui.json b/packages/spec/api-surface/ui.json index ff737a7990..072c606a6b 100644 --- a/packages/spec/api-surface/ui.json +++ b/packages/spec/api-surface/ui.json @@ -234,6 +234,7 @@ "ObjectFormProps (type)", "ObjectFormPropsSchema (const)", "ObjectGridProps (type)", + "ObjectGridPropsParsed (type)", "ObjectGridPropsSchema (const)", "ObjectKanbanProps (type)", "ObjectKanbanPropsSchema (const)", diff --git a/packages/spec/export-origins/ui.json b/packages/spec/export-origins/ui.json index 70dd21043a..c57a6f5d81 100644 --- a/packages/spec/export-origins/ui.json +++ b/packages/spec/export-origins/ui.json @@ -234,6 +234,7 @@ "ObjectFormProps": "src/ui/component.zod.ts#ObjectFormProps (type)", "ObjectFormPropsSchema": "src/ui/component.zod.ts#ObjectFormPropsSchema (const)", "ObjectGridProps": "src/ui/component.zod.ts#ObjectGridProps (type)", + "ObjectGridPropsParsed": "src/ui/component.zod.ts#ObjectGridPropsParsed (type)", "ObjectGridPropsSchema": "src/ui/component.zod.ts#ObjectGridPropsSchema (const)", "ObjectKanbanProps": "src/ui/component.zod.ts#ObjectKanbanProps (type)", "ObjectKanbanPropsSchema": "src/ui/component.zod.ts#ObjectKanbanPropsSchema (const)", diff --git a/packages/spec/src/type-alias-convention.pin.test.ts b/packages/spec/src/type-alias-convention.pin.test.ts index a4564cc7f4..850f84bdee 100644 --- a/packages/spec/src/type-alias-convention.pin.test.ts +++ b/packages/spec/src/type-alias-convention.pin.test.ts @@ -1566,9 +1566,11 @@ export type Iso849 = Assert, z.inf // The object-* block family (#7751) — deliberately default-free in its first, // warning-tier step ("the author said nothing" must stay distinguishable from // "the author asked for the renderer's fallback"), so input === infer holds. -// A default added to any of these six goes red here, and the fix is the ADR's: +// A default added to any of these goes red here, and the fix is the ADR's: // declare the XParsed alias and delete the pin line. -export type Iso839 = Assert, z.infer< typeof M170.ObjectGridPropsSchema > >>; +// `ObjectGridPropsSchema` (Iso839) left the family exactly that way on the +// ui#6207 convergence: its `data` now carries `ViewDataSchema`, whose own +// input ≠ infer, so `ObjectGridPropsParsed` is declared and the pin deleted. export type Iso840 = Assert, z.infer< typeof M170.ObjectMetricPropsSchema > >>; export type Iso841 = Assert, z.infer< typeof M170.ObjectKanbanPropsSchema > >>; export type Iso842 = Assert, z.infer< typeof M170.ObjectCalendarPropsSchema > >>; diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index 0ec320e132..13f31c7c77 100644 --- a/packages/spec/src/ui/component.test.ts +++ b/packages/spec/src/ui/component.test.ts @@ -2146,7 +2146,7 @@ describe('#7751 — object-* block props schemas', () => { // `object-grid-data-view-data-converged`. const r = ComponentPropsMap['object-grid'].safeParse({ data: [{ id: 1 }] }); expect(r.success).toBe(false); - expect(r.error!.issues.some((i: { path: (string | number)[] }) => i.path[0] === 'data')).toBe(true); + expect(r.error!.issues.some((i) => i.path[0] === 'data')).toBe(true); }); it('`defaultFilters` stays HONOURED — it is a read legacy fallback, not an inert spelling', () => { diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index 884b27e760..d8e33d423d 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -2283,6 +2283,14 @@ export const ObjectGridPropsSchema = lazySchema(() => strictObject({ })); /** Author state (ADR-0122: the bare name is the author state). */ export type ObjectGridProps = z.input; +/** + * ADR-0122: the parsed state differs from the authored state on exactly one + * key — `data` carries `ViewDataSchema` (the ui#6207 convergence), whose own + * input ≠ infer. So `object-grid` leaves the type-alias convention pin's + * default-free family (the Iso839 line deleted with this alias), taking the + * `RecordAlertPropsParsed` route its comment prescribes. + */ +export type ObjectGridPropsParsed = z.infer; /** * `object-metric` (objectui `plugin-dashboard/src/ObjectMetricWidget.tsx` @ From 7fc73b02a7a6a2148ed56ec03fd8f64ad7c78e6b Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 25 Aug 2026 09:27:15 +0000 Subject: [PATCH 3/4] test(spec): record Iso839's departure in the pin count (833 -> 832) with its receipt Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01NDGG54XF5gbTLdQzCtnaVV --- packages/spec/src/type-alias-convention.pin.test.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/spec/src/type-alias-convention.pin.test.ts b/packages/spec/src/type-alias-convention.pin.test.ts index 850f84bdee..ed7959a8d1 100644 --- a/packages/spec/src/type-alias-convention.pin.test.ts +++ b/packages/spec/src/type-alias-convention.pin.test.ts @@ -267,7 +267,7 @@ import type * as M170 from './ui/component.zod.js'; import type * as M183 from './api/sortability.zod.js'; // --------------------------------------------------------------------------- -// 833 isomorphic aliases: `z.input` === `z.infer`, so no `XParsed` is declared. +// 832 isomorphic aliases: `z.input` === `z.infer`, so no `XParsed` is declared. // // That number is machine-checked, not hand-kept. The runtime companion at the // bottom of this file recomputes the pin count from the source and asserts that @@ -1670,7 +1670,7 @@ describe('ADR-0122 type-alias convention', () => { // this title and the section header above the pin list — are now asserted // against the recomputed count below, so neither can go stale without a red // test naming it. - it('still declares all 833 isomorphic pins', () => { + it('still declares all 832 isomorphic pins', () => { // The truth of each pin is proved by tsc, not here — an `Assert>` // that stops holding is a compile error with the alias named. What tsc // cannot notice is a pin that was DELETED: removing the assertion removes @@ -1959,9 +1959,16 @@ describe('ADR-0122 type-alias convention', () => { // `BreakpointColumnMapSchema`, `BreakpointOrderMapSchema` — Iso696/697/ // 824/825): the four schemas no longer exist, so there is nothing left to // exempt. -4 retired, +0 of my own; the Iso numbers stay vacant. + // + // 833 -> 832 is #12039's ui#6207 convergence: `ObjectGridPropsSchema.data` + // now carries `ViewDataSchema`, whose own input ≠ infer (measured — the + // Eq probe answers false on ViewDataSchema alone), so `object-grid` left + // the default-free object-* family exactly the way that family's comment + // prescribes: `ObjectGridPropsParsed` declared, the Iso839 pin deleted. + // -1 converted to an `XParsed` pair; the Iso number stays vacant. const self = readFileSync(fileURLToPath(import.meta.url), 'utf8'); const pins = self.match(/^export type Iso\d+ = Assert Date: Tue, 25 Aug 2026 09:38:13 +0000 Subject: [PATCH 4/4] chore(spec): regenerate api-surface, export-origins, docs on the merged tree Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01NDGG54XF5gbTLdQzCtnaVV --- content/docs/references/ui/component.mdx | 4 ++-- packages/spec/api-surface/ui.json | 1 + packages/spec/export-origins/ui.json | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/content/docs/references/ui/component.mdx b/content/docs/references/ui/component.mdx index af792121d9..cd24bf7ea8 100644 --- a/content/docs/references/ui/component.mdx +++ b/content/docs/references/ui/component.mdx @@ -302,8 +302,8 @@ const result = AIChatWindowProps.parse(data); | **showColumnTypeIcons** | `boolean` | optional | Show field-type icons in column headers | | **exportOptions** | `any` | optional | Export config (`{ formats, streaming }`) | | **operations** | `any` | optional | Operation toggles (`{ export: false, … }`) | -| **data** | `any[]` | optional | Static inline rows — bypasses the object query | -| **staticData** | `any[]` | optional | Alternate spelling of `data` the renderer also reads | +| **data** | `{ provider: 'object'; object: string } \| { provider: 'api'; read?: object; write?: object } \| { provider: 'value'; items: any[] } \| { provider: 'schema'; schemaId: string; schema?: Record }` | optional | Data source binding (ViewDataSchema — discriminated on `provider`: object \| api \| value \| schema). Static inline rows live at `{ provider: 'value', items: [...] }`; the bare-array shortcut is refused — see migration `object-grid-data-view-data-converged` | +| **staticData** | `any[]` | optional | Deprecated bare-array static-rows shortcut the renderer still reads. Prefer `data: { provider: 'value', items: [...] }` | --- diff --git a/packages/spec/api-surface/ui.json b/packages/spec/api-surface/ui.json index ff737a7990..072c606a6b 100644 --- a/packages/spec/api-surface/ui.json +++ b/packages/spec/api-surface/ui.json @@ -234,6 +234,7 @@ "ObjectFormProps (type)", "ObjectFormPropsSchema (const)", "ObjectGridProps (type)", + "ObjectGridPropsParsed (type)", "ObjectGridPropsSchema (const)", "ObjectKanbanProps (type)", "ObjectKanbanPropsSchema (const)", diff --git a/packages/spec/export-origins/ui.json b/packages/spec/export-origins/ui.json index 70dd21043a..c57a6f5d81 100644 --- a/packages/spec/export-origins/ui.json +++ b/packages/spec/export-origins/ui.json @@ -234,6 +234,7 @@ "ObjectFormProps": "src/ui/component.zod.ts#ObjectFormProps (type)", "ObjectFormPropsSchema": "src/ui/component.zod.ts#ObjectFormPropsSchema (const)", "ObjectGridProps": "src/ui/component.zod.ts#ObjectGridProps (type)", + "ObjectGridPropsParsed": "src/ui/component.zod.ts#ObjectGridPropsParsed (type)", "ObjectGridPropsSchema": "src/ui/component.zod.ts#ObjectGridPropsSchema (const)", "ObjectKanbanProps": "src/ui/component.zod.ts#ObjectKanbanProps (type)", "ObjectKanbanPropsSchema": "src/ui/component.zod.ts#ObjectKanbanPropsSchema (const)",