{
"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"
}
]
}
Routed by the objectui
domain:uiseat 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
6006062645there (batch 🔗 Broken links detected in documentation #280 item 1, letter A′, on the maintainer's order) scopes it to:optionswhenpicklistis set;docs/qa/platform-checklist/areas/studio-authoring.json), outside the objectui lane, so the seat carries it here instead of editing objectstack from an objectui card.3114a9f), being landed through objectui's merge queue as this card is filed.mainfaf8dce4with a local, uncommitted picklist fixture:422 INVALID_METADATAatfields.tier.options;200in both designers;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
pnpm objectui:refreshfixture line has to hold before a run can pass: the console under test must carry objectui#10202's build.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 designerGenerated by Claude Code