/home/techb158/cosmic.abdallabala.com/docs
Edit: /home/techb158/cosmic.abdallabala.com/docs/01-uml-class-diagram.puml (11869B)
@startuml
skinparam classAttributeIconSize 0
skinparam shadowing false
skinparam classFontSize 12
skinparam packageStyle rectangle
title COSMIC AI-Risk Dashboard, UML Class Diagram
package "Domain Model" {
class Project {
+id: string
+name: string
+subtitle: string
+projectType: ProjectType
+currentLifecyclePhase: LifecyclePhaseName
+riskAppetite: number
+assessmentDate: date
+status: ProjectStatus
}
class LifecyclePhase {
+id: string
+projectId: string
+name: LifecyclePhaseName
+status: PhaseStatus
+readinessScore: number
}
class Risk {
+id: string
+projectId: string
+title: string
+description: string
+dimension: RiskDimension
+domain: RiskDomain
+lifecyclePhase: LifecyclePhaseName
+probability: number
+impact: number
+detectability: number
+status: RiskStatus
+approvalStatus: ApprovalStatus
+ownerId: string
+dueDate: date
+calculateRawScore(): number
}
class RiskScore {
+id: string
+riskId: string
+rawScore: number
+normalizedScore: number
+residualScore: number
+riskLevel: RiskLevel
+calculatedAt: datetime
}
class MitigationAction {
+id: string
+riskId: string
+title: string
+description: string
+ownerId: string
+status: MitigationStatus
+progressPercent: number
+effectivenessPercent: number
+dueDate: date
}
class Indicator {
+id: string
+name: string
+measurand: string
+unit: string
+thresholdMin: number
+thresholdMax: number
+interpretationRule: string
+dimension: RiskDimension
}
class MeasurementRecord {
+id: string
+projectId: string
+indicatorId: string
+value: string
+numericValue: number
+status: IndicatorStatus
+measuredAt: datetime
+evidenceId: string
}
class Experiment {
+id: string
+projectId: string
+name: string
+modelName: string
+datasetVersion: string
+selected: boolean
+reproducibilityStatus: ReproducibilityStatus
+createdAt: datetime
}
class ModelMetric {
+id: string
+experimentId: string
+metricName: string
+metricValue: number
+threshold: number
+status: MetricStatus
}
class DeploymentGate {
+id: string
+projectId: string
+status: GateStatus
+reviewStatus: ReviewStatus
+evaluatedAt: datetime
+evaluatedByUserId: string
+reviewedByDisplayName: string
+reviewedAt: datetime
+summary: string
+evaluate(): GateStatus
}
class GateCriterion {
+id: string
+gateId: string
+name: string
+actualValue: string
+expectedRule: string
+status: CriterionStatus
+blocking: boolean
+evidence: string
+evidenceUri: string
+reviewerStatus: CriterionReviewStatus
+reviewerNote: string
}
class GateDecision {
+id: string
+gateId: string
+decision: ReviewerDecision
+reason: string
+approvedByUserId: string
+reviewerDisplayName: string
+approvedAt: datetime
+createdAt: datetime
}
class EvidenceArtifact {
+id: string
+projectId: string
+riskId: string
+type: EvidenceType
+title: string
+uri: string
+createdByUserId: string
+createdAt: datetime
}
class User {
+id: string
+displayName: string
+email: string
+roleId: string
+active: boolean
}
class Role {
+id: string
+name: RoleName
+permissions: string[]
}
class AuditEvent {
+id: string
+projectId: string
+actorUserId: string
+entityType: string
+entityId: string
+action: string
+beforeJson: object
+afterJson: object
+createdAt: datetime
}
class TrelloMapping {
+id: string
+projectId: string
+trelloBoardId: string
+trelloListId: string
+trelloCardId: string
+localEntityType: string
+localEntityId: string
+syncStatus: SyncStatus
+lastSyncedAt: datetime
}
class ProjectManagementIntegration {
+id: string
+provider: string
+workspaceName: string
+externalProjectKey: string
+baseUrl: string
+authMode: string
+connectionStatus: string
+syncDirection: string
+lastSyncAt: datetime
}
class ExternalWorkItemMapping {
+id: string
+localEntityType: string
+localEntityId: string
+externalItemType: string
+externalItemId: string
+externalStatus: string
+syncStatus: string
+lastSyncedAt: datetime
}
class ProjectManagementSyncRun {
+id: string
+provider: string
+status: string
+createdCount: int
+updatedCount: int
+failedCount: int
+summary: string
}
}
package "Application Services" {
class RiskScoringService {
+calculateRiskScore(risk: Risk): RiskScore
+calculateResidualRisk(risk: Risk, mitigations: MitigationAction[]): number
+calculateProjectRisk(projectId: string): number
+calculateDimensionScores(projectId: string): map
}
class GateEvaluationService {
+evaluateProjectGate(projectId: string): DeploymentGate
+buildCriteria(projectId: string): GateCriterion[]
+blockIfCriticalCriteriaFail(criteria: GateCriterion[]): GateStatus
}
class GateWorkflowService {
+listGateHistory(projectId: string): DeploymentGate[]
+recordDecision(gateId: string, decision: GateDecision): GateDecision
+updateCriterionReview(criterionId: string): GateCriterion
+listAuditEvents(projectId: string): AuditEvent[]
}
class IndicatorService {
+recordMeasurement(record: MeasurementRecord): MeasurementRecord
+evaluateIndicator(record: MeasurementRecord): IndicatorStatus
}
class ProjectManagementIntegrationService {
+listSupportedProviders(): Provider[]
+createIntegration(projectId: string): ProjectManagementIntegration
+syncIntegration(integrationId: string): ProjectManagementSyncRun
+createRiskMapping(integrationId: string, riskId: string): ExternalWorkItemMapping
}
interface ProjectManagementAdapter {
+mapRiskToWorkItem(risk: Risk): object
+mapMitigationToExternalItem(mitigation: MitigationAction): object
+sync(): ProjectManagementSyncRun
}
class TrelloAdapter
class JiraAdapter
class AsanaAdapter
class MicrosoftPlannerAdapter
class ReportExport {
+id: string
+projectId: string
+reportType: string
+format: string
+generatedByUserId: string
+generatedAt: datetime
}
class ReportingService {
+getExecutiveReport(projectId: string): object
+getFullReport(projectId: string): object
+getRiskRegisterCsv(projectId: string): string
+getMitigationCsv(projectId: string): string
+renderExecutiveHtml(projectId: string): string
}
}
Project "1" o-- "6" LifecyclePhase
Project "1" o-- "0..*" Risk
Project "1" o-- "0..*" Indicator
Project "1" o-- "0..*" MeasurementRecord
Project "1" o-- "0..*" Experiment
Project "1" o-- "0..*" DeploymentGate
Project "1" o-- "0..*" EvidenceArtifact
Project "1" o-- "0..*" AuditEvent
Project "1" o-- "0..*" TrelloMapping
Project "1" o-- "0..*" ProjectManagementIntegration
Project "1" o-- "0..*" ExternalWorkItemMapping
Project "1" o-- "0..*" ProjectManagementSyncRun
Project "1" o-- "0..*" ReportExport
ProjectManagementIntegration "1" o-- "0..*" ExternalWorkItemMapping
ProjectManagementIntegration "1" o-- "0..*" ProjectManagementSyncRun
ExternalWorkItemMapping "0..*" --> "0..1" Risk : local risk
Risk "1" o-- "0..*" MitigationAction
Risk "1" o-- "0..*" RiskScore
Risk "1" o-- "0..*" EvidenceArtifact
Risk "0..*" --> "1" User : owner
MitigationAction "0..*" --> "1" User : owner
Indicator "1" o-- "0..*" MeasurementRecord
MeasurementRecord "0..*" --> "0..1" EvidenceArtifact
Experiment "1" o-- "0..*" ModelMetric
DeploymentGate "1" o-- "1..*" GateCriterion
DeploymentGate "1" o-- "0..*" GateDecision
User "0..*" --> "1" Role
RiskScoringService ..> Risk
RiskScoringService ..> RiskScore
RiskScoringService ..> MitigationAction
GateEvaluationService ..> DeploymentGate
GateEvaluationService ..> GateCriterion
GateWorkflowService ..> DeploymentGate
GateWorkflowService ..> GateDecision
GateWorkflowService ..> GateCriterion
GateWorkflowService ..> AuditEvent
IndicatorService ..> Indicator
IndicatorService ..> MeasurementRecord
ProjectManagementIntegrationService ..> ProjectManagementIntegration
ProjectManagementIntegrationService ..> ExternalWorkItemMapping
ProjectManagementIntegrationService ..> ProjectManagementSyncRun
ProjectManagementAdapter <|.. TrelloAdapter
ProjectManagementAdapter <|.. JiraAdapter
ProjectManagementAdapter <|.. AsanaAdapter
ProjectManagementAdapter <|.. MicrosoftPlannerAdapter
ReportingService ..> Project
ReportingService ..> ReportExport
ReportingService ..> DeploymentGate
ReportingService ..> ExternalWorkItemMapping
note right of Risk
Core measurable risk object.
Uses probability, impact, and detectability.
The formula is an implementation extension.
end note
note right of Indicator
ISO-style measurement concept.
Stores measurand, unit, threshold,
and interpretation rule.
end note
' Step 7.1 extension, OAuth and live PM clients
class OAuthService {
+listProviders()
+buildAuthorizePayload(provider, integrationId, actorUserId)
+exchangeAuthorizationCode(provider, code, state)
+storeOAuthToken(provider, tokenResponse, context)
+getAccessToken(provider, integrationId)
}
class OAuthState {
+id: string
+provider: string
+state: string
+integrationId: string
+status: string
+expiresAt: datetime
}
class OAuthToken {
+id: string
+provider: string
+integrationId: string
+accessTokenEncrypted: string
+accessTokenRedacted: string
+refreshTokenEncrypted: string
+expiresAt: datetime
}
class TokenVault {
+encryptToken(token)
+decryptToken(payload)
+redactToken(token)
}
interface LiveProjectManagementClient {
+testConnection()
+createRiskWorkItem(risk, mitigations, integration)
+updateRiskWorkItem(mapping, risk, mitigations)
}
class TrelloClient
class JiraClient
class AsanaClient
class PlannerClient
OAuthService --> OAuthState
OAuthService --> OAuthToken
OAuthService --> TokenVault
IntegrationService --> LiveProjectManagementClient
LiveProjectManagementClient <|.. TrelloClient
LiveProjectManagementClient <|.. JiraClient
LiveProjectManagementClient <|.. AsanaClient
LiveProjectManagementClient <|.. PlannerClient
class AccessControlService {
+listPermissions(): string[]
+listUsers(): User[]
+listRoles(): Role[]
+createUser(payload, actorUserId): User
+updateUser(userId, payload, actorUserId): User
+createRole(payload, actorUserId): Role
+updateRole(roleId, payload, actorUserId): Role
+requirePermission(userId, permission, context): User
}
class AuthorizationError {
+status: number
+details: object
}
AccessControlService --> User
AccessControlService --> Role
AccessControlService --> AuditEvent
AccessControlService ..> AuthorizationError
' Step 9 extension, production operations
class RuntimeConfig {
+nodeEnv: string
+port: number
+databaseFile: string
+backupDir: string
+securityHeadersEnabled: boolean
+forceHttps: boolean
+hstsEnabled: boolean
+allowedOrigins: string[]
+frameAncestors: string[]
}
class OperationsService {
+getHealth(): object
+getReadiness(): object
+getSecurityStatus(): object
+createBackup(actorUserId): BackupManifest
+listBackups(): BackupManifest[]
}
class BackupManifest {
+id: string
+actorUserId: string
+sourceFile: string
+backupFile: string
+createdAt: datetime
+sizeBytes: number
+sha256: string
}
class SecurityHeaders {
+buildSecurityHeaders(req, config): object
+buildContentSecurityPolicy(config): string
+isHttpsRequest(req, config): boolean
}
OperationsService --> RuntimeConfig
OperationsService --> BackupManifest
OperationsService --> AuditEvent
SecurityHeaders --> RuntimeConfig
@enduml