Overlay onto the SplitNaira repo.
backend/src/services/collaboration/invitation-registry.ts– register / cancel / accept guards + cancel eventsPOST /auth/invitationsreturnsinvitationIdand tracks pending invitesPOST /auth/invitations/:invitationId/cancel– inviter-only cancellationPOST /auth/invitations/acceptrejects cancelled invites with 410 invitation_cancelled- Tests:
invitation-cancel.test.ts
backend/src/services/collaboration/permissions.ts– rolesowner|admin|editor|viewer, full permission matrix,assertPermission,resolveCollaboratorRoleGET /collaboration/permissions/matrix- Delete route enforces
project:deleteserver-side - Tests:
permissions-matrix.test.ts
frontend/src/components/splits/ParticipantPercentageValidation.tsx- Live total %, invalid highlight,
shouldBlockSubmit() - Server basisPoints (sum 10000) remains authoritative
- Tests:
ParticipantPercentageValidation.test.ts
backend/src/services/collaboration/project-deletion.ts- Detects financial history; hard delete blocked → soft delete with confirmation phrase
DELETE PROJECT - Audit events preserved
POST /collaboration/projects/:projectId/delete- Tests:
project-deletion.test.ts
cd backend && npx vitest run src/services/collaboration
cd frontend && npx vitest run src/components/splits/ParticipantPercentageValidation.test.ts