The full RBAC grid — capabilities (rows) × roles (columns), check-mark cells indicating which role grants which capability. Two shapes: an editable grid for custom roles (admin authoring), and a read-only summary card showing one role's permissions in plain language.
Reach for the matrix when the role count exceeds the rich-picker sweet spot (~5) or when permissions are configurable. For built-in roles only, the summary view is enough — the matrix is the authoring surface, the summary is the runtime surface.
Capability per row, role per column, check-ui in each cell. Built-in roles (Viewer / Member / Admin / Owner) render disabled — they reflect the role's permissions but can't be edited from this surface. The Custom column is the authoring affordance: cells there toggle freely and save on change.
One card per role; description-list-ui with capability category as term, list of capabilities as description. Inline tag indicates whether the role is built-in or custom.
disabled — their cells reflect each role's permissions but can't be edited from the matrix. Owner is always fully checked; the others vary.type: 'boolean' columns).