Design-first gate · UX approval · FFRNT-188 · FF-EPIC-17

Selection Lists — Approval Frames

Eighteen navigable frames — fourteen desktop and one 375 px phone frame per flow — covering the org-admin management UI, the translation workbench, per-list access control, and the embeddable <SelectionListPicker>. Approving them freezes the visual and interaction contract — and the build inventory below — before any feature UI is written. Built in the fuse-seam design system (tokens only).

Approval is per flow

Each of the four flows below is approved independently. Approving Flow 1 unblocks its implementation immediately; the other three can keep iterating. No ready flow waits on an unready sibling.

Flow 1 · List management

● Awaiting approval
SelectionListManagementFlow → /settings/selection-lists · org admin / list owner

Create a list, curate its values, order them deliberately, and stay inside the org's quota ceilings. Values carry an immutable service-minted id (what consuming apps persist), an immutable interop code, and a translatable label.

Flow 2 · Translation workbench

● Awaiting approval
TranslationWorkbenchFlow → /settings/selection-lists/:listId/translations · translator

Runtime i18n for org-authored content across 11 locales. Machine output is always badged, human work is never overwritten, and a changed source is flagged rather than silently stale. RTL (ar, he) flips the target column, not the source.

Flow 3 · Access control

● Awaiting approval
SelectionListAccessFlow → /settings/selection-lists/:listId/access · list owner / org admin

Per-list ReBAC with action granularity — five non-stacking roles. The load-bearing state is last-owner protection: demoting or revoking the sole list-owner returns 409 CONFLICT, shown inline on that row.

Flow 4 · SelectionListPicker

● Awaiting approval
SelectionListPicker → embeddable (harness route /embed/selection-list-picker) · consuming products

The embeddable component every consuming product mounts. Shown in a generic host form — not in the FuzeFront shell — because that is where it actually lives. It persists the item id and re-resolves the label per viewer, per locale.

What approving this builds

Approving these frames approves this inventory. The implementation builds exactly these flows, components and packages — it cannot quietly invent a different architecture. Stories S9, S10, S11 and S13 are blocked until the relevant flow here is approved.

Flows (4 — approved independently)
SelectionListManagementFlow → /settings/selection-lists TranslationWorkbenchFlow → /settings/selection-lists/:listId/translations SelectionListAccessFlow → /settings/selection-lists/:listId/access SelectionListPicker → embeddable
Viewports — every flow is frozen at desktop and at 375 px (manifest build.flows[].responsive)
list-management → 15-mobile-list-management translation-workbench → 16-mobile-translation-workbench access-control → 17-mobile-access-control picker → 18-mobile-picker
Same components and packages at both widths — no mobile-only component. The phone layouts reuse the existing DS BottomSheet and Drawer and the --touch-target / --sheet-max-h / safe-area tokens; the frames-only device preview lives in mobile.css, which the desktop frames do not load.
Components (8)
SelectionListIndex SelectionListDetail ValueEditor TranslationWorkbench LocaleEditor AccessPanel SelectionListPicker QuotaWarning
Packages (2)
@fuzeone/selection-list-client — exists (S1) @fuzeone/selection-lists-ui — new (S11)
Design-system additions requested
Combobox / Listbox (single + multi, a11y) SortableList (pointer + keyboard reorder) Meter (quota / progress) Tooltip (explains a disabled control) Chip / TokenInput Skeleton
These are composed locally in frame.css for the frames. They are not one-offs to copy into feature code: frontend-engineer is the sole editor of design-system/ and adds them as a foundation PR before or alongside the UI. This designer specifies the primitives; it does not write them.

Design system: @fuzefront/design-system (fuse-seam) · Contract: services/selection-list-service/openapi.yaml → @fuzeone/selection-list-client · Flag: fuzefront.selection-lists.service (default OFF, builders audience targeted).
Epic FF-EPIC-17 · Jira FFRNT-188 (sub-tasks FFRNT-207, FFRNT-208, FFRNT-209).
Approval is written per flow into manifest.json by the design-approval workflow — reply @claude approve <flow-id> / @claude reject: <reason>. Rejection re-dispatches product-designer; it does not close the thread.
Re-stamp after any edit: node scripts/stamp-frames.mjs --write --feature selection-lists.

Review · selection-lists approve or reject each flow ↓
list-managementapproved · izzywdev
translation-workbenchapproved · izzywdev
access-controlapproved · izzywdev
pickerapproved · izzywdev