Contract-freeze · UX approval

Access administration · Approval Frames

The consumer surface for administering who is in an organization and what they can do — members, roles, invitations, removals. Backed by FuzeFront's own Security API; no identity or policy vendor name appears anywhere in the UI. These frames freeze the flow, its states, and the build inventory before any UI is written. Walk each frame below.

Frame (a) · /settings/access

Members & roles

The list: people in the org, their role pill, per-row change-role / remove. Cursor "Load more".

Frame (b) · /settings/access

Add member

Email + required role in one step. Roles come from the tenant catalogue, never hard-coded.

Frame (c) · /settings/access

Change role

Ordinary change, plus the refusal: the org's last admin cannot be demoted.

Frame (d) · /settings/access

Remove member

Confirm removal, plus the refusal: the org's last admin cannot be removed.

Frame (e) · /settings/access

States

Loading, single-member org, load error, empty role catalogue, and 403 (never a sign-in redirect).

Build inventory

Approving these frames approves this component/package plan. Implementation cannot quietly invent a different architecture. Mirrored in manifest.jsonbuild.

Flows

  • AccessAdminFlow
    route /settings/access · approved: false

Components

  • MemberList
  • MemberRow
  • RolePill
  • AddMemberDialog
  • ChangeRoleDialog
  • RemoveMemberDialog
  • RolePicker
  • AccessDeniedNotice

Packages

  • @fuzefront/access-admin-ui
● Awaiting approval — per flow

Design system: @fuzefront/design-system (fuse-seam, tokens only) · Contract: packages/security/openapi.yaml@fuzefront/security-client · Component: @fuzefront/access-admin-ui → AccessAdminFlow.
Commissioned by approval: a 409 LAST_ADMIN guard on demote/remove (frames c2, d2) — it does not exist in the contract today. Reached from the account-security hub. Approve per-flow by setting approved: true in manifest.json, or reply @claude approve / @claude reject: <reason>.

Review · authz-admin approve or reject each flow ↓
access-adminpendingApproveReject