SelectionListPicker — the effective list for a key

Bound to key="priority", exactly as before. What changes is which list that key means.

One lookup, one rule — the picker never chooses between lists itself

The picker calls getEffectiveList("priority") → GET /v1/selection-lists?key=priority&include_shared=true&limit=1. The service returns the effective list: your organization's own readable active list with that key (normally its fork) if there is one, else the active common list. The picker renders whatever comes back. It never fetches both and never merges them. Host forms change nothing — the key is the same, and the form still submits the item id.

A · Acme has an organization-visible fork → the fork wins

New support ticket

Helpdesk · a consuming product's form · viewer: Sam Ortiz (member)

Medium
Low
Medium
High
Urgent
Blocker
⑂ Your organization's version of the common list Priority

The caption renders only with the opt-in showSource prop (admin / form-builder screens). End-user forms get no caption at all: to them it is simply “Priority”. The caption is derived from the one list the service returned (forked_from, visibility) — no extra request, and no “behind source” check in a picker.

Harness inspector — which list the key resolved to
front_sl_01jfq3w8z6y5x4c3b2a1n9m8k7 · org Acme · visibility org · forked_from front_sl_01jf8k2m3n4p5q6r7s8t9v0w1x

Submits { "priority": "front_sli_01jfq3w8z6y5x4c3b2a1n9m8b2" } — the fork's item id.

B · No fork → the common list

New support ticket

Same form, in Initech (no fork) · viewer: a member

Normal
Low
Normal
High
Urgent
◎ Common listprovided by FuzeFront
Harness inspector
front_sl_01jf8k2m3n4p5q6r7s8t9v0w1x · platform org · visibility platform

Archived “Critical (legacy)” is not offered — active values only, authored order, as in 4.0.0.

Shadowing edge cases

All decided by the service (design record D8). The picker's only job is to render the one list it is given — these panels exist so QA can assert it does not second-guess the answer.

C · Private fork (a draft) — shadows only for grant-holders

Medium
⑂ Draft — only people with a role see this
Normal
◎ Common list

D · Fork archived → falls through to the active common list

Select…
◎ Common list

Archiving the fork is the “revert to common” action; the picker shows no archived caption, because one lookup returns only the common list and says nothing about the ignored fork. Values saved from the fork keep rendering (archived items still resolve) — see the next frame. Restoring the fork (frame 6, “existing, archived”) makes it win again. Falls through only to an active common list; with the common list archived or gone the picker renders no effective list.

States

Embedded in someone else's form: never throw into the host, never silently render an empty control.

Loading

One skeleton for both requests (effective-list lookup, then items) at final height. The source caption (if enabled) appears with the options, never before.

Error — either request failed

Couldn't load options

Retry in place; keep any selected value. A failed lookup must not fall back to a second, different list — that would show values the service didn't choose.

Also the state for a 403 on the lookup: a caller whose only tenant role is developer holds no SelectionListCatalog:list, so GET /v1/selection-lists refuses outright — it is a load failure, never “List unavailable”.

No effective list — getEffectiveList → null

List unavailable

No readable active list with key priority in this organization and no active common one (e.g. the fork was archived while the common list is archived or gone). Reached only from a 200 with an empty page — not an error from the service; the picker renders this state and does not throw. A 403 is the error state, not this one.

Flag OFF — 4.0.0 lookup

Normal

With fuzefront.selection-lists.shared-lists OFF the picker does not send include_shared and renders no source caption: GET ?key=priority exactly as the approved 4.0.0 picker. Common lists are invisible; a key with no own list renders “List unavailable”.

Test hooks: [data-frame='09-picker-effective'] · [data-panel='picker'] · [data-picker='priority'] · [data-effective-source='own'] · [data-effective-source='platform'] · [data-effective-source-caption='own'] · [data-effective-source-caption='platform'] · [data-badge='fork'] · [data-badge='common'] · [data-case='private-fork'] · [data-case='archived-fork'] · [data-effective-inspector] · [data-combo-control] · [data-selected-label] · [data-item='front_sli_01jfq3w8z6y5x4c3b2a1n9m8b6'] · [data-state='loading'] · [data-state='error'] · [data-state='not-found'] · [data-state='flag-off'] · [data-error='NOT_FOUND'] · [data-action='retry']
Contract: GET /v1/selection-lists?key=&include_shared=true&limit=1 (client getEffectiveList) · GET /v1/selection-lists/{listId}/items?status=active&locale=.
Tokens only — no raw hex, spacing or type outside tokens.css / frame.css.

Review · selection-lists-shared approve or reject each flow ↓
shared-readapproved · izzywdev
forkapproved · izzywdev
fork-provenanceapproved · izzywdev
visibilityapproved · izzywdev
effective-pickerapproved · izzywdev