Skip to main content

Identity & Access Wiring Map

Execution coordinates for the engineering agent. All paths relative to the wt-identity-access worktree (prd/identity-access branch).

Pages

ScreenRouteFilePattern to Copy
Permission Matrix/settings/governance/rolesapps/dreamineering/drmg-sales/src/app/(app)/settings/governance/roles/page.tsxapps/dreamineering/drmg-sales/src/app/(app)/settings/governance/audit/page.tsx
Invitations/settings/governance/invitationsapps/dreamineering/drmg-sales/src/app/(app)/settings/governance/invitations/page.tsxapps/dreamineering/drmg-sales/src/app/(app)/settings/governance/audit/page.tsx
Team Members/settings/governance/usersapps/dreamineering/drmg-sales/src/app/(app)/settings/governance/users/page.tsxapps/dreamineering/drmg-sales/src/app/(app)/settings/governance/audit/page.tsx
Accept Invite/invite/[token]apps/dreamineering/drmg-sales/src/app/(app)/invite/[token]/page.tsxapps/dreamineering/drmg-sales/src/app/(app)/settings/governance/audit/page.tsx
Audit Log/settings/governance/auditapps/dreamineering/drmg-sales/src/app/(app)/settings/governance/audit/page.tsx— (already built, reference implementation)

Components

All at libs/app-client/app-drmg-sales-client/src/components/governance/:

ComponentFileServes
PermissionToggleGridPermissionToggleGrid.tsxPermission Matrix (Build #4)
InviteFormInviteForm.tsxInvitations (Build #5)
InvitationManagerInvitationManager.tsxInvitations (Build #5, #6)
UserRolesTableUserRolesTable.tsxTeam Members (Build #4)
AuditLogTableAuditLogTable.tsxAudit Log (already built)
AcceptInviteClientAcceptInviteClient.tsxAccept Invite (Build #6)

Server Actions

FileActionsPermission Required
actions/governance-admin.actions.tslistRolesAction, listUserRolesAction, listRolePermissionsAction, listPermissionsAction, assignRoleToUserAction, revokeUserRoleAction, toggleRolePermissionActiongovernance:manage
actions/invitation.actions.tssendInvitationAction, revokeInvitationAction, listInvitationsAction, acceptInvitationAction, getInvitationByTokenActiongovernance:manage (except accept/get = public)
actions/governance.actions.tscheckPermissionAction, getMyPermissionsAction, checkMultiplePermissionsActionauthenticated

All actions at libs/app-server/app-drmg-sales-server/src/.

Infrastructure

LayerFilePurpose
Authorizationlibs/app-server/.../lib/auth/with-permission.tsassertPermission(context, action, resourceType) — default DENY
PolicyEnginelibs/domain/src/lib/governance__policy-engine/policy-engine.port.tscanI(), authorize(), getUserPermissions()
Seedlibs/infrastructure/database/repositories/src/lib/governance/seed-governance-defaults.tsseedResourceTypes(), seedDefaultGovernanceRoles() — idempotent
Schemalibs/infrastructure/database/schema/src/schema/schema-governance/6 tables: resource_types, permissions, role_permissions, user_roles, access_audit, org_invitations
Compositionlibs/app-server/.../composition/build-governance.tsWires PolicyEngine + repos into GovernanceBundle

Existing Tests

TypeFileCovers
e2eapps/.../drmg-sales-e2e/src/e2e/identity-access/identity-invite-flow.authenticated.spec.tsS1, Build #5, #6
e2eapps/.../drmg-sales-e2e/src/e2e/identity-access/permission-toggle.authenticated.spec.tsS2, Build #4
integrationactions/governance-admin.actions.integration.spec.tsRole/permission CRUD
intentapps/intents-e2e/src/intents/auth/governance-seed-defaults.intent.spec.tsS5, Build #3

Seeds and Fixtures

  • Seed command: seed-governance-defaults.ts runs on deploy — creates 3 roles (Admin, Member, Viewer) and CRUD permissions for all entities in governance_resource_types
  • Test account: Owner account (Clerk) with Admin role — used by all e2e tests
  • Reference table: governance_resource_types must be populated before permission seed runs (seed function handles ordering)
  • Idempotent: Safe to re-run — checks for existing rows before INSERT

Implementation Guardrails

  • Use audit/page.tsx as the pattern for all governance pages (server-component-first, getGovernancePorts() composition)
  • getGovernancePorts() returns { policyEngine, userRoleRepo, rolePermissionRepo, permissionRepo, accessAuditRepo } — use this, do not create alternate composition
  • Domain uses British spelling (organisationId, agentProfileId); server maps from American (organizationId)
  • New mutations must go through actions/governance-admin.actions.ts or actions/invitation.actions.ts — do not create new action files
  • All permission checks use assertPermission(context, action, resourceType) — do not bypass with direct DB queries
  • Reference table migration: governance_resource_types replaces pgEnum — INSERT new entity types, do not modify enum