Filed by the director seat under the objectui#7715 ruling (decision batch #67, 2026-09-07, option B1). objectui#7715 is pm:blocked on this card.
Why
objectui derives its zod schemas from the spec's .shape (BaseSchema.extend(specFieldsExcept(SpecListViewSchema.shape, …).shape), six sites across four files). That carries the spec's fields by reference but drops every check attached to the spec object (superRefine / refine), e.g. checkListViewCalendarVisualization in src/ui/view.zod.ts. Result, measured at 17.3.0: objectui's authoring door accepts appearance.allowedVisualizations: ['calendar'] with no calendar: block; the spec's publish door refuses it. Contract-first says the rule is written once, in the spec; a mirror must be able to attach the same rule instead of re-implementing it.
Scope
- For every spec object that carries an object-level refinement and is mirrored downstream (the objectui dev enumerates the six derivation sites; start with
ListViewSchema, then NavigationArea, App, DashboardWidget, Dashboard, Page as measured), export the check as a named, typed function ((value, ctx: z.RefinementCtx) => void) from the same module, alongside the schema — one function per refinement, no bundled "all checks" blob, so a mirror can attach exactly the ones whose fields it carries.
- Keep the spec schema itself unchanged (the export is additive; Clause-② conformance limb: no for this card — the spec's accept set does not move). Pin: each exported check is the one the schema's own
superRefine calls (a test that calls the export directly and the schema's parse and compares verdicts on the same fixture).
- api-surface baseline regenerated with the repo tooling; changeset (minor).
Acceptance
Refs objectui#7715, objectui#7122 (the tripwire pin that this work flips), objectui#2231.
Filed by the director seat under the objectui#7715 ruling (decision batch #67, 2026-09-07, option B1). objectui#7715 is
pm:blockedon this card.Why
objectui derives its zod schemas from the spec's
.shape(BaseSchema.extend(specFieldsExcept(SpecListViewSchema.shape, …).shape), six sites across four files). That carries the spec's fields by reference but drops every check attached to the spec object (superRefine/refine), e.g.checkListViewCalendarVisualizationinsrc/ui/view.zod.ts. Result, measured at 17.3.0: objectui's authoring door acceptsappearance.allowedVisualizations: ['calendar']with nocalendar:block; the spec's publish door refuses it. Contract-first says the rule is written once, in the spec; a mirror must be able to attach the same rule instead of re-implementing it.Scope
ListViewSchema, thenNavigationArea,App,DashboardWidget,Dashboard,Pageas measured), export the check as a named, typed function ((value, ctx: z.RefinementCtx) => void) from the same module, alongside the schema — one function per refinement, no bundled "all checks" blob, so a mirror can attach exactly the ones whose fields it carries.superRefinecalls (a test that calls the export directly and the schema's parse and compares verdicts on the same fixture).Acceptance
Refs objectui#7715, objectui#7122 (the tripwire pin that this work flips), objectui#2231.