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
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/viewwith a flattened list overlay passes the door throughListViewShapeSchema.extend(flattenedViewOverlayFields()).strip()(packages/spec/src/ui/view.zod.ts, the listOverlay member). A top-leveloptionsbag is stripped unjudged:options.timeline.metaFieldspasses, while the same key written directly (timeline.metaFields) is refusedunrecognized_keys.saveMetaItemthen persists the original body verbatim, and objectui's interface page forwardsview.optionsinto the renderer. So a stored view carries and renders keys the strict schemas refuse, and it renders two ways (the object page does not forwardoptions). 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)
options.KINDpresent 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.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.options-wrapped out-of-contract key get the same refusal; a legaloptions.KINDround-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 themetaFieldsreads) does not wait on this card.Generated by Claude Code