All checks were successful
CI/CD / go-lint (push) Has been skipped
CI/CD / python-lint (push) Has been skipped
CI/CD / nodejs-lint (push) Has been skipped
CI/CD / test-go-ai-compliance (push) Successful in 44s
CI/CD / test-python-backend-compliance (push) Successful in 33s
CI/CD / test-python-document-crawler (push) Successful in 22s
CI/CD / test-python-dsms-gateway (push) Successful in 19s
CI/CD / validate-canonical-controls (push) Successful in 13s
CI/CD / Deploy (push) Successful in 4s
Implements Phases 1-4 of the IACE Hazard-Matching-Engine: - 120 machine components (C001-C120) in 11 categories - 20 energy sources (EN01-EN20) - ~85 tag taxonomy across 5 domains - 44 hazard patterns with AND/NOT matching logic - Pattern engine with tag resolution and confidence scoring - 8 new API endpoints (component-library, energy-sources, tags, patterns, match/apply) - Completeness gate G09 for pattern matching - 320 tests passing (36 new) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
625 lines
28 KiB
Go
625 lines
28 KiB
Go
package iace
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// ============================================================================
|
|
// Constants / Enums
|
|
// ============================================================================
|
|
|
|
// ProjectStatus represents the lifecycle status of an IACE project
|
|
type ProjectStatus string
|
|
|
|
const (
|
|
ProjectStatusDraft ProjectStatus = "draft"
|
|
ProjectStatusOnboarding ProjectStatus = "onboarding"
|
|
ProjectStatusClassification ProjectStatus = "classification"
|
|
ProjectStatusHazardAnalysis ProjectStatus = "hazard_analysis"
|
|
ProjectStatusMitigation ProjectStatus = "mitigation"
|
|
ProjectStatusVerification ProjectStatus = "verification"
|
|
ProjectStatusTechFile ProjectStatus = "tech_file"
|
|
ProjectStatusCompleted ProjectStatus = "completed"
|
|
ProjectStatusArchived ProjectStatus = "archived"
|
|
)
|
|
|
|
// ComponentType represents the type of a system component
|
|
type ComponentType string
|
|
|
|
const (
|
|
ComponentTypeSoftware ComponentType = "software"
|
|
ComponentTypeFirmware ComponentType = "firmware"
|
|
ComponentTypeAIModel ComponentType = "ai_model"
|
|
ComponentTypeHMI ComponentType = "hmi"
|
|
ComponentTypeSensor ComponentType = "sensor"
|
|
ComponentTypeActuator ComponentType = "actuator"
|
|
ComponentTypeController ComponentType = "controller"
|
|
ComponentTypeNetwork ComponentType = "network"
|
|
ComponentTypeMechanical ComponentType = "mechanical"
|
|
ComponentTypeElectrical ComponentType = "electrical"
|
|
ComponentTypeOther ComponentType = "other"
|
|
)
|
|
|
|
// RegulationType represents the applicable EU regulation
|
|
type RegulationType string
|
|
|
|
const (
|
|
RegulationNIS2 RegulationType = "nis2"
|
|
RegulationAIAct RegulationType = "ai_act"
|
|
RegulationCRA RegulationType = "cra"
|
|
RegulationMachineryRegulation RegulationType = "machinery_regulation"
|
|
)
|
|
|
|
// HazardStatus represents the lifecycle status of a hazard
|
|
type HazardStatus string
|
|
|
|
const (
|
|
HazardStatusIdentified HazardStatus = "identified"
|
|
HazardStatusAssessed HazardStatus = "assessed"
|
|
HazardStatusMitigated HazardStatus = "mitigated"
|
|
HazardStatusAccepted HazardStatus = "accepted"
|
|
HazardStatusClosed HazardStatus = "closed"
|
|
)
|
|
|
|
// AssessmentType represents the type of risk assessment
|
|
type AssessmentType string
|
|
|
|
const (
|
|
AssessmentTypeInitial AssessmentType = "initial"
|
|
AssessmentTypePostMitigation AssessmentType = "post_mitigation"
|
|
AssessmentTypeReassessment AssessmentType = "reassessment"
|
|
)
|
|
|
|
// RiskLevel represents the severity level of a risk
|
|
type RiskLevel string
|
|
|
|
const (
|
|
RiskLevelNotAcceptable RiskLevel = "not_acceptable" // ISO 12100 mode: > 300
|
|
RiskLevelVeryHigh RiskLevel = "very_high" // ISO 12100 mode: 151-300
|
|
RiskLevelCritical RiskLevel = "critical"
|
|
RiskLevelHigh RiskLevel = "high"
|
|
RiskLevelMedium RiskLevel = "medium"
|
|
RiskLevelLow RiskLevel = "low"
|
|
RiskLevelNegligible RiskLevel = "negligible"
|
|
)
|
|
|
|
// ReductionType represents the type of risk reduction measure
|
|
type ReductionType string
|
|
|
|
const (
|
|
ReductionTypeDesign ReductionType = "design"
|
|
ReductionTypeProtective ReductionType = "protective"
|
|
ReductionTypeInformation ReductionType = "information"
|
|
)
|
|
|
|
// MitigationStatus represents the lifecycle status of a mitigation measure
|
|
type MitigationStatus string
|
|
|
|
const (
|
|
MitigationStatusPlanned MitigationStatus = "planned"
|
|
MitigationStatusImplemented MitigationStatus = "implemented"
|
|
MitigationStatusVerified MitigationStatus = "verified"
|
|
MitigationStatusRejected MitigationStatus = "rejected"
|
|
)
|
|
|
|
// VerificationMethod represents the method used for verification
|
|
type VerificationMethod string
|
|
|
|
const (
|
|
VerificationMethodTest VerificationMethod = "test"
|
|
VerificationMethodAnalysis VerificationMethod = "analysis"
|
|
VerificationMethodInspection VerificationMethod = "inspection"
|
|
VerificationMethodReview VerificationMethod = "review"
|
|
VerificationMethodDesignReview VerificationMethod = "design_review"
|
|
VerificationMethodCalculation VerificationMethod = "calculation"
|
|
VerificationMethodTestReport VerificationMethod = "test_report"
|
|
VerificationMethodValidation VerificationMethod = "validation"
|
|
VerificationMethodElectricalTest VerificationMethod = "electrical_test"
|
|
VerificationMethodSoftwareTest VerificationMethod = "software_test"
|
|
VerificationMethodPenetrationTest VerificationMethod = "penetration_test"
|
|
VerificationMethodAcceptanceProtocol VerificationMethod = "acceptance_protocol"
|
|
VerificationMethodUserTest VerificationMethod = "user_test"
|
|
VerificationMethodDocRelease VerificationMethod = "documentation_release"
|
|
)
|
|
|
|
// TechFileSectionStatus represents the status of a technical file section
|
|
type TechFileSectionStatus string
|
|
|
|
const (
|
|
TechFileSectionStatusDraft TechFileSectionStatus = "draft"
|
|
TechFileSectionStatusGenerated TechFileSectionStatus = "generated"
|
|
TechFileSectionStatusReviewed TechFileSectionStatus = "reviewed"
|
|
TechFileSectionStatusApproved TechFileSectionStatus = "approved"
|
|
)
|
|
|
|
// MonitoringEventType represents the type of monitoring event
|
|
type MonitoringEventType string
|
|
|
|
const (
|
|
MonitoringEventTypeIncident MonitoringEventType = "incident"
|
|
MonitoringEventTypeUpdate MonitoringEventType = "update"
|
|
MonitoringEventTypeDriftAlert MonitoringEventType = "drift_alert"
|
|
MonitoringEventTypeRegulationChange MonitoringEventType = "regulation_change"
|
|
MonitoringEventTypeAudit MonitoringEventType = "audit"
|
|
)
|
|
|
|
// AuditAction represents the type of action recorded in the audit trail
|
|
type AuditAction string
|
|
|
|
const (
|
|
AuditActionCreate AuditAction = "create"
|
|
AuditActionUpdate AuditAction = "update"
|
|
AuditActionDelete AuditAction = "delete"
|
|
AuditActionApprove AuditAction = "approve"
|
|
AuditActionVerify AuditAction = "verify"
|
|
)
|
|
|
|
// LifecyclePhase represents a machine lifecycle phase per ISO 12100 methodology
|
|
type LifecyclePhase string
|
|
|
|
const (
|
|
LPTransport LifecyclePhase = "transport"
|
|
LPStorage LifecyclePhase = "storage"
|
|
LPAssembly LifecyclePhase = "assembly"
|
|
LPInstallation LifecyclePhase = "installation"
|
|
LPCommissioning LifecyclePhase = "commissioning"
|
|
LPParameterization LifecyclePhase = "parameterization"
|
|
LPSetup LifecyclePhase = "setup"
|
|
LPNormalOperation LifecyclePhase = "normal_operation"
|
|
LPAutoOperation LifecyclePhase = "automatic_operation"
|
|
LPManualOperation LifecyclePhase = "manual_operation"
|
|
LPTeachMode LifecyclePhase = "teach_mode"
|
|
LPProductionStart LifecyclePhase = "production_start"
|
|
LPProductionStop LifecyclePhase = "production_stop"
|
|
LPProcessMonitoring LifecyclePhase = "process_monitoring"
|
|
LPCleaning LifecyclePhase = "cleaning"
|
|
LPMaintenance LifecyclePhase = "maintenance"
|
|
LPInspection LifecyclePhase = "inspection"
|
|
LPCalibration LifecyclePhase = "calibration"
|
|
LPFaultClearing LifecyclePhase = "fault_clearing"
|
|
LPRepair LifecyclePhase = "repair"
|
|
LPChangeover LifecyclePhase = "changeover"
|
|
LPSoftwareUpdate LifecyclePhase = "software_update"
|
|
LPRemoteMaintenance LifecyclePhase = "remote_maintenance"
|
|
LPDecommissioning LifecyclePhase = "decommissioning"
|
|
LPDisposal LifecyclePhase = "disposal"
|
|
)
|
|
|
|
// ReviewStatus represents the review state of a hazard assessment
|
|
type ReviewStatus string
|
|
|
|
const (
|
|
ReviewStatusDraft ReviewStatus = "draft"
|
|
ReviewStatusInReview ReviewStatus = "in_review"
|
|
ReviewStatusReviewed ReviewStatus = "reviewed"
|
|
ReviewStatusApproved ReviewStatus = "approved"
|
|
ReviewStatusRejected ReviewStatus = "rejected"
|
|
)
|
|
|
|
// ============================================================================
|
|
// Main Entities
|
|
// ============================================================================
|
|
|
|
// Project represents an IACE compliance project for a machine or system
|
|
type Project struct {
|
|
ID uuid.UUID `json:"id"`
|
|
TenantID uuid.UUID `json:"tenant_id"`
|
|
MachineName string `json:"machine_name"`
|
|
MachineType string `json:"machine_type"`
|
|
Manufacturer string `json:"manufacturer"`
|
|
Description string `json:"description,omitempty"`
|
|
NarrativeText string `json:"narrative_text,omitempty"`
|
|
Status ProjectStatus `json:"status"`
|
|
CEMarkingTarget string `json:"ce_marking_target,omitempty"`
|
|
CompletenessScore float64 `json:"completeness_score"`
|
|
RiskSummary map[string]int `json:"risk_summary,omitempty"`
|
|
TriggeredRegulations json.RawMessage `json:"triggered_regulations,omitempty"`
|
|
Metadata json.RawMessage `json:"metadata,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
ArchivedAt *time.Time `json:"archived_at,omitempty"`
|
|
}
|
|
|
|
// Component represents a system component within a project
|
|
type Component struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
ParentID *uuid.UUID `json:"parent_id,omitempty"`
|
|
Name string `json:"name"`
|
|
ComponentType ComponentType `json:"component_type"`
|
|
Version string `json:"version,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
IsSafetyRelevant bool `json:"is_safety_relevant"`
|
|
IsNetworked bool `json:"is_networked"`
|
|
Metadata json.RawMessage `json:"metadata,omitempty"`
|
|
SortOrder int `json:"sort_order"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// RegulatoryClassification represents the classification result for a regulation
|
|
type RegulatoryClassification struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
Regulation RegulationType `json:"regulation"`
|
|
ClassificationResult string `json:"classification_result"`
|
|
RiskLevel RiskLevel `json:"risk_level"`
|
|
Confidence float64 `json:"confidence"`
|
|
Reasoning string `json:"reasoning,omitempty"`
|
|
RAGSources json.RawMessage `json:"rag_sources,omitempty"`
|
|
Requirements json.RawMessage `json:"requirements,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// HazardLibraryEntry represents a reusable hazard template from the library
|
|
type HazardLibraryEntry struct {
|
|
ID uuid.UUID `json:"id"`
|
|
Category string `json:"category"`
|
|
SubCategory string `json:"sub_category,omitempty"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description,omitempty"`
|
|
DefaultSeverity int `json:"default_severity"`
|
|
DefaultProbability int `json:"default_probability"`
|
|
DefaultExposure int `json:"default_exposure,omitempty"`
|
|
DefaultAvoidance int `json:"default_avoidance,omitempty"`
|
|
ApplicableComponentTypes []string `json:"applicable_component_types"`
|
|
RegulationReferences []string `json:"regulation_references"`
|
|
SuggestedMitigations json.RawMessage `json:"suggested_mitigations,omitempty"`
|
|
TypicalCauses []string `json:"typical_causes,omitempty"`
|
|
TypicalHarm string `json:"typical_harm,omitempty"`
|
|
RelevantLifecyclePhases []string `json:"relevant_lifecycle_phases,omitempty"`
|
|
RecommendedMeasuresDesign []string `json:"recommended_measures_design,omitempty"`
|
|
RecommendedMeasuresTechnical []string `json:"recommended_measures_technical,omitempty"`
|
|
RecommendedMeasuresInformation []string `json:"recommended_measures_information,omitempty"`
|
|
SuggestedEvidence []string `json:"suggested_evidence,omitempty"`
|
|
RelatedKeywords []string `json:"related_keywords,omitempty"`
|
|
Tags []string `json:"tags,omitempty"`
|
|
IsBuiltin bool `json:"is_builtin"`
|
|
TenantID *uuid.UUID `json:"tenant_id,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// Hazard represents a specific hazard identified within a project
|
|
type Hazard struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
ComponentID uuid.UUID `json:"component_id"`
|
|
LibraryHazardID *uuid.UUID `json:"library_hazard_id,omitempty"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description,omitempty"`
|
|
Scenario string `json:"scenario,omitempty"`
|
|
Category string `json:"category"`
|
|
SubCategory string `json:"sub_category,omitempty"`
|
|
Status HazardStatus `json:"status"`
|
|
MachineModule string `json:"machine_module,omitempty"`
|
|
Function string `json:"function,omitempty"`
|
|
LifecyclePhase string `json:"lifecycle_phase,omitempty"`
|
|
HazardousZone string `json:"hazardous_zone,omitempty"`
|
|
TriggerEvent string `json:"trigger_event,omitempty"`
|
|
AffectedPerson string `json:"affected_person,omitempty"`
|
|
PossibleHarm string `json:"possible_harm,omitempty"`
|
|
ReviewStatus ReviewStatus `json:"review_status,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// RiskAssessment represents a quantitative risk assessment for a hazard
|
|
type RiskAssessment struct {
|
|
ID uuid.UUID `json:"id"`
|
|
HazardID uuid.UUID `json:"hazard_id"`
|
|
Version int `json:"version"`
|
|
AssessmentType AssessmentType `json:"assessment_type"`
|
|
Severity int `json:"severity"`
|
|
Exposure int `json:"exposure"`
|
|
Probability int `json:"probability"`
|
|
Avoidance int `json:"avoidance,omitempty"` // 0=disabled, 1-5 (3=neutral)
|
|
InherentRisk float64 `json:"inherent_risk"`
|
|
ControlMaturity int `json:"control_maturity"`
|
|
ControlCoverage float64 `json:"control_coverage"`
|
|
TestEvidenceStrength float64 `json:"test_evidence_strength"`
|
|
CEff float64 `json:"c_eff"`
|
|
ResidualRisk float64 `json:"residual_risk"`
|
|
RiskLevel RiskLevel `json:"risk_level"`
|
|
IsAcceptable bool `json:"is_acceptable"`
|
|
AcceptanceJustification string `json:"acceptance_justification,omitempty"`
|
|
AssessedBy uuid.UUID `json:"assessed_by"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// Mitigation represents a risk reduction measure applied to a hazard
|
|
type Mitigation struct {
|
|
ID uuid.UUID `json:"id"`
|
|
HazardID uuid.UUID `json:"hazard_id"`
|
|
ReductionType ReductionType `json:"reduction_type"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description,omitempty"`
|
|
Status MitigationStatus `json:"status"`
|
|
VerificationMethod VerificationMethod `json:"verification_method,omitempty"`
|
|
VerificationResult string `json:"verification_result,omitempty"`
|
|
VerifiedAt *time.Time `json:"verified_at,omitempty"`
|
|
VerifiedBy uuid.UUID `json:"verified_by,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// Evidence represents an uploaded file that serves as evidence for compliance
|
|
type Evidence struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
MitigationID *uuid.UUID `json:"mitigation_id,omitempty"`
|
|
VerificationPlanID *uuid.UUID `json:"verification_plan_id,omitempty"`
|
|
FileName string `json:"file_name"`
|
|
FilePath string `json:"file_path"`
|
|
FileHash string `json:"file_hash"`
|
|
FileSize int64 `json:"file_size"`
|
|
MimeType string `json:"mime_type"`
|
|
Description string `json:"description,omitempty"`
|
|
UploadedBy uuid.UUID `json:"uploaded_by"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// VerificationPlan represents a plan for verifying compliance measures
|
|
type VerificationPlan struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
HazardID *uuid.UUID `json:"hazard_id,omitempty"`
|
|
MitigationID *uuid.UUID `json:"mitigation_id,omitempty"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description,omitempty"`
|
|
AcceptanceCriteria string `json:"acceptance_criteria,omitempty"`
|
|
Method VerificationMethod `json:"method"`
|
|
Status string `json:"status"`
|
|
Result string `json:"result,omitempty"`
|
|
CompletedAt *time.Time `json:"completed_at,omitempty"`
|
|
CompletedBy uuid.UUID `json:"completed_by,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// TechFileSection represents a section of the technical documentation file
|
|
type TechFileSection struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
SectionType string `json:"section_type"`
|
|
Title string `json:"title"`
|
|
Content string `json:"content,omitempty"`
|
|
Version int `json:"version"`
|
|
Status TechFileSectionStatus `json:"status"`
|
|
ApprovedBy uuid.UUID `json:"approved_by,omitempty"`
|
|
ApprovedAt *time.Time `json:"approved_at,omitempty"`
|
|
Metadata json.RawMessage `json:"metadata,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// MonitoringEvent represents a post-market monitoring event
|
|
type MonitoringEvent struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
EventType MonitoringEventType `json:"event_type"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description,omitempty"`
|
|
Severity string `json:"severity"`
|
|
ImpactAssessment string `json:"impact_assessment,omitempty"`
|
|
Status string `json:"status"`
|
|
ResolvedAt *time.Time `json:"resolved_at,omitempty"`
|
|
ResolvedBy uuid.UUID `json:"resolved_by,omitempty"`
|
|
Metadata json.RawMessage `json:"metadata,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// AuditTrailEntry represents an immutable audit log entry for compliance traceability
|
|
type AuditTrailEntry struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProjectID uuid.UUID `json:"project_id"`
|
|
EntityType string `json:"entity_type"`
|
|
EntityID uuid.UUID `json:"entity_id"`
|
|
Action AuditAction `json:"action"`
|
|
UserID uuid.UUID `json:"user_id"`
|
|
OldValues json.RawMessage `json:"old_values,omitempty"`
|
|
NewValues json.RawMessage `json:"new_values,omitempty"`
|
|
Hash string `json:"hash"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// API Request Types
|
|
// ============================================================================
|
|
|
|
// CreateProjectRequest is the API request for creating a new IACE project
|
|
type CreateProjectRequest struct {
|
|
MachineName string `json:"machine_name" binding:"required"`
|
|
MachineType string `json:"machine_type" binding:"required"`
|
|
Manufacturer string `json:"manufacturer" binding:"required"`
|
|
Description string `json:"description,omitempty"`
|
|
NarrativeText string `json:"narrative_text,omitempty"`
|
|
CEMarkingTarget string `json:"ce_marking_target,omitempty"`
|
|
Metadata json.RawMessage `json:"metadata,omitempty"`
|
|
}
|
|
|
|
// UpdateProjectRequest is the API request for updating an existing project
|
|
type UpdateProjectRequest struct {
|
|
MachineName *string `json:"machine_name,omitempty"`
|
|
MachineType *string `json:"machine_type,omitempty"`
|
|
Manufacturer *string `json:"manufacturer,omitempty"`
|
|
Description *string `json:"description,omitempty"`
|
|
NarrativeText *string `json:"narrative_text,omitempty"`
|
|
CEMarkingTarget *string `json:"ce_marking_target,omitempty"`
|
|
Metadata *json.RawMessage `json:"metadata,omitempty"`
|
|
}
|
|
|
|
// CreateComponentRequest is the API request for adding a component to a project
|
|
type CreateComponentRequest struct {
|
|
ProjectID uuid.UUID `json:"project_id" binding:"required"`
|
|
ParentID *uuid.UUID `json:"parent_id,omitempty"`
|
|
Name string `json:"name" binding:"required"`
|
|
ComponentType ComponentType `json:"component_type" binding:"required"`
|
|
Version string `json:"version,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
IsSafetyRelevant bool `json:"is_safety_relevant"`
|
|
IsNetworked bool `json:"is_networked"`
|
|
}
|
|
|
|
// CreateHazardRequest is the API request for creating a new hazard
|
|
type CreateHazardRequest struct {
|
|
ProjectID uuid.UUID `json:"project_id" binding:"required"`
|
|
ComponentID uuid.UUID `json:"component_id" binding:"required"`
|
|
LibraryHazardID *uuid.UUID `json:"library_hazard_id,omitempty"`
|
|
Name string `json:"name" binding:"required"`
|
|
Description string `json:"description,omitempty"`
|
|
Scenario string `json:"scenario,omitempty"`
|
|
Category string `json:"category" binding:"required"`
|
|
SubCategory string `json:"sub_category,omitempty"`
|
|
MachineModule string `json:"machine_module,omitempty"`
|
|
Function string `json:"function,omitempty"`
|
|
LifecyclePhase string `json:"lifecycle_phase,omitempty"`
|
|
HazardousZone string `json:"hazardous_zone,omitempty"`
|
|
TriggerEvent string `json:"trigger_event,omitempty"`
|
|
AffectedPerson string `json:"affected_person,omitempty"`
|
|
PossibleHarm string `json:"possible_harm,omitempty"`
|
|
}
|
|
|
|
// AssessRiskRequest is the API request for performing a risk assessment
|
|
type AssessRiskRequest struct {
|
|
HazardID uuid.UUID `json:"hazard_id" binding:"required"`
|
|
Severity int `json:"severity" binding:"required"`
|
|
Exposure int `json:"exposure" binding:"required"`
|
|
Probability int `json:"probability" binding:"required"`
|
|
Avoidance int `json:"avoidance,omitempty"` // 0=disabled, 1-5 (3=neutral)
|
|
ControlMaturity int `json:"control_maturity" binding:"required"`
|
|
ControlCoverage float64 `json:"control_coverage" binding:"required"`
|
|
TestEvidenceStrength float64 `json:"test_evidence_strength" binding:"required"`
|
|
AcceptanceJustification string `json:"acceptance_justification,omitempty"`
|
|
}
|
|
|
|
// CreateMitigationRequest is the API request for creating a mitigation measure
|
|
type CreateMitigationRequest struct {
|
|
HazardID uuid.UUID `json:"hazard_id" binding:"required"`
|
|
ReductionType ReductionType `json:"reduction_type" binding:"required"`
|
|
Name string `json:"name" binding:"required"`
|
|
Description string `json:"description,omitempty"`
|
|
}
|
|
|
|
// CreateVerificationPlanRequest is the API request for creating a verification plan
|
|
type CreateVerificationPlanRequest struct {
|
|
ProjectID uuid.UUID `json:"project_id" binding:"required"`
|
|
HazardID *uuid.UUID `json:"hazard_id,omitempty"`
|
|
MitigationID *uuid.UUID `json:"mitigation_id,omitempty"`
|
|
Title string `json:"title" binding:"required"`
|
|
Description string `json:"description,omitempty"`
|
|
AcceptanceCriteria string `json:"acceptance_criteria,omitempty"`
|
|
Method VerificationMethod `json:"method" binding:"required"`
|
|
}
|
|
|
|
// CreateMonitoringEventRequest is the API request for logging a monitoring event
|
|
type CreateMonitoringEventRequest struct {
|
|
ProjectID uuid.UUID `json:"project_id" binding:"required"`
|
|
EventType MonitoringEventType `json:"event_type" binding:"required"`
|
|
Title string `json:"title" binding:"required"`
|
|
Description string `json:"description,omitempty"`
|
|
Severity string `json:"severity" binding:"required"`
|
|
}
|
|
|
|
// InitFromProfileRequest is the API request for initializing a project from a company profile
|
|
type InitFromProfileRequest struct {
|
|
CompanyProfile json.RawMessage `json:"company_profile" binding:"required"`
|
|
ComplianceScope json.RawMessage `json:"compliance_scope" binding:"required"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// API Response Types
|
|
// ============================================================================
|
|
|
|
// ProjectListResponse is the API response for listing projects
|
|
type ProjectListResponse struct {
|
|
Projects []Project `json:"projects"`
|
|
Total int `json:"total"`
|
|
}
|
|
|
|
// ProjectDetailResponse is the API response for a single project with related entities
|
|
type ProjectDetailResponse struct {
|
|
Project
|
|
Components []Component `json:"components"`
|
|
Classifications []RegulatoryClassification `json:"classifications"`
|
|
CompletenessGates []CompletenessGate `json:"completeness_gates"`
|
|
}
|
|
|
|
// RiskSummaryResponse is the API response for an aggregated risk overview
|
|
type RiskSummaryResponse struct {
|
|
TotalHazards int `json:"total_hazards"`
|
|
NotAcceptable int `json:"not_acceptable,omitempty"`
|
|
VeryHigh int `json:"very_high,omitempty"`
|
|
Critical int `json:"critical"`
|
|
High int `json:"high"`
|
|
Medium int `json:"medium"`
|
|
Low int `json:"low"`
|
|
Negligible int `json:"negligible"`
|
|
OverallRiskLevel RiskLevel `json:"overall_risk_level"`
|
|
AllAcceptable bool `json:"all_acceptable"`
|
|
}
|
|
|
|
// LifecyclePhaseInfo represents a machine lifecycle phase with labels
|
|
type LifecyclePhaseInfo struct {
|
|
ID string `json:"id"`
|
|
LabelDE string `json:"label_de"`
|
|
LabelEN string `json:"label_en"`
|
|
Sort int `json:"sort_order"`
|
|
}
|
|
|
|
// RoleInfo represents an affected person role with labels
|
|
type RoleInfo struct {
|
|
ID string `json:"id"`
|
|
LabelDE string `json:"label_de"`
|
|
LabelEN string `json:"label_en"`
|
|
Sort int `json:"sort_order"`
|
|
}
|
|
|
|
// EvidenceTypeInfo represents an evidence/verification type with labels
|
|
type EvidenceTypeInfo struct {
|
|
ID string `json:"id"`
|
|
Category string `json:"category"`
|
|
LabelDE string `json:"label_de"`
|
|
LabelEN string `json:"label_en"`
|
|
Tags []string `json:"tags,omitempty"`
|
|
Sort int `json:"sort_order"`
|
|
}
|
|
|
|
// ProtectiveMeasureEntry represents a protective measure from the library
|
|
type ProtectiveMeasureEntry struct {
|
|
ID string `json:"id"`
|
|
ReductionType string `json:"reduction_type"`
|
|
SubType string `json:"sub_type,omitempty"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
HazardCategory string `json:"hazard_category,omitempty"`
|
|
Examples []string `json:"examples,omitempty"`
|
|
Tags []string `json:"tags,omitempty"`
|
|
}
|
|
|
|
// ValidateMitigationHierarchyRequest is the request for hierarchy validation
|
|
type ValidateMitigationHierarchyRequest struct {
|
|
HazardID uuid.UUID `json:"hazard_id" binding:"required"`
|
|
ReductionType ReductionType `json:"reduction_type" binding:"required"`
|
|
}
|
|
|
|
// ValidateMitigationHierarchyResponse is the response from hierarchy validation
|
|
type ValidateMitigationHierarchyResponse struct {
|
|
Valid bool `json:"valid"`
|
|
Warnings []string `json:"warnings,omitempty"`
|
|
}
|
|
|
|
// CompletenessGate represents a single gate in the project completeness checklist
|
|
type CompletenessGate struct {
|
|
ID string `json:"id"`
|
|
Category string `json:"category"`
|
|
Label string `json:"label"`
|
|
Required bool `json:"required"`
|
|
Passed bool `json:"passed"`
|
|
Details string `json:"details,omitempty"`
|
|
}
|