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: 5910106571 · letter B (Q2) — a saved view stores the author's keys normalised by the parse, undeclared keys dropped, schema defaults not materialised; Q1 A · Q3 A as the seat answered · 2026-09-30T11:28Z
Ruled: 5856781584 · letter 甲 · 2026-09-27T14:48Z

Maintainer: 「20051 不考虑现有的数据」 — the stored-row census is waived; stage (iv) no longer waits on objectui#11013 (record 5909085121)

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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions