Skip to content

/meta/types output derivation: mark an ExpressionInputSchema member whose string arm a transform erased, so a consumer can tell 「erased authoring type」 from 「admits anything」 (ruling batch #196 item 3 letter B on objectui#9830) #19295

Description

@os-project-manager

Path: P1 | 那条路第 1 步「写元数据」 | /meta/types 把 string 臂擦成 {},消费方分不清「被擦掉的作者类型」和「什么都收」
分诊重测与定级:2026-09-20T15:25Z

Filed by the director seat, summon #25 (session_012GcsUbuqFGBibkEDMRC1eE), executing ruling batch #196 item 3 letter B on objectui#9830 (maintainer 「同意」). ⛔ Filed bare: domain:*, priority:* and type are triage's production. Landing: packages/metadata-protocol (toJsonSchemaSafe / the served projection) and, if the mark rides the envelope, packages/spec (ADR-0089 envelope). objectui#9830 carries Blocked-by: on this card.

The gap, measured by objectui (dev report 5729362918 / 5732080628, seat-verified)

Every predicate key the platform serves — hook.condition, sharing_rule.condition, field.visibleWhen / readonlyWhen / requiredWhen, flow edge.condition — is ExpressionInputSchema, a union whose string arm is a transform. In the output derivation /meta/types serves, z.toJSONSchema erases the transform's input type, so the member derives as anyOf: [ {}, { …ADR-0089 envelope } ]. On the wire {} is indistinguishable from 「admits everything, strings included」, so the metadata designer cannot tell an erased string predicate from a member that genuinely accepts anything; it vetoes the condition builder for all of them (objectui PR #9911, admitsString()), and an author only gets the builder by pinning widget: 'condition' in the form spec.

⛔ The global repair — derive everything with io: 'input' — was measured across the served surface and refused as a weakening of a published contract (24 of 26 types answer differently; required 1132 → 867), with a pin guarding it: packages/metadata-protocol/src/protocol.meta-types-degenerate-derivation.test.ts:19-28. ⛔ Not reopened here.

Ruling this card executes

The served derivation carries a machine-readable mark for a member whose authoring arm a transform erased — either on the ADR-0089 envelope object (a declared key naming the erased authoring type, e.g. that a string source is accepted) or as an annotation the projection emits beside the husk arm for ExpressionInputSchema members. The consumer reads the mark, ⛔ never the key name. Nothing else in the output derivation moves; the refused global widening stays refused and its pin stays green.

Acceptance

  • For every served member built on ExpressionInputSchema, the derived document carries the mark; a member that genuinely derives {} for another reason carries none (negative control).
  • The degenerate-derivation pin stays green (no io: 'input' widening).
  • The mark is declared once (spec or protocol), documented in the reference page, and versioned so objectui can gate on its presence.
  • Clause-② declared from the diff (a new declared key on the envelope ⇒ yes; an annotation on the served projection only ⇒ the claiming seat measures).

Sequencing

objectui#9830 unblocks when the marked derivation is installable by objectui (the pinned release carries it), ⛔ not merely merged; then admitsString() reads the mark and the husk-boundary pin inverts for marked members only.

Dedupe words: ExpressionInputSchema transform erased string arm · meta/types husk anyOf empty envelope · erased authoring type mark · degenerate derivation refused io input · objectui#9830


Generated by Claude Code

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions