Skip to content

platform-checklist: add studio-authoring.picklist-bound-select, the acceptance item of objectui#10202 (a package picklist bound from the designer: forms offer its options, inline options are refused, an object with a bound field saves) #21957

Description

@objectstack-fleet

Routed by the objectui domain:ui seat 1 (session_015W8GBu6sBiqus2L2xjMsAL) as the cross-repo half of objectstack-ai/objectui#10202. Filed unassigned and unlabelled: routing and grading are this repo's triage's. ⛔ Not a claim.

Why

The entry (for docs/qa/platform-checklist/areas/studio-authoring.json)

{
  "area": "studio-authoring",
  "id": "studio-authoring.picklist-bound-select",
  "title": "A picklist authored in a package is used by two objects' select fields from the designer: both forms offer its options, the bound field refuses inline options, and a GET → edit → PUT of an object with a bound field saves",
  "since": "v17.6",
  "status": "active",
  "revision": 1,
  "priority": "P2",
  "surface": "mixed",
  "personas": [
    "seeded admin (authors the objects in Studio; the picklist is authored in a package)"
  ],
  "fixtures": {
    "app": "showcase",
    "requires": [
      "a package that declares a picklist (definePicklist: name, label, two or more options) and, from a package, one picklistExtensions entry adding one option to it; the stock showcase declares none — add one in the run's own checkout, uncommitted",
      "a writable project package with two runtime objects, each with a sharingModel and one select field carrying inline options; one of them published with a field already bound (picklist: NAME, no options)",
      "the console under test carries objectui#10202's build, flowed back to objectstack with `pnpm objectui:refresh` per the multi-repo rule"
    ]
  },
  "steps": [
    "boot the showcase isolated with the console under test; sign in as the seeded admin",
    "GET /api/v1/meta/picklist and GET /api/v1/meta/picklist/NAME — the list is served with name, label, its own options and _packageId",
    "GET /api/v1/meta/object/OBJ_A/layers for the object whose field is already bound — record the bound field as served (picklist + resolved options, the extension's option included)",
    "metadata admin (Setup → Metadata → Object → OBJ_A): select an UNRELATED field, rename its label, let the autosave run; record the PUT body and status",
    "select the bound field: record what the select-field editor shows (Options from = the picklist; the values read-only; no inline options editor)",
    "open OBJ_B, select its inline select field, open 'Options from', choose the picklist; record the PUT body and status",
    "Studio → the package → Data → OBJ_A: add a field and let the autosave run; record the PUT body and status",
    "publish both objects; open the new-record form of each and open the bound select",
    "Setup → Metadata → Picklist → NAME: record what the page shows and offers"
  ],
  "acceptance": [
    {
      "clause": "the metadata-admin edit of an unrelated field saves: PUT 200, and no picklist-bound field in the body carries options; every other field (an inline select included) is sent byte-identical",
      "oracle": "api",
      "verify": "the captured PUT body and status",
      "evidence": "the PUT body"
    },
    {
      "clause": "the designer shows no live 'picklist and options cannot both be declared' issue on an object loaded with a served bound field",
      "oracle": "dom",
      "verify": "page text after load",
      "evidence": "screenshot"
    },
    {
      "clause": "the select-field editor offers the served picklists by name; choosing one PUTs the field with picklist and WITHOUT options (200)",
      "oracle": "mixed",
      "verify": "picker options vs GET /meta/picklist; the PUT body",
      "evidence": "picker screenshot + PUT body"
    },
    {
      "clause": "a bound field refuses inline options: no inline options editor (no 'Add value'), the list's values shown read-only with the reason",
      "oracle": "dom",
      "verify": "the field inspector",
      "evidence": "screenshot"
    },
    {
      "clause": "the Studio data page's autosave of an object with a bound field is accepted (200), the bound field sent without options",
      "oracle": "api",
      "verify": "the captured PUT",
      "evidence": "the PUT body"
    },
    {
      "clause": "after publish, both objects' new-record forms offer the picklist's options, the extension's option included",
      "oracle": "dom",
      "verify": "open each bound select",
      "evidence": "the two option lists"
    },
    {
      "clause": "the picklist page shows label, name, owning package, each option with its label and value, and each extension under its declaring package — and offers no create, edit or delete (no New on the list; every control on the detail page disabled or read-only; no write request)",
      "oracle": "dom",
      "verify": "list + detail page, network log",
      "evidence": "screenshots + the empty write log"
    }
  ],
  "negative": [
    "any PUT of an object with a bound field answered 422 INVALID_METADATA at fields.FIELD.options — FAIL (the served-options producer obligation)",
    "an inline options editor, or a free-text name box, offered on a bound field — FAIL",
    "a New / Save / Delete on the picklist list or detail page — FAIL (the kind is package-owned, allowRuntimeCreate false)",
    "the picklist page saying 'no package extends this picklist' when the package read failed — FAIL"
  ],
  "traps": [
    "stale-console-bundle",
    "cache-staleness"
  ],
  "source": [
    "objectui#10202 ruling 6006062645 (A′): (a) use picklist, (b) served options dropped before the PUT, (c) read-only page, (d) this item",
    "objectstack#18164; producer obligation 5925784898; server pin packages/objectql/src/protocol-picklist-served-roundtrip.test.ts",
    "packages/spec/src/data/picklist.zod.ts (PicklistSchema, PicklistExtensionSchema, PicklistServedFieldSchema); FieldSchema.picklist refinement"
  ],
  "history": [
    {
      "revision": 1,
      "date": "2026-10-06",
      "change": "new — drafted with objectui#10202 against the measured run of its PR; filed by the seat"
    }
  ]
}

Notes for whoever authors it

  • Run order. The pnpm objectui:refresh fixture line has to hold before a run can pass: the console under test must carry objectui#10202's build.
  • A writer that still fails. One object writer the PR does not touch still re-sends the served options: Studio → Access → OWD overview. It is filed on the objectui side as its own card. This item's steps go through the two designers objectui#10202 fixed, ⛔ not through the OWD overview.

Dedupe: mcp__github__search_issues (objectstack-ai/objectstack, semantic, closed included), studio-authoring checklist item picklist bound select field designer forms options inline refused PUT round trip → 14 hits. None is this item. The nearest are objectstack#18164 (the epic), #19518 and #19519 (its spec and runtime halves, closed), and #20939 (a different studio-authoring item).

Dedupe words: studio-authoring.picklist-bound-select · picklist checklist item · use picklist designer


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

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portaldocumentationImprovements or additions to documentationdomain:devxpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions