Skip to content

Designer PUTs half-filled lookup drafts that @objectstack/spec 17.3.0 refuses (reference is now required) — keep the draft client-side and do not PUT it (#7122 ruling, item 4 = A) #7714

Description

@os-justin

Filed by the domain:spec @ objectui execution seat (session session_01BAZFhALsQsGqxui8sNqM8s) as the follow-up card the #7122 ruling requires. ⛔ Unassigned; domain:* and grading are triage's — the ruling names the landing lane as domain:ui (packages/app-shell), recorded here for the triage seat rather than stamped by this one.

Blocked-by: #7122

The measured fact (PR #7685, aabc527cb, both artifacts read side by side)

FieldSchema.safeParse({ name, label, type: 'lookup' }) is ACCEPT at @objectstack/spec 17.2.0 and REFUSE at 17.3.0, with a custom issue on reference. MetadataService.saveFields (packages/app-shell/src/services/) deliberately PUTs half-filled lookup drafts, and MetadataService.specKeyReference.test.ts pins that behaviour on purpose ("a HALF-FILLED draft, type lookup, target left empty, still saves"). Against a 17.3.0-aligned backend that PUT answers 422 INVALID_METADATA — the failure class check-designer-field-key-parity documents as blocking every subsequent save of that object.

The ruling (director seat, #7122 comment 5549255921, 2026-09-05T04:11Z; maintainer verbatim 「15622 也移交了;其他同意」)

A — fix the designer: a half-filled lookup stays client-side and is not PUT. The dev's "contest upstream first" is not taken: spec's prose already declared reference required for relationship types, 17.3.0 closed a declared≠enforced gap deliberately, and asking spec to reopen it is the wrong direction; the correct home for draft state is the client, not the metadata store (#4001's silent-drop shape is the counter-example). ⛔ The pin is not flipped green. Own card, domain:ui (touches packages/app-shell), Blocked-by: this card.

Execution constraints carried from the ruling

  • ⛔ Do not flip MetadataService.specKeyReference.test.ts green by weakening it; the pin must state the new truth (a half-filled lookup is held client-side; the PUT body never carries a lookup without a non-empty reference).
  • ⛔ Not option B (strip incomplete relationship fields from the PUT body while still "saving"): the designer would show a field the server never received — the silent-drop shape objectstack#4001 closed.
  • ⛔ Not option C (contest upstream).
  • Confidence gap carried verbatim: neither seat has driven "half-filled lookup → save → later saves blocked" in a running designer; the dev on this card measures it first (dogfood against a 17.3.0 backend). The urgency may move; the direction should not.
  • Lands after the When bumping @objectstack/spec past objectstack#14075: list-view spec-parity pins need the CalendarConfig titleField-optional update #7122 chain (the lockfile bump), which is what makes the refusal reproducible in this repo's tests.

Related

#7122 (the chain and the ruling) · PR #7685 (measurement carrier) · #7635 (item 2 of the same ruling) · #4001 · #6041 / #6043 (earlier designer keys that hard-blocked a save).

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:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:blockedpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions