Priority
People with a role below can always see it. This decides who else can read it and pick its values.
For a fork: everyone else's forms use the common list if one is active; values saved from the common list show the common labels again.
Every member can read it and pick its values. As a fork, it replaces the common list for everyone.
People with a role — approved 4.0.0 access panel, unchanged
| Person | Role |
|---|---|
| Dana Okafor | Owner |
| Lee Park | Editor |
Changing it
Organization → Private: confirm the consequence
- Members without a role can no longer see it.
- Their forms use the common Priority list instead, if one is active — otherwise those forms show “List unavailable”.
- Values saved from the common list show the common labels again.
- Values picked from your fork keep showing your fork's labels — they belong to Acme Logistics and still resolve.
- Nothing is deleted; switch back to Organization at any time.
Private → Organization saves without a confirm (it only widens reading) and toasts
“Everyone in Acme Logistics can now see Priority.” The fork-specific lines render only when forked_from is set.
Why the two stored-value lines differ: POST /v1/resolve resolves every item id of the
caller's own organization (no per-list read check), so ids picked from the fork keep their fork labels whatever the fork's visibility.
Only common-list ids change: they stop being redirected to the fork's labels, because a private fork
never redirects. The forms line stays conditional because this page does not read the common list's status; the effective-list
lookup only falls through to an active common list.
Saving · saved · failed
When the control is read-only
Not an owner — the roster didn't load (403)
◉ Organization — everyone in Acme Logistics. Only the list's owner can change this.
Loading · error
Platform operators only — publishing a common list
The third option renders only when the shell's active organization is the platform organization and the list is
owned by it (organization_id = the active org). Everyone else never sees it. The service still decides:
publish_platform is evaluated in the platform tenant, and a refusal is the 403 below.
Platform org · list currently Organization
Publishes it as a common list. This can't be undone. Chosen — confirm below to publish.
- Every organization can read it and pick its values; organizations that want changes will fork it.
- It can never become private or organization-only again — organizations will store its value ids. To retire it, archive it.
- Your later edits reach every organization that hasn't forked it.
Key typed exactly — Publish enabled
Publishing — PATCH {"visibility":"platform"} in flight
The key input opens empty (never pre-filled, no autocomplete) and Publish carries native
disabled until the value equals the list key exactly — case-sensitive, no trimming, paste allowed. Any
mismatch disables it again. While the request is in flight every control is natively disabled.
Choosing Every organization opens the confirmation and marks the option pending
(data-pending, dashed outline) — it does not check it. Organization stays
aria-checked="true" and keeps the tab stop until the key is typed and the publish succeeds; Cancel, Esc or a
403 clear the pending mark and leave Organization selected.
A common list — locked (visibility_locked)
◎ Common 🔒 Locked
Every organization may have saved this list's values, so it can't be made private or organization-only. To retire it, archive it — archived values keep showing everywhere.
No radio group at all for a platform list — the control is a statement, not a disabled input.
Flag OFF
No visibility control: the Access tab is the approved 4.0.0 access panel
(selection-lists/10-access-panel) only. Lists are created private as today (the service
refuses any other value with 400 while the flag is OFF).
Test hooks: [data-frame='08-visibility-control'] · [data-panel='visibility-control'] · [data-control='visibility'] · [data-visibility-option='private'] · [data-visibility-option='org'][aria-checked='true'] · [data-visibility-option='platform'] · [data-scope='platform-org'] [data-visibility-option='org'][aria-checked='true'] · [data-visibility-option='platform'][data-pending='true'][aria-checked='false'] · [data-confirm='visibility-to-private'] · [data-consequence='forms'] · [data-consequence='stored-common'] · [data-consequence='stored-fork'] · [data-action='confirm-visibility'] · [data-state='saving'] · [data-result='visibility-saved'] · [data-case='visibility-not-owner'] · [data-state='read-only'] · [data-state='loading'] · [data-state='error'] · [data-scope='platform-org'] · [data-confirm='publish-platform'] · [data-confirm-input='key'] · [data-confirm-state='empty'] [data-confirm-input='key'] · [data-confirm-state='empty'] [data-action='confirm-publish'][disabled] · [data-confirm-state='matched'] [data-action='confirm-publish']:not([disabled]) · [data-confirm-state='publishing'] [data-action='confirm-publish'][disabled] · [data-action='confirm-publish'] · [data-state='locked'] · [data-reason='visibility_locked'] · [data-case='publish-forbidden'] · [data-state='flag-off'] · [data-action='retry']
Contract: PATCH /v1/selection-lists/{listId} {visibility} (needs manage_access; platform also publish_platform + platform-org ownership;
409 visibility_locked on demotion) · GET /v1/selection-lists/{listId}/access (decides editable vs read-only control).
Tokens only — no raw hex, spacing or type outside tokens.css / frame.css.