Contract-freeze · UX approval

Portal admin consoles · Approval Frames

Two admin surfaces the multi-tenant platform has never had a UI for — a master-admin console to run the portal fleet, and a portal-admin console for a tenant to run their own users, app catalog, and billing. Every capability from FF-EPIC-09 (portal CRUD), FF-EPIC-11 (scoped identity), FF-EPIC-12 (catalog), and FF-EPIC-15 (reseller billing) gets a reviewable frame here before any UI is written. These frames freeze the flows, their states, and the build inventory. Walk each frame; approve per flow.

Master-admin console · route /admin/portals · story FF-EPIC-14-S2
Frame (a) · /admin/portals

Portals

The fleet list: name, slug, status, primary domain, plan. Create, suspend, resume. Root-portal guard.

Frame (b) · /admin/portals/new

Create portal

Name, slug, owner email, plan / billing-mode. Reseller mode unlocks the Connect billing console.

Frame (c) · /admin/portals/:id

Portal detail

Branding summary, domains + verification status (read-only), user & app counts, suspend/resume.

Frame (d) · /admin/portals

States

Loading, fresh-install empty, error, suspend confirm, root-portal refusal, slug conflict, 403 (never a login redirect).

Portal-admin console · route /portal/admin · stories FF-EPIC-14-S3 / S4
Frame (e) · /portal/admin

Overview

The portal-scoped home: user / app / billing / plan summary, domain, and setup tasks. Tabbed shell.

Frame (f) · /portal/admin/users

Users

Portal-scoped users + roles, invite dialog, resend/revoke. Self-role-change guard.

Frame (g) · /portal/admin/catalog

App catalog

Enabled apps with drag + ▲▼ reorder, and add-app from the FuzeFront catalog.

Frame (h) · /portal/admin/billing

Billing

Connect onboarding status (onboarded), price book, and the portal's own platform subscription.

Frame (i) · /portal/admin/*

States

Users/catalog loading+empty+error, suspended portal (403), cross-tenant invite (403), and the Connect not-started / in-progress / restricted state machine.

Build inventory

Approving a flow approves its component/package plan and its contract binding — implementation cannot quietly invent a different architecture. Mirrored in manifest.jsonbuild. Approval is per flow: the master-admin console (S2) can be approved independently of the portal console (S3) and billing (S4).

MasterAdminPortalsFlow

route /admin/portals · story FF-EPIC-14-S2 · flag fuzefront.platform.multi-tenant-portals · approved: false
contract: @fuzefront/portal-client (ANTICIPATED — not frozen today) → @fuzefront/portal-admin-ui
PortalsTablePortalRowPortalStatusPillPlanBadge CreatePortalDialogPortalDetailPanelDomainStatusList SuspendPortalDialogMasterAdminGuard

PortalAdminConsoleFlow

route /portal/admin · story FF-EPIC-14-S3 · flags fuzefront.identity.portal-scoped-users + fuzefront.apps.portal-catalog · approved: false
contract: @fuzefront/security-client (REAL, members/roles) + @fuzefront/app-registry-client (REAL, app display) + anticipated portal-scoped invitation & portal_apps routes → @fuzefront/portal-admin-ui
PortalConsoleShellPortalTabsPortalOverviewCards PortalUsersTableInviteUserDialogPortalRolePicker AppCatalogListCatalogItemRowAddAppDialog ReorderControlsPortalSuspendedNoticeCrossTenantDeniedNotice

PortalBillingFlow

route /portal/admin/billing · story FF-EPIC-14-S4 · flag fuzefront.billing.reseller-connect · approved: false
contract: @fuzefront/billing-client (REAL, platform subscription) + anticipated Connect / price-book routes → @fuzefront/billing-ui
BillingConsolePanelConnectOnboardingCardConnectStatusStepper PriceBookTablePlatformSubscriptionCardConnectErrorNotice

npm packages

  • @fuzefront/portal-admin-ui (new)
  • @fuzefront/billing-ui (extended)

DS primitives needed

  • Tabs — flagged, not in DS today
  • StatusPill — semantic lifecycle pill
  • StatCard — summary metric card
  • Stepper — Connect onboarding steps
  • SortableList — catalog reorder
● Awaiting approval — per flow (S2 / S3 / S4)

Design system: @fuzefront/design-system (fuse-seam, tokens only) · Epics: FF-EPIC-14 (UI) consuming FF-EPIC-09 / 11 / 12 / 15.
Anticipated contracts: the @fuzefront/portal-client (all /portals*), the portal-scoped invitation route, the per-portal catalog (portal_apps), and the Stripe Connect / price-book surface do not exist in the contracts today — these frames commission them, exactly as an approved frame can commission a new endpoint. Members/roles bind to the real @fuzefront/security-client; app display to the real @fuzefront/app-registry-client; the portal's own subscription to the real @fuzefront/billing-client.
DS primitives: Tabs, StatusPill, StatCard, Stepper, and SortableList are not in @fuzefront/design-system today — frontend-engineer (sole editor of design-system/) adds them as foundation PRs; the frames compose them from tokens only in the meantime.
Approve per-flow by setting approved: true on the flow in manifest.json, or reply @claude approve <flow> / @claude reject: <reason>.

Review · portal-admin-consoles approve or reject each flow ↓
master-admin-portalspendingApproveReject
portal-consolependingApproveReject
portal-billingpendingApproveReject