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.
The fleet list: name, slug, status, primary domain, plan. Create, suspend, resume. Root-portal guard.
Name, slug, owner email, plan / billing-mode. Reseller mode unlocks the Connect billing console.
Branding summary, domains + verification status (read-only), user & app counts, suspend/resume.
Loading, fresh-install empty, error, suspend confirm, root-portal refusal, slug conflict, 403 (never a login redirect).
The portal-scoped home: user / app / billing / plan summary, domain, and setup tasks. Tabbed shell.
Portal-scoped users + roles, invite dialog, resend/revoke. Self-role-change guard.
Enabled apps with drag + ▲▼ reorder, and add-app from the FuzeFront catalog.
Connect onboarding status (onboarded), price book, and the portal's own platform subscription.
Users/catalog loading+empty+error, suspended portal (403), cross-tenant invite (403), and the Connect not-started / in-progress / restricted state machine.
Approving a flow approves its component/package plan and its contract binding —
implementation cannot quietly invent a different architecture. Mirrored in
manifest.json → build. Approval is per flow: the master-admin
console (S2) can be approved independently of the portal console (S3) and billing (S4).
MasterAdminPortalsFlowPortalsTablePortalRowPortalStatusPillPlanBadge
CreatePortalDialogPortalDetailPanelDomainStatusList
SuspendPortalDialogMasterAdminGuard
PortalAdminConsoleFlowPortalConsoleShellPortalTabsPortalOverviewCards
PortalUsersTableInviteUserDialogPortalRolePicker
AppCatalogListCatalogItemRowAddAppDialog
ReorderControlsPortalSuspendedNoticeCrossTenantDeniedNotice
PortalBillingFlowBillingConsolePanelConnectOnboardingCardConnectStatusStepper
PriceBookTablePlatformSubscriptionCardConnectErrorNotice
@fuzefront/portal-admin-ui (new)@fuzefront/billing-ui (extended)Tabs — flagged, not in DS todayStatusPill — semantic lifecycle pillStatCard — summary metric cardStepper — Connect onboarding stepsSortableList — catalog reorder
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>.