Skip to content

objectui's ListViewSchema derivation structurally drops the spec's object-level refinements — carrying them is an accept-set narrowing (Clause-② yes), ruled to its own card by #7122 item 6-B #7715

Description

@os-justin

Filed by the domain:spec @ objectui execution seat (session session_01BAZFhALsQsGqxui8sNqM8s) as the follow-up card the #7122 ruling requires. ⛔ Unassigned; domain:* and grading are triage's — the ruling names the landing lane as the domain:ui zod-mirror lane, recorded here rather than stamped.

The measured divergence (PR #7685, aabc527cb)

objectui's ListViewSchema is rebuilt as BaseSchema.extend(specFieldsExcept(SpecListViewSchema.shape, …).shape) (packages/types/src/zod/objectql.zod.ts) — a fresh ZodObject carrying spec fields by reference. A spec refinement lives on the spec object, not on any field, so the rebuild drops it. Measured on the derived schema at @objectstack/spec 17.3.0: every case ACCEPTS, including appearance.allowedVisualizations: ['calendar'] with no calendar: block, which the spec now refuses (checkListViewCalendarVisualization, src/ui/view.zod.ts). So objectui's authoring door accepts a shape the spec's publish door refuses — declared ≠ enforced, in the direction that gives an AI author no signal until publish.

What the #7122 ruling did with it (director seat, comment 5549255921, 2026-09-05T04:11Z)

6 | spec's ListView refinement structurally never reaches objectui (derivation rebuilds the object and drops it) | A — a tripwire pin recording the measured divergence (spec refuses, objectui accepts), test-only. Carrying the refinement is B, an accept-set narrowing with Clause-② yes, on its own card in the domain:ui zod-mirror lane.

A lands in the #7122 chain (a test-only tripwire, so the next spec refinement is loud instead of invisible). This card is B.

What B is

Make objectui's derived ListViewSchema (and by the same mechanism every other spec-derived object that has upstream refinements — the dev enumerates them) carry the spec's superRefine / refine checks, so objectui's validate refuses what the spec refuses. This is an accept-set narrowing of objectui's own published validation ⇒ Clause-② yes, CONTRACT_REVIEW_TIER, needs:contract-review on the PR, @object-ui/types changeset per the repo's convention for accept-set changes.

It is a published-contract change and a design choice (how the derivation carries refinements: re-attach the spec object's checks, or derive by .pick() from the spec object rather than rebuilding from .shape), so it is a maintainer decision rather than a dispatch — the four-facet analysis is triage's to attach at grading.

Order

After the #7122 chain lands (the tripwire pin in A is the control this card flips). Related: #7122 · PR #7685 · #2231 (the long-running hand-written-zod vs spec drift card) · #5435 / #2890 (the list-view normalisation chain).

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

    Labels

    bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatneeds-user-decisionpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions