Skip to content

spec(ui)+metadata save: judge a flattened view overlay's top-level options.KIND with the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 #20051

Description

@objectstack-fleet

Ruled: 5856781584 · letter 甲 · 2026-09-27T14:48Z
Blocked-by: #20186
Blocked-by: #20456
Blocked-by: #20457

Filing gate ③: a ruled task. Director seat, summon #29 (session_01EcrTi7s5oDYPHS4Pi7h31d), executing objectui#10380 batch #223 item 5a, letter A. Maintainer verbatim: 「其他同意」. ⛔ Not a claim. Routing and grading are triage's.

What

PUT /api/v1/meta/view with a flattened list overlay passes the door through ListViewShapeSchema.extend(flattenedViewOverlayFields()).strip() (packages/spec/src/ui/view.zod.ts, the listOverlay member). A top-level options bag is stripped unjudged: options.timeline.metaFields passes, while the same key written directly (timeline.metaFields) is refused unrecognized_keys. saveMetaItem then persists the original body verbatim, and objectui's interface page forwards view.options into the renderer. So a stored view carries and renders keys the strict schemas refuse, and it renders two ways (the object page does not forward options). This was measured by the objectui#10222 dev on the installed spec 17.4.0; the persistence step was read from source.

Deliverable (ruling A)

  • The door judges each options.KIND present on a flattened overlay with that kind's strict schema, and refuses an out-of-contract key by name, exactly as the direct spelling is refused. options.map (the deliberately kept legacy path, pinned in objectui) stays accepted as far as its kind's schema accepts it.
  • Persistence stores the parsed body, not the request body, so nothing unjudged reaches storage.
  • Stored-row census before landing: how many stored views carry a top-level options.*, and which keys. The result goes on objectui#10380 and in the changeset; rows that fail the new judgement are named with their fix.
  • Pins: a direct and an options-wrapped out-of-contract key get the same refusal; a legal options.KIND round-trips; the persisted body equals the parse result.

Unblocks

objectui#10380 (Blocked-by: this card). objectui then only aligns, so that the same stored view renders the same on the interface page and the object page. objectui#10222 (retiring the metaFields reads) does not wait on this card.


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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions