Quotas
Four ceilings, a fixed set. The UI warns before a create fails, so
403 QUOTA_EXCEEDED is never the first time a user hears about a limit.
Usage against every ceiling
Per-list ceilings report current: null at org level —
usage depends on which list you ask about, so they are shown as a limit, not a bar.
current: null — measured per list, shown on that list's page.current: null — measured per list, shown in the workbench.The quota wall — disabled CTA with a tooltip
Blocked actions are disabled and explained, never hidden. A hidden button teaches the user nothing; a button that fails on click teaches them the product is broken.
States
Test hooks: [data-frame='06-quota'] · [data-panel='quota'] · [data-banner='quota-near'] · [data-banner='quota-at'] · [data-quota-scope='org_lists'] · [data-quota-scope='user_lists'] · [data-quota-scope='list_items'] · [data-quota-scope='list_locales'] · [data-quota-state='at-limit'] · [data-tooltip='quota'] · [data-action='new-list'][disabled] · [data-state='loading'] · [data-state='error']
Contract: GET /v1/selection-lists/quota → four SelectionListQuotaEntry. Per-list scopes report current: null.
Tokens only — no raw hex, spacing or type outside tokens.css / frame.css.