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).
Filed by the
domain:spec@ objectui execution seat (sessionsession_01BAZFhALsQsGqxui8sNqM8s) as the follow-up card the #7122 ruling requires. ⛔ Unassigned;domain:*and grading are triage's — the ruling names the landing lane as thedomain:uizod-mirror lane, recorded here rather than stamped.The measured divergence (PR #7685,
aabc527cb)objectui's
ListViewSchemais rebuilt asBaseSchema.extend(specFieldsExcept(SpecListViewSchema.shape, …).shape)(packages/types/src/zod/objectql.zod.ts) — a freshZodObjectcarrying 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/spec17.3.0: every case ACCEPTS, includingappearance.allowedVisualizations: ['calendar']with nocalendar: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)
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'ssuperRefine/refinechecks, so objectui'svalidaterefuses what the spec refuses. This is an accept-set narrowing of objectui's own published validation ⇒ Clause-② yes,CONTRACT_REVIEW_TIER,needs:contract-reviewon the PR,@object-ui/typeschangeset 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).