Project ROUNDTABLE Docs
Data model

Submissions and matches

Industry technical intake and routing results

A submission is the record created when an industry organization shares a capability statement, white paper, pitch material, event summary, or profile update. It is not a contract offer and the portal warns users not to submit source-selection information.

Submission

ColumnPrisma typeRequired?DefaultMeaning
idStringYescuid()Submission identifier.
organizationIdStringYesNoneSending organization.
typeSubmissionTypeYesNoneKind of material.
statusSubmissionStatusYesSUBMITTEDRouting/review lifecycle state.
titleStringYesNoneShort descriptive title.
summaryStringYesNonePlain-text technical summary.
filePathString?NoNULLPrivate object key/path when a file was uploaded.
fileNameString?NoNULLOriginal filename shown to users.
techTagsStringYes""Lowercase comma-separated tags.
callIdString?NoNULLOptional call for technology answered.
reviewerIdString?NoNULLOptional government reviewer.
createdAtDateTimeYesnow()Submission time.
updatedAtDateTimeYes@updatedAtLast status or content update.

Relations are organization, optional call, optional reviewer, and many matches. A text-only submission is valid because filePath and fileName are optional.

SubmissionType

ValueMeaning
CAPABILITY_STATEMENTOrganization capability overview.
WHITE_PAPERDeeper technical paper.
PITCH_MATERIALBriefing or pitch material.
EVENT_SUMMARYFollow-up or summary from an event.
PROFILE_UPDATEInformation intended to update an organization profile.

SubmissionStatus

ValueMeaning
SUBMITTEDAccepted intake record awaiting or eligible for routing.
ROUTEDAt least one match was persisted.
REVIEWEDA government reviewer has reviewed it.
ARCHIVEDRetained record no longer in active workflow.

SubmissionMatch

ColumnPrisma typeRequired?DefaultMeaning
idStringYescuid()Match identifier.
submissionIdStringYesNoneSubmission being routed.
portfolioNodeIdStringYesNoneCandidate technical node.
scoreFloatYesNoneScore on a shared 0–1 scale; Bedrock scores are rescaled to it, so this field does not identify the scorer.
rationaleString?NoNULLOptional explanation.
createdAtDateTimeYesnow()Match creation time.

@@unique([submissionId, portfolioNodeId]) prevents duplicate matches for one submission/node pair. routeSubmission deletes old matches and recreates the current ranked set in a transaction.

File and routing lifecycle

File constraints are implemented in the portal route, not in Prisma: PDF, DOCX, PPTX, or TXT; maximum 15 MB; magic-byte checks; server-side encryption in S3 unless the deployment sets UPLOADS_S3_SSE=none. The database stores the private key, never a public upload URL.

Foreign-key behavior

organizationId is required, so every submission has an accountable industry owner. callId is optional and is checked by the route for an open call before creation. reviewerId is optional until government review begins. The schema's relation fields let a government detail page include organization and matches without copying organization name into every submission row.

The current schema does not store a MIME type, checksum, or extracted text. fileName is presentation metadata and filePath is the private storage key. If a future feature needs content scanning or deduplication, those are additive fields or services rather than assumptions about current behavior.

Rerouting is safe to repeat because (submissionId, portfolioNodeId) is unique and the matching service replaces the old set in a transaction. Notification de-duplication is handled separately by recipient, kind, and link URL.