Skip to content

finding(types): the import boundary drops every registry meta except description — 11 published ZodDefault nodes lose title/externalVocabulary, and a sibling helper drops descriptions too #9102

Description

@os-warren

Two sites of one class, both pre-existing and both outside what objectui#9034 asked for. The reviewer's instruction was to file rather than ride.

stripImportedDefaults carries description and nothing else

On the reachable published surface, 54 nodes carry registry meta other than descriptiontitle ×27, default ×18, externalVocabulary ×6, format ×3, xRef ×2, xExpression ×2. 11 of those are ZodDefault nodes and all 11 lose that meta, before and after objectui#9086:

  • title ×9 — Mongo/Mysql/Postgres host and port, Postgres schema, Sqlite/SqliteWasm filename
  • externalVocabulary ×2 — AuthConfigSchema.session.expiresIn, DisasterRecoveryPlanSchema.failover.dns.ttl

Visible through the emitter: z.toJSONSchema(PostgresConfigSchema).properties.host — spec emits {default, description, title, type}, objectui's head emits {description, type}, the pre-#9086 base emitted {type}.

⚠️ The docblock defends against the wrong key. packages/types/src/zod/imported-defaults.ts:144-147 enshrines "⛔ The description and nothing else" on a rationale about id — but id occurs 0 times in the spec's registry meta on this surface while title occurs 27. ⇒ the sentence guards an absent key and is silent about the present ones. It should either name the real trade-off or narrow to "never id".

⭐ Under the maintainer's principle this is the forbidden direction: objectui is narrower than the protocol on published metadata.

strict-authoring-face.ts:180-183 — the same helper shape, the same loss

It carries the identical new Ctor({...def, ...patch}) rebuild. Measured: deriveStrictAuthoringSchema(z.object({k: z.string().describe('LEAF')}).describe('CONTAINER')) returns a container with no description (the leaf keeps 'LEAF').

⇒ objectui#9086 fixed one site of this shape; this is the sibling it deliberately did not widen into.

⛔ Constraints

  • ⛔ Do not re-open objectui#9086 or revert any of it — that PR is correct and its pin fires (full revert 5 red; each half 3 / 2 red).
  • ⛔ Whatever carries meta must not mutate the spec's own objects: objectui#9086's .describe() route was chosen because on the already-optional branch the replacement is literally one of the spec's objects 257 times, so a mutating carry would relabel @objectstack/spec for every workspace consumer. Any .meta() carry has the same hazard.
  • ⚠️ registry.get() deletes id and add() overwrites _idmap silently — so re-registering an id rewrites the registry's id map. That is the real reason id must never be carried, and it is the one part of the current docblock that is correct.
  • ⛔ Do not let the identity property regress: a subtree with no ZodDefault must still come back reference-equal (941 / 941 plain clean exports today).

⚠️ Not measured

  • Whether any consumer reads title off these mirrors today (the loss is on the published surface; pull was ⛔ not measured).
  • Nodes reachable only through z.lazy getters — outside the reviewer's 33,556-node snapshot.
  • Spec versions other than 17.4.0.

Refs objectui#9086 · objectui#9034 · objectui#9088 (same class, tuple identity).

Filed unassigned by the domain:spec@objectui PM seat, session session_01Jmxdo7bmeqCQHLSfmLVX9w, from the non-blocking findings of the ceiling-tier contract review of PR objectui#9086 (ruling 5628764306, head 5131199465b75e1b2ebef107c07cbaa761d225a5, VERDICT: PASS). ⛔ Not claimed. ⛔ No domain:* or priority:* — routing and grading are triage's. ⛔ Nothing here blocked that PR; the reviewer said so explicitly and the fix it shipped is correct.


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

    Labels

    bugSomething isn't workingdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepackage: typespm:queuepriority:p2

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions