All docs
DATABASE
This project uses Prisma 7 with the `prisma-client` generator and a multi-file schema:
Source file: DATABASE.md
Prisma Setup
This project uses Prisma 7 with the prisma-client generator and a multi-file schema:
- Root config:
prisma/schema.prisma(generator + datasource) - Domain models:
prisma/models/*.prisma - Runtime client output:
lib/generated/prisma/
Database access is centralized through lib/db.ts using PrismaPg adapter.
Schema Domains
1) Identity + Auth
From prisma/models/user.prisma and prisma/models/auth.prisma:
UserAccountSessionVerificationToken- enum
SystemRole(ADMIN,USER)
Key points:
User.emailis unique.User.passwordis nullable to support OAuth-only users.User.localedefaults to"en".User.systemRolecontrols platform-level admin access.User.notificationPreferencesstores opt-in preferences as JSON.Accountenforces@@unique([provider, providerAccountId]).Session.sessionTokenis unique.VerificationTokenenforces@@unique([identifier, token]).
2) Firms + Memberships
From prisma/models/firm.prisma:
FirmFirmMembershipFirmInvitation- enums
FirmRole,FirmMembershipStatus
Key points:
Firmis the primary tenant boundary. All billing, projects, and access are scoped to a firm.Firm.slugis unique (used in URLs).FirmMembershipenforces@@unique([firmId, userId]).- Roles:
OWNER,ADMIN,PARTNER,ANALYST,REVIEWER,VIEWER. FirmInvitationsupports inviting users by email before they register. Token-based acceptance.- Cascade delete removes memberships and invitations when a firm is deleted.
3) Project Workspace
From prisma/models/project.prisma and prisma/models/project-document.prisma:
ProjectProjectDocumentProjectMembership- enums
ProjectStatus,ProjectDocumentProcessingStatus
Key points:
Projectbelongs to oneUserand oneFirm.Project.statusis one ofDRAFT,IN_PROGRESS,REVIEWED,COMPLETE,REJECTED.ProjectMembershipprovides optional ring-fencing — when present, only listed members can access the project.ProjectDocumentstores file metadata/pathname and processing state.ProjectDocument.processingStatusis one ofQUEUED,PROCESSING,PROCESSED,FAILED.- Cascade delete removes project children when a project is deleted.
ProjectDocumentenforces@@unique([projectId, pathname]).
4) API Key Management
From prisma/models/api-key.prisma:
UserApiKey- enum
ApiKeyProvider(OPENAI,ANTHROPIC,GOOGLE)
Key points:
- One key per provider per user via
@@unique([userId, provider]). enabledallows a key to be disabled without deletion.- Validation state is captured with
lastValidatedAtandvalidationError.
5) Diligence Execution and Outputs
From prisma/models/diligence.prisma:
- Execution control:
DiligenceJobDiligenceStageRun- enums
DiligenceJobStatus,DiligenceStageName,DiligenceStageStatus
- Input/output artifacts:
DiligenceArtifactDiligenceChunk- enums
DiligenceArtifactType,DiligenceStorageProvider
- Analytical entities:
DiligenceEntityDiligenceClaimDiligenceFindingDiligenceContradiction- enums
DiligenceFindingType,DiligenceClaimStatus
- Structured question framework:
DiligenceQuestionAnswerDiligenceEvidenceGapDiligenceOpenQuestionDiligenceDocumentClassification- enum
DiligenceCoreQuestion
Key points:
DiligenceJobstores provider/model selection, fallback providers, workflow run ID, token usage, and estimated cost.DiligenceArtifactsupports multiple storage backends and artifact types includingOCR_OUTPUT,MODEL_TRACE,EVIDENCE_MAP, andEXPORT_BUNDLE.DiligenceQuestionAnswerenforces@@unique([jobId, question]).DiligenceDocumentClassificationenforces@@unique([jobId, documentPathname]).
6) Knowledge Graph Definitions
From prisma/models/graph.prisma:
KnowledgeGraphDefinitionOntologyNodeOntologyEdgeFirmGraphEnablementAssistanceGoalEvidenceRequirementEvidenceMappingOutputTemplate- enums
GraphDefinitionStatus,OntologyNodeKind,OntologyEdgeKind,EvidenceRequirementStatus,OutputTemplateKind
Key points:
KnowledgeGraphDefinitionis platform-level and versioned. Slug is unique.OntologyNodekinds:ENTITY,CONTROL,EVIDENCE_TYPE,QUESTION,OUTPUT_SECTION,RISK_CATEGORY.OntologyEdgekinds:REQUIRES,SATISFIES,CONTRADICTS,MAPS_TO,ESCALATES_TO,PART_OF.FirmGraphEnablementlinks a firm to a published graph (@@unique([firmId, graphId])).AssistanceGoalbinds a project to a graph (projectIdis unique — one goal per project).EvidenceRequirementdefines what each graph node needs to be satisfied.EvidenceMappingtracks per-project evidence status against requirements (@@unique([projectId, requirementId])).OutputTemplatedefines report/questionnaire schemas per graph.
7) Billing + Entitlements
From prisma/models/billing.prisma:
BillingCustomerSubscriptionPlanEntitlementUsageMeterInvoiceEvent- enums
SubscriptionStatus,BillingInterval
Key points:
BillingCustomeris 1:1 withFirm(uniquefirmIdandstripeCustomerId).Subscriptiontracks Stripe subscription state, period, and cancellation.PlanEntitlementdefines per-firm limits (seats, projects, uploads, runs, exports).UsageMetertracks rolling monthly usage counters, reset each billing period.InvoiceEventis an immutable log of Stripe webhook events (idempotent viastripeEventId).
8) Audit Logs
From prisma/models/audit.prisma:
AuditLog- enum
AuditAction
Key points:
- Scoped to
firmIdwith optionalprojectId. actorUserIdrecords who performed the action.- Actions cover: membership, billing, project lifecycle, documents, workflows, exports, graph enablement.
- Indexed by
[firmId, createdAt],[actorUserId, createdAt],[projectId, createdAt],[action, createdAt].
Entity Relationship Overview
Rendering diagram…
Design Decisions
userIdis duplicated across child diligence tables intentionally — allows direct row-level filtering by user without mandatory joins throughProject/DiligenceJob.firmIdonProjectandEvidenceMappingenables firm-scoped queries without joining through user memberships.- JSON fields are used for opaque structured outputs and references:
metadata,chunkRefs,evidenceRefs,structured,outputJson,topicsCovered,contradictions,fallbackProviders. - Heavy text (
DiligenceChunk.text) and outputs are stored in DB for deterministic replay and enquiry grounding. - Per-job uniqueness constraints keep stage outputs, question answers, and document classifications deterministic.
InvoiceEvent.stripeEventIdprovides idempotency for webhook processing.
Migration / Generate Commands
After changing schema files:
yarn prisma generate
yarn prisma migrate dev