diff --git a/admin-compliance/app/sdk/control-library/components/ControlDetail.tsx b/admin-compliance/app/sdk/control-library/components/ControlDetail.tsx index de6e2ef..175241b 100644 --- a/admin-compliance/app/sdk/control-library/components/ControlDetail.tsx +++ b/admin-compliance/app/sdk/control-library/components/ControlDetail.tsx @@ -180,7 +180,11 @@ export function ControlDetail({
{ctrl.source_citation.source}
++ {ctrl.source_citation.source} + {ctrl.source_citation.article && ` — ${ctrl.source_citation.article}`} + {ctrl.source_citation.paragraph && ` ${ctrl.source_citation.paragraph}`} +
) : ctrl.generation_metadata?.source_regulation ? ({String(ctrl.generation_metadata.source_regulation)}
) : null} diff --git a/admin-compliance/app/sdk/control-library/page.tsx b/admin-compliance/app/sdk/control-library/page.tsx index 7b9082f..9158d67 100644 --- a/admin-compliance/app/sdk/control-library/page.tsx +++ b/admin-compliance/app/sdk/control-library/page.tsx @@ -624,7 +624,11 @@ export default function ControlLibraryPage() { {ctrl.source_citation?.source && ( <> | - {ctrl.source_citation.source} + + {ctrl.source_citation.source} + {ctrl.source_citation.article && ` ${ctrl.source_citation.article}`} + {ctrl.source_citation.paragraph && ` ${ctrl.source_citation.paragraph}`} + > )} | diff --git a/ai-compliance-sdk/cmd/server/main.go b/ai-compliance-sdk/cmd/server/main.go index 43f8734..805c5fa 100644 --- a/ai-compliance-sdk/cmd/server/main.go +++ b/ai-compliance-sdk/cmd/server/main.go @@ -529,6 +529,13 @@ func main() { iaceRoutes.GET("/roles", iaceHandler.ListRoles) iaceRoutes.GET("/evidence-types", iaceHandler.ListEvidenceTypes) iaceRoutes.GET("/protective-measures-library", iaceHandler.ListProtectiveMeasures) + // Component Library & Energy Sources (Hazard Matching Engine) + iaceRoutes.GET("/component-library", iaceHandler.ListComponentLibrary) + iaceRoutes.GET("/energy-sources", iaceHandler.ListEnergySources) + // Tag Taxonomy + iaceRoutes.GET("/tags", iaceHandler.ListTags) + // Hazard Patterns + iaceRoutes.GET("/hazard-patterns", iaceHandler.ListHazardPatterns) // Project Management iaceRoutes.POST("/projects", iaceHandler.CreateProject) @@ -558,6 +565,12 @@ func main() { iaceRoutes.PUT("/projects/:id/hazards/:hid", iaceHandler.UpdateHazard) iaceRoutes.POST("/projects/:id/hazards/suggest", iaceHandler.SuggestHazards) + // Pattern Matching Engine + iaceRoutes.POST("/projects/:id/match-patterns", iaceHandler.MatchPatterns) + iaceRoutes.POST("/projects/:id/apply-patterns", iaceHandler.ApplyPatternResults) + iaceRoutes.POST("/projects/:id/hazards/:hid/suggest-measures", iaceHandler.SuggestMeasuresForHazard) + iaceRoutes.POST("/projects/:id/mitigations/:mid/suggest-evidence", iaceHandler.SuggestEvidenceForMitigation) + // Risk Assessment iaceRoutes.POST("/projects/:id/hazards/:hid/assess", iaceHandler.AssessRisk) iaceRoutes.GET("/projects/:id/risk-summary", iaceHandler.GetRiskSummary) diff --git a/ai-compliance-sdk/internal/api/handlers/iace_handler.go b/ai-compliance-sdk/internal/api/handlers/iace_handler.go index b165eaa..8f91d14 100644 --- a/ai-compliance-sdk/internal/api/handlers/iace_handler.go +++ b/ai-compliance-sdk/internal/api/handlers/iace_handler.go @@ -2052,3 +2052,284 @@ func (h *IACEHandler) ListEvidenceTypes(c *gin.Context) { "total": len(types), }) } + +// ============================================================================ +// Component Library & Energy Sources (Phase 1) +// ============================================================================ + +// ListComponentLibrary handles GET /component-library +// Returns the built-in component library with optional category filter. +func (h *IACEHandler) ListComponentLibrary(c *gin.Context) { + category := c.Query("category") + + all := iace.GetComponentLibrary() + var filtered []iace.ComponentLibraryEntry + for _, entry := range all { + if category != "" && entry.Category != category { + continue + } + filtered = append(filtered, entry) + } + + if filtered == nil { + filtered = []iace.ComponentLibraryEntry{} + } + + c.JSON(http.StatusOK, gin.H{ + "components": filtered, + "total": len(filtered), + }) +} + +// ListEnergySources handles GET /energy-sources +// Returns the built-in energy source library. +func (h *IACEHandler) ListEnergySources(c *gin.Context) { + sources := iace.GetEnergySources() + c.JSON(http.StatusOK, gin.H{ + "energy_sources": sources, + "total": len(sources), + }) +} + +// ============================================================================ +// Tag Taxonomy (Phase 2) +// ============================================================================ + +// ListTags handles GET /tags +// Returns the tag taxonomy with optional domain filter. +func (h *IACEHandler) ListTags(c *gin.Context) { + domain := c.Query("domain") + + all := iace.GetTagTaxonomy() + var filtered []iace.TagEntry + for _, entry := range all { + if domain != "" && entry.Domain != domain { + continue + } + filtered = append(filtered, entry) + } + + if filtered == nil { + filtered = []iace.TagEntry{} + } + + c.JSON(http.StatusOK, gin.H{ + "tags": filtered, + "total": len(filtered), + }) +} + +// ============================================================================ +// Hazard Patterns & Pattern Engine (Phase 3+4) +// ============================================================================ + +// ListHazardPatterns handles GET /hazard-patterns +// Returns all built-in hazard patterns. +func (h *IACEHandler) ListHazardPatterns(c *gin.Context) { + patterns := iace.GetBuiltinHazardPatterns() + c.JSON(http.StatusOK, gin.H{ + "patterns": patterns, + "total": len(patterns), + }) +} + +// MatchPatterns handles POST /projects/:id/match-patterns +// Runs the pattern engine against the project's components and energy sources. +func (h *IACEHandler) MatchPatterns(c *gin.Context) { + projectID, err := uuid.Parse(c.Param("id")) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "invalid project ID"}) + return + } + + // Verify project exists + project, err := h.store.GetProject(c.Request.Context(), projectID) + if err != nil || project == nil { + c.JSON(http.StatusNotFound, gin.H{"error": "project not found"}) + return + } + + var input iace.MatchInput + if err := c.ShouldBindJSON(&input); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + engine := iace.NewPatternEngine() + result := engine.Match(input) + + c.JSON(http.StatusOK, result) +} + +// ApplyPatternResults handles POST /projects/:id/apply-patterns +// Accepts matched patterns and creates concrete hazards, mitigations, and +// verification plans in the project. +func (h *IACEHandler) ApplyPatternResults(c *gin.Context) { + projectID, err := uuid.Parse(c.Param("id")) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "invalid project ID"}) + return + } + + tenantID, err := getTenantID(c) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + project, err := h.store.GetProject(c.Request.Context(), projectID) + if err != nil || project == nil { + c.JSON(http.StatusNotFound, gin.H{"error": "project not found"}) + return + } + + var req struct { + AcceptedHazards []iace.CreateHazardRequest `json:"accepted_hazards"` + AcceptedMeasures []iace.CreateMitigationRequest `json:"accepted_measures"` + AcceptedEvidence []iace.CreateVerificationPlanRequest `json:"accepted_evidence"` + SourcePatternIDs []string `json:"source_pattern_ids"` + } + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + ctx := c.Request.Context() + var createdHazards int + var createdMeasures int + var createdEvidence int + + // Create hazards + for _, hazardReq := range req.AcceptedHazards { + hazardReq.ProjectID = projectID + _, err := h.store.CreateHazard(ctx, hazardReq) + if err != nil { + continue + } + createdHazards++ + } + + // Create mitigations + for _, mitigReq := range req.AcceptedMeasures { + _, err := h.store.CreateMitigation(ctx, mitigReq) + if err != nil { + continue + } + createdMeasures++ + } + + // Create verification plans + for _, evidReq := range req.AcceptedEvidence { + evidReq.ProjectID = projectID + _, err := h.store.CreateVerificationPlan(ctx, evidReq) + if err != nil { + continue + } + createdEvidence++ + } + + // Audit trail + h.store.AddAuditEntry(ctx, projectID, "pattern_matching", projectID, + iace.AuditActionCreate, tenantID.String(), + nil, + mustMarshalJSON(map[string]interface{}{ + "source_patterns": req.SourcePatternIDs, + "created_hazards": createdHazards, + "created_measures": createdMeasures, + "created_evidence": createdEvidence, + }), + ) + + c.JSON(http.StatusOK, gin.H{ + "created_hazards": createdHazards, + "created_measures": createdMeasures, + "created_evidence": createdEvidence, + "message": "Pattern results applied successfully", + }) +} + +// SuggestMeasuresForHazard handles POST /projects/:id/hazards/:hid/suggest-measures +// Suggests measures for a specific hazard based on its tags and category. +func (h *IACEHandler) SuggestMeasuresForHazard(c *gin.Context) { + hazardID, err := uuid.Parse(c.Param("hid")) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "invalid hazard ID"}) + return + } + + hazard, err := h.store.GetHazard(c.Request.Context(), hazardID) + if err != nil || hazard == nil { + c.JSON(http.StatusNotFound, gin.H{"error": "hazard not found"}) + return + } + + // Find measures matching the hazard category + all := iace.GetProtectiveMeasureLibrary() + var suggested []iace.ProtectiveMeasureEntry + for _, m := range all { + if m.HazardCategory == hazard.Category || m.HazardCategory == "general" { + suggested = append(suggested, m) + } + } + + if suggested == nil { + suggested = []iace.ProtectiveMeasureEntry{} + } + + c.JSON(http.StatusOK, gin.H{ + "hazard_id": hazardID.String(), + "hazard_category": hazard.Category, + "suggested_measures": suggested, + "total": len(suggested), + }) +} + +// SuggestEvidenceForMitigation handles POST /projects/:id/mitigations/:mid/suggest-evidence +// Suggests evidence types for a specific mitigation. +func (h *IACEHandler) SuggestEvidenceForMitigation(c *gin.Context) { + mitigationID, err := uuid.Parse(c.Param("mid")) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "invalid mitigation ID"}) + return + } + + mitigation, err := h.store.GetMitigation(c.Request.Context(), mitigationID) + if err != nil || mitigation == nil { + c.JSON(http.StatusNotFound, gin.H{"error": "mitigation not found"}) + return + } + + // Map reduction type to relevant evidence tags + var relevantTags []string + switch mitigation.ReductionType { + case iace.ReductionTypeDesign: + relevantTags = []string{"design_evidence", "analysis_evidence"} + case iace.ReductionTypeProtective: + relevantTags = []string{"test_evidence", "inspection_evidence"} + case iace.ReductionTypeInformation: + relevantTags = []string{"training_evidence", "operational_evidence"} + } + + resolver := iace.NewTagResolver() + suggested := resolver.FindEvidenceByTags(relevantTags) + + if suggested == nil { + suggested = []iace.EvidenceTypeInfo{} + } + + c.JSON(http.StatusOK, gin.H{ + "mitigation_id": mitigationID.String(), + "reduction_type": string(mitigation.ReductionType), + "suggested_evidence": suggested, + "total": len(suggested), + }) +} + +// mustMarshalJSON marshals the given value to json.RawMessage. +func mustMarshalJSON(v interface{}) json.RawMessage { + data, err := json.Marshal(v) + if err != nil { + return nil + } + return data +} diff --git a/ai-compliance-sdk/internal/iace/completeness.go b/ai-compliance-sdk/internal/iace/completeness.go index 0fa5463..f8bd366 100644 --- a/ai-compliance-sdk/internal/iace/completeness.go +++ b/ai-compliance-sdk/internal/iace/completeness.go @@ -135,6 +135,23 @@ func buildGateDefinitions() []GateDefinition { }, }, + // ===================================================================== + // Pattern Matching Gate (G09) - Recommended + // ===================================================================== + { + ID: "G09", + Category: "onboarding", + Label: "Pattern matching performed", + Required: false, + Recommended: true, + CheckFunc: func(ctx *CompletenessContext) bool { + // Check audit trail for pattern_matching entries + // Since we can't query audit trail from context, check if hazards + // have been created (proxy for pattern matching having been performed) + return len(ctx.Hazards) >= 3 + }, + }, + // ===================================================================== // Classification Gates (G10-G13) - Required // ===================================================================== diff --git a/ai-compliance-sdk/internal/iace/completeness_test.go b/ai-compliance-sdk/internal/iace/completeness_test.go index 5b974e4..7abcb23 100644 --- a/ai-compliance-sdk/internal/iace/completeness_test.go +++ b/ai-compliance-sdk/internal/iace/completeness_test.go @@ -608,10 +608,10 @@ func TestCompletenessCheck_GateCountsAndCategories(t *testing.T) { } result := checker.Check(ctx) - // The buildGateDefinitions function returns exactly 21 gates - // (G01-G08: 8, G10-G13: 4, G20-G24: 5, G30: 1, G40-G42: 3 = 21 total) - if len(result.Gates) != 21 { - t.Errorf("Total gates = %d, want 21", len(result.Gates)) + // The buildGateDefinitions function returns exactly 22 gates + // (G01-G08: 8, G09: 1, G10-G13: 4, G20-G24: 5, G30: 1, G40-G42: 3 = 22 total) + if len(result.Gates) != 22 { + t.Errorf("Total gates = %d, want 22", len(result.Gates)) } // Count required vs recommended @@ -622,8 +622,8 @@ func TestCompletenessCheck_GateCountsAndCategories(t *testing.T) { requiredCount++ } } - // G30 is the only recommended gate (Required=false, Recommended=true) - // All others are required (20 required, 1 recommended) + // G09 and G30 are recommended gates (Required=false, Recommended=true) + // All others are required (20 required, 2 recommended) if requiredCount != 20 { t.Errorf("Required gates count = %d, want 20", requiredCount) } @@ -632,9 +632,9 @@ func TestCompletenessCheck_GateCountsAndCategories(t *testing.T) { t.Errorf("TotalRequired = %d, want 20", result.TotalRequired) } - // TotalRecommended should be 1 (G30) - if result.TotalRecommended != 1 { - t.Errorf("TotalRecommended = %d, want 1", result.TotalRecommended) + // TotalRecommended should be 2 (G09, G30) + if result.TotalRecommended != 2 { + t.Errorf("TotalRecommended = %d, want 2", result.TotalRecommended) } _ = recommendedCount @@ -645,7 +645,7 @@ func TestCompletenessCheck_GateCountsAndCategories(t *testing.T) { } expectedCategories := map[string]int{ - "onboarding": 8, + "onboarding": 9, // G01-G08 + G09 (recommended) "classification": 4, "hazard_risk": 5, "evidence": 1, diff --git a/ai-compliance-sdk/internal/iace/component_library.go b/ai-compliance-sdk/internal/iace/component_library.go new file mode 100644 index 0000000..cbd8cd5 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/component_library.go @@ -0,0 +1,209 @@ +package iace + +// ComponentLibraryEntry represents a reusable machine component template from the library. +type ComponentLibraryEntry struct { + ID string `json:"id"` + NameDE string `json:"name_de"` + NameEN string `json:"name_en"` + Category string `json:"category"` + DescriptionDE string `json:"description_de,omitempty"` + TypicalHazardCategories []string `json:"typical_hazard_categories"` + TypicalEnergySources []string `json:"typical_energy_sources"` + MapsToComponentType string `json:"maps_to_component_type"` + Tags []string `json:"tags"` + SortOrder int `json:"sort_order"` +} + +// EnergySourceEntry represents an energy source type used in machinery. +type EnergySourceEntry struct { + ID string `json:"id"` + NameDE string `json:"name_de"` + NameEN string `json:"name_en"` + DescriptionDE string `json:"description_de,omitempty"` + TypicalComponents []string `json:"typical_components"` + TypicalHazardCategories []string `json:"typical_hazard_categories"` + Tags []string `json:"tags"` + SortOrder int `json:"sort_order"` +} + +// GetComponentLibrary returns the complete built-in component library with 120 entries +// across 11 categories, covering typical industrial machine components. +func GetComponentLibrary() []ComponentLibraryEntry { + return []ComponentLibraryEntry{ + // ── Category: mechanical (C001-C020) ──────────────────────────────────── + {ID: "C001", NameDE: "Roboterarm", NameEN: "Robot Arm", Category: "mechanical", DescriptionDE: "Mehrgelenkiger Industrierobotearm fuer Pick-and-Place, Schweissen oder Montage.", TypicalHazardCategories: []string{"mechanical_hazard", "ergonomic"}, TypicalEnergySources: []string{"EN01", "EN02"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "rotating_part", "high_force"}, SortOrder: 1}, + {ID: "C002", NameDE: "Greifer", NameEN: "Gripper", Category: "mechanical", DescriptionDE: "Pneumatischer oder elektrischer Greifer zum Greifen und Halten von Werkstuecken.", TypicalHazardCategories: []string{"mechanical_hazard", "pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN01", "EN05"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "clamping_part", "pinch_point"}, SortOrder: 2}, + {ID: "C003", NameDE: "Foerderband", NameEN: "Conveyor Belt", Category: "mechanical", DescriptionDE: "Endlosband zum Transport von Werkstuecken zwischen Arbeitsstationen.", TypicalHazardCategories: []string{"mechanical_hazard", "ergonomic"}, TypicalEnergySources: []string{"EN01", "EN02"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "rotating_part", "entanglement_risk"}, SortOrder: 3}, + {ID: "C004", NameDE: "Drehtisch", NameEN: "Rotary Table", Category: "mechanical", DescriptionDE: "Rotierender Arbeitstisch fuer Bearbeitungs- oder Montageprozesse.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN02"}, MapsToComponentType: "mechanical", Tags: []string{"rotating_part", "high_force"}, SortOrder: 4}, + {ID: "C005", NameDE: "Linearachse", NameEN: "Linear Axis", Category: "mechanical", DescriptionDE: "Linearfuehrung fuer praezise translatorische Bewegungen.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN01"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "crush_point"}, SortOrder: 5}, + {ID: "C006", NameDE: "Spindel", NameEN: "Spindle", Category: "mechanical", DescriptionDE: "Hochdrehende Spindel fuer Fräs-, Bohr- oder Schleifoperationen.", TypicalHazardCategories: []string{"mechanical_hazard", "noise_vibration"}, TypicalEnergySources: []string{"EN02"}, MapsToComponentType: "mechanical", Tags: []string{"rotating_part", "high_speed", "cutting_part"}, SortOrder: 6}, + {ID: "C007", NameDE: "Saegeblatt", NameEN: "Saw Blade", Category: "mechanical", DescriptionDE: "Rotierendes oder oszillierendes Schneidwerkzeug.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN02"}, MapsToComponentType: "mechanical", Tags: []string{"cutting_part", "rotating_part", "high_speed"}, SortOrder: 7}, + {ID: "C008", NameDE: "Pressenstoessel", NameEN: "Press Ram", Category: "mechanical", DescriptionDE: "Auf- und abfahrender Stoessel einer Presse zum Umformen.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN01", "EN05"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "high_force", "crush_point"}, SortOrder: 8}, + {ID: "C009", NameDE: "Walze", NameEN: "Roller", Category: "mechanical", DescriptionDE: "Zylindrische Walze zum Foerdern, Pressen oder Kalandrieren.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN02"}, MapsToComponentType: "mechanical", Tags: []string{"rotating_part", "entanglement_risk", "pinch_point"}, SortOrder: 9}, + {ID: "C010", NameDE: "Kettenantrieb", NameEN: "Chain Drive", Category: "mechanical", DescriptionDE: "Kette und Kettenrad zur Kraftuebertragung.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN01"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "entanglement_risk"}, SortOrder: 10}, + {ID: "C011", NameDE: "Zahnradgetriebe", NameEN: "Gear Transmission", Category: "mechanical", DescriptionDE: "Zahnradpaar oder -satz zur Drehzahl-/Drehmomentanpassung.", TypicalHazardCategories: []string{"mechanical_hazard", "noise_vibration"}, TypicalEnergySources: []string{"EN02"}, MapsToComponentType: "mechanical", Tags: []string{"rotating_part", "pinch_point"}, SortOrder: 11}, + {ID: "C012", NameDE: "Kupplung", NameEN: "Clutch", Category: "mechanical", DescriptionDE: "Mechanische Kupplung zur An-/Abkopplung von Antriebsstraengen.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN02"}, MapsToComponentType: "mechanical", Tags: []string{"rotating_part"}, SortOrder: 12}, + {ID: "C013", NameDE: "Bremse", NameEN: "Brake", Category: "mechanical", DescriptionDE: "Mechanische oder elektromagnetische Bremse zum Stillsetzen von Antrieben.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN01"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "stored_energy"}, SortOrder: 13}, + {ID: "C014", NameDE: "Hubwerk", NameEN: "Hoist", Category: "mechanical", DescriptionDE: "Hebezeug zum vertikalen Bewegen von Lasten.", TypicalHazardCategories: []string{"mechanical_hazard", "ergonomic"}, TypicalEnergySources: []string{"EN01", "EN03"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "high_force", "gravity_risk"}, SortOrder: 14}, + {ID: "C015", NameDE: "Werkzeugwechsler", NameEN: "Tool Changer", Category: "mechanical", DescriptionDE: "Automatischer Werkzeugwechsler fuer CNC-Maschinen.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN01", "EN05"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "pinch_point"}, SortOrder: 15}, + {ID: "C016", NameDE: "Schweisskopf", NameEN: "Welding Head", Category: "mechanical", DescriptionDE: "Schweisskopf fuer MIG/MAG, WIG oder Laserschweissen.", TypicalHazardCategories: []string{"mechanical_hazard", "thermal_hazard", "electrical_hazard"}, TypicalEnergySources: []string{"EN03", "EN07"}, MapsToComponentType: "mechanical", Tags: []string{"high_temperature", "radiation_risk"}, SortOrder: 16}, + {ID: "C017", NameDE: "Schraubstation", NameEN: "Screwdriving Station", Category: "mechanical", DescriptionDE: "Automatische Schraubeinheit fuer Montageprozesse.", TypicalHazardCategories: []string{"mechanical_hazard", "noise_vibration"}, TypicalEnergySources: []string{"EN02"}, MapsToComponentType: "mechanical", Tags: []string{"rotating_part"}, SortOrder: 17}, + {ID: "C018", NameDE: "Stanzen-Werkzeug", NameEN: "Punching Tool", Category: "mechanical", DescriptionDE: "Stanzwerkzeug zum Ausschneiden von Formen aus Blech oder Folie.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN01"}, MapsToComponentType: "mechanical", Tags: []string{"cutting_part", "high_force", "crush_point"}, SortOrder: 18}, + {ID: "C019", NameDE: "Biegewerkzeug", NameEN: "Bending Tool", Category: "mechanical", DescriptionDE: "Werkzeug zum Biegen von Blech oder Profilen.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN01"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "high_force", "crush_point"}, SortOrder: 19}, + {ID: "C020", NameDE: "Vibrationsfoerderer", NameEN: "Vibratory Feeder", Category: "mechanical", DescriptionDE: "Schwingfoerderer zum Sortieren und Zufuehren von Kleinteilen.", TypicalHazardCategories: []string{"mechanical_hazard", "noise_vibration"}, TypicalEnergySources: []string{"EN01"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "vibration_source"}, SortOrder: 20}, + + // ── Category: structural (C021-C030) ──────────────────────────────────── + {ID: "C021", NameDE: "Maschinenrahmen", NameEN: "Machine Frame", Category: "structural", DescriptionDE: "Tragender Rahmen als Grundstruktur der Maschine.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{}, MapsToComponentType: "mechanical", Tags: []string{"structural_part"}, SortOrder: 21}, + {ID: "C022", NameDE: "Schutzgehaeuse", NameEN: "Protective Enclosure", Category: "structural", DescriptionDE: "Feste Verkleidung zum Schutz vor Gefahrstellen.", TypicalHazardCategories: []string{}, TypicalEnergySources: []string{}, MapsToComponentType: "mechanical", Tags: []string{"structural_part", "guard"}, SortOrder: 22}, + {ID: "C023", NameDE: "Schutztuer", NameEN: "Safety Door", Category: "structural", DescriptionDE: "Verriegelte Tuer mit Zugangsschutz zum Gefahrbereich.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{}, MapsToComponentType: "mechanical", Tags: []string{"structural_part", "guard", "interlocked"}, SortOrder: 23}, + {ID: "C024", NameDE: "Arbeitstisch", NameEN: "Work Table", Category: "structural", DescriptionDE: "Feststehende oder hoehenverstellbare Arbeitsflaeche.", TypicalHazardCategories: []string{"ergonomic"}, TypicalEnergySources: []string{}, MapsToComponentType: "mechanical", Tags: []string{"structural_part"}, SortOrder: 24}, + {ID: "C025", NameDE: "Kabelkanal", NameEN: "Cable Tray", Category: "structural", DescriptionDE: "Fuehrung und Schutz fuer elektrische Leitungen und Kabel.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{}, MapsToComponentType: "mechanical", Tags: []string{"structural_part"}, SortOrder: 25}, + {ID: "C026", NameDE: "Schwingungsdaempfer", NameEN: "Vibration Damper", Category: "structural", DescriptionDE: "Daempfungselement zur Reduzierung von Maschinenschwingungen.", TypicalHazardCategories: []string{"noise_vibration"}, TypicalEnergySources: []string{}, MapsToComponentType: "mechanical", Tags: []string{"structural_part"}, SortOrder: 26}, + {ID: "C027", NameDE: "Fundamentplatte", NameEN: "Foundation Plate", Category: "structural", DescriptionDE: "Fundamentplatte zur Aufstellung und Verankerung der Maschine.", TypicalHazardCategories: []string{}, TypicalEnergySources: []string{}, MapsToComponentType: "mechanical", Tags: []string{"structural_part"}, SortOrder: 27}, + {ID: "C028", NameDE: "Schutzgitter", NameEN: "Safety Fence", Category: "structural", DescriptionDE: "Feststehende Schutzeinrichtung als Umzaeunung des Gefahrbereichs.", TypicalHazardCategories: []string{}, TypicalEnergySources: []string{}, MapsToComponentType: "mechanical", Tags: []string{"structural_part", "guard"}, SortOrder: 28}, + {ID: "C029", NameDE: "Aufstiegsleiter", NameEN: "Access Ladder", Category: "structural", DescriptionDE: "Fest montierte Leiter fuer Wartungszugang in der Hoehe.", TypicalHazardCategories: []string{"ergonomic", "mechanical_hazard"}, TypicalEnergySources: []string{"EN03"}, MapsToComponentType: "mechanical", Tags: []string{"structural_part", "gravity_risk"}, SortOrder: 29}, + {ID: "C030", NameDE: "Plattform/Buehne", NameEN: "Platform/Walkway", Category: "structural", DescriptionDE: "Begehbare Plattform fuer Bedienung oder Wartung in der Hoehe.", TypicalHazardCategories: []string{"ergonomic", "mechanical_hazard"}, TypicalEnergySources: []string{"EN03"}, MapsToComponentType: "mechanical", Tags: []string{"structural_part", "gravity_risk"}, SortOrder: 30}, + + // ── Category: drive (C031-C040) ───────────────────────────────────────── + {ID: "C031", NameDE: "Elektromotor (Drehstrom)", NameEN: "AC Motor", Category: "drive", DescriptionDE: "Drehstrom-Asynchronmotor als Hauptantrieb.", TypicalHazardCategories: []string{"electrical_hazard", "mechanical_hazard", "noise_vibration"}, TypicalEnergySources: []string{"EN02", "EN04"}, MapsToComponentType: "electrical", Tags: []string{"rotating_part", "high_voltage", "high_force"}, SortOrder: 31}, + {ID: "C032", NameDE: "Servomotor", NameEN: "Servo Motor", Category: "drive", DescriptionDE: "Hochdynamischer Servomotor fuer praezise Positionierung.", TypicalHazardCategories: []string{"electrical_hazard", "mechanical_hazard"}, TypicalEnergySources: []string{"EN02", "EN04"}, MapsToComponentType: "electrical", Tags: []string{"rotating_part", "high_speed"}, SortOrder: 32}, + {ID: "C033", NameDE: "Schrittmotor", NameEN: "Stepper Motor", Category: "drive", DescriptionDE: "Schrittmotor fuer inkrementelle Positionierung.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN02", "EN04"}, MapsToComponentType: "electrical", Tags: []string{"rotating_part"}, SortOrder: 33}, + {ID: "C034", NameDE: "Frequenzumrichter", NameEN: "Frequency Converter", Category: "drive", DescriptionDE: "Frequenzumrichter zur stufenlosen Drehzahlregelung.", TypicalHazardCategories: []string{"electrical_hazard", "emc_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "electrical", Tags: []string{"high_voltage", "stored_energy"}, SortOrder: 34}, + {ID: "C035", NameDE: "Getriebemotor", NameEN: "Gear Motor", Category: "drive", DescriptionDE: "Motor mit integriertem Getriebe fuer hohes Drehmoment bei niedriger Drehzahl.", TypicalHazardCategories: []string{"mechanical_hazard", "electrical_hazard"}, TypicalEnergySources: []string{"EN02", "EN04"}, MapsToComponentType: "electrical", Tags: []string{"rotating_part", "high_force"}, SortOrder: 35}, + {ID: "C036", NameDE: "Linearmotor", NameEN: "Linear Motor", Category: "drive", DescriptionDE: "Elektromagnetischer Direktantrieb fuer lineare Bewegung.", TypicalHazardCategories: []string{"electrical_hazard", "mechanical_hazard"}, TypicalEnergySources: []string{"EN01", "EN04"}, MapsToComponentType: "electrical", Tags: []string{"moving_part", "high_speed"}, SortOrder: 36}, + {ID: "C037", NameDE: "Torque-Motor", NameEN: "Torque Motor", Category: "drive", DescriptionDE: "Direktantriebsmotor fuer hohe Drehmomente ohne Getriebe.", TypicalHazardCategories: []string{"electrical_hazard", "mechanical_hazard"}, TypicalEnergySources: []string{"EN02", "EN04"}, MapsToComponentType: "electrical", Tags: []string{"rotating_part", "high_force"}, SortOrder: 37}, + {ID: "C038", NameDE: "Elektrischer Stellantrieb", NameEN: "Electric Actuator", Category: "drive", DescriptionDE: "Elektrischer Antrieb fuer Ventile, Klappen oder Schieber.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN01", "EN04"}, MapsToComponentType: "actuator", Tags: []string{"moving_part"}, SortOrder: 38}, + {ID: "C039", NameDE: "Spindelantrieb", NameEN: "Spindle Drive", Category: "drive", DescriptionDE: "Kugelgewindetrieb fuer praezise Linearbewegung.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN01"}, MapsToComponentType: "mechanical", Tags: []string{"moving_part", "crush_point"}, SortOrder: 39}, + {ID: "C040", NameDE: "Riemenantrieb", NameEN: "Belt Drive", Category: "drive", DescriptionDE: "Riemen und Riemenscheiben zur Kraftuebertragung.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN02"}, MapsToComponentType: "mechanical", Tags: []string{"rotating_part", "entanglement_risk"}, SortOrder: 40}, + + // ── Category: hydraulic (C041-C050) ───────────────────────────────────── + {ID: "C041", NameDE: "Hydraulikpumpe", NameEN: "Hydraulic Pump", Category: "hydraulic", DescriptionDE: "Pumpe zur Erzeugung des hydraulischen Drucks im System.", TypicalHazardCategories: []string{"pneumatic_hydraulic", "noise_vibration"}, TypicalEnergySources: []string{"EN05"}, MapsToComponentType: "actuator", Tags: []string{"hydraulic_part", "high_pressure"}, SortOrder: 41}, + {ID: "C042", NameDE: "Hydraulikzylinder", NameEN: "Hydraulic Cylinder", Category: "hydraulic", DescriptionDE: "Linearaktuator zur Erzeugung hoher Kraefte.", TypicalHazardCategories: []string{"pneumatic_hydraulic", "mechanical_hazard"}, TypicalEnergySources: []string{"EN05"}, MapsToComponentType: "actuator", Tags: []string{"hydraulic_part", "moving_part", "high_force", "high_pressure"}, SortOrder: 42}, + {ID: "C043", NameDE: "Hydraulikventil", NameEN: "Hydraulic Valve", Category: "hydraulic", DescriptionDE: "Steuer- oder Regelventil im Hydraulikkreislauf.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN05"}, MapsToComponentType: "actuator", Tags: []string{"hydraulic_part", "high_pressure"}, SortOrder: 43}, + {ID: "C044", NameDE: "Hydraulikspeicher", NameEN: "Hydraulic Accumulator", Category: "hydraulic", DescriptionDE: "Druckspeicher zur Pufferung von Druckspitzen.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN05"}, MapsToComponentType: "actuator", Tags: []string{"hydraulic_part", "stored_energy", "high_pressure"}, SortOrder: 44}, + {ID: "C045", NameDE: "Hydraulikschlauch", NameEN: "Hydraulic Hose", Category: "hydraulic", DescriptionDE: "Flexible Schlauchleitung fuer Hydraulikfluid.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN05"}, MapsToComponentType: "actuator", Tags: []string{"hydraulic_part", "high_pressure"}, SortOrder: 45}, + {ID: "C046", NameDE: "Hydraulikfilter", NameEN: "Hydraulic Filter", Category: "hydraulic", DescriptionDE: "Filter zur Reinigung des Hydraulikfluids.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN05"}, MapsToComponentType: "actuator", Tags: []string{"hydraulic_part"}, SortOrder: 46}, + {ID: "C047", NameDE: "Hydraulikkuehler", NameEN: "Hydraulic Cooler", Category: "hydraulic", DescriptionDE: "Kuehlaggregat zur Temperierung des Hydraulikoels.", TypicalHazardCategories: []string{"pneumatic_hydraulic", "thermal_hazard"}, TypicalEnergySources: []string{"EN05", "EN07"}, MapsToComponentType: "actuator", Tags: []string{"hydraulic_part", "high_temperature"}, SortOrder: 47}, + {ID: "C048", NameDE: "Hydraulik-Proportionalventil", NameEN: "Hydraulic Proportional Valve", Category: "hydraulic", DescriptionDE: "Proportionalventil fuer stufenlose Steuerung von Druck und Volumen.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN05"}, MapsToComponentType: "actuator", Tags: []string{"hydraulic_part", "high_pressure"}, SortOrder: 48}, + {ID: "C049", NameDE: "Hydraulik-Druckminderer", NameEN: "Hydraulic Pressure Reducer", Category: "hydraulic", DescriptionDE: "Druckregelventil zur Begrenzung des Systemdrucks.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN05"}, MapsToComponentType: "actuator", Tags: []string{"hydraulic_part", "high_pressure"}, SortOrder: 49}, + {ID: "C050", NameDE: "Hydraulik-Absperrventil", NameEN: "Hydraulic Shut-off Valve", Category: "hydraulic", DescriptionDE: "Handventil zum sicheren Absperren von Leitungsabschnitten.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN05"}, MapsToComponentType: "actuator", Tags: []string{"hydraulic_part"}, SortOrder: 50}, + + // ── Category: pneumatic (C051-C060) ───────────────────────────────────── + {ID: "C051", NameDE: "Pneumatikzylinder", NameEN: "Pneumatic Cylinder", Category: "pneumatic", DescriptionDE: "Druckluftbetriebener Linearaktuator.", TypicalHazardCategories: []string{"pneumatic_hydraulic", "mechanical_hazard"}, TypicalEnergySources: []string{"EN06"}, MapsToComponentType: "actuator", Tags: []string{"pneumatic_part", "moving_part", "stored_energy"}, SortOrder: 51}, + {ID: "C052", NameDE: "Kompressor", NameEN: "Compressor", Category: "pneumatic", DescriptionDE: "Druckluftkompressor zur Erzeugung von Druckluft.", TypicalHazardCategories: []string{"pneumatic_hydraulic", "noise_vibration"}, TypicalEnergySources: []string{"EN06"}, MapsToComponentType: "actuator", Tags: []string{"pneumatic_part", "high_pressure", "noise_source"}, SortOrder: 52}, + {ID: "C053", NameDE: "Pneumatikventil", NameEN: "Pneumatic Valve", Category: "pneumatic", DescriptionDE: "Steuerventil zur Druckluftverteilung.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN06"}, MapsToComponentType: "actuator", Tags: []string{"pneumatic_part"}, SortOrder: 53}, + {ID: "C054", NameDE: "Druckluftaufbereitung", NameEN: "Air Treatment Unit", Category: "pneumatic", DescriptionDE: "Wartungseinheit mit Filter, Regler und Oeler.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN06"}, MapsToComponentType: "actuator", Tags: []string{"pneumatic_part"}, SortOrder: 54}, + {ID: "C055", NameDE: "Vakuumsauger", NameEN: "Vacuum Suction Cup", Category: "pneumatic", DescriptionDE: "Vakuumgreifer zum beruehrungslosen Heben von Werkstuecken.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN06"}, MapsToComponentType: "actuator", Tags: []string{"pneumatic_part"}, SortOrder: 55}, + {ID: "C056", NameDE: "Vakuumerzeuger", NameEN: "Vacuum Generator", Category: "pneumatic", DescriptionDE: "Venturi-Erzeuger oder Vakuumpumpe.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN06"}, MapsToComponentType: "actuator", Tags: []string{"pneumatic_part"}, SortOrder: 56}, + {ID: "C057", NameDE: "Druckluftmotor", NameEN: "Pneumatic Motor", Category: "pneumatic", DescriptionDE: "Druckluftbetriebener Rotationsmotor.", TypicalHazardCategories: []string{"pneumatic_hydraulic", "mechanical_hazard"}, TypicalEnergySources: []string{"EN06"}, MapsToComponentType: "actuator", Tags: []string{"pneumatic_part", "rotating_part"}, SortOrder: 57}, + {ID: "C058", NameDE: "Pneumatik-Absperrventil", NameEN: "Pneumatic Shut-off Valve", Category: "pneumatic", DescriptionDE: "Handventil zum sicheren Absperren der Druckluft.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN06"}, MapsToComponentType: "actuator", Tags: []string{"pneumatic_part"}, SortOrder: 58}, + {ID: "C059", NameDE: "Pneumatik-Drosselventil", NameEN: "Pneumatic Flow Control", Category: "pneumatic", DescriptionDE: "Drosselventil zur Geschwindigkeitsregelung von Pneumatikzylindern.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN06"}, MapsToComponentType: "actuator", Tags: []string{"pneumatic_part"}, SortOrder: 59}, + {ID: "C060", NameDE: "Druckluftspeicher", NameEN: "Air Reservoir", Category: "pneumatic", DescriptionDE: "Druckluftbehaelter als Energiespeicher.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN06"}, MapsToComponentType: "actuator", Tags: []string{"pneumatic_part", "stored_energy", "high_pressure"}, SortOrder: 60}, + + // ── Category: electrical (C061-C070) ──────────────────────────────────── + {ID: "C061", NameDE: "Schaltschrank", NameEN: "Control Cabinet", Category: "electrical", DescriptionDE: "Zentraler Schaltschrank mit Sicherungen, Schuetzen und Steuerung.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "electrical", Tags: []string{"high_voltage", "electrical_part"}, SortOrder: 61}, + {ID: "C062", NameDE: "Stromversorgung (Netzteil)", NameEN: "Power Supply", Category: "electrical", DescriptionDE: "AC/DC-Wandler oder Schaltnetzteil fuer die Maschinensteuerung.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "electrical", Tags: []string{"high_voltage", "electrical_part"}, SortOrder: 62}, + {ID: "C063", NameDE: "Transformator", NameEN: "Transformer", Category: "electrical", DescriptionDE: "Spannungswandler fuer die Versorgung verschiedener Spannungsebenen.", TypicalHazardCategories: []string{"electrical_hazard", "thermal_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "electrical", Tags: []string{"high_voltage", "electrical_part"}, SortOrder: 63}, + {ID: "C064", NameDE: "Schuetz/Relais", NameEN: "Contactor/Relay", Category: "electrical", DescriptionDE: "Elektromechanisches Schaltgeraet fuer Lastkreise.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "electrical", Tags: []string{"electrical_part"}, SortOrder: 64}, + {ID: "C065", NameDE: "Sicherungsautomat", NameEN: "Circuit Breaker", Category: "electrical", DescriptionDE: "Leitungsschutzschalter oder Motorschutzschalter.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "electrical", Tags: []string{"electrical_part"}, SortOrder: 65}, + {ID: "C066", NameDE: "FI-Schutzschalter", NameEN: "Residual Current Device", Category: "electrical", DescriptionDE: "Fehlerstromschutzschalter zum Personenschutz.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "electrical", Tags: []string{"electrical_part", "safety_device"}, SortOrder: 66}, + {ID: "C067", NameDE: "USV (Unterbrechungsfreie Stromversorgung)", NameEN: "Uninterruptible Power Supply", Category: "electrical", DescriptionDE: "Batteriepuffer fuer sicherheitsrelevante Verbraucher.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN04", "EN08"}, MapsToComponentType: "electrical", Tags: []string{"electrical_part", "stored_energy"}, SortOrder: 67}, + {ID: "C068", NameDE: "Energiekette/Schleppkette", NameEN: "Cable Carrier", Category: "electrical", DescriptionDE: "Fuehrung fuer Kabel und Schlaeuche an bewegten Achsen.", TypicalHazardCategories: []string{"electrical_hazard", "mechanical_hazard"}, TypicalEnergySources: []string{}, MapsToComponentType: "electrical", Tags: []string{"electrical_part", "moving_part"}, SortOrder: 68}, + {ID: "C069", NameDE: "Erdungssystem", NameEN: "Grounding System", Category: "electrical", DescriptionDE: "Schutz- und Funktionserdung der Maschine.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "electrical", Tags: []string{"electrical_part"}, SortOrder: 69}, + {ID: "C070", NameDE: "Hauptschalter", NameEN: "Main Switch", Category: "electrical", DescriptionDE: "Zentraler Netztrennschalter der Maschine.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "electrical", Tags: []string{"electrical_part", "high_voltage"}, SortOrder: 70}, + + // ── Category: control (C071-C080) ─────────────────────────────────────── + {ID: "C071", NameDE: "SPS (Speicherprogrammierbare Steuerung)", NameEN: "PLC (Programmable Logic Controller)", Category: "control", DescriptionDE: "Zentrale Maschinensteuerung mit SPS-Programm.", TypicalHazardCategories: []string{"software_fault", "configuration_error"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"has_software", "programmable"}, SortOrder: 71}, + {ID: "C072", NameDE: "Sicherheits-SPS", NameEN: "Safety PLC", Category: "control", DescriptionDE: "Redundante Sicherheitssteuerung bis SIL 3 / PL e.", TypicalHazardCategories: []string{"safety_function_failure", "software_fault"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"has_software", "programmable", "safety_device"}, SortOrder: 72}, + {ID: "C073", NameDE: "HMI (Bedienterminal)", NameEN: "HMI (Human Machine Interface)", Category: "control", DescriptionDE: "Bedienpanel mit Touchscreen zur Maschinensteuerung.", TypicalHazardCategories: []string{"hmi_error", "mode_confusion"}, TypicalEnergySources: []string{}, MapsToComponentType: "hmi", Tags: []string{"has_software", "user_interface"}, SortOrder: 73}, + {ID: "C074", NameDE: "Industrierechner (IPC)", NameEN: "Industrial PC", Category: "control", DescriptionDE: "Industrie-PC fuer komplexe Steuerungs- und Datenverarbeitungsaufgaben.", TypicalHazardCategories: []string{"software_fault", "configuration_error"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"has_software", "programmable", "networked"}, SortOrder: 74}, + {ID: "C075", NameDE: "Motion Controller", NameEN: "Motion Controller", Category: "control", DescriptionDE: "Achscontroller fuer synchronisierte Mehrachsbewegungen.", TypicalHazardCategories: []string{"software_fault", "mechanical_hazard"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"has_software", "programmable"}, SortOrder: 75}, + {ID: "C076", NameDE: "Sicherheitsrelais", NameEN: "Safety Relay", Category: "control", DescriptionDE: "Sicherheitsschaltgeraet fuer Not-Halt, Schutztuer etc.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device"}, SortOrder: 76}, + {ID: "C077", NameDE: "Antriebsregler", NameEN: "Drive Controller", Category: "control", DescriptionDE: "Intelligenter Antriebsregler mit integrierten Sicherheitsfunktionen.", TypicalHazardCategories: []string{"software_fault", "electrical_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "controller", Tags: []string{"has_software", "programmable"}, SortOrder: 77}, + {ID: "C078", NameDE: "Remote I/O", NameEN: "Remote I/O Module", Category: "control", DescriptionDE: "Dezentrales Ein-/Ausgangsmodul im Feldbus.", TypicalHazardCategories: []string{"communication_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"networked"}, SortOrder: 78}, + {ID: "C079", NameDE: "Bedienpult", NameEN: "Control Desk", Category: "control", DescriptionDE: "Zentrales Bedienpult mit Tastern, Schaltern und Anzeigen.", TypicalHazardCategories: []string{"hmi_error", "mode_confusion"}, TypicalEnergySources: []string{}, MapsToComponentType: "hmi", Tags: []string{"user_interface"}, SortOrder: 79}, + {ID: "C080", NameDE: "Datenschreiber/Logger", NameEN: "Data Logger", Category: "control", DescriptionDE: "Geraet zur Aufzeichnung von Prozessparametern.", TypicalHazardCategories: []string{"logging_audit_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"has_software"}, SortOrder: 80}, + + // ── Category: sensor (C081-C090) ──────────────────────────────────────── + {ID: "C081", NameDE: "Positionssensor", NameEN: "Position Sensor", Category: "sensor", DescriptionDE: "Induktiver, kapazitiver oder optischer Positionssensor.", TypicalHazardCategories: []string{"sensor_spoofing"}, TypicalEnergySources: []string{}, MapsToComponentType: "sensor", Tags: []string{"sensor_part"}, SortOrder: 81}, + {ID: "C082", NameDE: "Kamerasystem", NameEN: "Camera System", Category: "sensor", DescriptionDE: "Industriekamera fuer Bildverarbeitung und Qualitaetskontrolle.", TypicalHazardCategories: []string{"sensor_spoofing", "false_classification"}, TypicalEnergySources: []string{}, MapsToComponentType: "sensor", Tags: []string{"sensor_part", "networked"}, SortOrder: 82}, + {ID: "C083", NameDE: "Kraftsensor", NameEN: "Force Sensor", Category: "sensor", DescriptionDE: "Dehnungsmessstreifen oder piezoelektrischer Kraftsensor.", TypicalHazardCategories: []string{"sensor_spoofing"}, TypicalEnergySources: []string{}, MapsToComponentType: "sensor", Tags: []string{"sensor_part"}, SortOrder: 83}, + {ID: "C084", NameDE: "Temperatursensor", NameEN: "Temperature Sensor", Category: "sensor", DescriptionDE: "Thermocouple oder PT100 zur Temperaturueberwachung.", TypicalHazardCategories: []string{"sensor_spoofing"}, TypicalEnergySources: []string{}, MapsToComponentType: "sensor", Tags: []string{"sensor_part"}, SortOrder: 84}, + {ID: "C085", NameDE: "Drucksensor", NameEN: "Pressure Sensor", Category: "sensor", DescriptionDE: "Sensor zur Ueberwachung von Druck in Hydraulik- oder Pneumatiksystemen.", TypicalHazardCategories: []string{"sensor_spoofing"}, TypicalEnergySources: []string{}, MapsToComponentType: "sensor", Tags: []string{"sensor_part"}, SortOrder: 85}, + {ID: "C086", NameDE: "Drehgeber/Encoder", NameEN: "Rotary Encoder", Category: "sensor", DescriptionDE: "Absolut- oder Inkrementaldrehgeber zur Winkel-/Positionsmessung.", TypicalHazardCategories: []string{"sensor_spoofing"}, TypicalEnergySources: []string{}, MapsToComponentType: "sensor", Tags: []string{"sensor_part"}, SortOrder: 86}, + {ID: "C087", NameDE: "Laserscanner", NameEN: "Laser Scanner", Category: "sensor", DescriptionDE: "Sicherheits-Laserscanner zur Ueberwachung von Schutzzonen.", TypicalHazardCategories: []string{"sensor_spoofing", "safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "sensor", Tags: []string{"sensor_part", "safety_device"}, SortOrder: 87}, + {ID: "C088", NameDE: "Beschleunigungssensor", NameEN: "Accelerometer", Category: "sensor", DescriptionDE: "Sensor zur Vibrations- und Beschleunigungsmessung.", TypicalHazardCategories: []string{"sensor_spoofing"}, TypicalEnergySources: []string{}, MapsToComponentType: "sensor", Tags: []string{"sensor_part"}, SortOrder: 88}, + {ID: "C089", NameDE: "Durchflusssensor", NameEN: "Flow Sensor", Category: "sensor", DescriptionDE: "Sensor zur Ueberwachung des Volumenstrom.", TypicalHazardCategories: []string{"sensor_spoofing"}, TypicalEnergySources: []string{}, MapsToComponentType: "sensor", Tags: []string{"sensor_part"}, SortOrder: 89}, + {ID: "C090", NameDE: "Fuellstandsensor", NameEN: "Level Sensor", Category: "sensor", DescriptionDE: "Sensor zur Ueberwachung des Fuellstands in Tanks und Behaeltern.", TypicalHazardCategories: []string{"sensor_spoofing"}, TypicalEnergySources: []string{}, MapsToComponentType: "sensor", Tags: []string{"sensor_part"}, SortOrder: 90}, + + // ── Category: actuator (C091-C100) ────────────────────────────────────── + {ID: "C091", NameDE: "Magnetventil", NameEN: "Solenoid Valve", Category: "actuator", DescriptionDE: "Elektromagnetisch betaetigtes Ventil fuer Pneumatik oder Hydraulik.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN05", "EN06"}, MapsToComponentType: "actuator", Tags: []string{"actuator_part"}, SortOrder: 91}, + {ID: "C092", NameDE: "Linearantrieb (elektrisch)", NameEN: "Electric Linear Actuator", Category: "actuator", DescriptionDE: "Elektrischer Linearantrieb fuer Positionieraufgaben.", TypicalHazardCategories: []string{"mechanical_hazard", "electrical_hazard"}, TypicalEnergySources: []string{"EN01", "EN04"}, MapsToComponentType: "actuator", Tags: []string{"actuator_part", "moving_part"}, SortOrder: 92}, + {ID: "C093", NameDE: "Proportionalventil", NameEN: "Proportional Valve", Category: "actuator", DescriptionDE: "Stetig regelbares Ventil fuer praezise Drucksteuerung.", TypicalHazardCategories: []string{"pneumatic_hydraulic"}, TypicalEnergySources: []string{"EN05", "EN06"}, MapsToComponentType: "actuator", Tags: []string{"actuator_part"}, SortOrder: 93}, + {ID: "C094", NameDE: "Heizelement", NameEN: "Heating Element", Category: "actuator", DescriptionDE: "Elektrisches Heizelement fuer Temperierung von Werkzeugen oder Medien.", TypicalHazardCategories: []string{"thermal_hazard", "electrical_hazard"}, TypicalEnergySources: []string{"EN07"}, MapsToComponentType: "actuator", Tags: []string{"actuator_part", "high_temperature"}, SortOrder: 94}, + {ID: "C095", NameDE: "Kuehlaggregat", NameEN: "Cooling Unit", Category: "actuator", DescriptionDE: "Kuehlanlage fuer Prozesse oder Schaltschraenke.", TypicalHazardCategories: []string{"thermal_hazard"}, TypicalEnergySources: []string{"EN07"}, MapsToComponentType: "actuator", Tags: []string{"actuator_part"}, SortOrder: 95}, + {ID: "C096", NameDE: "Luefter/Geblaese", NameEN: "Fan/Blower", Category: "actuator", DescriptionDE: "Luefter zur Kuehlung oder Absaugung.", TypicalHazardCategories: []string{"mechanical_hazard", "noise_vibration"}, TypicalEnergySources: []string{"EN02"}, MapsToComponentType: "actuator", Tags: []string{"actuator_part", "rotating_part"}, SortOrder: 96}, + {ID: "C097", NameDE: "Dosierpumpe", NameEN: "Dosing Pump", Category: "actuator", DescriptionDE: "Praezisionspumpe zur Dosierung von Fluessigkeiten oder Klebstoffen.", TypicalHazardCategories: []string{"pneumatic_hydraulic", "material_environmental"}, TypicalEnergySources: []string{"EN05"}, MapsToComponentType: "actuator", Tags: []string{"actuator_part"}, SortOrder: 97}, + {ID: "C098", NameDE: "Elektromagnet", NameEN: "Electromagnet", Category: "actuator", DescriptionDE: "Elektromagnet fuer Halten, Spannen oder Foerdern.", TypicalHazardCategories: []string{"electrical_hazard", "emc_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "actuator", Tags: []string{"actuator_part", "stored_energy"}, SortOrder: 98}, + {ID: "C099", NameDE: "Piezo-Aktuator", NameEN: "Piezo Actuator", Category: "actuator", DescriptionDE: "Piezoelektrischer Aktuator fuer hochpraezise Mikrobewegungen.", TypicalHazardCategories: []string{"electrical_hazard"}, TypicalEnergySources: []string{"EN04"}, MapsToComponentType: "actuator", Tags: []string{"actuator_part"}, SortOrder: 99}, + {ID: "C100", NameDE: "Spannvorrichtung", NameEN: "Clamping Device", Category: "actuator", DescriptionDE: "Mechanische, pneumatische oder hydraulische Spannvorrichtung.", TypicalHazardCategories: []string{"mechanical_hazard"}, TypicalEnergySources: []string{"EN01", "EN05", "EN06"}, MapsToComponentType: "actuator", Tags: []string{"actuator_part", "clamping_part", "pinch_point"}, SortOrder: 100}, + + // ── Category: safety (C101-C110) ──────────────────────────────────────── + {ID: "C101", NameDE: "Not-Halt-Taster", NameEN: "Emergency Stop Button", Category: "safety", DescriptionDE: "Pilzfoermiger Taster fuer den sofortigen Maschinenstopp.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device", "emergency_stop"}, SortOrder: 101}, + {ID: "C102", NameDE: "Lichtgitter / Lichtvorhang", NameEN: "Light Curtain", Category: "safety", DescriptionDE: "Optoelektronische Schutzeinrichtung zur Zugangsueberwachung.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device", "interlocked"}, SortOrder: 102}, + {ID: "C103", NameDE: "Sicherheits-Laserscanner", NameEN: "Safety Laser Scanner", Category: "safety", DescriptionDE: "Scanner zur Ueberwachung von Schutzfeldern und Warnfeldern.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device", "sensor_part"}, SortOrder: 103}, + {ID: "C104", NameDE: "Sicherheitsschalter (Tuerkontakt)", NameEN: "Safety Switch (Door Contact)", Category: "safety", DescriptionDE: "Positions- oder Schluesseltransferschalter an Schutztueren.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device", "interlocked"}, SortOrder: 104}, + {ID: "C105", NameDE: "Zuhaltung", NameEN: "Guard Locking Device", Category: "safety", DescriptionDE: "Elektromechanische Zuhaltung fuer Schutztueren.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device", "interlocked"}, SortOrder: 105}, + {ID: "C106", NameDE: "Zweihandschaltung", NameEN: "Two-Hand Control", Category: "safety", DescriptionDE: "Zweihandschaltung zur sicheren Ausloesung von Hubbewegungen.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device"}, SortOrder: 106}, + {ID: "C107", NameDE: "Sicherheitsmagnet / RFID-Schalter", NameEN: "Safety RFID Switch", Category: "safety", DescriptionDE: "Manipulationssicherer Sicherheitsschalter mit RFID-Codierung.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device", "interlocked"}, SortOrder: 107}, + {ID: "C108", NameDE: "Schaltmatte / Trittmatte", NameEN: "Safety Mat", Category: "safety", DescriptionDE: "Druckempfindliche Matte zur Personenerkennung in Gefahrzonen.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device"}, SortOrder: 108}, + {ID: "C109", NameDE: "Seilzugschalter", NameEN: "Pull-Wire Switch", Category: "safety", DescriptionDE: "Seilzug-Notschalter entlang von Foerderstrecken.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device", "emergency_stop"}, SortOrder: 109}, + {ID: "C110", NameDE: "Zustimmtaster", NameEN: "Enabling Device", Category: "safety", DescriptionDE: "Dreistufiger Zustimmtaster fuer den Einrichtbetrieb.", TypicalHazardCategories: []string{"safety_function_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "controller", Tags: []string{"safety_device"}, SortOrder: 110}, + + // ── Category: it_network (C111-C120) ──────────────────────────────────── + {ID: "C111", NameDE: "Industrie-Switch (managed)", NameEN: "Managed Industrial Switch", Category: "it_network", DescriptionDE: "Managed Ethernet Switch fuer das Maschinennetzwerk.", TypicalHazardCategories: []string{"communication_failure", "unauthorized_access"}, TypicalEnergySources: []string{}, MapsToComponentType: "network", Tags: []string{"networked", "it_component"}, SortOrder: 111}, + {ID: "C112", NameDE: "Industrie-Router", NameEN: "Industrial Router", Category: "it_network", DescriptionDE: "Router zur Segmentierung und Absicherung des Maschinennetzwerks.", TypicalHazardCategories: []string{"communication_failure", "unauthorized_access"}, TypicalEnergySources: []string{}, MapsToComponentType: "network", Tags: []string{"networked", "it_component"}, SortOrder: 112}, + {ID: "C113", NameDE: "Industrie-Firewall", NameEN: "Industrial Firewall", Category: "it_network", DescriptionDE: "Firewall zum Schutz des OT-Netzwerks vor externen Angriffen.", TypicalHazardCategories: []string{"unauthorized_access"}, TypicalEnergySources: []string{}, MapsToComponentType: "network", Tags: []string{"networked", "it_component", "security_device"}, SortOrder: 113}, + {ID: "C114", NameDE: "IoT-Gateway", NameEN: "IoT Gateway", Category: "it_network", DescriptionDE: "Gateway fuer die Anbindung von Maschinen an Cloud/Edge.", TypicalHazardCategories: []string{"communication_failure", "unauthorized_access"}, TypicalEnergySources: []string{}, MapsToComponentType: "network", Tags: []string{"networked", "it_component", "has_software"}, SortOrder: 114}, + {ID: "C115", NameDE: "Edge-Computing-Einheit", NameEN: "Edge Computing Unit", Category: "it_network", DescriptionDE: "Lokale Recheneinheit fuer Datenvorverarbeitung und KI-Inferenz.", TypicalHazardCategories: []string{"software_fault", "communication_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "network", Tags: []string{"networked", "it_component", "has_software", "has_ai"}, SortOrder: 115}, + {ID: "C116", NameDE: "WLAN Access Point (Industrie)", NameEN: "Industrial WiFi Access Point", Category: "it_network", DescriptionDE: "Drahtloser Netzwerkzugang im Maschinenumfeld.", TypicalHazardCategories: []string{"communication_failure", "unauthorized_access"}, TypicalEnergySources: []string{}, MapsToComponentType: "network", Tags: []string{"networked", "it_component", "wireless"}, SortOrder: 116}, + {ID: "C117", NameDE: "OPC UA Server", NameEN: "OPC UA Server", Category: "it_network", DescriptionDE: "OPC UA Kommunikationsserver fuer Maschine-zu-Maschine-Vernetzung.", TypicalHazardCategories: []string{"communication_failure", "unauthorized_access"}, TypicalEnergySources: []string{}, MapsToComponentType: "network", Tags: []string{"networked", "it_component", "has_software"}, SortOrder: 117}, + {ID: "C118", NameDE: "VPN-Appliance", NameEN: "VPN Appliance", Category: "it_network", DescriptionDE: "VPN-Geraet fuer sichere Fernzugriffe auf die Maschinensteuerung.", TypicalHazardCategories: []string{"unauthorized_access"}, TypicalEnergySources: []string{}, MapsToComponentType: "network", Tags: []string{"networked", "it_component", "security_device"}, SortOrder: 118}, + {ID: "C119", NameDE: "KI-Inferenzmodul", NameEN: "AI Inference Module", Category: "it_network", DescriptionDE: "Dediziertes KI-Modul (GPU/TPU) fuer Echtzeit-Inferenz.", TypicalHazardCategories: []string{"false_classification", "model_drift", "unintended_bias"}, TypicalEnergySources: []string{}, MapsToComponentType: "network", Tags: []string{"has_ai", "has_software", "networked"}, SortOrder: 119}, + {ID: "C120", NameDE: "Feldbus-Koppler", NameEN: "Fieldbus Coupler", Category: "it_network", DescriptionDE: "Koppler fuer PROFINET, EtherCAT oder andere Feldbussysteme.", TypicalHazardCategories: []string{"communication_failure"}, TypicalEnergySources: []string{}, MapsToComponentType: "network", Tags: []string{"networked", "it_component"}, SortOrder: 120}, + } +} + +// GetEnergySources returns the complete built-in energy source library with 20 entries. +func GetEnergySources() []EnergySourceEntry { + return []EnergySourceEntry{ + {ID: "EN01", NameDE: "Kinetische Energie (translatorisch)", NameEN: "Kinetic Energy (Translational)", DescriptionDE: "Energie durch lineare Bewegung von Maschinenteilen.", TypicalComponents: []string{"C001", "C002", "C005", "C008"}, TypicalHazardCategories: []string{"mechanical_hazard"}, Tags: []string{"kinetic", "translational"}, SortOrder: 1}, + {ID: "EN02", NameDE: "Kinetische Energie (rotatorisch)", NameEN: "Kinetic Energy (Rotational)", DescriptionDE: "Energie durch Drehbewegung von Wellen, Spindeln, Motoren.", TypicalComponents: []string{"C004", "C006", "C009", "C031"}, TypicalHazardCategories: []string{"mechanical_hazard"}, Tags: []string{"kinetic", "rotational"}, SortOrder: 2}, + {ID: "EN03", NameDE: "Potentielle Energie (Lage)", NameEN: "Potential Energy (Gravitational)", DescriptionDE: "Energie durch angehobene Lasten oder Maschinenteile.", TypicalComponents: []string{"C014", "C029", "C030"}, TypicalHazardCategories: []string{"mechanical_hazard"}, Tags: []string{"potential", "gravitational"}, SortOrder: 3}, + {ID: "EN04", NameDE: "Elektrische Energie", NameEN: "Electrical Energy", DescriptionDE: "Netz- oder Batteriespannung in Schaltschraenken und Antrieben.", TypicalComponents: []string{"C061", "C062", "C063", "C070"}, TypicalHazardCategories: []string{"electrical_hazard"}, Tags: []string{"electrical_energy"}, SortOrder: 4}, + {ID: "EN05", NameDE: "Hydraulische Energie", NameEN: "Hydraulic Energy", DescriptionDE: "Druckenergie in Hydrauliksystemen.", TypicalComponents: []string{"C041", "C042", "C043", "C044"}, TypicalHazardCategories: []string{"pneumatic_hydraulic"}, Tags: []string{"hydraulic_pressure"}, SortOrder: 5}, + {ID: "EN06", NameDE: "Pneumatische Energie", NameEN: "Pneumatic Energy", DescriptionDE: "Druckenergie in Druckluftsystemen.", TypicalComponents: []string{"C051", "C052", "C053", "C060"}, TypicalHazardCategories: []string{"pneumatic_hydraulic"}, Tags: []string{"pneumatic_pressure"}, SortOrder: 6}, + {ID: "EN07", NameDE: "Thermische Energie", NameEN: "Thermal Energy", DescriptionDE: "Waerme- oder Kaelteenergie in Prozessen oder Kuehlsystemen.", TypicalComponents: []string{"C094", "C095", "C047"}, TypicalHazardCategories: []string{"thermal_hazard"}, Tags: []string{"thermal"}, SortOrder: 7}, + {ID: "EN08", NameDE: "Gespeicherte Energie (elektrisch)", NameEN: "Stored Energy (Electrical)", DescriptionDE: "Energie in Kondensatoren, Batterien oder USV-Systemen.", TypicalComponents: []string{"C067", "C034"}, TypicalHazardCategories: []string{"electrical_hazard"}, Tags: []string{"stored_energy", "electrical_energy"}, SortOrder: 8}, + {ID: "EN09", NameDE: "Gespeicherte Energie (mechanisch)", NameEN: "Stored Energy (Mechanical)", DescriptionDE: "Energie in Federn, Schwungraedern oder Gegengewichten.", TypicalComponents: []string{"C013"}, TypicalHazardCategories: []string{"mechanical_hazard"}, Tags: []string{"stored_energy", "mechanical"}, SortOrder: 9}, + {ID: "EN10", NameDE: "Gespeicherte Energie (hydraulisch)", NameEN: "Stored Energy (Hydraulic)", DescriptionDE: "Restdruck in Hydraulikspeichern und -leitungen.", TypicalComponents: []string{"C044", "C045"}, TypicalHazardCategories: []string{"pneumatic_hydraulic"}, Tags: []string{"stored_energy", "hydraulic_pressure"}, SortOrder: 10}, + {ID: "EN11", NameDE: "Gespeicherte Energie (pneumatisch)", NameEN: "Stored Energy (Pneumatic)", DescriptionDE: "Restdruck in Druckluftbehaeltern und -leitungen.", TypicalComponents: []string{"C060", "C051"}, TypicalHazardCategories: []string{"pneumatic_hydraulic"}, Tags: []string{"stored_energy", "pneumatic_pressure"}, SortOrder: 11}, + {ID: "EN12", NameDE: "Strahlung (optisch/Laser)", NameEN: "Radiation (Optical/Laser)", DescriptionDE: "Licht- oder Laserstrahlung bei Schneid-, Schweiß- oder Messprozessen.", TypicalComponents: []string{"C016", "C087"}, TypicalHazardCategories: []string{"thermal_hazard"}, Tags: []string{"radiation"}, SortOrder: 12}, + {ID: "EN13", NameDE: "Strahlung (elektromagnetisch)", NameEN: "Radiation (Electromagnetic)", DescriptionDE: "EMV-Stoerungen durch Frequenzumrichter, Motoren oder Funksender.", TypicalComponents: []string{"C034", "C098", "C116"}, TypicalHazardCategories: []string{"emc_hazard"}, Tags: []string{"radiation", "electromagnetic"}, SortOrder: 13}, + {ID: "EN14", NameDE: "Schallenergie", NameEN: "Acoustic Energy", DescriptionDE: "Laermemission durch Antriebe, Kompressoren oder Bearbeitungsprozesse.", TypicalComponents: []string{"C052", "C006", "C020"}, TypicalHazardCategories: []string{"noise_vibration"}, Tags: []string{"acoustic"}, SortOrder: 14}, + {ID: "EN15", NameDE: "Vibrationsenergie", NameEN: "Vibration Energy", DescriptionDE: "Mechanische Schwingungen durch rotierende oder oszillierende Teile.", TypicalComponents: []string{"C020", "C006"}, TypicalHazardCategories: []string{"noise_vibration"}, Tags: []string{"vibration"}, SortOrder: 15}, + {ID: "EN16", NameDE: "Chemische Energie", NameEN: "Chemical Energy", DescriptionDE: "Gefahrstoffe, Klebstoffe, Kuehlschmierstoffe oder Hydraulikoele.", TypicalComponents: []string{"C097", "C046"}, TypicalHazardCategories: []string{"material_environmental"}, Tags: []string{"chemical"}, SortOrder: 16}, + {ID: "EN17", NameDE: "Magnetische Energie", NameEN: "Magnetic Energy", DescriptionDE: "Magnetfelder durch Elektromagnete oder Permanentmagnete.", TypicalComponents: []string{"C098"}, TypicalHazardCategories: []string{"emc_hazard"}, Tags: []string{"magnetic"}, SortOrder: 17}, + {ID: "EN18", NameDE: "Datenenergie (Cyber)", NameEN: "Data/Cyber Energy", DescriptionDE: "Logische Steuerungsdaten und Kommunikation als Angriffsvektor.", TypicalComponents: []string{"C111", "C112", "C114", "C119"}, TypicalHazardCategories: []string{"unauthorized_access", "firmware_corruption"}, Tags: []string{"cyber", "data"}, SortOrder: 18}, + {ID: "EN19", NameDE: "KI-Modell-Energie", NameEN: "AI Model Energy", DescriptionDE: "Trainierte Modellparameter als potenzielle Fehlerquelle bei Inferenz.", TypicalComponents: []string{"C119", "C115"}, TypicalHazardCategories: []string{"false_classification", "model_drift", "data_poisoning", "unintended_bias"}, Tags: []string{"ai_model", "cyber"}, SortOrder: 19}, + {ID: "EN20", NameDE: "Ergonomische Belastung", NameEN: "Ergonomic Load", DescriptionDE: "Koerperliche Belastung durch ungünstige Arbeitshaltungen oder Gewichte.", TypicalComponents: []string{"C024", "C029", "C030"}, TypicalHazardCategories: []string{"ergonomic"}, Tags: []string{"ergonomic"}, SortOrder: 20}, + } +} + +// ValidComponentLibraryCategories returns all valid component library categories. +func ValidComponentLibraryCategories() []string { + return []string{ + "mechanical", "structural", "drive", "hydraulic", "pneumatic", + "electrical", "control", "sensor", "actuator", "safety", "it_network", + } +} diff --git a/ai-compliance-sdk/internal/iace/component_library_test.go b/ai-compliance-sdk/internal/iace/component_library_test.go new file mode 100644 index 0000000..41581f8 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/component_library_test.go @@ -0,0 +1,131 @@ +package iace + +import "testing" + +// TestGetComponentLibrary_EntryCount verifies the component library has exactly 120 entries. +func TestGetComponentLibrary_EntryCount(t *testing.T) { + entries := GetComponentLibrary() + if len(entries) != 120 { + t.Fatalf("GetComponentLibrary returned %d entries, want 120", len(entries)) + } +} + +// TestGetComponentLibrary_UniqueIDs verifies all component IDs are unique. +func TestGetComponentLibrary_UniqueIDs(t *testing.T) { + entries := GetComponentLibrary() + seen := make(map[string]bool) + for _, e := range entries { + if e.ID == "" { + t.Errorf("component has empty ID: %s", e.NameDE) + } + if seen[e.ID] { + t.Errorf("duplicate component ID: %s", e.ID) + } + seen[e.ID] = true + } +} + +// TestGetComponentLibrary_ValidCategories verifies all categories are valid. +func TestGetComponentLibrary_ValidCategories(t *testing.T) { + validCats := make(map[string]bool) + for _, c := range ValidComponentLibraryCategories() { + validCats[c] = true + } + for _, e := range GetComponentLibrary() { + if !validCats[e.Category] { + t.Errorf("component %s has invalid category %q", e.ID, e.Category) + } + } +} + +// TestGetComponentLibrary_NonEmptyFields verifies required fields are filled. +func TestGetComponentLibrary_NonEmptyFields(t *testing.T) { + for _, e := range GetComponentLibrary() { + if e.NameDE == "" { + t.Errorf("component %s: NameDE is empty", e.ID) + } + if e.NameEN == "" { + t.Errorf("component %s: NameEN is empty", e.ID) + } + if e.MapsToComponentType == "" { + t.Errorf("component %s: MapsToComponentType is empty", e.ID) + } + if len(e.Tags) == 0 { + t.Errorf("component %s: Tags is empty", e.ID) + } + } +} + +// TestGetComponentLibrary_CategoryDistribution verifies expected category counts. +func TestGetComponentLibrary_CategoryDistribution(t *testing.T) { + counts := make(map[string]int) + for _, e := range GetComponentLibrary() { + counts[e.Category]++ + } + expected := map[string]int{ + "mechanical": 20, + "structural": 10, + "drive": 10, + "hydraulic": 10, + "pneumatic": 10, + "electrical": 10, + "control": 10, + "sensor": 10, + "actuator": 10, + "safety": 10, + "it_network": 10, + } + for cat, want := range expected { + got := counts[cat] + if got != want { + t.Errorf("category %s: got %d entries, want %d", cat, got, want) + } + } +} + +// TestGetEnergySources_EntryCount verifies the energy source library has exactly 20 entries. +func TestGetEnergySources_EntryCount(t *testing.T) { + entries := GetEnergySources() + if len(entries) != 20 { + t.Fatalf("GetEnergySources returned %d entries, want 20", len(entries)) + } +} + +// TestGetEnergySources_UniqueIDs verifies all energy source IDs are unique. +func TestGetEnergySources_UniqueIDs(t *testing.T) { + entries := GetEnergySources() + seen := make(map[string]bool) + for _, e := range entries { + if e.ID == "" { + t.Errorf("energy source has empty ID: %s", e.NameDE) + } + if seen[e.ID] { + t.Errorf("duplicate energy source ID: %s", e.ID) + } + seen[e.ID] = true + } +} + +// TestGetEnergySources_NonEmptyFields verifies required fields are filled. +func TestGetEnergySources_NonEmptyFields(t *testing.T) { + for _, e := range GetEnergySources() { + if e.NameDE == "" { + t.Errorf("energy source %s: NameDE is empty", e.ID) + } + if e.NameEN == "" { + t.Errorf("energy source %s: NameEN is empty", e.ID) + } + if len(e.Tags) == 0 { + t.Errorf("energy source %s: Tags is empty", e.ID) + } + } +} + +// TestGetEnergySources_AllHaveTags verifies every energy source has at least one tag. +func TestGetEnergySources_AllHaveTags(t *testing.T) { + for _, e := range GetEnergySources() { + if len(e.Tags) == 0 { + t.Errorf("energy source %s has no tags", e.ID) + } + } +} diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns.go b/ai-compliance-sdk/internal/iace/hazard_patterns.go new file mode 100644 index 0000000..f470d83 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/hazard_patterns.go @@ -0,0 +1,458 @@ +package iace + +// HazardPattern defines a rule that matches component/energy tags to +// hazards, measures, and evidence. When a pattern's required tags are all +// present (AND) and none of its excluded tags are present (NOT), it fires. +type HazardPattern struct { + ID string `json:"id"` + NameDE string `json:"name_de"` + NameEN string `json:"name_en"` + RequiredComponentTags []string `json:"required_component_tags"` + RequiredEnergyTags []string `json:"required_energy_tags"` + RequiredLifecycles []string `json:"required_lifecycle_phases"` + ExcludedComponentTags []string `json:"excluded_component_tags"` + GeneratedHazardCats []string `json:"generated_hazard_categories"` + SuggestedMeasureIDs []string `json:"suggested_measure_ids"` + SuggestedEvidenceIDs []string `json:"suggested_evidence_ids"` + Priority int `json:"priority"` +} + +// GetBuiltinHazardPatterns returns ~44 built-in hazard patterns organized +// by domain (mechanical, electrical, thermal, hydraulic/pneumatic, +// noise/vibration, ergonomic, software/control, cyber/network, AI-specific). +func GetBuiltinHazardPatterns() []HazardPattern { + return []HazardPattern{ + // ==================================================================== + // Mechanical Patterns (HP001-HP010) + // ==================================================================== + { + ID: "HP001", NameDE: "Quetschgefahr durch bewegte Teile", NameEN: "Crush risk from moving parts", + RequiredComponentTags: []string{"moving_part"}, + RequiredEnergyTags: []string{"kinetic"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M001", "M005", "M051", "M054"}, + SuggestedEvidenceIDs: []string{"E01", "E08", "E20"}, + Priority: 95, + }, + { + ID: "HP002", NameDE: "Einzugsgefahr durch rotierende Teile", NameEN: "Entanglement risk from rotating parts", + RequiredComponentTags: []string{"rotating_part"}, + RequiredEnergyTags: []string{"rotational"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M002", "M051", "M053", "M121"}, + SuggestedEvidenceIDs: []string{"E01", "E08"}, + Priority: 95, + }, + { + ID: "HP003", NameDE: "Schnittgefahr durch Schneidwerkzeuge", NameEN: "Cut risk from cutting tools", + RequiredComponentTags: []string{"cutting_part"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M003", "M051", "M054", "M131"}, + SuggestedEvidenceIDs: []string{"E01", "E08"}, + Priority: 90, + }, + { + ID: "HP004", NameDE: "Klemmgefahr an Quetsch-/Klemmstellen", NameEN: "Pinch risk at clamping points", + RequiredComponentTags: []string{"pinch_point"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M001", "M004", "M051", "M121"}, + SuggestedEvidenceIDs: []string{"E01", "E08"}, + Priority: 85, + }, + { + ID: "HP005", NameDE: "Quetschgefahr an Quetschstellen", NameEN: "Crush risk at crush points", + RequiredComponentTags: []string{"crush_point"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M001", "M005", "M054"}, + SuggestedEvidenceIDs: []string{"E01", "E08"}, + Priority: 90, + }, + { + ID: "HP006", NameDE: "Gefahr durch hohe Kraefte", NameEN: "Risk from high forces", + RequiredComponentTags: []string{"high_force"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M001", "M005", "M051", "M106"}, + SuggestedEvidenceIDs: []string{"E01", "E07", "E08"}, + Priority: 90, + }, + { + ID: "HP007", NameDE: "Gefahr durch hohe Geschwindigkeit", NameEN: "Risk from high speed", + RequiredComponentTags: []string{"high_speed"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M002", "M051", "M053", "M054"}, + SuggestedEvidenceIDs: []string{"E01", "E08"}, + Priority: 85, + }, + { + ID: "HP008", NameDE: "Absturzgefahr / Herabfallende Teile", NameEN: "Fall/drop risk", + RequiredComponentTags: []string{"gravity_risk"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M009", "M121", "M131"}, + SuggestedEvidenceIDs: []string{"E01", "E20"}, + Priority: 85, + }, + { + ID: "HP009", NameDE: "Gefahr durch Spannvorrichtungen", NameEN: "Clamping device risk", + RequiredComponentTags: []string{"clamping_part"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M004", "M051", "M121"}, + SuggestedEvidenceIDs: []string{"E01", "E08"}, + Priority: 80, + }, + { + ID: "HP010", NameDE: "Gefahr durch gespeicherte mechanische Energie", NameEN: "Stored mechanical energy risk", + RequiredComponentTags: []string{"stored_energy"}, + RequiredEnergyTags: []string{"mechanical"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M010", "M121", "M123"}, + SuggestedEvidenceIDs: []string{"E01", "E20"}, + Priority: 80, + }, + + // ==================================================================== + // Electrical Patterns (HP011-HP015) + // ==================================================================== + { + ID: "HP011", NameDE: "Stromschlaggefahr durch Hochspannung", NameEN: "Electric shock risk from high voltage", + RequiredComponentTags: []string{"high_voltage"}, + RequiredEnergyTags: []string{"electrical_energy"}, + GeneratedHazardCats: []string{"electrical_hazard"}, + SuggestedMeasureIDs: []string{"M061", "M062", "M063", "M121"}, + SuggestedEvidenceIDs: []string{"E01", "E04", "E10"}, + Priority: 95, + }, + { + ID: "HP012", NameDE: "Gefahr durch elektrische Komponenten", NameEN: "Risk from electrical components", + RequiredComponentTags: []string{"electrical_part"}, + RequiredEnergyTags: []string{"electrical_energy"}, + GeneratedHazardCats: []string{"electrical_hazard"}, + SuggestedMeasureIDs: []string{"M061", "M064", "M121"}, + SuggestedEvidenceIDs: []string{"E01", "E04", "E10"}, + Priority: 85, + }, + { + ID: "HP013", NameDE: "Gefahr durch gespeicherte elektrische Energie", NameEN: "Stored electrical energy risk", + RequiredComponentTags: []string{"stored_energy"}, + RequiredEnergyTags: []string{"electrical_energy"}, + GeneratedHazardCats: []string{"electrical_hazard"}, + SuggestedMeasureIDs: []string{"M062", "M063", "M121", "M123"}, + SuggestedEvidenceIDs: []string{"E01", "E10"}, + Priority: 85, + }, + { + ID: "HP014", NameDE: "Kurzschluss-/Lichtbogengefahr", NameEN: "Short circuit / arc flash risk", + RequiredComponentTags: []string{"high_voltage", "electrical_part"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"electrical_hazard", "thermal_hazard"}, + SuggestedMeasureIDs: []string{"M061", "M065", "M131"}, + SuggestedEvidenceIDs: []string{"E01", "E04", "E10"}, + Priority: 90, + }, + { + ID: "HP015", NameDE: "EMV-Stoerungsgefahr", NameEN: "EMC interference risk", + RequiredComponentTags: []string{"electrical_part"}, + RequiredEnergyTags: []string{"electromagnetic"}, + GeneratedHazardCats: []string{"emc_hazard"}, + SuggestedMeasureIDs: []string{"M066", "M121"}, + SuggestedEvidenceIDs: []string{"E01", "E10"}, + Priority: 70, + }, + + // ==================================================================== + // Thermal Patterns (HP016-HP018) + // ==================================================================== + { + ID: "HP016", NameDE: "Verbrennungsgefahr durch heisse Oberflaechen", NameEN: "Burn risk from hot surfaces", + RequiredComponentTags: []string{"high_temperature"}, + RequiredEnergyTags: []string{"thermal"}, + GeneratedHazardCats: []string{"thermal_hazard"}, + SuggestedMeasureIDs: []string{"M071", "M121", "M131"}, + SuggestedEvidenceIDs: []string{"E01", "E20"}, + Priority: 85, + }, + { + ID: "HP017", NameDE: "Strahlungsgefahr (Laser/optisch)", NameEN: "Radiation risk (laser/optical)", + RequiredComponentTags: []string{"radiation_risk"}, + RequiredEnergyTags: []string{"radiation"}, + GeneratedHazardCats: []string{"thermal_hazard"}, + SuggestedMeasureIDs: []string{"M072", "M051", "M131"}, + SuggestedEvidenceIDs: []string{"E01", "E20"}, + Priority: 85, + }, + { + ID: "HP018", NameDE: "Verbrennungsgefahr durch Aktuatoren", NameEN: "Burn risk from actuators", + RequiredComponentTags: []string{"actuator_part", "high_temperature"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"thermal_hazard"}, + SuggestedMeasureIDs: []string{"M071", "M121"}, + SuggestedEvidenceIDs: []string{"E01"}, + Priority: 75, + }, + + // ==================================================================== + // Hydraulic / Pneumatic Patterns (HP019-HP022) + // ==================================================================== + { + ID: "HP019", NameDE: "Hydraulikdruck-Gefahr", NameEN: "Hydraulic pressure hazard", + RequiredComponentTags: []string{"hydraulic_part"}, + RequiredEnergyTags: []string{"hydraulic_pressure"}, + GeneratedHazardCats: []string{"pneumatic_hydraulic"}, + SuggestedMeasureIDs: []string{"M081", "M082", "M121", "M123"}, + SuggestedEvidenceIDs: []string{"E01", "E05", "E11"}, + Priority: 90, + }, + { + ID: "HP020", NameDE: "Pneumatikdruck-Gefahr", NameEN: "Pneumatic pressure hazard", + RequiredComponentTags: []string{"pneumatic_part"}, + RequiredEnergyTags: []string{"pneumatic_pressure"}, + GeneratedHazardCats: []string{"pneumatic_hydraulic"}, + SuggestedMeasureIDs: []string{"M083", "M084", "M121"}, + SuggestedEvidenceIDs: []string{"E01", "E06", "E11"}, + Priority: 85, + }, + { + ID: "HP021", NameDE: "Gefahr durch gespeicherten Hydraulikdruck", NameEN: "Stored hydraulic pressure risk", + RequiredComponentTags: []string{"hydraulic_part", "stored_energy"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"pneumatic_hydraulic"}, + SuggestedMeasureIDs: []string{"M081", "M082", "M123"}, + SuggestedEvidenceIDs: []string{"E01", "E05", "E11"}, + Priority: 90, + }, + { + ID: "HP022", NameDE: "Gefahr durch Druckluftspeicher", NameEN: "Stored pneumatic pressure risk", + RequiredComponentTags: []string{"pneumatic_part", "stored_energy"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"pneumatic_hydraulic"}, + SuggestedMeasureIDs: []string{"M083", "M084", "M123"}, + SuggestedEvidenceIDs: []string{"E01", "E06", "E11"}, + Priority: 85, + }, + + // ==================================================================== + // Noise / Vibration Patterns (HP023-HP025) + // ==================================================================== + { + ID: "HP023", NameDE: "Laermgefahr", NameEN: "Noise hazard", + RequiredComponentTags: []string{"noise_source"}, + RequiredEnergyTags: []string{"acoustic"}, + GeneratedHazardCats: []string{"noise_vibration"}, + SuggestedMeasureIDs: []string{"M091", "M131"}, + SuggestedEvidenceIDs: []string{"E01", "E12"}, + Priority: 70, + }, + { + ID: "HP024", NameDE: "Vibrationsgefahr", NameEN: "Vibration hazard", + RequiredComponentTags: []string{"vibration_source"}, + RequiredEnergyTags: []string{"vibration"}, + GeneratedHazardCats: []string{"noise_vibration"}, + SuggestedMeasureIDs: []string{"M092", "M131"}, + SuggestedEvidenceIDs: []string{"E01", "E13"}, + Priority: 65, + }, + { + ID: "HP025", NameDE: "Laerm durch rotierende Hochgeschwindigkeitsteile", NameEN: "Noise from high-speed rotating parts", + RequiredComponentTags: []string{"rotating_part", "high_speed"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"noise_vibration"}, + SuggestedMeasureIDs: []string{"M091", "M092", "M131"}, + SuggestedEvidenceIDs: []string{"E01", "E12", "E13"}, + Priority: 70, + }, + + // ==================================================================== + // Ergonomic Patterns (HP026-HP028) + // ==================================================================== + { + ID: "HP026", NameDE: "Ergonomische Belastung an Bedienstationen", NameEN: "Ergonomic risk at operator stations", + RequiredComponentTags: []string{"user_interface"}, + RequiredEnergyTags: []string{"ergonomic"}, + GeneratedHazardCats: []string{"ergonomic"}, + SuggestedMeasureIDs: []string{"M126", "M121"}, + SuggestedEvidenceIDs: []string{"E01", "E24"}, + Priority: 50, + }, + { + ID: "HP027", NameDE: "Ergonomische Belastung bei Wartung in der Hoehe", NameEN: "Ergonomic risk for work at height", + RequiredComponentTags: []string{"structural_part", "gravity_risk"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"ergonomic", "mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M121", "M131"}, + SuggestedEvidenceIDs: []string{"E01", "E20"}, + Priority: 60, + }, + { + ID: "HP028", NameDE: "Fehlbedienungsgefahr", NameEN: "Mode confusion / misoperation risk", + RequiredComponentTags: []string{"user_interface", "programmable"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"hmi_error", "mode_confusion"}, + SuggestedMeasureIDs: []string{"M126", "M127", "M121"}, + SuggestedEvidenceIDs: []string{"E01", "E14", "E24"}, + Priority: 70, + }, + + // ==================================================================== + // Software / Control Patterns (HP029-HP034) + // ==================================================================== + { + ID: "HP029", NameDE: "Software-Fehler in Steuerung", NameEN: "Software fault in controller", + RequiredComponentTags: []string{"has_software", "programmable"}, + RequiredEnergyTags: []string{}, + ExcludedComponentTags: []string{"has_ai"}, + GeneratedHazardCats: []string{"software_fault"}, + SuggestedMeasureIDs: []string{"M101", "M102", "M103"}, + SuggestedEvidenceIDs: []string{"E01", "E14"}, + Priority: 85, + }, + { + ID: "HP030", NameDE: "Sicherheitsfunktionsversagen", NameEN: "Safety function failure", + RequiredComponentTags: []string{"safety_device"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"safety_function_failure"}, + SuggestedMeasureIDs: []string{"M104", "M105", "M051"}, + SuggestedEvidenceIDs: []string{"E01", "E07", "E08", "E09"}, + Priority: 95, + }, + { + ID: "HP031", NameDE: "Konfigurationsfehler", NameEN: "Configuration error", + RequiredComponentTags: []string{"programmable"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"configuration_error"}, + SuggestedMeasureIDs: []string{"M145", "M146", "M121"}, + SuggestedEvidenceIDs: []string{"E01", "E14"}, + Priority: 70, + }, + { + ID: "HP032", NameDE: "Fehlende Protokollierung / Audit", NameEN: "Missing logging / audit", + RequiredComponentTags: []string{"has_software"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"logging_audit_failure"}, + SuggestedMeasureIDs: []string{"M142", "M149"}, + SuggestedEvidenceIDs: []string{"E01"}, + Priority: 50, + }, + { + ID: "HP033", NameDE: "Update-Fehler / Rollback-Problem", NameEN: "Update failure / rollback problem", + RequiredComponentTags: []string{"has_software", "programmable"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"update_failure"}, + SuggestedMeasureIDs: []string{"M138", "M141", "M146"}, + SuggestedEvidenceIDs: []string{"E01", "E14"}, + Priority: 65, + }, + { + ID: "HP034", NameDE: "Verriegelungs-Umgehungsgefahr", NameEN: "Interlock bypass risk", + RequiredComponentTags: []string{"interlocked"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"safety_function_failure"}, + SuggestedMeasureIDs: []string{"M051", "M104", "M107"}, + SuggestedEvidenceIDs: []string{"E01", "E08"}, + Priority: 85, + }, + + // ==================================================================== + // Cyber / Network Patterns (HP035-HP039) + // ==================================================================== + { + ID: "HP035", NameDE: "Unbefugter Netzwerkzugriff", NameEN: "Unauthorized network access", + RequiredComponentTags: []string{"networked"}, + RequiredEnergyTags: []string{"cyber"}, + GeneratedHazardCats: []string{"unauthorized_access"}, + SuggestedMeasureIDs: []string{"M111", "M112", "M113", "M140"}, + SuggestedEvidenceIDs: []string{"E01", "E16", "E17"}, + Priority: 90, + }, + { + ID: "HP036", NameDE: "Kommunikationsausfall", NameEN: "Communication failure", + RequiredComponentTags: []string{"networked", "it_component"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"communication_failure"}, + SuggestedMeasureIDs: []string{"M114", "M115"}, + SuggestedEvidenceIDs: []string{"E01", "E17"}, + Priority: 80, + }, + { + ID: "HP037", NameDE: "Firmware-Manipulation", NameEN: "Firmware manipulation", + RequiredComponentTags: []string{"has_software", "networked"}, + RequiredEnergyTags: []string{"cyber"}, + GeneratedHazardCats: []string{"firmware_corruption"}, + SuggestedMeasureIDs: []string{"M116", "M138", "M146"}, + SuggestedEvidenceIDs: []string{"E01", "E16", "E18"}, + Priority: 85, + }, + { + ID: "HP038", NameDE: "Drahtlos-Angriff (WiFi/Bluetooth)", NameEN: "Wireless attack (WiFi/Bluetooth)", + RequiredComponentTags: []string{"wireless"}, + RequiredEnergyTags: []string{"cyber"}, + GeneratedHazardCats: []string{"unauthorized_access"}, + SuggestedMeasureIDs: []string{"M111", "M113", "M140"}, + SuggestedEvidenceIDs: []string{"E01", "E16"}, + Priority: 80, + }, + { + ID: "HP039", NameDE: "Supply-Chain-Angriff auf IT-Komponenten", NameEN: "Supply chain attack on IT components", + RequiredComponentTags: []string{"it_component", "has_software"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"unauthorized_access", "firmware_corruption"}, + SuggestedMeasureIDs: []string{"M116", "M118"}, + SuggestedEvidenceIDs: []string{"E01", "E18", "E19"}, + Priority: 75, + }, + + // ==================================================================== + // AI-Specific Patterns (HP040-HP044) + // ==================================================================== + { + ID: "HP040", NameDE: "KI-Fehlklassifikation", NameEN: "AI misclassification", + RequiredComponentTags: []string{"has_ai"}, + RequiredEnergyTags: []string{"ai_model"}, + GeneratedHazardCats: []string{"false_classification"}, + SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedEvidenceIDs: []string{"E01", "E15"}, + Priority: 90, + }, + { + ID: "HP041", NameDE: "Model Drift / Concept Drift", NameEN: "Model drift / concept drift", + RequiredComponentTags: []string{"has_ai"}, + RequiredEnergyTags: []string{"ai_model"}, + GeneratedHazardCats: []string{"model_drift"}, + SuggestedMeasureIDs: []string{"M103"}, + SuggestedEvidenceIDs: []string{"E01", "E15"}, + Priority: 85, + }, + { + ID: "HP042", NameDE: "Data Poisoning / Adversarial Attack", NameEN: "Data poisoning / adversarial attack", + RequiredComponentTags: []string{"has_ai"}, + RequiredEnergyTags: []string{"cyber", "ai_model"}, + GeneratedHazardCats: []string{"data_poisoning"}, + SuggestedMeasureIDs: []string{"M101", "M116"}, + SuggestedEvidenceIDs: []string{"E01", "E15", "E16"}, + Priority: 85, + }, + { + ID: "HP043", NameDE: "Unbeabsichtigte KI-Diskriminierung", NameEN: "Unintended AI bias", + RequiredComponentTags: []string{"has_ai"}, + RequiredEnergyTags: []string{"ai_model"}, + GeneratedHazardCats: []string{"unintended_bias"}, + SuggestedMeasureIDs: []string{"M101"}, + SuggestedEvidenceIDs: []string{"E01", "E15"}, + Priority: 75, + }, + { + ID: "HP044", NameDE: "KI-Sensormanipulation", NameEN: "AI sensor spoofing", + RequiredComponentTags: []string{"has_ai", "sensor_part"}, + RequiredEnergyTags: []string{}, + GeneratedHazardCats: []string{"sensor_spoofing"}, + SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedEvidenceIDs: []string{"E01", "E15"}, + Priority: 80, + }, + } +} diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_test.go b/ai-compliance-sdk/internal/iace/hazard_patterns_test.go new file mode 100644 index 0000000..a07523f --- /dev/null +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_test.go @@ -0,0 +1,126 @@ +package iace + +import "testing" + +// TestGetBuiltinHazardPatterns_UniqueIDs verifies all pattern IDs are unique. +func TestGetBuiltinHazardPatterns_UniqueIDs(t *testing.T) { + patterns := GetBuiltinHazardPatterns() + seen := make(map[string]bool) + for _, p := range patterns { + if p.ID == "" { + t.Errorf("pattern has empty ID: %s", p.NameDE) + } + if seen[p.ID] { + t.Errorf("duplicate pattern ID: %s", p.ID) + } + seen[p.ID] = true + } +} + +// TestGetBuiltinHazardPatterns_Count verifies the expected number of patterns. +func TestGetBuiltinHazardPatterns_Count(t *testing.T) { + patterns := GetBuiltinHazardPatterns() + if len(patterns) < 40 { + t.Fatalf("expected at least 40 patterns, got %d", len(patterns)) + } +} + +// TestGetBuiltinHazardPatterns_AllHaveRequiredTags verifies every pattern has at +// least one required component tag or energy tag. +func TestGetBuiltinHazardPatterns_AllHaveRequiredTags(t *testing.T) { + for _, p := range GetBuiltinHazardPatterns() { + if len(p.RequiredComponentTags) == 0 && len(p.RequiredEnergyTags) == 0 { + t.Errorf("pattern %s (%s) has no required component or energy tags", p.ID, p.NameDE) + } + } +} + +// TestGetBuiltinHazardPatterns_AllHaveGeneratedHazardCats verifies every pattern +// generates at least one hazard category. +func TestGetBuiltinHazardPatterns_AllHaveGeneratedHazardCats(t *testing.T) { + for _, p := range GetBuiltinHazardPatterns() { + if len(p.GeneratedHazardCats) == 0 { + t.Errorf("pattern %s (%s) has no generated hazard categories", p.ID, p.NameDE) + } + } +} + +// TestGetBuiltinHazardPatterns_AllHaveSuggestedMeasures verifies every pattern +// suggests at least one measure. +func TestGetBuiltinHazardPatterns_AllHaveSuggestedMeasures(t *testing.T) { + for _, p := range GetBuiltinHazardPatterns() { + if len(p.SuggestedMeasureIDs) == 0 { + t.Errorf("pattern %s (%s) has no suggested measure IDs", p.ID, p.NameDE) + } + } +} + +// TestGetBuiltinHazardPatterns_AllHaveSuggestedEvidence verifies every pattern +// suggests at least one evidence type. +func TestGetBuiltinHazardPatterns_AllHaveSuggestedEvidence(t *testing.T) { + for _, p := range GetBuiltinHazardPatterns() { + if len(p.SuggestedEvidenceIDs) == 0 { + t.Errorf("pattern %s (%s) has no suggested evidence IDs", p.ID, p.NameDE) + } + } +} + +// TestGetBuiltinHazardPatterns_ValidPriorities verifies all priorities are 1-100. +func TestGetBuiltinHazardPatterns_ValidPriorities(t *testing.T) { + for _, p := range GetBuiltinHazardPatterns() { + if p.Priority < 1 || p.Priority > 100 { + t.Errorf("pattern %s has invalid priority %d (want 1-100)", p.ID, p.Priority) + } + } +} + +// TestGetBuiltinHazardPatterns_ReferencedMeasuresExist verifies all referenced +// measure IDs exist in the protective measures library. +func TestGetBuiltinHazardPatterns_ReferencedMeasuresExist(t *testing.T) { + measureIDs := make(map[string]bool) + for _, m := range GetProtectiveMeasureLibrary() { + measureIDs[m.ID] = true + } + + for _, p := range GetBuiltinHazardPatterns() { + for _, mid := range p.SuggestedMeasureIDs { + if !measureIDs[mid] { + t.Errorf("pattern %s references non-existent measure ID %s", p.ID, mid) + } + } + } +} + +// TestGetBuiltinHazardPatterns_ReferencedEvidenceExist verifies all referenced +// evidence IDs exist in the evidence type library. +func TestGetBuiltinHazardPatterns_ReferencedEvidenceExist(t *testing.T) { + evidenceIDs := make(map[string]bool) + for _, e := range GetEvidenceTypeLibrary() { + evidenceIDs[e.ID] = true + } + + for _, p := range GetBuiltinHazardPatterns() { + for _, eid := range p.SuggestedEvidenceIDs { + if !evidenceIDs[eid] { + t.Errorf("pattern %s references non-existent evidence ID %s", p.ID, eid) + } + } + } +} + +// TestGetBuiltinHazardPatterns_HazardCategoriesValid verifies all generated +// hazard categories match known categories in the hazard library. +func TestGetBuiltinHazardPatterns_HazardCategoriesValid(t *testing.T) { + validCategories := make(map[string]bool) + for _, h := range GetBuiltinHazardLibrary() { + validCategories[h.Category] = true + } + + for _, p := range GetBuiltinHazardPatterns() { + for _, cat := range p.GeneratedHazardCats { + if !validCategories[cat] { + t.Errorf("pattern %s references unknown hazard category %q", p.ID, cat) + } + } + } +} diff --git a/ai-compliance-sdk/internal/iace/models.go b/ai-compliance-sdk/internal/iace/models.go index 41bad55..d05e128 100644 --- a/ai-compliance-sdk/internal/iace/models.go +++ b/ai-compliance-sdk/internal/iace/models.go @@ -277,6 +277,7 @@ type HazardLibraryEntry struct { 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"` @@ -580,11 +581,12 @@ type RoleInfo struct { // 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"` - Sort int `json:"sort_order"` + 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 @@ -596,6 +598,7 @@ type ProtectiveMeasureEntry struct { 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 diff --git a/ai-compliance-sdk/internal/iace/pattern_engine.go b/ai-compliance-sdk/internal/iace/pattern_engine.go new file mode 100644 index 0000000..11e231b --- /dev/null +++ b/ai-compliance-sdk/internal/iace/pattern_engine.go @@ -0,0 +1,240 @@ +package iace + +import "sort" + +// MatchInput defines the inputs for the pattern-matching engine. +type MatchInput struct { + ComponentLibraryIDs []string `json:"component_library_ids"` + EnergySourceIDs []string `json:"energy_source_ids"` + LifecyclePhases []string `json:"lifecycle_phases"` + CustomTags []string `json:"custom_tags"` +} + +// MatchOutput contains the results of pattern matching. +type MatchOutput struct { + MatchedPatterns []PatternMatch `json:"matched_patterns"` + SuggestedHazards []HazardSuggestion `json:"suggested_hazards"` + SuggestedMeasures []MeasureSuggestion `json:"suggested_measures"` + SuggestedEvidence []EvidenceSuggestion `json:"suggested_evidence"` + ResolvedTags []string `json:"resolved_tags"` +} + +// PatternMatch records which pattern fired and why. +type PatternMatch struct { + PatternID string `json:"pattern_id"` + PatternName string `json:"pattern_name"` + Priority int `json:"priority"` + MatchedTags []string `json:"matched_tags"` +} + +// HazardSuggestion is a suggested hazard from pattern matching. +type HazardSuggestion struct { + Category string `json:"category"` + SourcePatterns []string `json:"source_patterns"` + Confidence float64 `json:"confidence"` +} + +// MeasureSuggestion is a suggested protective measure from pattern matching. +type MeasureSuggestion struct { + MeasureID string `json:"measure_id"` + SourcePatterns []string `json:"source_patterns"` +} + +// EvidenceSuggestion is a suggested evidence type from pattern matching. +type EvidenceSuggestion struct { + EvidenceID string `json:"evidence_id"` + SourcePatterns []string `json:"source_patterns"` +} + +// PatternEngine evaluates hazard patterns against resolved tags. +type PatternEngine struct { + resolver *TagResolver + patterns []HazardPattern +} + +// NewPatternEngine creates a PatternEngine with built-in patterns and resolver. +func NewPatternEngine() *PatternEngine { + return &PatternEngine{ + resolver: NewTagResolver(), + patterns: GetBuiltinHazardPatterns(), + } +} + +// Match executes the pattern-matching algorithm: +// 1. Resolve component + energy IDs → tags +// 2. Merge with custom tags +// 3. Sort patterns by priority (descending) +// 4. For each pattern: check required_tags (AND) and excluded_tags (NOT) +// 5. Collect hazards, measures, evidence from fired patterns (deduplicated) +// 6. Calculate confidence scores +func (e *PatternEngine) Match(input MatchInput) *MatchOutput { + // Step 1+2: resolve all tags + allTags := e.resolver.ResolveTags(input.ComponentLibraryIDs, input.EnergySourceIDs, input.CustomTags) + + if len(allTags) == 0 { + return &MatchOutput{ResolvedTags: []string{}} + } + + tagSet := toSet(allTags) + + // Step 3: sort patterns by priority descending + patterns := make([]HazardPattern, len(e.patterns)) + copy(patterns, e.patterns) + sort.Slice(patterns, func(i, j int) bool { + return patterns[i].Priority > patterns[j].Priority + }) + + // Step 4+5: evaluate each pattern + var matchedPatterns []PatternMatch + hazardCatSources := make(map[string][]string) // category → pattern IDs + measureSources := make(map[string][]string) // measure ID → pattern IDs + evidenceSources := make(map[string][]string) // evidence ID → pattern IDs + + for _, p := range patterns { + if !patternMatches(p, tagSet, input.LifecyclePhases) { + continue + } + + // Collect the tags that contributed to this match + var matchedTags []string + for _, t := range p.RequiredComponentTags { + if tagSet[t] { + matchedTags = append(matchedTags, t) + } + } + for _, t := range p.RequiredEnergyTags { + if tagSet[t] { + matchedTags = append(matchedTags, t) + } + } + + matchedPatterns = append(matchedPatterns, PatternMatch{ + PatternID: p.ID, + PatternName: p.NameDE, + Priority: p.Priority, + MatchedTags: matchedTags, + }) + + for _, cat := range p.GeneratedHazardCats { + hazardCatSources[cat] = appendUnique(hazardCatSources[cat], p.ID) + } + for _, mid := range p.SuggestedMeasureIDs { + measureSources[mid] = appendUnique(measureSources[mid], p.ID) + } + for _, eid := range p.SuggestedEvidenceIDs { + evidenceSources[eid] = appendUnique(evidenceSources[eid], p.ID) + } + } + + // Step 6: build output with confidence scores + totalPatterns := len(patterns) + firedCount := len(matchedPatterns) + + var suggestedHazards []HazardSuggestion + for cat, sources := range hazardCatSources { + confidence := float64(len(sources)) / float64(maxInt(firedCount, 1)) + if confidence > 1.0 { + confidence = 1.0 + } + suggestedHazards = append(suggestedHazards, HazardSuggestion{ + Category: cat, + SourcePatterns: sources, + Confidence: confidence, + }) + } + // Sort by confidence descending + sort.Slice(suggestedHazards, func(i, j int) bool { + return suggestedHazards[i].Confidence > suggestedHazards[j].Confidence + }) + + var suggestedMeasures []MeasureSuggestion + for mid, sources := range measureSources { + suggestedMeasures = append(suggestedMeasures, MeasureSuggestion{ + MeasureID: mid, + SourcePatterns: sources, + }) + } + sort.Slice(suggestedMeasures, func(i, j int) bool { + return suggestedMeasures[i].MeasureID < suggestedMeasures[j].MeasureID + }) + + var suggestedEvidence []EvidenceSuggestion + for eid, sources := range evidenceSources { + suggestedEvidence = append(suggestedEvidence, EvidenceSuggestion{ + EvidenceID: eid, + SourcePatterns: sources, + }) + } + sort.Slice(suggestedEvidence, func(i, j int) bool { + return suggestedEvidence[i].EvidenceID < suggestedEvidence[j].EvidenceID + }) + + _ = totalPatterns // used conceptually for confidence normalization + + return &MatchOutput{ + MatchedPatterns: matchedPatterns, + SuggestedHazards: suggestedHazards, + SuggestedMeasures: suggestedMeasures, + SuggestedEvidence: suggestedEvidence, + ResolvedTags: allTags, + } +} + +// patternMatches checks if a pattern fires given the resolved tag set and lifecycle phases. +func patternMatches(p HazardPattern, tagSet map[string]bool, lifecyclePhases []string) bool { + // All required component tags must be present (AND) + for _, t := range p.RequiredComponentTags { + if !tagSet[t] { + return false + } + } + + // All required energy tags must be present (AND) + for _, t := range p.RequiredEnergyTags { + if !tagSet[t] { + return false + } + } + + // None of the excluded tags may be present (NOT) + for _, t := range p.ExcludedComponentTags { + if tagSet[t] { + return false + } + } + + // If pattern requires specific lifecycle phases, at least one must match + if len(p.RequiredLifecycles) > 0 && len(lifecyclePhases) > 0 { + found := false + phaseSet := toSet(lifecyclePhases) + for _, lp := range p.RequiredLifecycles { + if phaseSet[lp] { + found = true + break + } + } + if !found { + return false + } + } + + return true +} + +// appendUnique appends val to slice if not already present. +func appendUnique(slice []string, val string) []string { + for _, s := range slice { + if s == val { + return slice + } + } + return append(slice, val) +} + +// maxInt returns the larger of a and b. +func maxInt(a, b int) int { + if a > b { + return a + } + return b +} diff --git a/ai-compliance-sdk/internal/iace/pattern_engine_test.go b/ai-compliance-sdk/internal/iace/pattern_engine_test.go new file mode 100644 index 0000000..d18a514 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/pattern_engine_test.go @@ -0,0 +1,217 @@ +package iace + +import "testing" + +func TestPatternEngine_RobotArm_MechanicalHazards(t *testing.T) { + engine := NewPatternEngine() + result := engine.Match(MatchInput{ + ComponentLibraryIDs: []string{"C001"}, // Roboterarm: moving_part, rotating_part, high_force + EnergySourceIDs: []string{"EN01", "EN02"}, // kinetic translational + rotational + }) + + if len(result.MatchedPatterns) == 0 { + t.Fatal("expected matched patterns for robot arm + kinetic energy") + } + + // Should match mechanical hazard patterns (HP001, HP002, HP006) + hasMechHazard := false + for _, h := range result.SuggestedHazards { + if h.Category == "mechanical_hazard" { + hasMechHazard = true + break + } + } + if !hasMechHazard { + t.Error("expected mechanical_hazard in suggested hazards for robot arm") + } +} + +func TestPatternEngine_Schaltschrank_ElectricalHazards(t *testing.T) { + engine := NewPatternEngine() + result := engine.Match(MatchInput{ + ComponentLibraryIDs: []string{"C061"}, // Schaltschrank: high_voltage, electrical_part + EnergySourceIDs: []string{"EN04"}, // Elektrische Energie + }) + + if len(result.MatchedPatterns) == 0 { + t.Fatal("expected matched patterns for control cabinet + electrical energy") + } + + hasElecHazard := false + for _, h := range result.SuggestedHazards { + if h.Category == "electrical_hazard" { + hasElecHazard = true + break + } + } + if !hasElecHazard { + t.Error("expected electrical_hazard in suggested hazards for Schaltschrank") + } +} + +func TestPatternEngine_SPS_Switch_SoftwareCyberHazards(t *testing.T) { + engine := NewPatternEngine() + result := engine.Match(MatchInput{ + ComponentLibraryIDs: []string{"C071", "C111"}, // SPS + Switch: has_software, programmable, networked, it_component + EnergySourceIDs: []string{"EN18"}, // Cyber/Data energy + }) + + if len(result.MatchedPatterns) == 0 { + t.Fatal("expected matched patterns for SPS + Switch + cyber energy") + } + + categories := make(map[string]bool) + for _, h := range result.SuggestedHazards { + categories[h.Category] = true + } + + if !categories["software_fault"] { + t.Error("expected software_fault hazard for SPS") + } + if !categories["unauthorized_access"] { + t.Error("expected unauthorized_access hazard for networked components + cyber energy") + } +} + +func TestPatternEngine_AIModule_AISpecificHazards(t *testing.T) { + engine := NewPatternEngine() + result := engine.Match(MatchInput{ + ComponentLibraryIDs: []string{"C119"}, // KI-Inferenzmodul: has_ai, has_software, networked + EnergySourceIDs: []string{"EN19", "EN18"}, // AI model + cyber energy + }) + + if len(result.MatchedPatterns) == 0 { + t.Fatal("expected matched patterns for AI inference module") + } + + categories := make(map[string]bool) + for _, h := range result.SuggestedHazards { + categories[h.Category] = true + } + + if !categories["false_classification"] { + t.Error("expected false_classification hazard for AI module") + } + if !categories["model_drift"] { + t.Error("expected model_drift hazard for AI module") + } +} + +func TestPatternEngine_EmptyInput_EmptyResults(t *testing.T) { + engine := NewPatternEngine() + result := engine.Match(MatchInput{}) + + if len(result.MatchedPatterns) != 0 { + t.Errorf("expected no matched patterns for empty input, got %d", len(result.MatchedPatterns)) + } + if len(result.SuggestedHazards) != 0 { + t.Errorf("expected no suggested hazards for empty input, got %d", len(result.SuggestedHazards)) + } +} + +func TestPatternEngine_ExclusionTags(t *testing.T) { + engine := NewPatternEngine() + + // HP029 requires has_software+programmable, excludes has_ai + // C071 (SPS) has has_software+programmable but NOT has_ai → should match HP029 + result1 := engine.Match(MatchInput{ + ComponentLibraryIDs: []string{"C071"}, // SPS + }) + hasHP029 := false + for _, p := range result1.MatchedPatterns { + if p.PatternID == "HP029" { + hasHP029 = true + break + } + } + if !hasHP029 { + t.Error("HP029 should match for SPS (has_software+programmable, no has_ai)") + } + + // C119 (KI-Inferenzmodul) has has_ai → HP029 should be excluded + result2 := engine.Match(MatchInput{ + ComponentLibraryIDs: []string{"C119"}, // KI-Inferenzmodul: has_ai + }) + hasHP029_2 := false + for _, p := range result2.MatchedPatterns { + if p.PatternID == "HP029" { + hasHP029_2 = true + break + } + } + if hasHP029_2 { + t.Error("HP029 should NOT match for AI module (excluded by has_ai tag)") + } +} + +func TestPatternEngine_HydraulicPatterns(t *testing.T) { + engine := NewPatternEngine() + result := engine.Match(MatchInput{ + ComponentLibraryIDs: []string{"C042"}, // Hydraulikzylinder + EnergySourceIDs: []string{"EN05"}, // Hydraulische Energie + }) + + hasHydraulicHazard := false + for _, h := range result.SuggestedHazards { + if h.Category == "pneumatic_hydraulic" { + hasHydraulicHazard = true + break + } + } + if !hasHydraulicHazard { + t.Error("expected pneumatic_hydraulic hazard for hydraulic cylinder + hydraulic energy") + } +} + +func TestPatternEngine_MeasuresAndEvidence(t *testing.T) { + engine := NewPatternEngine() + result := engine.Match(MatchInput{ + ComponentLibraryIDs: []string{"C001"}, // Roboterarm + EnergySourceIDs: []string{"EN01"}, // Kinetische Energie + }) + + if len(result.SuggestedMeasures) == 0 { + t.Error("expected suggested measures for robot arm") + } + if len(result.SuggestedEvidence) == 0 { + t.Error("expected suggested evidence for robot arm") + } +} + +func TestPatternEngine_ResolvedTags(t *testing.T) { + engine := NewPatternEngine() + result := engine.Match(MatchInput{ + ComponentLibraryIDs: []string{"C001"}, + EnergySourceIDs: []string{"EN01"}, + CustomTags: []string{"my_custom_tag"}, + }) + + tagSet := toSet(result.ResolvedTags) + if !tagSet["moving_part"] { + t.Error("expected 'moving_part' in resolved tags") + } + if !tagSet["kinetic"] { + t.Error("expected 'kinetic' in resolved tags") + } + if !tagSet["my_custom_tag"] { + t.Error("expected 'my_custom_tag' in resolved tags") + } +} + +func TestPatternEngine_SafetyDevice_HighPriority(t *testing.T) { + engine := NewPatternEngine() + result := engine.Match(MatchInput{ + ComponentLibraryIDs: []string{"C101"}, // Not-Halt-Taster: safety_device, emergency_stop + }) + + hasSafetyFail := false + for _, h := range result.SuggestedHazards { + if h.Category == "safety_function_failure" { + hasSafetyFail = true + break + } + } + if !hasSafetyFail { + t.Error("expected safety_function_failure for Not-Halt-Taster") + } +} diff --git a/ai-compliance-sdk/internal/iace/store.go b/ai-compliance-sdk/internal/iace/store.go index d6a6db6..f754eb1 100644 --- a/ai-compliance-sdk/internal/iace/store.go +++ b/ai-compliance-sdk/internal/iace/store.go @@ -980,6 +980,11 @@ func (s *Store) ListMitigations(ctx context.Context, hazardID uuid.UUID) ([]Miti return mitigations, nil } +// GetMitigation fetches a single mitigation by ID. +func (s *Store) GetMitigation(ctx context.Context, id uuid.UUID) (*Mitigation, error) { + return s.getMitigation(ctx, id) +} + // getMitigation is a helper to fetch a single mitigation by ID func (s *Store) getMitigation(ctx context.Context, id uuid.UUID) (*Mitigation, error) { var m Mitigation diff --git a/ai-compliance-sdk/internal/iace/tag_resolver.go b/ai-compliance-sdk/internal/iace/tag_resolver.go new file mode 100644 index 0000000..b993ca5 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/tag_resolver.go @@ -0,0 +1,172 @@ +package iace + +// TagResolver resolves component/energy IDs to tags and finds matching +// hazards, measures, and evidence by tag intersection. +type TagResolver struct { + componentIndex map[string]ComponentLibraryEntry + energyIndex map[string]EnergySourceEntry +} + +// NewTagResolver creates a TagResolver pre-indexed from the built-in libraries. +func NewTagResolver() *TagResolver { + tr := &TagResolver{ + componentIndex: make(map[string]ComponentLibraryEntry), + energyIndex: make(map[string]EnergySourceEntry), + } + for _, c := range GetComponentLibrary() { + tr.componentIndex[c.ID] = c + } + for _, e := range GetEnergySources() { + tr.energyIndex[e.ID] = e + } + return tr +} + +// ResolveComponentTags resolves component library IDs to their combined tag set. +func (tr *TagResolver) ResolveComponentTags(componentIDs []string) []string { + seen := make(map[string]bool) + var tags []string + for _, id := range componentIDs { + comp, ok := tr.componentIndex[id] + if !ok { + continue + } + for _, tag := range comp.Tags { + if !seen[tag] { + seen[tag] = true + tags = append(tags, tag) + } + } + } + return tags +} + +// ResolveEnergyTags resolves energy source IDs to their combined tag set. +func (tr *TagResolver) ResolveEnergyTags(energyIDs []string) []string { + seen := make(map[string]bool) + var tags []string + for _, id := range energyIDs { + src, ok := tr.energyIndex[id] + if !ok { + continue + } + for _, tag := range src.Tags { + if !seen[tag] { + seen[tag] = true + tags = append(tags, tag) + } + } + } + return tags +} + +// ResolveTags combines component, energy, and custom tags into a unified set. +func (tr *TagResolver) ResolveTags(componentIDs, energyIDs, customTags []string) []string { + seen := make(map[string]bool) + var all []string + + add := func(tags []string) { + for _, t := range tags { + if !seen[t] { + seen[t] = true + all = append(all, t) + } + } + } + + add(tr.ResolveComponentTags(componentIDs)) + add(tr.ResolveEnergyTags(energyIDs)) + add(customTags) + return all +} + +// FindHazardsByTags returns hazard library entries that have any matching tag. +func (tr *TagResolver) FindHazardsByTags(tags []string) []HazardLibraryEntry { + tagSet := toSet(tags) + var matched []HazardLibraryEntry + for _, h := range GetBuiltinHazardLibrary() { + if h.Tags == nil { + continue + } + for _, t := range h.Tags { + if tagSet[t] { + matched = append(matched, h) + break + } + } + } + return matched +} + +// FindMeasuresByTags returns protective measure entries that have any matching tag. +func (tr *TagResolver) FindMeasuresByTags(tags []string) []ProtectiveMeasureEntry { + tagSet := toSet(tags) + var matched []ProtectiveMeasureEntry + for _, m := range GetProtectiveMeasureLibrary() { + if m.Tags == nil { + continue + } + for _, t := range m.Tags { + if tagSet[t] { + matched = append(matched, m) + break + } + } + } + return matched +} + +// FindEvidenceByTags returns evidence type entries that have any matching tag. +func (tr *TagResolver) FindEvidenceByTags(tags []string) []EvidenceTypeInfo { + tagSet := toSet(tags) + var matched []EvidenceTypeInfo + for _, e := range GetEvidenceTypeLibrary() { + for _, t := range e.Tags { + if tagSet[t] { + matched = append(matched, e) + break + } + } + } + return matched +} + +// toSet converts a string slice to a map for O(1) lookup. +func toSet(s []string) map[string]bool { + m := make(map[string]bool, len(s)) + for _, v := range s { + m[v] = true + } + return m +} + +// GetEvidenceTypeLibrary returns built-in evidence types with tags for tag resolution. +func GetEvidenceTypeLibrary() []EvidenceTypeInfo { + return []EvidenceTypeInfo{ + {ID: "E01", Category: "design", LabelDE: "Risikobeurteilung", LabelEN: "Risk Assessment Document", Tags: []string{"design_evidence"}, Sort: 1}, + {ID: "E02", Category: "design", LabelDE: "FMEA-Dokument", LabelEN: "FMEA Document", Tags: []string{"design_evidence", "analysis_evidence"}, Sort: 2}, + {ID: "E03", Category: "design", LabelDE: "Sicherheitskonzept", LabelEN: "Safety Concept", Tags: []string{"design_evidence"}, Sort: 3}, + {ID: "E04", Category: "design", LabelDE: "Schaltplan", LabelEN: "Circuit Diagram", Tags: []string{"design_evidence"}, Sort: 4}, + {ID: "E05", Category: "design", LabelDE: "Hydraulikschaltplan", LabelEN: "Hydraulic Diagram", Tags: []string{"design_evidence"}, Sort: 5}, + {ID: "E06", Category: "design", LabelDE: "Pneumatikschaltplan", LabelEN: "Pneumatic Diagram", Tags: []string{"design_evidence"}, Sort: 6}, + {ID: "E07", Category: "design", LabelDE: "SIL/PL-Berechnung", LabelEN: "SIL/PL Calculation", Tags: []string{"design_evidence", "analysis_evidence"}, Sort: 7}, + {ID: "E08", Category: "test", LabelDE: "Funktionspruefung Schutzeinrichtung", LabelEN: "Guard Function Test", Tags: []string{"test_evidence", "guard_measure"}, Sort: 8}, + {ID: "E09", Category: "test", LabelDE: "Not-Halt-Test", LabelEN: "Emergency Stop Test", Tags: []string{"test_evidence"}, Sort: 9}, + {ID: "E10", Category: "test", LabelDE: "Elektrische Sicherheitspruefung", LabelEN: "Electrical Safety Test", Tags: []string{"test_evidence"}, Sort: 10}, + {ID: "E11", Category: "test", LabelDE: "Druckpruefung", LabelEN: "Pressure Test", Tags: []string{"test_evidence"}, Sort: 11}, + {ID: "E12", Category: "test", LabelDE: "Laermmessung", LabelEN: "Noise Measurement", Tags: []string{"test_evidence"}, Sort: 12}, + {ID: "E13", Category: "test", LabelDE: "Vibrationsmessung", LabelEN: "Vibration Measurement", Tags: []string{"test_evidence"}, Sort: 13}, + {ID: "E14", Category: "test", LabelDE: "Software-Testprotokoll", LabelEN: "Software Test Protocol", Tags: []string{"test_evidence", "software_safety_measure"}, Sort: 14}, + {ID: "E15", Category: "test", LabelDE: "KI-Validierungsbericht", LabelEN: "AI Validation Report", Tags: []string{"test_evidence", "ai_risk"}, Sort: 15}, + {ID: "E16", Category: "cyber", LabelDE: "Penetrationstest-Bericht", LabelEN: "Penetration Test Report", Tags: []string{"cyber_evidence", "test_evidence"}, Sort: 16}, + {ID: "E17", Category: "cyber", LabelDE: "Netzwerk-Segmentierungsnachweis", LabelEN: "Network Segmentation Evidence", Tags: []string{"cyber_evidence"}, Sort: 17}, + {ID: "E18", Category: "cyber", LabelDE: "SBOM (Software Bill of Materials)", LabelEN: "SBOM", Tags: []string{"cyber_evidence"}, Sort: 18}, + {ID: "E19", Category: "cyber", LabelDE: "Patch-Management-Nachweis", LabelEN: "Patch Management Evidence", Tags: []string{"cyber_evidence"}, Sort: 19}, + {ID: "E20", Category: "inspection", LabelDE: "Abnahmeprotokoll", LabelEN: "Acceptance Protocol", Tags: []string{"inspection_evidence"}, Sort: 20}, + {ID: "E21", Category: "inspection", LabelDE: "Wartungscheckliste (ausgefuellt)", LabelEN: "Maintenance Checklist (completed)", Tags: []string{"inspection_evidence", "operational_evidence"}, Sort: 21}, + {ID: "E22", Category: "inspection", LabelDE: "CE-Konformitaetserklaerung", LabelEN: "CE Declaration of Conformity", Tags: []string{"certification_evidence"}, Sort: 22}, + {ID: "E23", Category: "inspection", LabelDE: "Typenpruefzertifikat", LabelEN: "Type Examination Certificate", Tags: []string{"certification_evidence"}, Sort: 23}, + {ID: "E24", Category: "training", LabelDE: "Schulungsnachweis Bediener", LabelEN: "Operator Training Record", Tags: []string{"training_evidence"}, Sort: 24}, + {ID: "E25", Category: "training", LabelDE: "Sicherheitsunterweisung (Protokoll)", LabelEN: "Safety Briefing Record", Tags: []string{"training_evidence"}, Sort: 25}, + } +} diff --git a/ai-compliance-sdk/internal/iace/tag_resolver_test.go b/ai-compliance-sdk/internal/iace/tag_resolver_test.go new file mode 100644 index 0000000..cf1fad1 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/tag_resolver_test.go @@ -0,0 +1,92 @@ +package iace + +import "testing" + +func TestTagResolver_ResolveComponentTags_Roboterarm(t *testing.T) { + tr := NewTagResolver() + tags := tr.ResolveComponentTags([]string{"C001"}) // Roboterarm + if len(tags) == 0 { + t.Fatal("expected tags for C001 (Roboterarm), got none") + } + tagSet := toSet(tags) + if !tagSet["moving_part"] { + t.Error("expected 'moving_part' tag for Roboterarm") + } + if !tagSet["rotating_part"] { + t.Error("expected 'rotating_part' tag for Roboterarm") + } +} + +func TestTagResolver_ResolveComponentTags_Schaltschrank(t *testing.T) { + tr := NewTagResolver() + tags := tr.ResolveComponentTags([]string{"C061"}) // Schaltschrank + tagSet := toSet(tags) + if !tagSet["high_voltage"] { + t.Error("expected 'high_voltage' tag for Schaltschrank") + } + if !tagSet["electrical_part"] { + t.Error("expected 'electrical_part' tag for Schaltschrank") + } +} + +func TestTagResolver_ResolveEnergyTags(t *testing.T) { + tr := NewTagResolver() + tags := tr.ResolveEnergyTags([]string{"EN01", "EN04"}) + tagSet := toSet(tags) + if !tagSet["kinetic"] { + t.Error("expected 'kinetic' tag for EN01") + } + if !tagSet["electrical_energy"] { + t.Error("expected 'electrical_energy' tag for EN04") + } +} + +func TestTagResolver_ResolveTags_Merged(t *testing.T) { + tr := NewTagResolver() + tags := tr.ResolveTags( + []string{"C001"}, // Roboterarm → moving_part, rotating_part, high_force + []string{"EN01"}, // Kinetische Energie → kinetic, translational + []string{"custom_tag"}, + ) + tagSet := toSet(tags) + if !tagSet["moving_part"] { + t.Error("missing component tag 'moving_part'") + } + if !tagSet["kinetic"] { + t.Error("missing energy tag 'kinetic'") + } + if !tagSet["custom_tag"] { + t.Error("missing custom tag") + } +} + +func TestTagResolver_ResolveTags_NoDuplicates(t *testing.T) { + tr := NewTagResolver() + // C001 and C003 both have "moving_part" + tags := tr.ResolveTags([]string{"C001", "C003"}, nil, nil) + count := 0 + for _, t := range tags { + if t == "moving_part" { + count++ + } + } + if count != 1 { + t.Errorf("expected 'moving_part' exactly once, got %d", count) + } +} + +func TestTagResolver_ResolveComponentTags_UnknownID(t *testing.T) { + tr := NewTagResolver() + tags := tr.ResolveComponentTags([]string{"UNKNOWN_ID"}) + if len(tags) != 0 { + t.Errorf("expected no tags for unknown ID, got %v", tags) + } +} + +func TestTagResolver_ResolveComponentTags_Empty(t *testing.T) { + tr := NewTagResolver() + tags := tr.ResolveComponentTags(nil) + if len(tags) != 0 { + t.Errorf("expected no tags for nil input, got %v", tags) + } +} diff --git a/ai-compliance-sdk/internal/iace/tag_taxonomy.go b/ai-compliance-sdk/internal/iace/tag_taxonomy.go new file mode 100644 index 0000000..10612d8 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/tag_taxonomy.go @@ -0,0 +1,118 @@ +package iace + +// TagEntry represents a tag in the taxonomy with its domain and description. +type TagEntry struct { + ID string `json:"id"` + Domain string `json:"domain"` + DescriptionDE string `json:"description_de"` + DescriptionEN string `json:"description_en"` +} + +// GetTagTaxonomy returns the complete tag taxonomy (~85 tags in 5 domains). +func GetTagTaxonomy() []TagEntry { + return []TagEntry{ + // ── Domain: component (~30 tags) ──────────────────────────────────── + {ID: "moving_part", Domain: "component", DescriptionDE: "Bewegtes Maschinenteil", DescriptionEN: "Moving machine part"}, + {ID: "rotating_part", Domain: "component", DescriptionDE: "Rotierendes Bauteil", DescriptionEN: "Rotating component"}, + {ID: "cutting_part", Domain: "component", DescriptionDE: "Schneidendes Werkzeug", DescriptionEN: "Cutting tool"}, + {ID: "clamping_part", Domain: "component", DescriptionDE: "Spannendes/Greifendes Bauteil", DescriptionEN: "Clamping/gripping part"}, + {ID: "structural_part", Domain: "component", DescriptionDE: "Tragendes/Strukturelles Bauteil", DescriptionEN: "Structural/supporting part"}, + {ID: "hydraulic_part", Domain: "component", DescriptionDE: "Hydraulikkomponente", DescriptionEN: "Hydraulic component"}, + {ID: "pneumatic_part", Domain: "component", DescriptionDE: "Pneumatikkomponente", DescriptionEN: "Pneumatic component"}, + {ID: "electrical_part", Domain: "component", DescriptionDE: "Elektrische Komponente", DescriptionEN: "Electrical component"}, + {ID: "sensor_part", Domain: "component", DescriptionDE: "Sensorisches Bauteil", DescriptionEN: "Sensor component"}, + {ID: "actuator_part", Domain: "component", DescriptionDE: "Aktor/Stellglied", DescriptionEN: "Actuator part"}, + {ID: "safety_device", Domain: "component", DescriptionDE: "Sicherheitseinrichtung", DescriptionEN: "Safety device"}, + {ID: "security_device", Domain: "component", DescriptionDE: "IT-Sicherheitsgeraet", DescriptionEN: "IT security device"}, + {ID: "guard", Domain: "component", DescriptionDE: "Schutzeinrichtung (trennend)", DescriptionEN: "Guard (separating)"}, + {ID: "interlocked", Domain: "component", DescriptionDE: "Verriegelt/Ueberwacht", DescriptionEN: "Interlocked/monitored"}, + {ID: "emergency_stop", Domain: "component", DescriptionDE: "Not-Halt-Funktion", DescriptionEN: "Emergency stop function"}, + {ID: "high_voltage", Domain: "component", DescriptionDE: "Hochspannung (>50V AC / >120V DC)", DescriptionEN: "High voltage (>50V AC / >120V DC)"}, + {ID: "high_force", Domain: "component", DescriptionDE: "Hohe Kraft/Drehmoment", DescriptionEN: "High force/torque"}, + {ID: "high_speed", Domain: "component", DescriptionDE: "Hohe Geschwindigkeit/Drehzahl", DescriptionEN: "High speed/rpm"}, + {ID: "high_pressure", Domain: "component", DescriptionDE: "Hoher Druck", DescriptionEN: "High pressure"}, + {ID: "high_temperature", Domain: "component", DescriptionDE: "Hohe Temperatur", DescriptionEN: "High temperature"}, + {ID: "has_software", Domain: "component", DescriptionDE: "Enthaelt Software", DescriptionEN: "Contains software"}, + {ID: "has_ai", Domain: "component", DescriptionDE: "Enthaelt KI-Modell", DescriptionEN: "Contains AI model"}, + {ID: "programmable", Domain: "component", DescriptionDE: "Programmierbar", DescriptionEN: "Programmable"}, + {ID: "networked", Domain: "component", DescriptionDE: "Vernetzt/Netzwerkfaehig", DescriptionEN: "Networked"}, + {ID: "wireless", Domain: "component", DescriptionDE: "Drahtlose Kommunikation", DescriptionEN: "Wireless communication"}, + {ID: "it_component", Domain: "component", DescriptionDE: "IT-Infrastruktur-Komponente", DescriptionEN: "IT infrastructure component"}, + {ID: "user_interface", Domain: "component", DescriptionDE: "Benutzerschnittstelle", DescriptionEN: "User interface"}, + {ID: "noise_source", Domain: "component", DescriptionDE: "Laermquelle", DescriptionEN: "Noise source"}, + {ID: "vibration_source", Domain: "component", DescriptionDE: "Vibrationsquelle", DescriptionEN: "Vibration source"}, + {ID: "radiation_risk", Domain: "component", DescriptionDE: "Strahlungsquelle", DescriptionEN: "Radiation source"}, + + // ── Domain: energy (~15 tags) ─────────────────────────────────────── + {ID: "kinetic", Domain: "energy", DescriptionDE: "Kinetische Energie", DescriptionEN: "Kinetic energy"}, + {ID: "translational", Domain: "energy", DescriptionDE: "Translatorische Bewegung", DescriptionEN: "Translational motion"}, + {ID: "rotational", Domain: "energy", DescriptionDE: "Rotatorische Bewegung", DescriptionEN: "Rotational motion"}, + {ID: "potential", Domain: "energy", DescriptionDE: "Potentielle Energie", DescriptionEN: "Potential energy"}, + {ID: "gravitational", Domain: "energy", DescriptionDE: "Schwerkraftbedingt", DescriptionEN: "Gravitational"}, + {ID: "electrical_energy", Domain: "energy", DescriptionDE: "Elektrische Energie", DescriptionEN: "Electrical energy"}, + {ID: "hydraulic_pressure", Domain: "energy", DescriptionDE: "Hydraulischer Druck", DescriptionEN: "Hydraulic pressure"}, + {ID: "pneumatic_pressure", Domain: "energy", DescriptionDE: "Pneumatischer Druck", DescriptionEN: "Pneumatic pressure"}, + {ID: "thermal", Domain: "energy", DescriptionDE: "Thermische Energie", DescriptionEN: "Thermal energy"}, + {ID: "stored_energy", Domain: "energy", DescriptionDE: "Gespeicherte Energie", DescriptionEN: "Stored energy"}, + {ID: "radiation", Domain: "energy", DescriptionDE: "Strahlung", DescriptionEN: "Radiation"}, + {ID: "electromagnetic", Domain: "energy", DescriptionDE: "Elektromagnetische Strahlung", DescriptionEN: "Electromagnetic radiation"}, + {ID: "acoustic", Domain: "energy", DescriptionDE: "Schallenergie", DescriptionEN: "Acoustic energy"}, + {ID: "vibration", Domain: "energy", DescriptionDE: "Vibration", DescriptionEN: "Vibration"}, + {ID: "chemical", Domain: "energy", DescriptionDE: "Chemische Energie", DescriptionEN: "Chemical energy"}, + {ID: "magnetic", Domain: "energy", DescriptionDE: "Magnetische Energie", DescriptionEN: "Magnetic energy"}, + {ID: "cyber", Domain: "energy", DescriptionDE: "Cyber/Daten-Energie", DescriptionEN: "Cyber/data energy"}, + {ID: "ai_model", Domain: "energy", DescriptionDE: "KI-Modell", DescriptionEN: "AI model"}, + {ID: "ergonomic", Domain: "energy", DescriptionDE: "Ergonomische Belastung", DescriptionEN: "Ergonomic load"}, + + // ── Domain: hazard (~20 tags) ─────────────────────────────────────── + {ID: "crush_risk", Domain: "hazard", DescriptionDE: "Quetschgefahr", DescriptionEN: "Crush risk"}, + {ID: "shear_risk", Domain: "hazard", DescriptionDE: "Schergefahr", DescriptionEN: "Shear risk"}, + {ID: "cut_risk", Domain: "hazard", DescriptionDE: "Schnittgefahr", DescriptionEN: "Cut risk"}, + {ID: "entanglement_risk", Domain: "hazard", DescriptionDE: "Einzugsgefahr", DescriptionEN: "Entanglement risk"}, + {ID: "impact_risk", Domain: "hazard", DescriptionDE: "Stossgefahr", DescriptionEN: "Impact risk"}, + {ID: "gravity_risk", Domain: "hazard", DescriptionDE: "Absturzgefahr / Herabfallen", DescriptionEN: "Fall/drop risk"}, + {ID: "pinch_point", Domain: "hazard", DescriptionDE: "Klemmstelle", DescriptionEN: "Pinch point"}, + {ID: "crush_point", Domain: "hazard", DescriptionDE: "Quetschstelle", DescriptionEN: "Crush point"}, + {ID: "electric_shock_risk", Domain: "hazard", DescriptionDE: "Stromschlaggefahr", DescriptionEN: "Electric shock risk"}, + {ID: "burn_risk", Domain: "hazard", DescriptionDE: "Verbrennungsgefahr", DescriptionEN: "Burn risk"}, + {ID: "pressure_risk", Domain: "hazard", DescriptionDE: "Druckgefahr", DescriptionEN: "Pressure risk"}, + {ID: "noise_risk", Domain: "hazard", DescriptionDE: "Laermgefahr", DescriptionEN: "Noise risk"}, + {ID: "vibration_risk", Domain: "hazard", DescriptionDE: "Vibrationsgefahr", DescriptionEN: "Vibration risk"}, + {ID: "ergonomic_risk", Domain: "hazard", DescriptionDE: "Ergonomie-Risiko", DescriptionEN: "Ergonomic risk"}, + {ID: "chemical_risk", Domain: "hazard", DescriptionDE: "Gefahrstoffrisiko", DescriptionEN: "Chemical risk"}, + {ID: "cyber_risk", Domain: "hazard", DescriptionDE: "Cyber-Sicherheitsrisiko", DescriptionEN: "Cyber security risk"}, + {ID: "ai_risk", Domain: "hazard", DescriptionDE: "KI-spezifisches Risiko", DescriptionEN: "AI-specific risk"}, + {ID: "software_risk", Domain: "hazard", DescriptionDE: "Software-Fehlerrisiko", DescriptionEN: "Software fault risk"}, + {ID: "communication_risk", Domain: "hazard", DescriptionDE: "Kommunikationsausfall-Risiko", DescriptionEN: "Communication failure risk"}, + {ID: "emc_risk", Domain: "hazard", DescriptionDE: "EMV-Stoerungsrisiko", DescriptionEN: "EMC interference risk"}, + + // ── Domain: measure (~10 tags) ────────────────────────────────────── + {ID: "guard_measure", Domain: "measure", DescriptionDE: "Trennende Schutzeinrichtung", DescriptionEN: "Separating guard measure"}, + {ID: "interlock_measure", Domain: "measure", DescriptionDE: "Verriegelungsmassnahme", DescriptionEN: "Interlock measure"}, + {ID: "force_limit_measure", Domain: "measure", DescriptionDE: "Kraftbegrenzungsmassnahme", DescriptionEN: "Force limiting measure"}, + {ID: "safety_function_measure", Domain: "measure", DescriptionDE: "Sicherheitsfunktion (STO/SLS/SOS)", DescriptionEN: "Safety function (STO/SLS/SOS)"}, + {ID: "software_safety_measure", Domain: "measure", DescriptionDE: "Software-Sicherheitsmassnahme", DescriptionEN: "Software safety measure"}, + {ID: "cyber_security_measure", Domain: "measure", DescriptionDE: "Cyber-Sicherheitsmassnahme", DescriptionEN: "Cyber security measure"}, + {ID: "pressure_relief_measure", Domain: "measure", DescriptionDE: "Druckentlastungsmassnahme", DescriptionEN: "Pressure relief measure"}, + {ID: "thermal_protection_measure", Domain: "measure", DescriptionDE: "Thermische Schutzmassnahme", DescriptionEN: "Thermal protection measure"}, + {ID: "ppe_measure", Domain: "measure", DescriptionDE: "Persoenliche Schutzausruestung", DescriptionEN: "Personal protective equipment"}, + {ID: "training_measure", Domain: "measure", DescriptionDE: "Schulungsmassnahme", DescriptionEN: "Training measure"}, + + // ── Domain: evidence (~10 tags) ───────────────────────────────────── + {ID: "design_evidence", Domain: "evidence", DescriptionDE: "Konstruktionsnachweis", DescriptionEN: "Design evidence"}, + {ID: "test_evidence", Domain: "evidence", DescriptionDE: "Testnachweis", DescriptionEN: "Test evidence"}, + {ID: "analysis_evidence", Domain: "evidence", DescriptionDE: "Analysenachweis", DescriptionEN: "Analysis evidence"}, + {ID: "inspection_evidence", Domain: "evidence", DescriptionDE: "Inspektionsnachweis", DescriptionEN: "Inspection evidence"}, + {ID: "cyber_evidence", Domain: "evidence", DescriptionDE: "Cyber-Security-Nachweis", DescriptionEN: "Cyber security evidence"}, + {ID: "simulation_evidence", Domain: "evidence", DescriptionDE: "Simulationsnachweis", DescriptionEN: "Simulation evidence"}, + {ID: "certification_evidence", Domain: "evidence", DescriptionDE: "Zertifizierungsnachweis", DescriptionEN: "Certification evidence"}, + {ID: "training_evidence", Domain: "evidence", DescriptionDE: "Schulungsnachweis", DescriptionEN: "Training evidence"}, + {ID: "operational_evidence", Domain: "evidence", DescriptionDE: "Betriebsnachweis", DescriptionEN: "Operational evidence"}, + {ID: "audit_evidence", Domain: "evidence", DescriptionDE: "Auditnachweis", DescriptionEN: "Audit evidence"}, + } +} + +// ValidTagDomains returns the list of valid tag domains. +func ValidTagDomains() []string { + return []string{"component", "energy", "hazard", "measure", "evidence"} +} diff --git a/ai-compliance-sdk/migrations/020_iace_component_energy_library.sql b/ai-compliance-sdk/migrations/020_iace_component_energy_library.sql new file mode 100644 index 0000000..6d4511f --- /dev/null +++ b/ai-compliance-sdk/migrations/020_iace_component_energy_library.sql @@ -0,0 +1,56 @@ +-- Migration 020: IACE Component Library, Energy Sources & Pattern Engine +-- Adds machine component library (120 entries), energy sources (20 entries), +-- and extends existing iace_components with library references and tags. + +-- ============================================================================ +-- Component Library (120 entries, C001-C120) +-- ============================================================================ +CREATE TABLE IF NOT EXISTS iace_component_library ( + id TEXT PRIMARY KEY, + name_de TEXT NOT NULL, + name_en TEXT NOT NULL, + category TEXT NOT NULL, + description_de TEXT DEFAULT '', + typical_hazard_categories JSONB DEFAULT '[]', + typical_energy_sources JSONB DEFAULT '[]', + maps_to_component_type TEXT NOT NULL, + tags JSONB DEFAULT '[]', + sort_order INT DEFAULT 0 +); + +-- ============================================================================ +-- Energy Sources (20 entries, EN01-EN20) +-- ============================================================================ +CREATE TABLE IF NOT EXISTS iace_energy_sources ( + id TEXT PRIMARY KEY, + name_de TEXT NOT NULL, + name_en TEXT NOT NULL, + description_de TEXT DEFAULT '', + typical_components JSONB DEFAULT '[]', + typical_hazard_categories JSONB DEFAULT '[]', + tags JSONB DEFAULT '[]', + sort_order INT DEFAULT 0 +); + +-- ============================================================================ +-- Extend existing iace_components with library references +-- ============================================================================ +ALTER TABLE iace_components ADD COLUMN IF NOT EXISTS library_component_id TEXT; +ALTER TABLE iace_components ADD COLUMN IF NOT EXISTS energy_source_ids JSONB DEFAULT '[]'; +ALTER TABLE iace_components ADD COLUMN IF NOT EXISTS tags JSONB DEFAULT '[]'; + +-- ============================================================================ +-- Pattern matching results table (audit trail for applied patterns) +-- ============================================================================ +CREATE TABLE IF NOT EXISTS iace_pattern_results ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID NOT NULL REFERENCES iace_projects(id) ON DELETE CASCADE, + matched_patterns JSONB DEFAULT '[]', + resolved_tags JSONB DEFAULT '[]', + input_data JSONB DEFAULT '{}', + created_at TIMESTAMPTZ DEFAULT NOW(), + created_by TEXT DEFAULT '' +); + +CREATE INDEX IF NOT EXISTS idx_iace_pattern_results_project ON iace_pattern_results(project_id); +CREATE INDEX IF NOT EXISTS idx_iace_component_library_category ON iace_component_library(category); diff --git a/backend-compliance/compliance/api/control_generator_routes.py b/backend-compliance/compliance/api/control_generator_routes.py index a0de281..3838ed4 100644 --- a/backend-compliance/compliance/api/control_generator_routes.py +++ b/backend-compliance/compliance/api/control_generator_routes.py @@ -27,6 +27,7 @@ from compliance.services.control_generator import ( GeneratorConfig, ALL_COLLECTIONS, ) +from compliance.services.citation_backfill import CitationBackfill, BackfillResult from compliance.services.rag_client import get_rag_client logger = logging.getLogger(__name__) @@ -496,3 +497,288 @@ async def get_controls_customer_view( return {"controls": controls, "total": len(controls)} finally: db.close() + + +# ============================================================================= +# CITATION BACKFILL +# ============================================================================= + +class BackfillRequest(BaseModel): + dry_run: bool = True # Default to dry_run for safety + limit: int = 0 # 0 = all controls + + +class BackfillResponse(BaseModel): + status: str + total_controls: int = 0 + matched_hash: int = 0 + matched_regex: int = 0 + matched_llm: int = 0 + unmatched: int = 0 + updated: int = 0 + errors: list = [] + + +_backfill_status: dict = {} + + +async def _run_backfill_background(dry_run: bool, limit: int, backfill_id: str): + """Run backfill in background with own DB session.""" + db = SessionLocal() + try: + backfill = CitationBackfill(db=db, rag_client=get_rag_client()) + result = await backfill.run(dry_run=dry_run, limit=limit) + _backfill_status[backfill_id] = { + "status": "completed", + "total_controls": result.total_controls, + "matched_hash": result.matched_hash, + "matched_regex": result.matched_regex, + "matched_llm": result.matched_llm, + "unmatched": result.unmatched, + "updated": result.updated, + "errors": result.errors[:50], + } + logger.info("Backfill %s completed: %d updated", backfill_id, result.updated) + except Exception as e: + logger.error("Backfill %s failed: %s", backfill_id, e) + _backfill_status[backfill_id] = {"status": "failed", "errors": [str(e)]} + finally: + db.close() + + +@router.post("/generate/backfill-citations", response_model=BackfillResponse) +async def start_backfill(req: BackfillRequest): + """Backfill article/paragraph into existing control source_citations. + + Uses 3-tier matching: hash lookup → regex parse → Ollama LLM. + Default is dry_run=True (preview only, no DB changes). + """ + import uuid + backfill_id = str(uuid.uuid4())[:8] + _backfill_status[backfill_id] = {"status": "running"} + + # Always run in background (RAG index build takes minutes) + asyncio.create_task(_run_backfill_background(req.dry_run, req.limit, backfill_id)) + return BackfillResponse( + status=f"running (id={backfill_id})", + ) + + +@router.get("/generate/backfill-status/{backfill_id}") +async def get_backfill_status(backfill_id: str): + """Get status of a backfill job.""" + status = _backfill_status.get(backfill_id) + if not status: + raise HTTPException(status_code=404, detail="Backfill job not found") + return status + + +# ============================================================================= +# DOMAIN + TARGET AUDIENCE BACKFILL +# ============================================================================= + +class DomainBackfillRequest(BaseModel): + dry_run: bool = True + job_id: Optional[str] = None # Only backfill controls from this job + limit: int = 0 # 0 = all + +_domain_backfill_status: dict = {} + + +async def _run_domain_backfill(req: DomainBackfillRequest, backfill_id: str): + """Backfill domain, category, and target_audience for existing controls using Anthropic.""" + import os + import httpx + + ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY", "") + ANTHROPIC_MODEL = os.getenv("CONTROL_GEN_ANTHROPIC_MODEL", "claude-sonnet-4-6") + + if not ANTHROPIC_API_KEY: + _domain_backfill_status[backfill_id] = { + "status": "failed", "error": "ANTHROPIC_API_KEY not set" + } + return + + db = SessionLocal() + try: + # Find controls needing backfill + where_clauses = ["(target_audience IS NULL OR target_audience = '[]' OR target_audience = 'null')"] + params: dict = {} + if req.job_id: + where_clauses.append("generation_metadata->>'job_id' = :job_id") + params["job_id"] = req.job_id + + query = f""" + SELECT id, control_id, title, objective, category, source_original_text, tags + FROM canonical_controls + WHERE {' AND '.join(where_clauses)} + ORDER BY control_id + """ + if req.limit > 0: + query += f" LIMIT {req.limit}" + + result = db.execute(text(query), params) + controls = [dict(zip(result.keys(), row)) for row in result] + + total = len(controls) + updated = 0 + errors = [] + + _domain_backfill_status[backfill_id] = { + "status": "running", "total": total, "updated": 0, "errors": [] + } + + # Process in batches of 10 + BATCH_SIZE = 10 + for batch_start in range(0, total, BATCH_SIZE): + batch = controls[batch_start:batch_start + BATCH_SIZE] + + entries = [] + for idx, ctrl in enumerate(batch): + text_for_analysis = ctrl.get("objective") or ctrl.get("title") or "" + original = ctrl.get("source_original_text") or "" + if original: + text_for_analysis += f"\n\nQuelltext-Auszug: {original[:500]}" + entries.append( + f"--- CONTROL {idx + 1}: {ctrl['control_id']} ---\n" + f"Titel: {ctrl.get('title', '')}\n" + f"Objective: {text_for_analysis[:800]}\n" + f"Tags: {json.dumps(ctrl.get('tags', []))}" + ) + + prompt = f"""Analysiere die folgenden {len(batch)} Controls und bestimme fuer jedes: +1. domain: Das Fachgebiet (AUTH, CRYP, NET, DATA, LOG, ACC, SEC, INC, AI, COMP, GOV, LAB, FIN, TRD, ENV, HLT) +2. category: Die Kategorie (encryption, authentication, network, data_protection, logging, incident, continuity, compliance, supply_chain, physical, personnel, application, system, risk, governance, hardware, identity, public_administration, labor_law, finance, trade_regulation, environmental, health) +3. target_audience: Liste der Zielgruppen (moegliche Werte: "unternehmen", "behoerden", "entwickler", "datenschutzbeauftragte", "geschaeftsfuehrung", "it-abteilung", "rechtsabteilung", "compliance-officer", "personalwesen", "einkauf", "produktion", "vertrieb", "gesundheitswesen", "finanzwesen", "oeffentlicher_dienst") + +Antworte mit einem JSON-Array mit {len(batch)} Objekten. Jedes Objekt hat: +- control_index: 1-basierter Index +- domain: Fachgebiet-Kuerzel +- category: Kategorie +- target_audience: Liste der Zielgruppen + +{"".join(entries)}""" + + try: + headers = { + "x-api-key": ANTHROPIC_API_KEY, + "anthropic-version": "2023-06-01", + "content-type": "application/json", + } + payload = { + "model": ANTHROPIC_MODEL, + "max_tokens": 4096, + "system": "Du bist ein Compliance-Experte. Klassifiziere Controls nach Fachgebiet und Zielgruppe. Antworte NUR mit validem JSON.", + "messages": [{"role": "user", "content": prompt}], + } + + async with httpx.AsyncClient(timeout=60.0) as client: + resp = await client.post( + "https://api.anthropic.com/v1/messages", + headers=headers, + json=payload, + ) + if resp.status_code != 200: + errors.append(f"Anthropic API {resp.status_code} at batch {batch_start}") + continue + + raw = resp.json().get("content", [{}])[0].get("text", "") + + # Parse response + import re + bracket_match = re.search(r"\[.*\]", raw, re.DOTALL) + if not bracket_match: + errors.append(f"No JSON array in response at batch {batch_start}") + continue + + results_list = json.loads(bracket_match.group(0)) + + for item in results_list: + idx = item.get("control_index", 0) - 1 + if idx < 0 or idx >= len(batch): + continue + ctrl = batch[idx] + ctrl_id = str(ctrl["id"]) + + new_domain = item.get("domain", "") + new_category = item.get("category", "") + new_audience = item.get("target_audience", []) + + if not isinstance(new_audience, list): + new_audience = [] + + # Build new control_id from domain if domain changed + old_prefix = ctrl["control_id"].split("-")[0] if ctrl["control_id"] else "" + new_prefix = new_domain.upper()[:4] if new_domain else old_prefix + + if not req.dry_run: + update_parts = [] + update_params: dict = {"ctrl_id": ctrl_id} + + if new_category: + update_parts.append("category = :category") + update_params["category"] = new_category + + if new_audience: + update_parts.append("target_audience = :target_audience") + update_params["target_audience"] = json.dumps(new_audience) + + # Note: We do NOT rename control_ids here — that would + # break references and cause unique constraint violations. + + if update_parts: + update_parts.append("updated_at = NOW()") + db.execute( + text(f"UPDATE canonical_controls SET {', '.join(update_parts)} WHERE id = CAST(:ctrl_id AS uuid)"), + update_params, + ) + updated += 1 + + if not req.dry_run: + db.commit() + + except Exception as e: + errors.append(f"Batch {batch_start}: {str(e)}") + db.rollback() + + _domain_backfill_status[backfill_id] = { + "status": "running", "total": total, "updated": updated, + "progress": f"{min(batch_start + BATCH_SIZE, total)}/{total}", + "errors": errors[-10:], + } + + _domain_backfill_status[backfill_id] = { + "status": "completed", "total": total, "updated": updated, + "errors": errors[-50:], + } + logger.info("Domain backfill %s completed: %d/%d updated", backfill_id, updated, total) + + except Exception as e: + logger.error("Domain backfill %s failed: %s", backfill_id, e) + _domain_backfill_status[backfill_id] = {"status": "failed", "error": str(e)} + finally: + db.close() + + +@router.post("/generate/backfill-domain") +async def start_domain_backfill(req: DomainBackfillRequest): + """Backfill domain, category, and target_audience for controls using Anthropic API. + + Finds controls where target_audience is NULL and enriches them. + Default is dry_run=True (preview only). + """ + import uuid + backfill_id = str(uuid.uuid4())[:8] + _domain_backfill_status[backfill_id] = {"status": "starting"} + asyncio.create_task(_run_domain_backfill(req, backfill_id)) + return {"status": "running", "backfill_id": backfill_id, + "message": f"Domain backfill started. Poll /generate/backfill-status/{backfill_id}"} + + +@router.get("/generate/domain-backfill-status/{backfill_id}") +async def get_domain_backfill_status(backfill_id: str): + """Get status of a domain backfill job.""" + status = _domain_backfill_status.get(backfill_id) + if not status: + raise HTTPException(status_code=404, detail="Domain backfill job not found") + return status diff --git a/backend-compliance/compliance/services/control_generator.py b/backend-compliance/compliance/services/control_generator.py index f0cfaa2..ed272e3 100644 --- a/backend-compliance/compliance/services/control_generator.py +++ b/backend-compliance/compliance/services/control_generator.py @@ -223,13 +223,13 @@ def _classify_regulation(regulation_code: str) -> dict: DOMAIN_KEYWORDS = { "AUTH": ["authentication", "login", "password", "credential", "mfa", "2fa", "session", "token", "oauth", "identity", "authentifizierung", "anmeldung"], - "CRYPT": ["encryption", "cryptography", "tls", "ssl", "certificate", "hashing", - "aes", "rsa", "verschlüsselung", "kryptographie", "zertifikat"], + "CRYP": ["encryption", "cryptography", "tls", "ssl", "certificate", "hashing", + "aes", "rsa", "verschlüsselung", "kryptographie", "cipher", "schlüssel"], "NET": ["network", "firewall", "dns", "vpn", "proxy", "segmentation", "netzwerk", "routing", "port", "intrusion"], "DATA": ["data protection", "privacy", "personal data", "datenschutz", "personenbezogen", "dsgvo", "gdpr", "löschung", "verarbeitung"], - "LOG": ["logging", "monitoring", "audit", "siem", "alert", "anomaly", + "LOG": ["logging", "monitoring", "audit trail", "siem", "alert", "anomaly", "protokollierung", "überwachung"], "ACC": ["access control", "authorization", "rbac", "permission", "privilege", "zugriffskontrolle", "berechtigung", "autorisierung"], @@ -241,12 +241,30 @@ DOMAIN_KEYWORDS = { "ki", "künstliche intelligenz", "algorithmus", "training"], "COMP": ["compliance", "audit", "regulation", "standard", "certification", "konformität", "prüfung", "zertifizierung"], + "GOV": ["behörde", "verwaltung", "öffentlich", "register", "gewerberegister", + "handelsregister", "meldepflicht", "aufsicht", "genehmigung", "bescheid", + "verwaltungsakt", "ordnungswidrig", "bußgeld", "staat", "ministerium", + "bundesamt", "landesamt", "kommune", "gebietskörperschaft"], + "LAB": ["arbeitnehmer", "arbeitgeber", "arbeitsschutz", "arbeitszeit", "betriebsrat", + "kündigung", "beschäftigung", "mindestlohn", "arbeitsvertrag", "betriebsverfassung", + "arbeitsrecht", "arbeitsstätte", "gefährdungsbeurteilung", "unterweisung"], + "FIN": ["finanz", "bankwesen", "zahlungsverkehr", "geldwäsche", "bilanz", "rechnungslegung", + "buchführung", "jahresabschluss", "steuererklärung", "kapitalmarkt", "wertpapier", + "kreditinstitut", "finanzdienstleistung", "bankenaufsicht", "bafin"], + "TRD": ["handelsrecht", "gewerbeordnung", "gewerbe", "handwerk", "gewerbeuntersagung", + "gewerbebetrieb", "handelsgesetzbuch", "handelsregister", "kaufmann", + "unternehmer", "wettbewerb", "verbraucherschutz", "produktsicherheit"], + "ENV": ["umweltschutz", "emission", "abfall", "immission", "gewässerschutz", + "naturschutz", "umweltverträglichkeit", "klimaschutz", "nachhaltigkeit", + "entsorgung", "recycling", "umweltrecht"], + "HLT": ["gesundheit", "medizinprodukt", "arzneimittel", "patient", "krankenhaus", + "hygiene", "infektionsschutz", "medizin", "pflege", "therapie"], } CATEGORY_KEYWORDS = { "encryption": ["encryption", "cryptography", "tls", "ssl", "certificate", "hashing", - "aes", "rsa", "verschlüsselung", "kryptographie", "zertifikat", "cipher"], + "aes", "rsa", "verschlüsselung", "kryptographie", "cipher", "schlüssel"], "authentication": ["authentication", "login", "password", "credential", "mfa", "2fa", "session", "oauth", "authentifizierung", "anmeldung", "passwort"], "network": ["network", "firewall", "dns", "vpn", "proxy", "segmentation", @@ -278,6 +296,20 @@ CATEGORY_KEYWORDS = { "plattform", "geräte"], "identity": ["identity", "iam", "directory", "ldap", "sso", "provisioning", "identität", "identitätsmanagement", "benutzerverzeichnis"], + "public_administration": ["behörde", "verwaltung", "öffentlich", "register", "gewerberegister", + "handelsregister", "meldepflicht", "aufsicht", "genehmigung", "bescheid", + "verwaltungsakt", "ordnungswidrig", "bußgeld", "amt"], + "labor_law": ["arbeitnehmer", "arbeitgeber", "arbeitsschutz", "arbeitszeit", "betriebsrat", + "kündigung", "beschäftigung", "mindestlohn", "arbeitsvertrag", "betriebsverfassung"], + "finance": ["finanz", "bankwesen", "zahlungsverkehr", "geldwäsche", "bilanz", "rechnungslegung", + "buchführung", "jahresabschluss", "kapitalmarkt", "wertpapier", "bafin"], + "trade_regulation": ["gewerbeordnung", "gewerbe", "handwerk", "gewerbeuntersagung", + "gewerbebetrieb", "handelsrecht", "kaufmann", "wettbewerb", + "verbraucherschutz", "produktsicherheit"], + "environmental": ["umweltschutz", "emission", "abfall", "immission", "gewässerschutz", + "naturschutz", "klimaschutz", "nachhaltigkeit", "entsorgung"], + "health": ["gesundheit", "medizinprodukt", "arzneimittel", "patient", "krankenhaus", + "hygiene", "infektionsschutz", "pflege"], } VERIFICATION_KEYWORDS = { @@ -372,7 +404,8 @@ class GeneratedControl: generation_strategy: str = "ungrouped" # ungrouped | document_grouped # Classification fields verification_method: Optional[str] = None # code_review, document, tool, hybrid - category: Optional[str] = None # one of 17 categories + category: Optional[str] = None # one of 22 categories + target_audience: Optional[list] = None # e.g. ["unternehmen", "behoerden", "entwickler"] @dataclass @@ -705,9 +738,11 @@ class ControlGeneratorPipeline: page = 0 collection_total = 0 collection_new = 0 - seen_offsets: set[str] = set() # Detect scroll loops + max_pages = 1000 # Safety limit: 1000 pages × 200 = 200K chunks max per collection + prev_chunk_count = -1 # Track stalls (same count means no progress) + stall_count = 0 - while True: + while page < max_pages: chunks, next_offset = await self.rag.scroll( collection=collection, offset=offset, @@ -747,17 +782,30 @@ class ControlGeneratorPipeline: # Stop conditions if not next_offset: break - # Detect infinite scroll loops (Qdrant mixed ID types) - if next_offset in seen_offsets: - logger.warning( - "Scroll loop detected in %s at offset %s (page %d) — stopping", - collection, next_offset, page, - ) - break - seen_offsets.add(next_offset) + + # Detect stalls: if no NEW unique chunks found for several pages, + # we've likely cycled through all chunks in this collection. + # (Safer than offset dedup which breaks with mixed Qdrant ID types) + if collection_new == prev_chunk_count: + stall_count += 1 + if stall_count >= 5: + logger.warning( + "Scroll stalled in %s at page %d — no new unique chunks for 5 pages (%d total, %d new) — stopping", + collection, page, collection_total, collection_new, + ) + break + else: + stall_count = 0 + prev_chunk_count = collection_new offset = next_offset + if page >= max_pages: + logger.warning( + "Collection %s: reached max_pages limit (%d). %d chunks scrolled.", + collection, max_pages, collection_total, + ) + logger.info( "Collection %s: %d total chunks scrolled, %d new unprocessed", collection, collection_total, collection_new, @@ -823,7 +871,9 @@ Quelle: {chunk.regulation_name} ({chunk.regulation_code}), {chunk.article}""" control.license_rule = 1 control.source_original_text = chunk.text control.source_citation = { - "source": f"{chunk.regulation_name} {chunk.article or ''}".strip(), + "source": chunk.regulation_name, + "article": chunk.article or "", + "paragraph": chunk.paragraph or "", "license": license_info.get("license", ""), "url": chunk.source_url or "", } @@ -835,6 +885,7 @@ Quelle: {chunk.regulation_name} ({chunk.regulation_code}), {chunk.article}""" "license_rule": 1, "source_regulation": chunk.regulation_code, "source_article": chunk.article, + "source_paragraph": chunk.paragraph, } return control @@ -873,7 +924,9 @@ Quelle: {chunk.regulation_name}, {chunk.article}""" control.license_rule = 2 control.source_original_text = chunk.text control.source_citation = { - "source": f"{chunk.regulation_name} {chunk.article or ''}".strip(), + "source": chunk.regulation_name, + "article": chunk.article or "", + "paragraph": chunk.paragraph or "", "license": license_info.get("license", ""), "license_notice": attribution, "url": chunk.source_url or "", @@ -886,6 +939,7 @@ Quelle: {chunk.regulation_name}, {chunk.article}""" "license_rule": 2, "source_regulation": chunk.regulation_code, "source_article": chunk.article, + "source_paragraph": chunk.paragraph, } return control @@ -913,7 +967,9 @@ Gib JSON zurück mit diesen Feldern: - test_procedure: Liste von Prüfschritten (Strings) - evidence: Liste von Nachweisdokumenten (Strings) - severity: low/medium/high/critical -- tags: Liste von Tags (eigene Begriffe)""" +- tags: Liste von Tags (eigene Begriffe) +- domain: Fachgebiet als Kuerzel (AUTH, CRYP, NET, DATA, LOG, ACC, SEC, INC, AI, COMP, GOV, LAB, FIN, TRD, ENV, HLT) +- target_audience: Liste der Zielgruppen (z.B. "unternehmen", "behoerden", "entwickler", "datenschutzbeauftragte", "geschaeftsfuehrung", "it-abteilung", "rechtsabteilung", "compliance-officer", "personalwesen", "oeffentlicher_dienst")""" raw = await _llm_chat(prompt, REFORM_SYSTEM_PROMPT) data = _parse_llm_json(raw) @@ -989,6 +1045,8 @@ Gib ein JSON-Array zurueck mit GENAU {len(chunks)} Objekten. Jedes Objekt hat di - evidence: Liste von Nachweisdokumenten (Strings, Deutsch) - severity: low/medium/high/critical - tags: Liste von Tags +- domain: Fachgebiet als Kuerzel (AUTH=Authentifizierung, CRYP=Kryptographie, NET=Netzwerk, DATA=Datenschutz, LOG=Logging, ACC=Zugriffskontrolle, SEC=IT-Sicherheit, INC=Vorfallmanagement, AI=KI, COMP=Compliance, GOV=Behoerden/Verwaltung, LAB=Arbeitsrecht, FIN=Finanzregulierung, TRD=Gewerbe/Handelsrecht, ENV=Umwelt, HLT=Gesundheit) +- target_audience: Liste der Zielgruppen fuer die dieses Control relevant ist. Moegliche Werte: "unternehmen", "behoerden", "entwickler", "datenschutzbeauftragte", "geschaeftsfuehrung", "it-abteilung", "rechtsabteilung", "compliance-officer", "personalwesen", "einkauf", "produktion", "vertrieb", "gesundheitswesen", "finanzwesen", "oeffentlicher_dienst" {joined}""" @@ -1016,7 +1074,9 @@ Gib ein JSON-Array zurueck mit GENAU {len(chunks)} Objekten. Jedes Objekt hat di if lic["rule"] in (1, 2): control.source_original_text = chunk.text control.source_citation = { - "source": f"{chunk.regulation_name} {chunk.article or ''}".strip(), + "source": chunk.regulation_name, + "article": chunk.article or "", + "paragraph": chunk.paragraph or "", "license": lic.get("license", ""), "license_notice": lic.get("attribution", ""), "url": chunk.source_url or "", @@ -1030,6 +1090,7 @@ Gib ein JSON-Array zurueck mit GENAU {len(chunks)} Objekten. Jedes Objekt hat di "license_rule": lic["rule"], "source_regulation": chunk.regulation_code, "source_article": chunk.article, + "source_paragraph": chunk.paragraph, "batch_size": len(chunks), "document_grouped": same_doc, } @@ -1071,6 +1132,8 @@ Gib ein JSON-Array zurueck mit GENAU {len(chunks)} Objekten. Jedes Objekt hat di - evidence: Liste von Nachweisdokumenten (Strings) - severity: low/medium/high/critical - tags: Liste von Tags (eigene Begriffe) +- domain: Fachgebiet als Kuerzel (AUTH=Authentifizierung, CRYP=Kryptographie, NET=Netzwerk, DATA=Datenschutz, LOG=Logging, ACC=Zugriffskontrolle, SEC=IT-Sicherheit, INC=Vorfallmanagement, AI=KI, COMP=Compliance, GOV=Behoerden/Verwaltung, LAB=Arbeitsrecht, FIN=Finanzregulierung, TRD=Gewerbe/Handelsrecht, ENV=Umwelt, HLT=Gesundheit) +- target_audience: Liste der Zielgruppen (z.B. "unternehmen", "behoerden", "entwickler", "datenschutzbeauftragte", "geschaeftsfuehrung", "it-abteilung", "rechtsabteilung", "compliance-officer", "personalwesen", "einkauf", "produktion", "gesundheitswesen", "finanzwesen", "oeffentlicher_dienst") {joined}""" @@ -1182,8 +1245,10 @@ Gib ein JSON-Array zurueck mit GENAU {len(chunks)} Objekten. Jedes Objekt hat di else: control.release_state = "needs_review" - # Control ID - domain = config.domain or _detect_domain(control.objective) + # Control ID — prefer LLM-assigned domain over keyword detection + domain = (control.generation_metadata.get("_effective_domain") + or config.domain + or _detect_domain(control.objective)) control.control_id = self._generate_control_id(domain, self.db) control.generation_metadata["job_id"] = job_id @@ -1270,7 +1335,21 @@ Gib ein JSON-Array zurueck mit GENAU {len(chunks)} Objekten. Jedes Objekt hat di if isinstance(tags, str): tags = [t.strip() for t in tags.split(",")] - return GeneratedControl( + # Use LLM-provided domain if available, fallback to keyword-detected domain + llm_domain = data.get("domain") + valid_domains = {"AUTH", "CRYP", "NET", "DATA", "LOG", "ACC", "SEC", "INC", + "AI", "COMP", "GOV", "LAB", "FIN", "TRD", "ENV", "HLT"} + if llm_domain and llm_domain.upper() in valid_domains: + domain = llm_domain.upper() + + # Parse target_audience from LLM response + target_audience = data.get("target_audience") + if isinstance(target_audience, str): + target_audience = [t.strip() for t in target_audience.split(",")] + if not isinstance(target_audience, list): + target_audience = None + + control = GeneratedControl( title=str(data.get("title", "Untitled Control"))[:255], objective=str(data.get("objective", "")), rationale=str(data.get("rationale", "")), @@ -1282,7 +1361,11 @@ Gib ein JSON-Array zurueck mit GENAU {len(chunks)} Objekten. Jedes Objekt hat di risk_score=min(10.0, max(0.0, float(data.get("risk_score", 5.0)))), implementation_effort=data.get("implementation_effort", "m") if data.get("implementation_effort") in ("s", "m", "l", "xl") else "m", tags=tags[:20], + target_audience=target_audience, ) + # Store effective domain for later control_id generation + control.generation_metadata["_effective_domain"] = domain + return control def _fallback_control(self, chunk: RAGSearchResult) -> GeneratedControl: """Create a minimal control when LLM parsing fails.""" @@ -1393,7 +1476,8 @@ Gib ein JSON-Array zurueck mit GENAU {len(chunks)} Objekten. Jedes Objekt hat di open_anchors, release_state, tags, license_rule, source_original_text, source_citation, customer_visible, generation_metadata, - verification_method, category, generation_strategy + verification_method, category, generation_strategy, + target_audience ) VALUES ( :framework_id, :control_id, :title, :objective, :rationale, :scope, :requirements, :test_procedure, :evidence, @@ -1401,7 +1485,8 @@ Gib ein JSON-Array zurueck mit GENAU {len(chunks)} Objekten. Jedes Objekt hat di :open_anchors, :release_state, :tags, :license_rule, :source_original_text, :source_citation, :customer_visible, :generation_metadata, - :verification_method, :category, :generation_strategy + :verification_method, :category, :generation_strategy, + :target_audience ) ON CONFLICT (framework_id, control_id) DO NOTHING RETURNING id @@ -1430,6 +1515,7 @@ Gib ein JSON-Array zurueck mit GENAU {len(chunks)} Objekten. Jedes Objekt hat di "verification_method": control.verification_method, "category": control.category, "generation_strategy": control.generation_strategy, + "target_audience": json.dumps(control.target_audience) if control.target_audience else None, }, ) self.db.commit() diff --git a/docs-src/services/sdk-modules/iace-hazard-library.md b/docs-src/services/sdk-modules/iace-hazard-library.md new file mode 100644 index 0000000..375ddcb --- /dev/null +++ b/docs-src/services/sdk-modules/iace-hazard-library.md @@ -0,0 +1,2434 @@ +# IACE Hazard Library — 150 Gefährdungen + +Diese Bibliothek ist eine eigene, generische Arbeitsbibliothek für Maschinen, Anlagen, Software, Firmware, vernetzte Komponenten und KI-Module. Sie dient als produktisierbare Wissensbasis für die CE-Risikobeurteilungs-Engine der IACE-Plattform. Jede Gefährdung ist einheitlich strukturiert und direkt als Seed-Datenbank, RAG-Basis oder Regelquelle verwendbar. + +!!! warning "Rechtlicher Hinweis" + Diese Bibliothek ist eine eigenständige, generische Arbeitsbibliothek. Sie ist nicht als Wiedergabe von DIN-/ISO-Normtexten zu verstehen. Normen werden ausschließlich als Methodenreferenz geführt. + +--- + +## A. Mechanische Gefährdungen (40) + +### HZ-M-001 — Quetschen zwischen bewegten Teilen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Verletzungsgefahr durch das Einklemmen von Körperteilen zwischen zwei gegeneinander oder zueinander bewegten Teilen. | +| **Typische Ursachen** | Gegenläufige Bewegung, fehlende Schutzabdeckung, unerwarteter Wiederanlauf, manuelles Eingreifen in den Arbeitsraum. | +| **Gefährliche Situation** | Bediener greift bei laufender Maschine in den Wirkbereich von Förderern, Pressen, Greifern oder Schiebern. | +| **Mögliche Schäden** | Fingerquetschung, Handverletzung, Knochenbruch, Amputation. | +| **Betroffene Rollen** | Maschinenbediener, Einrichter, Wartungstechniker. | +| **Lebensphasen** | Einrichten, Normalbetrieb, Störungsbeseitigung, Wartung. | +| **Komponenten** | Presse, Schieber, Förderband, Greifer, Schutztürbereich. | +| **Maßnahmenarten** | Inhärent sichere Konstruktion, trennende Schutzeinrichtungen, Verriegelung, sichere Stillsetzung. | +| **Nachweise** | Konstruktionsreview, Verriegelungstest, Sicherheitsfunktionstest. | + +### HZ-M-002 — Scheren durch gegeneinander laufende Kanten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr des Abtrennens oder Verletzens von Körperteilen durch schneidende bzw. scherenartige Bewegungen. | +| **Typische Ursachen** | Rotierende Messer, lineare Klingen, ungeeignete Abstände, fehlende Schutzeinhausung. | +| **Gefährliche Situation** | Bediener führt Material nach oder entfernt Störungen im Bereich bewegter Schneidorgane. | +| **Mögliche Schäden** | Schnittverletzungen, Teilamputation, schwere Weichteilverletzung. | +| **Betroffene Rollen** | Bediener, Einrichter, Reinigungspersonal. | +| **Lebensphasen** | Produktion, Reinigung, Wartung. | +| **Komponenten** | Schneidwerke, Stanzen, Scheren, Slicer. | +| **Maßnahmenarten** | Konstruktive Abschirmung, sichere Zuführung, Verriegelung, Not-Halt, Benutzerinformation. | +| **Nachweise** | Sichtprüfung, Funktionstest, Konstruktionsreview. | + +### HZ-M-003 — Schneiden an scharfen Werkzeugen oder Kanten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr von Schnittverletzungen durch offene Kanten, Werkzeuge oder bearbeitete Teile. | +| **Typische Ursachen** | Unentgratete Bauteile, offenliegende Messer, Werkzeugwechsel ohne Schutz. | +| **Gefährliche Situation** | Personal berührt bei Montage, Reinigung oder Entstörung scharfe Bereiche. | +| **Mögliche Schäden** | Schnittwunden, Sehnenverletzungen, Blutungen. | +| **Betroffene Rollen** | Bediener, Wartung, Reinigung, Montagepersonal. | +| **Lebensphasen** | Montage, Betrieb, Reinigung, Wartung. | +| **Komponenten** | Messer, Blechteile, Werkzeughalter, Fräser. | +| **Maßnahmenarten** | Entgratung, Abdeckungen, sichere Werkzeugaufnahme, Handschuhkonzept, Kennzeichnung. | +| **Nachweise** | Sichtprüfung, Arbeitsanweisung, Abnahmeprotokoll. | + +### HZ-M-004 — Einziehen an rotierenden Teilen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr, dass Kleidung, Haare oder Körperteile von rotierenden Teilen erfasst und eingezogen werden. | +| **Typische Ursachen** | Offene Wellen, Walzen, Riemen, fehlende Schutzverkleidung. | +| **Gefährliche Situation** | Bediener arbeitet in der Nähe rotierender Komponenten und kommt versehentlich in Kontakt. | +| **Mögliche Schäden** | Quetschungen, Abrissverletzungen, Skalierung, schwere Körperverletzung. | +| **Betroffene Rollen** | Bediener, Wartung, Reinigung. | +| **Lebensphasen** | Betrieb, Reinigung, Wartung. | +| **Komponenten** | Wellen, Walzen, Antriebe, Riemen, Spindeln. | +| **Maßnahmenarten** | Abdeckung, sichere Abstände, Stillsetzung vor Zugriff, Schutzkleidungsvorgaben. | +| **Nachweise** | Konstruktionsreview, Sichtprüfung, Betriebsanweisung. | + +### HZ-M-005 — Erfassen durch rotierende oder umlaufende Teile + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr des Erfasstwerdens durch bewegte Teile mit Mitnahmeeffekt. | +| **Typische Ursachen** | Umlaufende Förderer, Ketten, Rollenbahnen, offene Kupplungen. | +| **Gefährliche Situation** | Körperteil oder Kleidung gerät in Kontakt mit bewegter Oberfläche. | +| **Mögliche Schäden** | Mitziehen, Sturz, Quetschen, Knochenbrüche. | +| **Betroffene Rollen** | Bediener, Logistikpersonal, Wartung. | +| **Lebensphasen** | Betrieb, Materialtransport, Wartung. | +| **Komponenten** | Kettenförderer, Rollenbahnen, Kupplungen. | +| **Maßnahmenarten** | Verkleidung, Einzugssicherung, Abstandsregeln, Zugangsbeschränkung. | +| **Nachweise** | Sichtprüfung, Funktionsprüfung, Unterweisungsnachweis. | + +### HZ-M-006 — Stoßen an bewegten Maschinenteilen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Verletzungsgefahr durch Stoßkontakt mit ausfahrenden, schwenkenden oder sich schnell bewegenden Teilen. | +| **Typische Ursachen** | Schwenkbewegungen ohne Schutzraum, fehlende Warnung, mangelnde Sichtbarkeit. | +| **Gefährliche Situation** | Person hält sich im Schwenkbereich einer Anlage oder eines Roboters auf. | +| **Mögliche Schäden** | Prellungen, Kopfverletzungen, Sturzfolgen. | +| **Betroffene Rollen** | Bediener, Besucher, Wartung. | +| **Lebensphasen** | Betrieb, Einrichten, Wartung. | +| **Komponenten** | Roboterarm, Klappen, Schwenkeinheiten, Hubachsen. | +| **Maßnahmenarten** | Schutzraum, Geschwindigkeitsbegrenzung, Präsenzüberwachung, Warnsignale. | +| **Nachweise** | Konstruktionsreview, Sicherheitsfunktionstest, Sichtprüfung. | + +### HZ-M-007 — Herabfallende Teile oder Lasten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch ungesicherte oder fehlerhaft gehaltene Lasten, Werkstücke oder Bauteile. | +| **Typische Ursachen** | Greiferfehler, Haltekraftverlust, mangelhafte Lastsicherung, Materialbruch. | +| **Gefährliche Situation** | Last löst sich über Personen oder Arbeitsbereichen. | +| **Mögliche Schäden** | Kopfverletzung, Quetschung, tödliche Verletzung. | +| **Betroffene Rollen** | Bediener, Logistikpersonal, Wartung, Besucher. | +| **Lebensphasen** | Transport, Betrieb, Wartung, Montage. | +| **Komponenten** | Greifer, Hebezeuge, Spannsysteme, Magazine. | +| **Maßnahmenarten** | Lastsicherung, redundante Haltesysteme, Ausschlussbereiche, Inspektion. | +| **Nachweise** | Lasttest, Funktionsprüfung, Wartungsbericht. | + +### HZ-M-008 — Wegschleudern von Teilen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch mit hoher Energie aus dem Prozess austretende Teile, Werkstücke oder Bruchstücke. | +| **Typische Ursachen** | Werkzeugbruch, Werkstückversagen, zu hohe Drehzahl, fehlerhafte Einspannung. | +| **Gefährliche Situation** | Bruchstück verlässt den Arbeitsraum in Richtung Bediener oder Umgebung. | +| **Mögliche Schäden** | Augenverletzung, Penetrationstrauma, schwere Körperverletzung. | +| **Betroffene Rollen** | Bediener, Einrichter, Wartung. | +| **Lebensphasen** | Normalbetrieb, Einrichten, Testlauf. | +| **Komponenten** | Fräser, Schleifscheiben, Spannfutter, Hochgeschwindigkeitsspindeln. | +| **Maßnahmenarten** | Umhausung, Drehzahlbegrenzung, sichere Einspannung, Inspektion. | +| **Nachweise** | Belastungstest, Sichtprüfung, Abnahmetest. | + +### HZ-M-009 — Instabilität der Maschine oder von Baugruppen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr des Kippens, Verschiebens oder Zusammenbrechens von Maschinen oder Aufbauten. | +| **Typische Ursachen** | Fehlende Verankerung, unzureichende Statik, Schwerpunktverlagerung, Lastwechsel. | +| **Gefährliche Situation** | Maschine kippt im Betrieb, Transport oder bei Wartung. | +| **Mögliche Schäden** | Quetschung, Anprall, Sachschäden, tödliche Verletzung. | +| **Betroffene Rollen** | Montagepersonal, Bediener, Wartung, Logistikpersonal. | +| **Lebensphasen** | Transport, Montage, Inbetriebnahme, Betrieb. | +| **Komponenten** | Gestell, Schaltschrank, Portale, Hubbühnen. | +| **Maßnahmenarten** | Standsicherheitsnachweis, Verankerung, Schwerpunktkontrolle, Transportkonzept. | +| **Nachweise** | Festigkeitsnachweis, Montageprotokoll, Abnahmeprüfung. | + +### HZ-M-010 — Kollision mit bewegten Achsen oder Robotern + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr von Zusammenstößen zwischen Personen und automatisierten Bewegungen. | +| **Typische Ursachen** | Fehlender Schutzraum, Programmierfehler, Bedienereingriff, Sensorversagen. | +| **Gefährliche Situation** | Person befindet sich im Bewegungsraum während einer Achs- oder Roboterbewegung. | +| **Mögliche Schäden** | Prellungen, Knochenbrüche, Quetschungen, schwere Traumata. | +| **Betroffene Rollen** | Einrichter, Bediener, Wartung. | +| **Lebensphasen** | Einrichten, Teach-Modus, Automatikbetrieb, Wartung. | +| **Komponenten** | Roboter, Linearachsen, Portalsysteme, Pick-and-Place-Einheiten. | +| **Maßnahmenarten** | Schutzzäune, Zustimmschalter, sichere Geschwindigkeitsüberwachung, Kollisionsraumüberwachung. | +| **Nachweise** | Sicherheitsfunktionstest, Programmreview, Abnahmetest. | + +### HZ-M-011 — Überlast mechanischer Strukturen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr des Versagens durch Überschreiten zulässiger Lasten oder Kräfte. | +| **Typische Ursachen** | Falsche Parametrierung, ungeplante Lastfälle, falsche Werkstückdaten, Bedienfehler. | +| **Gefährliche Situation** | Tragende Struktur, Achse oder Greifer wird überbeansprucht. | +| **Mögliche Schäden** | Bruch, Wegschleudern, Lastabsturz, Folgekollisionen. | +| **Betroffene Rollen** | Bediener, Wartung, Prozessingenieur. | +| **Lebensphasen** | Betrieb, Umrüstung, Testbetrieb. | +| **Komponenten** | Greifer, Traversen, Rahmen, Werkzeugaufnahmen. | +| **Maßnahmenarten** | Lastbegrenzung, Plausibilitätsprüfung, Festigkeitsnachweis, Sensorik. | +| **Nachweise** | Berechnung, Lasttest, Parametrierfreigabe. | + +### HZ-M-012 — Bruch beweglicher oder tragender Teile + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch plötzliches Material- oder Bauteilversagen. | +| **Typische Ursachen** | Materialermüdung, Korrosion, Fehlbemessung, Stoßbelastung. | +| **Gefährliche Situation** | Bewegtes Bauteil bricht während des Betriebs oder der Wartung. | +| **Mögliche Schäden** | Anprall, Quetschen, herabfallende Teile, Sekundärunfälle. | +| **Betroffene Rollen** | Bediener, Wartung, Besucher. | +| **Lebensphasen** | Betrieb, Wartung, Inspektion. | +| **Komponenten** | Gelenke, Wellen, Halter, Gestelle, Hebeteile. | +| **Maßnahmenarten** | Werkstoffwahl, Inspektionszyklen, Lebensdauerüberwachung, Redundanz. | +| **Nachweise** | Festigkeitsnachweis, Wartungsprotokoll, Sichtprüfung. | + +### HZ-M-013 — Unerwarteter Wiederanlauf nach Stillstand + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr eines automatischen oder unbeabsichtigten Neustarts nach Unterbrechung. | +| **Typische Ursachen** | Spannungsausfall/-rückkehr, Software-Restart, ungesicherte Wiederanlaufbedingung. | +| **Gefährliche Situation** | Person arbeitet im Gefahrenbereich und Maschine setzt sich plötzlich wieder in Bewegung. | +| **Mögliche Schäden** | Quetschen, Stoßen, Scheren, schwere Verletzung. | +| **Betroffene Rollen** | Wartung, Reinigung, Einrichter. | +| **Lebensphasen** | Wartung, Störungsbeseitigung, Reinigung, Setup. | +| **Komponenten** | Antriebe, Förderer, Aktoren, Robotik. | +| **Maßnahmenarten** | Wiederanlaufschutz, verriegelte Freigabe, sichere Zustandslogik, LOTO. | +| **Nachweise** | Sicherheitsfunktionstest, Software-Test, Abnahmeprotokoll. | + +### HZ-M-014 — Werkstückverlust aus Spann- oder Haltesystem + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr, dass ein Werkstück aus seiner Aufnahme gelöst wird. | +| **Typische Ursachen** | Falsche Spannkraft, Verschleiß, Fehlbedienung, falsches Format. | +| **Gefährliche Situation** | Werkstück fällt oder wird aus dem Prozess herausgeschleudert. | +| **Mögliche Schäden** | Anprallverletzung, Augenschaden, Folgekollision. | +| **Betroffene Rollen** | Bediener, Einrichter, Wartung. | +| **Lebensphasen** | Betrieb, Umrüstung, Inbetriebnahme. | +| **Komponenten** | Spannfutter, Vakuumgreifer, Klemmen, Aufnahmen. | +| **Maßnahmenarten** | Spannkraftüberwachung, Plausibilisierung, Schutzhaube, Formatverriegelung. | +| **Nachweise** | Funktionstest, Parametrierprüfung, Abnahmetest. | + +### HZ-M-015 — Fehlpositionierung bewegter Einheiten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch Abweichung einer Bewegung von der vorgesehenen Sollbahn oder Endlage. | +| **Typische Ursachen** | Sensorfehler, Encoderfehler, Softwarefehler, Schlupf, Kalibrierfehler. | +| **Gefährliche Situation** | Achse fährt in verbotenen Bereich oder kollidiert mit Personen/Objekten. | +| **Mögliche Schäden** | Quetschen, Kollision, Bauteilschaden. | +| **Betroffene Rollen** | Bediener, Einrichter, Wartung. | +| **Lebensphasen** | Teach, Setup, Betrieb, Kalibrierung. | +| **Komponenten** | Servoantriebe, Portale, Roboter, Positionierachsen. | +| **Maßnahmenarten** | Positionsüberwachung, Referenzfahrten, Endlagenbegrenzung, Plausibilitätschecks. | +| **Nachweise** | Systemtest, Kalibrierprotokoll, Sicherheitsfunktionstest. | + +### HZ-M-016 — Verklemmen und Lösen gespeicherter mechanischer Energie + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch blockierte Bauteile, die sich nach Lösen schlagartig bewegen. | +| **Typische Ursachen** | Materialstau, Verzug, Federkraft, Restspannung. | +| **Gefährliche Situation** | Bediener beseitigt Blockierung manuell und gespeicherte Energie wird frei. | +| **Mögliche Schäden** | Schlagverletzung, Quetschung, Schnittverletzung. | +| **Betroffene Rollen** | Bediener, Wartung, Reinigung. | +| **Lebensphasen** | Störungsbeseitigung, Wartung, Reinigung. | +| **Komponenten** | Förderer, Federn, Spanner, Klappen, Messer. | +| **Maßnahmenarten** | Energieentlastung, Entstörkonzept, LOTO, sichere Zugänge. | +| **Nachweise** | Arbeitsanweisung, Sicherheitsfunktionstest, Unterweisungsnachweis. | + +### HZ-M-017 — Abrutschen oder Abstürzen an Arbeitsplätzen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr des Stolperns, Abrutschens oder Abstürzens im Maschinenumfeld. | +| **Typische Ursachen** | Glatte Oberflächen, fehlende Trittflächen, ungesicherte Höhenzugänge, Leckagen. | +| **Gefährliche Situation** | Personal bewegt sich auf Podesten, Wartungsbühnen oder in nassen Bereichen. | +| **Mögliche Schäden** | Prellungen, Frakturen, Kopfverletzungen. | +| **Betroffene Rollen** | Wartung, Reinigung, Bediener. | +| **Lebensphasen** | Wartung, Reinigung, Inspektion. | +| **Komponenten** | Bühnen, Treppen, Podeste, Maschinensockel. | +| **Maßnahmenarten** | Rutschhemmung, Geländer, Zugangskonzept, Reinigungskonzept. | +| **Nachweise** | Sichtprüfung, Wartungsprotokoll, Abnahme. | + +### HZ-M-018 — Kantenverletzung an Bauteilen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch scharfe Kanten, Ecken oder Grate an Maschinen- oder Werkstückteilen. | +| **Typische Ursachen** | Unzureichende Nachbearbeitung, Verschleiß, beschädigte Verkleidung. | +| **Gefährliche Situation** | Berührung beim Umrüsten, Reinigen oder Beladen. | +| **Mögliche Schäden** | Hautverletzung, Schnittwunde. | +| **Betroffene Rollen** | Bediener, Montage, Wartung, Reinigung. | +| **Lebensphasen** | Montage, Betrieb, Wartung, Reinigung. | +| **Komponenten** | Blechverkleidung, Werkstückträger, Werkzeughalter. | +| **Maßnahmenarten** | Entgratung, Kantenradius, Schutzhandschuhe, Sichtkontrolle. | +| **Nachweise** | Sichtprüfung, Freigabeprotokoll. | + +### HZ-M-019 — Verletzung durch Bohr- oder Fräswerkzeuge + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch Kontakt mit schnell rotierenden oder schneidenden Werkzeugen. | +| **Typische Ursachen** | Offene Bearbeitungszone, manuelle Eingriffe, falscher Werkzeugwechsel. | +| **Gefährliche Situation** | Bediener greift in Bearbeitungsraum oder kommt beim Wechsel in Kontakt. | +| **Mögliche Schäden** | Tiefe Schnittverletzung, Amputation, Augenverletzung. | +| **Betroffene Rollen** | Bediener, Einrichter, Wartung. | +| **Lebensphasen** | Betrieb, Werkzeugwechsel, Wartung. | +| **Komponenten** | Fräser, Bohrer, Bearbeitungsspindel. | +| **Maßnahmenarten** | Umhausung, Werkzeugstillstand, Verriegelung, Wechselanweisung. | +| **Nachweise** | Funktionstest, Arbeitsanweisung, Abnahmeprotokoll. | + +### HZ-M-020 — Schleifverletzung an Schleif- oder Polierorganen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch abrasiven Kontakt oder Werkzeugbruch bei Schleifprozessen. | +| **Typische Ursachen** | Offene Schleifzone, Scheibenbruch, falsche Montage. | +| **Gefährliche Situation** | Bediener hält sich vor rotierender Schleifscheibe oder im Funkenbereich auf. | +| **Mögliche Schäden** | Haut-/Augenverletzung, Wegschleuderung, Atembelastung. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Einrichten, Werkzeugwechsel. | +| **Komponenten** | Schleifscheibe, Polierwalze, Spindel. | +| **Maßnahmenarten** | Schutzhaube, Drehzahlbegrenzung, PSA, Staubabsaugung. | +| **Nachweise** | Sichtprüfung, Lasttest, Betriebsanweisung. | + +### HZ-M-021 — Pressverletzung in Press- oder Stanzprozessen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch hohe Kräfte in Pressbereichen. | +| **Typische Ursachen** | Fehlender Handschutz, ungesicherter Einlegebereich, Zweihandfehler. | +| **Gefährliche Situation** | Hände befinden sich beim Presshub im Werkzeugbereich. | +| **Mögliche Schäden** | Quetschung, Amputation, tödliche Verletzung. | +| **Betroffene Rollen** | Bediener, Einrichter. | +| **Lebensphasen** | Produktion, Einrichten, Testhub. | +| **Komponenten** | Presse, Stanze, Hubzylinder. | +| **Maßnahmenarten** | Zweihandsteuerung, Lichtgitter, Werkzeugschutz, Zustandsüberwachung. | +| **Nachweise** | Sicherheitsfunktionstest, Zyklustest, Abnahme. | + +### HZ-M-022 — Bewegte Lasten im Transportbereich + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch fahrende oder transportierende Einheiten im innerbetrieblichen Materialfluss. | +| **Typische Ursachen** | Fehlende Trennung von Verkehrswegen, fehlende Erkennung, Fehlsteuerung. | +| **Gefährliche Situation** | Person kreuzt den Fahrweg eines Förderwagens oder Shuttles. | +| **Mögliche Schäden** | Anstoß, Überrollung, Quetschung. | +| **Betroffene Rollen** | Logistikpersonal, Bediener, Besucher. | +| **Lebensphasen** | Betrieb, Logistik, Wartung. | +| **Komponenten** | AGV, Shuttle, Kettenförderer, Rollenbahn. | +| **Maßnahmenarten** | Wegekonzept, Sensorik, Warnsysteme, Geschwindigkeitsbegrenzung. | +| **Nachweise** | Verkehrswegeprüfung, Funktionstest, Betriebsanweisung. | + +### HZ-M-023 — Unkontrolliertes Nachlaufen bewegter Teile + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch Restbewegung nach dem Stoppbefehl. | +| **Typische Ursachen** | Trägheit, fehlende Bremsung, falsche Stillstandserkennung. | +| **Gefährliche Situation** | Person geht nach Stoppsignal von sofortigem Stillstand aus und greift ein. | +| **Mögliche Schäden** | Quetschen, Stoßen, Schnittverletzung. | +| **Betroffene Rollen** | Bediener, Wartung, Reinigung. | +| **Lebensphasen** | Betrieb, Reinigung, Wartung. | +| **Komponenten** | Lüfter, Walzen, Schwungräder, Spindeln. | +| **Maßnahmenarten** | Bremsen, Stillstandsüberwachung, Verriegelung bis Stillstand. | +| **Nachweise** | Sicherheitsfunktionstest, Messprotokoll. | + +### HZ-M-024 — Ungesicherte Schwerkraftbewegung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch Absinken oder Abfallen von Lasten oder Baugruppen infolge Schwerkraft. | +| **Typische Ursachen** | Energieausfall, Bremsversagen, fehlende Haltemechanismen. | +| **Gefährliche Situation** | Vertikalachse oder Klappe sinkt unkontrolliert ab. | +| **Mögliche Schäden** | Quetschung, Anprall, tödliche Verletzung. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung, Energieabschaltung. | +| **Komponenten** | Hubachsen, Hubtische, Klappen, Greiferachsen. | +| **Maßnahmenarten** | Haltebremsen, mechanische Sicherungen, Energieüberwachung. | +| **Nachweise** | Funktionstest, Bremsentest, Wartungsprotokoll. | + +### HZ-M-025 — Federkraftbedingte Rückstellbewegung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch plötzliches Zurückschnellen federbelasteter Teile. | +| **Typische Ursachen** | Entspannen von Federn, nicht gesicherter Ausbau, Fehljustage. | +| **Gefährliche Situation** | Wartungspersonal löst Halterungen oder Schutzabdeckungen. | +| **Mögliche Schäden** | Augenverletzung, Schlagverletzung, Schnittwunde. | +| **Betroffene Rollen** | Wartung, Montage. | +| **Lebensphasen** | Wartung, Reparatur, Montage. | +| **Komponenten** | Federmechanismen, Spannsysteme, Klappen. | +| **Maßnahmenarten** | Entspannprozedur, mechanische Sicherung, Wartungsanweisung. | +| **Nachweise** | Arbeitsanweisung, Unterweisungsnachweis. | + +### HZ-M-026 — Torsions- und Biegebruch an Wellen oder Armen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch Materialversagen infolge Torsion oder Biegung. | +| **Typische Ursachen** | Überlast, Resonanz, falsche Auslegung, Schwingung. | +| **Gefährliche Situation** | Mechanisches Element versagt unter Last und schlägt aus. | +| **Mögliche Schäden** | Anprall, Wegschleudern, Folgeschäden. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Testlauf, Wartung. | +| **Komponenten** | Wellen, Roboterarme, Hebel, Spindeln. | +| **Maßnahmenarten** | Festigkeitsnachweis, Zustandsüberwachung, Lastbegrenzung. | +| **Nachweise** | Berechnung, Prüfprotokoll, Wartungsbericht. | + +### HZ-M-027 — Resonanzbedingte Gefährdung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch verstärkte Schwingungen mit möglichem Versagen oder Kontrollverlust. | +| **Typische Ursachen** | Falsche Eigenfrequenzlage, Unwucht, Prozessänderung. | +| **Gefährliche Situation** | Maschine schwingt stark, Bauteile lockern sich oder brechen. | +| **Mögliche Schäden** | Bruch, Wegschleudern, Lärm, Vibrationsexposition. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Inbetriebnahme, Betrieb, Kalibrierung. | +| **Komponenten** | Gestelle, Spindeln, Schwingförderer. | +| **Maßnahmenarten** | Auslegung, Dämpfung, Überwachung, Grenzwertüberwachung. | +| **Nachweise** | Berechnung, Testlauf, Messprotokoll. | + +### HZ-M-028 — Einklemmen an Klappen, Türen und Verkleidungen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr des Einklemmens von Fingern oder Händen an schließenden Elementen. | +| **Typische Ursachen** | Schwere Türen, Feder-/Pneumatikunterstützung, fehlende Dämpfung. | +| **Gefährliche Situation** | Bediener schließt Zugangsklappe oder Wartungstür. | +| **Mögliche Schäden** | Fingerquetschung, Prellung, Fraktur. | +| **Betroffene Rollen** | Bediener, Wartung, Reinigung. | +| **Lebensphasen** | Betrieb, Reinigung, Wartung. | +| **Komponenten** | Türen, Hauben, Klappen, Wartungsabdeckungen. | +| **Maßnahmenarten** | Dämpfung, Griffgestaltung, Schutzspalte, Warnhinweise. | +| **Nachweise** | Sichtprüfung, Funktionsprüfung. | + +### HZ-M-029 — Unerwartete Werkzeugbewegung beim Wechsel + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch unbeabsichtigtes Bewegen von Werkzeugen während Rüst- oder Wechselvorgängen. | +| **Typische Ursachen** | Restenergie, Fehlbedienung, ungesicherter Moduswechsel. | +| **Gefährliche Situation** | Einrichter wechselt Werkzeug und Achse oder Werkzeug bewegt sich. | +| **Mögliche Schäden** | Quetschung, Schnittverletzung, Stoß. | +| **Betroffene Rollen** | Einrichter, Wartung. | +| **Lebensphasen** | Umrüstung, Einrichten, Wartung. | +| **Komponenten** | Werkzeugmagazine, Spindeln, Greifer. | +| **Maßnahmenarten** | Sichere Betriebsart, Zustimmschalter, Energieabschaltung. | +| **Nachweise** | Modustest, Arbeitsanweisung, Sicherheitsfunktionstest. | + +### HZ-M-030 — Personenkontakt mit frei bewegten Lastarmen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch schwenkende oder auskragende Lastaufnahmen und Hebelarme. | +| **Typische Ursachen** | Falscher Bewegungsraum, mangelhafte Trennung, Sichtbehinderung. | +| **Gefährliche Situation** | Person steht im Ausschwenkbereich. | +| **Mögliche Schäden** | Anstoß, Quetschung, Sturz. | +| **Betroffene Rollen** | Bediener, Besucher, Logistikpersonal. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | Schwenkarme, Manipulatoren, Hebeeinheiten. | +| **Maßnahmenarten** | Bereichssperre, reduzierte Geschwindigkeit, Warnsystem. | +| **Nachweise** | Layoutreview, Sicherheitsfunktionstest. | + +### HZ-M-031 — Scharfkantige Späne oder Splitter + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch scharfkantige Abfallprodukte von Zerspanungs- oder Bearbeitungsprozessen. | +| **Typische Ursachen** | Bearbeitungsvorgang, Reinigung ohne Werkzeuge, fehlende Späneführung. | +| **Gefährliche Situation** | Personal entfernt Späne manuell oder kommt mit ihnen in Kontakt. | +| **Mögliche Schäden** | Schnittverletzungen, Augenverletzungen. | +| **Betroffene Rollen** | Bediener, Reinigung, Wartung. | +| **Lebensphasen** | Betrieb, Reinigung, Wartung. | +| **Komponenten** | Späneförderer, Bearbeitungsräume, Auffangwannen. | +| **Maßnahmenarten** | Geschlossene Führung, Werkzeuge zur Entfernung, PSA, Reinigungsanweisung. | +| **Nachweise** | Betriebsanweisung, Sichtprüfung. | + +### HZ-M-032 — Gefährdung durch manuelle Kraftaufwendung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr von Verletzungen durch hohe Bedienkräfte oder manuelles Bewegen schwerer Teile. | +| **Typische Ursachen** | Schwere Türen, fehlende Hilfsmittel, unergonomische Gestaltung. | +| **Gefährliche Situation** | Bediener öffnet schwere Abdeckung oder bewegt Werkstück manuell. | +| **Mögliche Schäden** | Muskel-Skelett-Verletzungen, Quetschungen, Zerrungen. | +| **Betroffene Rollen** | Bediener, Wartung, Logistikpersonal. | +| **Lebensphasen** | Umrüstung, Reinigung, Wartung. | +| **Komponenten** | Schutzhauben, Werkzeugträger, Wechselteile. | +| **Maßnahmenarten** | Ergonomisches Design, Hebehilfen, Kraftreduzierung. | +| **Nachweise** | Ergonomiebewertung, Sichtprüfung. | + +### HZ-M-033 — Verkanten von Werkstücken oder Trägern + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch schlagartiges Lösen oder Kippen verkeilter Teile. | +| **Typische Ursachen** | Falsches Format, Verschleiß, Toleranzfehler, unsaubere Zuführung. | +| **Gefährliche Situation** | Bediener greift zur Störungsbeseitigung ein. | +| **Mögliche Schäden** | Quetschung, Schlagverletzung, Schnittverletzung. | +| **Betroffene Rollen** | Bediener, Einrichter. | +| **Lebensphasen** | Betrieb, Störungsbeseitigung, Setup. | +| **Komponenten** | Magazine, Förderer, Weichen, Werkstückträger. | +| **Maßnahmenarten** | Formatkontrolle, Entstörkonzept, sichere Zugänge. | +| **Nachweise** | Funktionstest, Arbeitsanweisung. | + +### HZ-M-034 — Gefährdung durch manuelles Heben schwerer Komponenten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch manuelles Bewegen schwerer Lasten oder Maschinenteile. | +| **Typische Ursachen** | Fehlende Hebehilfen, unzureichende Planung, enge Zugänge. | +| **Gefährliche Situation** | Wartung oder Umrüstung mit schwerem Bauteilwechsel. | +| **Mögliche Schäden** | Rückenverletzung, Sturz, Quetschung durch Lastabwurf. | +| **Betroffene Rollen** | Wartung, Montage, Logistikpersonal. | +| **Lebensphasen** | Montage, Umrüstung, Reparatur. | +| **Komponenten** | Motoren, Werkzeuge, Verkleidungen, Module. | +| **Maßnahmenarten** | Hebepunkte, Lastaufnahmehilfen, Gewichtskennzeichnung. | +| **Nachweise** | Montageanweisung, Risikobewertung, Sichtprüfung. | + +### HZ-M-035 — Gefährdung durch stoßende Rückschläge + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch plötzlichen Rückschlag eines Werkstücks oder Werkzeugs. | +| **Typische Ursachen** | Blockierung, falsche Bearbeitungsparameter, unsichere Führung. | +| **Gefährliche Situation** | Werkzeug greift aggressiv ein, Werkstück schlägt zurück. | +| **Mögliche Schäden** | Hand-/Armverletzung, Augenverletzung, Anprall. | +| **Betroffene Rollen** | Bediener. | +| **Lebensphasen** | Betrieb, Einrichten. | +| **Komponenten** | Sägen, Fräsen, Handlingsysteme. | +| **Maßnahmenarten** | Prozessbegrenzung, Führung, Schutzhaube, Schulung. | +| **Nachweise** | Testlauf, Betriebsanweisung. | + +### HZ-M-036 — Gefährdung durch unzureichende Sicht auf Bewegungsraum + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr, weil Bediener Bewegungen oder Gefahrenzonen nicht ausreichend erkennen kann. | +| **Typische Ursachen** | Schlechte HMI, verdeckte Bereiche, fehlende Signalisierung. | +| **Gefährliche Situation** | Person tritt in aktiven Bewegungsraum ohne Wahrnehmung der Gefahr ein. | +| **Mögliche Schäden** | Kollision, Quetschung, Anstoß. | +| **Betroffene Rollen** | Bediener, Einrichter, Besucher. | +| **Lebensphasen** | Betrieb, Setup, Wartung. | +| **Komponenten** | Einhausungen, Robotikzellen, Fördertechnik. | +| **Maßnahmenarten** | Sichtfenster, Kameras, Signale, Layoutanpassung. | +| **Nachweise** | Designreview, Bedienkonzeptprüfung. | + +### HZ-M-037 — Gefährdung durch ungesicherte manuelle Eingriffe + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch Eingriffe in laufende Prozesse ohne sichere Betriebsart. | +| **Typische Ursachen** | Produktionsdruck, schlechte Zugänglichkeit, fehlende Interlocks. | +| **Gefährliche Situation** | Bediener beseitigt Fehler oder richtet nach, während Bewegung aktiv bleibt. | +| **Mögliche Schäden** | Quetschung, Schnitt, Kollision. | +| **Betroffene Rollen** | Bediener, Einrichter. | +| **Lebensphasen** | Betrieb, Störungsbeseitigung, Setup. | +| **Komponenten** | Förderer, Bearbeitungsräume, Greifer. | +| **Maßnahmenarten** | Sichere Betriebsarten, Interlocks, Prozessoptimierung, Schulung. | +| **Nachweise** | Arbeitsanweisung, Sicherheitsfunktionstest. | + +### HZ-M-038 — Gefährdung durch fehlende mechanische Endanschläge + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch Überfahren zulässiger Verfahrwege oder Bewegungsgrenzen. | +| **Typische Ursachen** | Steuerungsfehler, Sensorversagen, falsche Parametrierung. | +| **Gefährliche Situation** | Achse fährt über Soll-Endlage hinaus und kollidiert. | +| **Mögliche Schäden** | Kollision, Bruch, Wegschleudern, Personengefährdung. | +| **Betroffene Rollen** | Bediener, Einrichter, Wartung. | +| **Lebensphasen** | Inbetriebnahme, Kalibrierung, Betrieb. | +| **Komponenten** | Linearachsen, Portale, Hubsysteme. | +| **Maßnahmenarten** | Mechanische Anschläge, sichere Endlagenüberwachung, Parametrierkontrolle. | +| **Nachweise** | Funktionstest, Konstruktionsreview. | + +### HZ-M-039 — Gefährdung durch unsichere Werkzeugmagazine + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch automatische Werkzeugwechsel- und Magazinbewegungen. | +| **Typische Ursachen** | Fehlende Abdeckung, falsche Synchronisation, Bedienereingriff. | +| **Gefährliche Situation** | Person greift in Bereich eines wechselnden Werkzeugs. | +| **Mögliche Schäden** | Stoß, Schnitt, Quetschung. | +| **Betroffene Rollen** | Einrichter, Wartung. | +| **Lebensphasen** | Umrüstung, Werkzeugwechsel, Wartung. | +| **Komponenten** | Werkzeugmagazin, Wechsler, Greifer. | +| **Maßnahmenarten** | Verriegelung, sichere Betriebsart, Zustimmschalter. | +| **Nachweise** | Sicherheitsfunktionstest, Arbeitsanweisung. | + +### HZ-M-040 — Gefährdung durch unkontrollierten Materialauswurf + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Mechanisch | +| **Beschreibung** | Gefahr durch Auswurf von Ausschuss, Restmaterial oder Teilen aus Prozesslinien. | +| **Typische Ursachen** | Prozessfehler, Blockade, Druckstoß, fehlerhafte Weiche. | +| **Gefährliche Situation** | Material verlässt Linie seitlich oder nach oben. | +| **Mögliche Schäden** | Anprall, Augenverletzung, Sturz. | +| **Betroffene Rollen** | Bediener, Logistikpersonal. | +| **Lebensphasen** | Betrieb, Testlauf. | +| **Komponenten** | Förderer, Ausschleuser, Pneumatikweichen, Bearbeitungsraum. | +| **Maßnahmenarten** | Umhausung, Leitbleche, Prozessüberwachung. | +| **Nachweise** | Funktionstest, Sichtprüfung. | + + +--- + +## B. Elektrische Gefährdungen (20) + +### HZ-E-001 — Direkter Kontakt mit spannungsführenden Teilen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr eines elektrischen Schlages durch Berührung aktiver Leiter oder Kontakte. | +| **Typische Ursachen** | Offene Schaltschrankteile, fehlende Abdeckung, Arbeiten unter Spannung. | +| **Gefährliche Situation** | Person berührt bei Wartung oder Störung spannungsführende Elemente. | +| **Mögliche Schäden** | Stromschlag, Verbrennung, Herzrhythmusstörung, Tod. | +| **Betroffene Rollen** | Elektriker, Wartung, Service. | +| **Lebensphasen** | Wartung, Fehlersuche, Inbetriebnahme. | +| **Komponenten** | Schaltschrank, Klemmen, Netzteile, Leistungsmodule. | +| **Maßnahmenarten** | Berührungsschutz, Freischaltung, LOTO, Zugangsberechtigung. | +| **Nachweise** | Schutzleiterprüfung, Sichtprüfung, Arbeitsfreigabe. | + +### HZ-E-002 — Indirekter Kontakt über leitfähige Gehäuse + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr, dass im Fehlerfall berührbare leitfähige Teile Spannung annehmen. | +| **Typische Ursachen** | Isolationsfehler, fehlender PE, defektes Netzteil. | +| **Gefährliche Situation** | Bediener berührt Gehäuse mit Fehlerstromführung. | +| **Mögliche Schäden** | Stromschlag, Verbrennung, Tod. | +| **Betroffene Rollen** | Bediener, Wartung, Besucher. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | Gehäuse, Antriebe, Heizungen, Bedienpanel. | +| **Maßnahmenarten** | Schutzerdung, Abschaltkonzept, Isolationsüberwachung. | +| **Nachweise** | Schutzleiterprüfung, Isolationsmessung, Prüfprotokoll. | + +### HZ-E-003 — Lichtbogenbildung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch hohen Energieeintrag, Hitze und Druckwelle infolge Lichtbogen. | +| **Typische Ursachen** | Kurzschluss, Schaltfehler, lose Kontakte, Arbeiten unter Spannung. | +| **Gefährliche Situation** | Schaltvorgang oder Fehler löst Lichtbogen im Schaltschrank aus. | +| **Mögliche Schäden** | Verbrennung, Augenverletzung, Brand, Tod. | +| **Betroffene Rollen** | Elektriker, Service. | +| **Lebensphasen** | Inbetriebnahme, Wartung, Fehlersuche. | +| **Komponenten** | Schaltgeräte, Sammelschienen, Klemmen. | +| **Maßnahmenarten** | Abschottung, geeignete Schaltgeräte, Freischaltregeln, PSA. | +| **Nachweise** | Prüfprotokoll, Schaltplanreview, Arbeitsanweisung. | + +### HZ-E-004 — Kurzschluss + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch hohen Kurzschlussstrom mit thermischer und mechanischer Wirkung. | +| **Typische Ursachen** | Verdrahtungsfehler, Isolationsversagen, Feuchtigkeit. | +| **Gefährliche Situation** | Fehler führt zu starker Erwärmung, Lichtbogen oder Folgeschäden. | +| **Mögliche Schäden** | Brand, Verbrennung, Sekundärschäden. | +| **Betroffene Rollen** | Elektriker, Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Inbetriebnahme, Wartung. | +| **Komponenten** | Netzverteilung, Schaltschränke, Leitungen. | +| **Maßnahmenarten** | Absicherung, Kurzschlussschutz, saubere Verdrahtung. | +| **Nachweise** | Schaltplanprüfung, Kurzschlussprüfung, Abnahme. | + +### HZ-E-005 — Überstrom und Überlastung elektrischer Kreise + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr der Erwärmung und Beschädigung durch zu hohen Betriebsstrom. | +| **Typische Ursachen** | Überlast, falsche Auslegung, blockierte Motoren. | +| **Gefährliche Situation** | Bauteile überhitzen und versagen oder verursachen Brand. | +| **Mögliche Schäden** | Brand, Rauch, Ausfall, Sekundärverletzung. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Inbetriebnahme. | +| **Komponenten** | Motoren, Leitungen, Netzteile, Sicherungen. | +| **Maßnahmenarten** | Überstromschutz, Dimensionierung, Temperaturüberwachung. | +| **Nachweise** | Lasttest, Schaltplanreview, Prüfprotokoll. | + +### HZ-E-006 — Isolationsfehler + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch beschädigte oder unzureichende Isolation elektrischer Leiter. | +| **Typische Ursachen** | Alterung, mechanische Beschädigung, Feuchte, Verschmutzung. | +| **Gefährliche Situation** | Fehlerstrom tritt an berührbaren Teilen oder in unerwarteten Pfaden auf. | +| **Mögliche Schäden** | Stromschlag, Brand, Anlagenausfall. | +| **Betroffene Rollen** | Bediener, Wartung, Elektriker. | +| **Lebensphasen** | Betrieb, Wartung, Reinigung. | +| **Komponenten** | Kabel, Motoren, Heizungen, Steckverbinder. | +| **Maßnahmenarten** | Isolationsüberwachung, Schutzarten, Kabelführung. | +| **Nachweise** | Isolationsmessung, Sichtprüfung. | + +### HZ-E-007 — Fehlende oder unzureichende Erdung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr, dass Fehlerströme nicht sicher abgeführt werden. | +| **Typische Ursachen** | Montagefehler, Korrosion, gebrochener PE, fehlende Verbindung. | +| **Gefährliche Situation** | Gehäuse wird im Fehlerfall spannungsführend. | +| **Mögliche Schäden** | Stromschlag, Brand. | +| **Betroffene Rollen** | Bediener, Elektriker, Wartung. | +| **Lebensphasen** | Montage, Inbetriebnahme, Betrieb. | +| **Komponenten** | Gehäuse, Schaltschränke, Motoren. | +| **Maßnahmenarten** | PE-Konzept, Erdungsmessung, Montagekontrolle. | +| **Nachweise** | Schutzleiterprüfung, Erdungsmessung. | + +### HZ-E-008 — Überspannung und Transienten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch kurzzeitige Spannungsspitzen, die Bauteile beschädigen. | +| **Typische Ursachen** | Netzstörungen, Schalthandlungen, Blitznähe. | +| **Gefährliche Situation** | Elektronik fällt aus oder reagiert unkontrolliert. | +| **Mögliche Schäden** | Geräteausfall, Brand, Fehlbewegung durch Steuerungsausfall. | +| **Betroffene Rollen** | Bediener, Wartung, IT/Elektrik. | +| **Lebensphasen** | Betrieb, Inbetriebnahme. | +| **Komponenten** | SPS, Netzteile, Sensorik, Kommunikationstechnik. | +| **Maßnahmenarten** | Überspannungsschutz, Filter, EMV-gerechtes Design. | +| **Nachweise** | Schaltplanreview, EMV-/Abnahmetest. | + +### HZ-E-009 — Blitzwirkung auf Anlagen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr direkter oder indirekter Blitzeinwirkung auf elektrische Systeme. | +| **Typische Ursachen** | Fehlender Blitzschutz, lange Außenleitungen, ungeeignete Ableitung. | +| **Gefährliche Situation** | Überspannung oder Zerstörung von Komponenten. | +| **Mögliche Schäden** | Brand, Stromschlag, Totalausfall. | +| **Betroffene Rollen** | Bediener, Wartung, Gebäudenutzer. | +| **Lebensphasen** | Betrieb. | +| **Komponenten** | Außenanlagen, Antennen, Netzanschlüsse. | +| **Maßnahmenarten** | Blitz-/Überspannungsschutz, Erdung, Zonenkonzept. | +| **Nachweise** | Planungsdokumente, Messprotokoll. | + +### HZ-E-010 — Kontaktfehler und lose Verbindungen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch erhöhte Übergangswiderstände und lokale Erwärmung. | +| **Typische Ursachen** | Schlechte Montage, Vibration, Korrosion, falsches Anzugsmoment. | +| **Gefährliche Situation** | Klemme wird heiß, Lichtbogen oder Ausfall entsteht. | +| **Mögliche Schäden** | Brand, Rauch, Systemausfall. | +| **Betroffene Rollen** | Elektriker, Wartung, Bediener. | +| **Lebensphasen** | Montage, Betrieb, Wartung. | +| **Komponenten** | Klemmen, Stecker, Schütze. | +| **Maßnahmenarten** | Montagevorgaben, Wartung, Inspektion, Thermografie. | +| **Nachweise** | Sichtprüfung, Wartungsprotokoll, Messprotokoll. | + +### HZ-E-011 — Kabelbruch oder gequetschte Leitungen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch mechanisch beschädigte Leitungen mit möglicher Strom- oder Signalunterbrechung. | +| **Typische Ursachen** | Schlechte Führung, Reibung, Biegebeanspruchung, Quetschung. | +| **Gefährliche Situation** | Schutzisolierung wird beschädigt oder Steuerung erhält falsche Signale. | +| **Mögliche Schäden** | Stromschlag, Fehlfunktion, Brand, Fehlbewegung. | +| **Betroffene Rollen** | Bediener, Wartung, Elektriker. | +| **Lebensphasen** | Betrieb, Wartung, Montage. | +| **Komponenten** | Energieketten, Anschlussleitungen, Schleppkabel. | +| **Maßnahmenarten** | Kabelführung, Zugentlastung, Schutzschlauch, Inspektion. | +| **Nachweise** | Sichtprüfung, Wartungsprotokoll. | + +### HZ-E-012 — Feuchtebedingte elektrische Gefährdung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch Kondensat, Spritzwasser oder Reinigungsmedien an elektrischen Komponenten. | +| **Typische Ursachen** | Unzureichende Schutzart, Reinigung, Leckagen, Klimaeinflüsse. | +| **Gefährliche Situation** | Feuchte verursacht Kriechstrom, Kurzschluss oder Berührungsgefahr. | +| **Mögliche Schäden** | Stromschlag, Brand, Anlagenstillstand. | +| **Betroffene Rollen** | Reinigung, Wartung, Bediener. | +| **Lebensphasen** | Reinigung, Betrieb, Wartung. | +| **Komponenten** | Bedienpanel, Sensorik, Schaltschränke, Klemmenkästen. | +| **Maßnahmenarten** | Schutzart, Dichtungskonzept, Trennung von Nass-/Elektrikbereich. | +| **Nachweise** | Sichtprüfung, Schutzartenachweis. | + +### HZ-E-013 — Fehlstrom über unerwartete Pfade + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch Fehlerströme über Gehäuse, Rohrleitungen oder Hilfskonstruktionen. | +| **Typische Ursachen** | PE-Fehler, Potenzialprobleme, beschädigte Isolation. | +| **Gefährliche Situation** | Person berührt leitfähige Teile unterschiedlicher Potenziale. | +| **Mögliche Schäden** | Stromschlag, Verbrennung. | +| **Betroffene Rollen** | Bediener, Wartung, Elektriker. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | Gehäuse, Gestell, Rohrsysteme. | +| **Maßnahmenarten** | Potenzialausgleich, Erdung, Fehlerstromschutz. | +| **Nachweise** | Messprotokolle, Schutzleiterprüfung. | + +### HZ-E-014 — Schütz- oder Relaisversagen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr, dass Leistungs- oder Sicherheitsabschaltung elektrisch nicht wirksam wird. | +| **Typische Ursachen** | Kontaktverschweißung, Überlast, falsche Dimensionierung. | +| **Gefährliche Situation** | Stoppsignal wird gegeben, Antrieb bleibt dennoch versorgt. | +| **Mögliche Schäden** | Fehlbewegung, Folgeunfall, Brand. | +| **Betroffene Rollen** | Bediener, Wartung, Einrichter. | +| **Lebensphasen** | Betrieb, Störung, Wartung. | +| **Komponenten** | Schütze, Relais, Leistungsschalter. | +| **Maßnahmenarten** | Diagnose, Redundanz, geeignete Auslegung, Testzyklen. | +| **Nachweise** | Sicherheitsfunktionstest, Wartungsprotokoll. | + +### HZ-E-015 — Steuerstromausfall mit sicherheitskritischer Folge + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr, dass der Verlust der Steuerspannung zu unsicherem Zustand führt. | +| **Typische Ursachen** | Netzteilversagen, Leitungsbruch, Klemme lose. | +| **Gefährliche Situation** | Aktor fällt in unerwarteten Zustand oder verliert Haltefunktion. | +| **Mögliche Schäden** | Fehlbewegung, Lastabfall, Prozessverlust. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | SPS-Versorgung, Ventile, Schütze, Sicherheitsmodule. | +| **Maßnahmenarten** | Fail-safe-Auslegung, Energiezustandsanalyse, Notabschaltkonzept. | +| **Nachweise** | Fault-Injection-Test, Systemtest. | + +### HZ-E-016 — Elektrische Erwärmung von Oberflächen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch heiße elektrische Komponenten und Kontaktflächen. | +| **Typische Ursachen** | Überlast, Kontaktfehler, unzureichende Kühlung. | +| **Gefährliche Situation** | Person berührt stark erhitzte Gehäuse oder Komponenten. | +| **Mögliche Schäden** | Verbrennungen, Brand. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | Widerstände, Heizer, Netzteile, Antriebe. | +| **Maßnahmenarten** | Abschirmung, Temperaturüberwachung, Warnhinweis. | +| **Nachweise** | Temperaturmessung, Sichtprüfung. | + +### HZ-E-017 — Fehlerhafte Steckverbindungen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch falsches Stecken, lose Stecker oder Verpolung. | +| **Typische Ursachen** | Fehlende Kodierung, Montagefehler, Vibration. | +| **Gefährliche Situation** | Versorgung oder Signale werden falsch geführt. | +| **Mögliche Schäden** | Funktionsausfall, Überhitzung, Fehlbewegung. | +| **Betroffene Rollen** | Montage, Wartung, Service. | +| **Lebensphasen** | Montage, Wartung, Reparatur. | +| **Komponenten** | Steckverbinder, Modulkabel, Sensoranschlüsse. | +| **Maßnahmenarten** | Kodierung, Verriegelung, Beschriftung, Prüfprozess. | +| **Nachweise** | Sichtprüfung, Funktionsprüfung. | + +### HZ-E-018 — Batterie- oder Energiespeichergefährdung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch gespeicherte elektrische Energie, thermisches Durchgehen oder Kurzschluss. | +| **Typische Ursachen** | Fehlbedienung, Beschädigung, falsches Ladeverfahren. | +| **Gefährliche Situation** | Speicher wird gewartet, ausgebaut oder kurzgeschlossen. | +| **Mögliche Schäden** | Stromschlag, Verbrennung, Brand, Explosion. | +| **Betroffene Rollen** | Wartung, Service, Elektriker. | +| **Lebensphasen** | Wartung, Reparatur, Entsorgung. | +| **Komponenten** | Batterien, USV, Kondensatorbänke. | +| **Maßnahmenarten** | Entladeeinrichtung, Schutzabdeckung, Arbeitsanweisung, Temperaturüberwachung. | +| **Nachweise** | Prüfprotokoll, Wartungsanweisung. | + +### HZ-E-019 — Fehlende Trennung von Leistungs- und Steuerkreisen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr durch Rückwirkungen oder Übertragung gefährlicher Spannungen in Steuerkreise. | +| **Typische Ursachen** | Verdrahtungsfehler, Designfehler, mangelhafte Isolation. | +| **Gefährliche Situation** | Niederspannungskreis wird gefährlich hoch beaufschlagt. | +| **Mögliche Schäden** | Stromschlag, Elektronikversagen, Sicherheitsfunktionsverlust. | +| **Betroffene Rollen** | Elektriker, Wartung, Bediener. | +| **Lebensphasen** | Inbetriebnahme, Wartung, Betrieb. | +| **Komponenten** | I/O-Module, Netzteile, Klemmen, Feldgeräte. | +| **Maßnahmenarten** | Galvanische Trennung, saubere Auslegung, Prüfung. | +| **Nachweise** | Schaltplanreview, Prüfprotokoll. | + +### HZ-E-020 — Restladung nach Abschaltung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Elektrisch | +| **Beschreibung** | Gefahr, dass nach dem Ausschalten noch gefährliche Spannungen vorhanden sind. | +| **Typische Ursachen** | Kondensatoren, Speicher, Entladezeit unterschätzt. | +| **Gefährliche Situation** | Wartung unmittelbar nach Abschaltung. | +| **Mögliche Schäden** | Stromschlag, Verbrennung. | +| **Betroffene Rollen** | Wartung, Elektriker. | +| **Lebensphasen** | Wartung, Reparatur, Demontage. | +| **Komponenten** | Frequenzumrichter, Kondensatorbänke, Netzteile. | +| **Maßnahmenarten** | Entladeeinrichtung, Wartezeitkennzeichnung, Spannungsnachweis. | +| **Nachweise** | Messprotokoll, Arbeitsanweisung. | + + +--- + +## C. Thermische Gefährdungen (10) + +### HZ-T-001 — Heiße Oberflächen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Thermisch | +| **Beschreibung** | Gefahr durch Berührung erhitzter Anlagenteile. | +| **Typische Ursachen** | Prozesswärme, elektrische Erwärmung, fehlende Isolierung. | +| **Gefährliche Situation** | Bediener oder Wartungspersonal berührt heiße Gehäuse, Leitungen oder Werkstücke. | +| **Mögliche Schäden** | Verbrennungen ersten bis dritten Grades. | +| **Betroffene Rollen** | Bediener, Wartung, Reinigung. | +| **Lebensphasen** | Betrieb, Wartung, Reinigung. | +| **Komponenten** | Heizzonen, Öfen, Motoren, Prozessleitungen. | +| **Maßnahmenarten** | Isolierung, Abschirmung, Kennzeichnung, Temperaturbegrenzung. | +| **Nachweise** | Temperaturmessung, Sichtprüfung. | + +### HZ-T-002 — Kalte Oberflächen und Kältebereiche + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Thermisch | +| **Beschreibung** | Gefahr von Kälteverletzungen durch Kontakt mit sehr kalten Oberflächen oder Medien. | +| **Typische Ursachen** | Kühlprozesse, Kältemedien, fehlende Isolierung. | +| **Gefährliche Situation** | Berührung kalter Leitungen oder Komponenten bei Betrieb/Wartung. | +| **Mögliche Schäden** | Kälteverbrennung, Hautschädigung, Erfrierung. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung, Reinigung. | +| **Komponenten** | Kühlleitungen, Kühlaggregate, Wärmetauscher. | +| **Maßnahmenarten** | Isolierung, Kennzeichnung, PSA, Zugangskonzept. | +| **Nachweise** | Sichtprüfung, Betriebsanweisung. | + +### HZ-T-003 — Wärmestrahlung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Thermisch | +| **Beschreibung** | Gefahr durch intensive Strahlungswärme aus Prozessen oder heißen Oberflächen. | +| **Typische Ursachen** | Offene Ofenbereiche, heiße Werkstücke, fehlende Abschirmung. | +| **Gefährliche Situation** | Person arbeitet nahe starker Wärmequelle. | +| **Mögliche Schäden** | Verbrennungen, Hitzestress, Augenschäden. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | Ofen, Trockner, Schmelzbereich. | +| **Maßnahmenarten** | Abschirmung, Distanz, Lüftung, PSA. | +| **Nachweise** | Messung, Arbeitsplatzbewertung. | + +### HZ-T-004 — Überhitzung von Komponenten oder Prozessen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Thermisch | +| **Beschreibung** | Gefahr durch unkontrollierte Temperaturanstiege mit Folgeversagen. | +| **Typische Ursachen** | Kühlungsfehler, Überlast, Sensorfehler. | +| **Gefährliche Situation** | Komponente überhitzt und führt zu Brand, Ausfall oder unsicherem Verhalten. | +| **Mögliche Schäden** | Brand, Rauch, Verbrennung, Fehlfunktion. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Inbetriebnahme. | +| **Komponenten** | Motoren, Heizer, Leistungselektronik, Lager. | +| **Maßnahmenarten** | Temperaturüberwachung, Abschaltung, Auslegung, Alarmierung. | +| **Nachweise** | Temperaturtest, Funktionstest. | + +### HZ-T-005 — Brandentstehung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Thermisch | +| **Beschreibung** | Gefahr der Entzündung brennbarer Stoffe oder Komponenten. | +| **Typische Ursachen** | Überhitzung, Kurzschluss, Funken, Reibung. | +| **Gefährliche Situation** | Brennbarer Stoff oder Bauteil entzündet sich im oder am Prozess. | +| **Mögliche Schäden** | Verbrennung, Rauchgasvergiftung, Sachschaden, Tod. | +| **Betroffene Rollen** | Alle im Gefahrenbereich befindlichen Personen. | +| **Lebensphasen** | Betrieb, Wartung, Reinigung. | +| **Komponenten** | Schaltschränke, Heizmodule, Staubbereiche. | +| **Maßnahmenarten** | Brandschutzkonzept, Temperaturgrenzen, Detektion, Materialwahl. | +| **Nachweise** | Prüfung, Brandschutzdokumentation. | + +### HZ-T-006 — Explosion durch entzündliche Gemische + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Thermisch | +| **Beschreibung** | Gefahr durch Zündung explosionsfähiger Atmosphäre oder Gemische. | +| **Typische Ursachen** | Dämpfe, Stäube, Leckagen, Funkenquellen. | +| **Gefährliche Situation** | Zündfähiges Gemisch trifft auf Zündquelle. | +| **Mögliche Schäden** | Druckwelle, Verbrennungen, schwere Mehrfachverletzungen, Tod. | +| **Betroffene Rollen** | Bediener, Wartung, Reinigung. | +| **Lebensphasen** | Betrieb, Reinigung, Wartung. | +| **Komponenten** | Behälter, Trockner, Dosiersysteme, Lackieranlagen. | +| **Maßnahmenarten** | Ex-Schutzkonzept, Lüftung, Zündquellenvermeidung. | +| **Nachweise** | Gefährdungsbeurteilung, Prüfdokumentation. | + +### HZ-T-007 — Funkenbildung mit Entzündungsgefahr + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Thermisch | +| **Beschreibung** | Gefahr durch Prozess- oder Fehlerfunken in brennbarer Umgebung. | +| **Typische Ursachen** | Schleifen, Kontaktfehler, mechanischer Abrieb. | +| **Gefährliche Situation** | Funken treffen auf brennbare Stoffe oder Staubwolken. | +| **Mögliche Schäden** | Brand, Explosion, Verbrennung. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | Schleifanlagen, Schalter, Kontaktstellen. | +| **Maßnahmenarten** | Abschirmung, Absaugung, Materialtrennung, Wartung. | +| **Nachweise** | Sichtprüfung, Prozessbewertung. | + +### HZ-T-008 — Überdruckbedingte thermische Gefährdung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Thermisch | +| **Beschreibung** | Gefahr durch heißen Austritt von Dampf, Gas oder Medien unter Druck. | +| **Typische Ursachen** | Ventilfehler, verstopfte Leitungen, Überhitzung von Behältern. | +| **Gefährliche Situation** | Heißes Medium tritt plötzlich aus. | +| **Mögliche Schäden** | Verbrühung, Verbrennung, Anprall. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung, Störung. | +| **Komponenten** | Dampfleitungen, Ventile, Druckbehälter. | +| **Maßnahmenarten** | Druckbegrenzung, Abschirmung, Inspektion. | +| **Nachweise** | Prüfprotokoll, Wartungsbericht. | + +### HZ-T-009 — Verbrühung durch heiße Flüssigkeiten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Thermisch | +| **Beschreibung** | Gefahr des Kontakts mit heißen Flüssigkeiten oder Reinigungsmedien. | +| **Typische Ursachen** | Leckagen, Öffnen unter Druck, Fehlbedienung. | +| **Gefährliche Situation** | Bediener oder Wartungspersonal wird mit heißem Medium getroffen. | +| **Mögliche Schäden** | Verbrühung, Verbrennung, Augenschaden. | +| **Betroffene Rollen** | Bediener, Wartung, Reinigung. | +| **Lebensphasen** | Reinigung, Wartung, Betrieb. | +| **Komponenten** | Tanks, Leitungen, CIP-Systeme, Wärmetauscher. | +| **Maßnahmenarten** | Drucklosmachen, Kennzeichnung, Entleerprozedur, PSA. | +| **Nachweise** | Arbeitsanweisung, Prüfdokumente. | + +### HZ-T-010 — Frost- oder Temperaturschockschäden + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Thermisch | +| **Beschreibung** | Gefahr durch rasche Temperaturwechsel an Materialien, Werkzeugen oder Körperteilen. | +| **Typische Ursachen** | Kältemedien, Prozesswechsel, Reinigungszyklen. | +| **Gefährliche Situation** | Person berührt stark abgekühlte Flächen oder Bauteile versagen thermisch. | +| **Mögliche Schäden** | Hautverletzung, Leckage, Materialbruch. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Reinigung, Wartung. | +| **Komponenten** | Kühlmodule, Behälter, Leitungen. | +| **Maßnahmenarten** | Materialauswahl, Isolierung, Arbeitsanweisung. | +| **Nachweise** | Designreview, Betriebsanweisung. | + +--- + +## D. Pneumatische / Hydraulische Gefährdungen (15) + +### HZ-PH-001 — Druckverlust mit sicherheitskritischer Folge + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr, dass der Verlust des Betriebsdrucks zu unsicherem Verhalten führt. | +| **Typische Ursachen** | Leckage, Pumpen-/Kompressorausfall, Ventilfehler. | +| **Gefährliche Situation** | Lasten sinken ab, Spannsysteme lösen, Aktoren verlieren sichere Lage. | +| **Mögliche Schäden** | Quetschung, Lastabwurf, Kollision. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung, Energieausfall. | +| **Komponenten** | Zylinder, Spannsysteme, Hubachsen. | +| **Maßnahmenarten** | Fail-safe-Auslegung, Halteventile, Drucküberwachung. | +| **Nachweise** | Funktionstest, Fault-Injection-Test. | + +### HZ-PH-002 — Druckspitzen und Stoßbelastung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch kurzzeitige Druckanstiege mit schlagartiger Aktorbewegung oder Leitungsbelastung. | +| **Typische Ursachen** | Ventilumschaltung, falsche Dämpfung, Fehlparametrierung. | +| **Gefährliche Situation** | Zylinder fährt ruckartig oder Leitung versagt. | +| **Mögliche Schäden** | Stoßverletzung, Schlauchbruch, Bauteilschaden. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Inbetriebnahme. | +| **Komponenten** | Ventile, Zylinder, Leitungen. | +| **Maßnahmenarten** | Dämpfung, Druckbegrenzung, Parametrierung. | +| **Nachweise** | Funktionstest, Parametrierprüfung. | + +### HZ-PH-003 — Schlauchbruch + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch Versagen druckführender Schläuche. | +| **Typische Ursachen** | Alterung, Abrieb, Überdruck, falsche Verlegung. | +| **Gefährliche Situation** | Druckmedium tritt unkontrolliert aus, Bewegung wird unkontrolliert. | +| **Mögliche Schäden** | Schlagverletzung, Verbrühung bei Heißmedien, Rutschgefahr. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | Hydraulikschläuche, Pneumatikleitungen. | +| **Maßnahmenarten** | Schlauchsicherung, Inspektion, Schutzschlauch. | +| **Nachweise** | Wartungsprotokoll, Sichtprüfung. | + +### HZ-PH-004 — Schlauchpeitschen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch schlagendes Leitungsende nach Abriss oder Lösen unter Druck. | +| **Typische Ursachen** | Mangelnde Sicherung, Materialversagen, falsche Kupplung. | +| **Gefährliche Situation** | Leitung reißt und schwingt unkontrolliert. | +| **Mögliche Schäden** | Schlagverletzung, Augenverletzung. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung, Anschließen/Abkoppeln. | +| **Komponenten** | Druckluftschläuche, Schnellkupplungen. | +| **Maßnahmenarten** | Peitschensicherungen, Druckentlastung, geeignete Kupplungen. | +| **Nachweise** | Sichtprüfung, Arbeitsanweisung. | + +### HZ-PH-005 — Leckage von Hydraulik- oder Pneumatikmedien + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch austretende Medien mit Prozess-, Umwelt- und Sicherheitsfolge. | +| **Typische Ursachen** | Dichtungsverschleiß, Montagefehler, Materialermüdung. | +| **Gefährliche Situation** | Medium tritt in Arbeitsraum aus und verursacht Rutsch- oder Kontaktgefahr. | +| **Mögliche Schäden** | Sturz, Hautkontakt, Brand bei geeigneten Medien, Prozessverlust. | +| **Betroffene Rollen** | Bediener, Reinigung, Wartung. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | Ventile, Zylinder, Leitungen, Pumpen. | +| **Maßnahmenarten** | Leckageüberwachung, Auffangwannen, Wartung. | +| **Nachweise** | Sichtprüfung, Wartungsbericht. | + +### HZ-PH-006 — Ventilfehler + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch falsches Schalten, Hängenbleiben oder internes Leck eines Ventils. | +| **Typische Ursachen** | Verschmutzung, Verschleiß, elektrischer Fehler, Fehlparametrierung. | +| **Gefährliche Situation** | Aktor bewegt sich unerwartet oder hält Position nicht. | +| **Mögliche Schäden** | Quetschung, Kollision, Lastabwurf. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung, Inbetriebnahme. | +| **Komponenten** | Wegeventile, Sicherheitsventile, Proportionalventile. | +| **Maßnahmenarten** | Diagnose, Filterung, sichere Ventilauswahl, Testzyklen. | +| **Nachweise** | Funktionstest, Wartungsprotokoll. | + +### HZ-PH-007 — Druckspeicherentladung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch gespeicherte Energie in Druckspeichern oder Leitungen nach Abschaltung. | +| **Typische Ursachen** | Fehlende Entlastung, unzureichende Kennzeichnung, Wartungsfehler. | +| **Gefährliche Situation** | Bauteil wird gelöst, während noch Druck anliegt. | +| **Mögliche Schäden** | Austritt von Medium, Schlag, Quetschung, Verbrühung. | +| **Betroffene Rollen** | Wartung, Service. | +| **Lebensphasen** | Wartung, Reparatur, Demontage. | +| **Komponenten** | Druckspeicher, Hydraulikaggregate, Luftkessel. | +| **Maßnahmenarten** | Entlastungsprozedur, Manometer, Sperrventil, Kennzeichnung. | +| **Nachweise** | Arbeitsanweisung, Messung. | + +### HZ-PH-008 — Pumpenausfall mit Folgerisiko + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr, dass nach Pumpen- oder Kompressorausfall ein unsicherer Zustand entsteht. | +| **Typische Ursachen** | Energieausfall, mechanischer Defekt, Überhitzung. | +| **Gefährliche Situation** | Druck bricht zusammen, Kühlung fällt aus, Schmierung fehlt. | +| **Mögliche Schäden** | Lastabfall, Überhitzung, Ausfall von Sicherheitsfunktionen. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Störung. | +| **Komponenten** | Hydraulikaggregat, Kompressor, Kühlsystem. | +| **Maßnahmenarten** | Überwachung, Redundanz, Fail-safe-Konzept. | +| **Nachweise** | Funktionstest, Störungssimulation. | + +### HZ-PH-009 — Hydraulikstrahl / Einspritzverletzung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch hochdruckbedingtes Eindringen von Fluid in Haut oder Gewebe. | +| **Typische Ursachen** | Feine Leckage, beschädigte Leitung, Arbeiten im Druckzustand. | +| **Gefährliche Situation** | Person sucht Leckage händisch oder befindet sich nahe austretendem Strahl. | +| **Mögliche Schäden** | Schwere Gewebeschädigung, Infektion, Amputation. | +| **Betroffene Rollen** | Wartung, Service. | +| **Lebensphasen** | Wartung, Fehlersuche. | +| **Komponenten** | Hochdruckleitungen, Verschraubungen, Hydraulikaggregate. | +| **Maßnahmenarten** | Drucklos machen, Lecksuche mit Hilfsmitteln, Arbeitsanweisung, PSA. | +| **Nachweise** | Unterweisungsnachweis, Wartungsanweisung. | + +### HZ-PH-010 — Zylinderfehlbewegung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch unbeabsichtigtes oder falsches Verfahren eines Zylinders. | +| **Typische Ursachen** | Ventilfehler, Sensorfehler, Fehlverdrahtung, Parametrierung. | +| **Gefährliche Situation** | Zylinder fährt, obwohl Person im Gefahrenbereich ist. | +| **Mögliche Schäden** | Quetschung, Kollision, Werkzeugschaden. | +| **Betroffene Rollen** | Bediener, Einrichter, Wartung. | +| **Lebensphasen** | Betrieb, Inbetriebnahme, Setup. | +| **Komponenten** | Pneumatikzylinder, Hydraulikzylinder, Spannsysteme. | +| **Maßnahmenarten** | Endlagenüberwachung, sichere Ventile, Modussteuerung. | +| **Nachweise** | Funktionstest, Sicherheitsfunktionstest. | + +### HZ-PH-011 — Rückströmung oder ungewollter Medienfluss + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch Rückfluss oder unkontrollierten Medienaustausch zwischen Kreisen. | +| **Typische Ursachen** | Fehlende Rückschlagventile, Druckdifferenzen, Defekte. | +| **Gefährliche Situation** | Aktor erhält unerwartet Energie oder Medium gelangt in falschen Kreislauf. | +| **Mögliche Schäden** | Fehlbewegung, Kontamination, Funktionsverlust. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | Ventilblöcke, Druckkreise, Rückleitungen. | +| **Maßnahmenarten** | Rückschlagventile, Kreis-Trennung, Diagnose. | +| **Nachweise** | Funktionstest, Hydraulikplanreview. | + +### HZ-PH-012 — Überdruck + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch Überschreiten zulässiger Drücke in Komponenten oder Systemen. | +| **Typische Ursachen** | Falsche Einstellung, Ventilfehler, Blockade. | +| **Gefährliche Situation** | Leitung, Behälter oder Aktor wird überbeansprucht. | +| **Mögliche Schäden** | Bersten, Leckage, Anprall, Brandfolge. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Inbetriebnahme. | +| **Komponenten** | Speicher, Leitungen, Zylinder, Ventile. | +| **Maßnahmenarten** | Druckbegrenzungsventile, Überwachung, Dimensionierung. | +| **Nachweise** | Drucktest, Parametrierprüfung. | + +### HZ-PH-013 — Unterdruck / Vakuumverlust + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch Verlust von Haltekraft oder Prozesssicherheit in Vakuumsystemen. | +| **Typische Ursachen** | Leckage, Pumpenausfall, Materialfehler. | +| **Gefährliche Situation** | Werkstück fällt ab oder wird falsch positioniert. | +| **Mögliche Schäden** | Lastabwurf, Kollision, Produktverlust. | +| **Betroffene Rollen** | Bediener, Logistikpersonal. | +| **Lebensphasen** | Betrieb, Wartung. | +| **Komponenten** | Vakuumgreifer, Sauger, Pumpen. | +| **Maßnahmenarten** | Vakuumüberwachung, Redundanz, Lastsicherung. | +| **Nachweise** | Funktionstest, Alarmtest. | + +### HZ-PH-014 — Kavitation und Folgeschäden + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch Dampfblasenbildung und resultierende Schäden in Pumpen/Leitungen. | +| **Typische Ursachen** | Falsche Ansaugbedingungen, Temperatur, Unterdruck. | +| **Gefährliche Situation** | Pumpe versagt oder erzeugt unvorhersehbares Verhalten. | +| **Mögliche Schäden** | Ausfall, Leckage, Prozessverlust, Sekundärschäden. | +| **Betroffene Rollen** | Wartung, Bediener. | +| **Lebensphasen** | Betrieb, Inbetriebnahme. | +| **Komponenten** | Pumpen, Ventile, Saugleitungen. | +| **Maßnahmenarten** | Auslegung, Überwachung, Wartung. | +| **Nachweise** | Wartungsbericht, Inbetriebnahmeprotokoll. | + +### HZ-PH-015 — Heißes oder gefährliches Druckmedium + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Pneumatik/Hydraulik | +| **Beschreibung** | Gefahr durch austretende unter Druck stehende Medien mit zusätzlicher stofflicher oder thermischer Wirkung. | +| **Typische Ursachen** | Leckage, Schlauchbruch, Ventilfehler. | +| **Gefährliche Situation** | Medium trifft Personal oder kontaminiert Umgebung. | +| **Mögliche Schäden** | Verbrühung, chemische Reizung, Rutschgefahr. | +| **Betroffene Rollen** | Bediener, Wartung, Reinigung. | +| **Lebensphasen** | Betrieb, Wartung, Störung. | +| **Komponenten** | Druckleitungen, Tanks, Aggregate. | +| **Maßnahmenarten** | Druckentlastung, Abschirmung, Auffangsystem, PSA. | +| **Nachweise** | Arbeitsanweisung, Wartungsprotokoll. | + + +--- + +## E. Steuerungs- / Software-Gefährdungen (25) + +### HZ-S-001 — Logikfehler in der Steuerung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch fehlerhafte Entscheidungs- oder Ablaufsteuerung. | +| **Typische Ursachen** | Spezifikationsfehler, Implementierungsfehler, unklare Zustände. | +| **Gefährliche Situation** | Maschine verhält sich anders als vorgesehen und erzeugt gefährliche Bewegungen oder Freigaben. | +| **Mögliche Schäden** | Quetschen, Kollision, Prozessfehler mit Sicherheitsfolge. | +| **Betroffene Rollen** | Bediener, Einrichter, Wartung. | +| **Lebensphasen** | Betrieb, Inbetriebnahme, Update. | +| **Komponenten** | SPS-Programm, Embedded Software, PLC-Logik. | +| **Maßnahmenarten** | Designreview, Teststrategie, klare Zustandsmodelle. | +| **Nachweise** | Software-Designreview, Systemtest, Code Review. | + +### HZ-S-002 — Zustandsfehler / inkonsistente Zustandsmaschine + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch unklare oder widersprüchliche Betriebszustände. | +| **Typische Ursachen** | Fehlende Übergangsdefinitionen, Parallelzustände, Sonderfälle. | +| **Gefährliche Situation** | Maschine befindet sich in unsicherem Mischzustand, z. B. Automatik + Service. | +| **Mögliche Schäden** | Unerwartete Bewegung, unzulässige Freigabe. | +| **Betroffene Rollen** | Bediener, Einrichter, Wartung. | +| **Lebensphasen** | Setup, Wartung, Betrieb, Restart. | +| **Komponenten** | Modusverwaltung, SPS-Zustandslogik, HMI. | +| **Maßnahmenarten** | Formale Zustandsmaschine, Moduskonzept, Testfälle. | +| **Nachweise** | Designreview, Modustest, Code Review. | + +### HZ-S-003 — Race Condition + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch zeitabhängige Konkurrenz mehrerer Prozesse oder Signale. | +| **Typische Ursachen** | Parallelität, asynchrone Events, fehlende Synchronisierung. | +| **Gefährliche Situation** | Freigaben oder Stopps werden in falscher Reihenfolge verarbeitet. | +| **Mögliche Schäden** | Fehlbewegung, fehlende Abschaltung, unstetes Verhalten. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Update, Fehlersituationen. | +| **Komponenten** | Multithread-Software, SPS-Tasking, Edge-Steuerungen. | +| **Maßnahmenarten** | Synchronisation, deterministische Verarbeitung, Belastungstests. | +| **Nachweise** | Code Review, Integrationstest, Fault-Injection-Test. | + +### HZ-S-004 — Timingfehler / Zykluszeitverletzung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch zu späte oder zu frühe Reaktion von Steuerungsfunktionen. | +| **Typische Ursachen** | Überlast, schlechte Priorisierung, Netzwerklatenz. | +| **Gefährliche Situation** | Sicherheitsrelevante Reaktion erfolgt nicht rechtzeitig. | +| **Mögliche Schäden** | Kollision, Überlauf, Fehlfunktion. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Lastspitzen, Update. | +| **Komponenten** | SPS, Echtzeitsystem, Buskommunikation. | +| **Maßnahmenarten** | Echtzeitanalyse, Priorisierung, Watchdogs, Lasttests. | +| **Nachweise** | Lasttest, Performance-Messung, Systemtest. | + +### HZ-S-005 — Sensorfehler mit gefährlicher Folge + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch fehlerhafte, fehlende oder unplausible Sensorsignale. | +| **Typische Ursachen** | Defekt, Verschmutzung, Fehlkalibrierung, Kommunikationsfehler. | +| **Gefährliche Situation** | Steuerung trifft auf falscher Datenbasis gefährliche Entscheidungen. | +| **Mögliche Schäden** | Fehlpositionierung, Kollision, Prozessfreigabe im unsicheren Zustand. | +| **Betroffene Rollen** | Bediener, Einrichter. | +| **Lebensphasen** | Betrieb, Kalibrierung, Wartung. | +| **Komponenten** | Endschalter, Encoder, Kameras, Näherungssensoren. | +| **Maßnahmenarten** | Plausibilisierung, Redundanz, Diagnose, Kalibrierkonzept. | +| **Nachweise** | Funktionstest, Kalibrierprotokoll, Diagnosetest. | + +### HZ-S-006 — Aktorfehler mit gefährlicher Folge + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch Aktoren, die falsche, verspätete oder keine Bewegung ausführen. | +| **Typische Ursachen** | Antriebsfehler, Ventilfehler, Verklemmen, Kommunikationsfehler. | +| **Gefährliche Situation** | Bewegung erfolgt trotz Stopp oder bleibt in unsicherer Position. | +| **Mögliche Schäden** | Quetschung, Lastabfall, Kollision. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Wartung, Start/Stopp. | +| **Komponenten** | Motoren, Zylinder, Ventile, Relais. | +| **Maßnahmenarten** | Rückmeldeüberwachung, Diagnose, sichere Abschaltung. | +| **Nachweise** | Funktionstest, Fault-Injection-Test. | + +### HZ-S-007 — Kommunikationsfehler zwischen Komponenten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch Verlust, Verzögerung oder Verfälschung interner Kommunikationsdaten. | +| **Typische Ursachen** | Busfehler, Netzwerkstörung, Timeout, Protokollinkonsistenz. | +| **Gefährliche Situation** | Steuerung und Peripherie haben unterschiedliche Annahmen zum Zustand. | +| **Mögliche Schäden** | Fehlbewegung, unzulässige Freigabe, Diagnoseverlust. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Update, Inbetriebnahme. | +| **Komponenten** | Feldbus, Ethernet, IO-Link, Gateway. | +| **Maßnahmenarten** | Timeout-Konzept, Heartbeats, Safe-State bei Kommunikationsverlust. | +| **Nachweise** | Systemtest, Störungssimulation. | + +### HZ-S-008 — Watchdog-Fehler + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr, dass Softwarestillstände oder Laufzeitfehler nicht erkannt oder falsch behandelt werden. | +| **Typische Ursachen** | Falsche Konfiguration, fehlende Überwachung, Deadlocks. | +| **Gefährliche Situation** | System hängt, ohne in sicheren Zustand zu wechseln. | +| **Mögliche Schäden** | Unkontrollierte Zustände, fehlender Stopp, Prozessverlust. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Lastspitzen, Ausnahmefälle. | +| **Komponenten** | Embedded Controller, IPC, SPS. | +| **Maßnahmenarten** | Watchdog-Konzept, Recovery-Strategie, Testfälle. | +| **Nachweise** | Fault-Injection-Test, Systemtest. | + +### HZ-S-009 — Deadlock / Stillstand konkurrierender Prozesse + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr, dass Prozesse sich gegenseitig blockieren und unsichere Folgezustände entstehen. | +| **Typische Ursachen** | Sperrkonflikte, Ressourcenfehler, fehlerhafte Thread-Steuerung. | +| **Gefährliche Situation** | Maschine bleibt in Zwischenzustand ohne sichere Auflösung. | +| **Mögliche Schäden** | Verklemmte Lasten, fehlende Sicherheitsreaktion, Prozessschaden. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Recovery, Update. | +| **Komponenten** | IPC-Software, Middleware, Multithread-Anwendungen. | +| **Maßnahmenarten** | Designanalyse, Timeout/Recovery, Testfälle. | +| **Nachweise** | Code Review, Lasttest. | + +### HZ-S-010 — Speicherleck / Ressourcenerschöpfung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch schleichenden Verlust verfügbarer Ressourcen mit Funktions- oder Sicherheitsfolge. | +| **Typische Ursachen** | Memory Leak, Dateihandle-Leak, ungeprüfte Puffer. | +| **Gefährliche Situation** | System wird instabil oder verliert Reaktionsfähigkeit im Betrieb. | +| **Mögliche Schäden** | Timingfehler, Absturz, Verlust von Schutzfunktionen. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Langzeitbetrieb. | +| **Komponenten** | IPC, Edge-Gateway, Embedded Runtime. | +| **Maßnahmenarten** | Monitoring, Stresstests, Speicheranalyse. | +| **Nachweise** | Langzeittest, Code Review, Monitoring-Logs. | + +### HZ-S-011 — Overflow / Numerische Fehler + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch Überläufe, Unterläufe oder fehlerhafte numerische Grenzen. | +| **Typische Ursachen** | Fehlende Validierung, falsche Datentypen, Sonderwerte. | +| **Gefährliche Situation** | Steuergrößen springen in unzulässige Bereiche. | +| **Mögliche Schäden** | Fehlbewegung, falsche Regelung, Kollision. | +| **Betroffene Rollen** | Bediener, Einrichter. | +| **Lebensphasen** | Betrieb, Parametrierung, Update. | +| **Komponenten** | Regelalgorithmen, Berechnungsfunktionen, APIs. | +| **Maßnahmenarten** | Input-Validierung, Grenzwerttests, robuste Datentypwahl. | +| **Nachweise** | Unit-Tests, Code Review, Systemtest. | + +### HZ-S-012 — Falsche Grenzwertlogik + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch falsch gesetzte oder falsch ausgewertete Grenzwerte. | +| **Typische Ursachen** | Konfigurationsfehler, Copy/Paste-Fehler, Anforderungsfehler. | +| **Gefährliche Situation** | Maschine läuft trotz gefährlicher Temperatur, Geschwindigkeit oder Position weiter. | +| **Mögliche Schäden** | Kollision, Überhitzung, Materialbruch. | +| **Betroffene Rollen** | Bediener, Wartung, Prozessingenieur. | +| **Lebensphasen** | Inbetriebnahme, Betrieb, Update. | +| **Komponenten** | Regelung, HMI-Konfiguration, SPS-Parameter. | +| **Maßnahmenarten** | Parametrierprüfung, Plausibilisierung, Vier-Augen-Prinzip. | +| **Nachweise** | Parametrierprotokoll, Systemtest. | + +### HZ-S-013 — Falsche Parametrierung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch ungeeignete Sollwerte, Formate oder Betriebsparameter. | +| **Typische Ursachen** | Bedienfehler, fehlende Validierung, falsches Rezept. | +| **Gefährliche Situation** | Maschine bewegt sich mit unzulässigen Kräften oder Wegen. | +| **Mögliche Schäden** | Produktfehler, Kollision, Quetschung. | +| **Betroffene Rollen** | Bediener, Einrichter, Prozessingenieur. | +| **Lebensphasen** | Setup, Umrüstung, Betrieb. | +| **Komponenten** | HMI, Rezeptverwaltung, Steuerungsparameter. | +| **Maßnahmenarten** | Rollenrechte, Plausibilitätsprüfungen, Freigabeprozess. | +| **Nachweise** | Änderungsprotokoll, Parametrierprüfung. | + +### HZ-S-014 — Fehlkonfiguration von Sicherheits- oder Prozesslogik + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch falsche Konfiguration von Optionen, Modi oder Sicherheitsgrenzen. | +| **Typische Ursachen** | Ungeprüfte Änderungen, unklare Verantwortlichkeit, Versionskonflikte. | +| **Gefährliche Situation** | Sicherheitsfunktion ist unwirksam oder Prozess läuft außerhalb zulässiger Grenzen. | +| **Mögliche Schäden** | Fehlbewegung, fehlende Abschaltung, Produkt-/Personenschaden. | +| **Betroffene Rollen** | Inbetriebnehmer, Wartung, Softwareingenieur. | +| **Lebensphasen** | Inbetriebnahme, Update, Service. | +| **Komponenten** | Konfigurationsdateien, Sicherheitsparameter, HMI. | +| **Maßnahmenarten** | Konfigurationsmanagement, Freigabeprozess, Audit-Trail. | +| **Nachweise** | Änderungsprotokoll, Review, Funktionstest. | + +### HZ-S-015 — Restart-Fehler nach Software- oder Stromneustart + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr, dass nach Neustart Zustände falsch rekonstruiert oder Ausgänge falsch gesetzt werden. | +| **Typische Ursachen** | Fehlende Persistenzlogik, falsche Initialisierung, Recovery-Fehler. | +| **Gefährliche Situation** | Aktoren werden beim Neustart unerwartet aktiv. | +| **Mögliche Schäden** | Quetschung, Kollision, Lastabfall. | +| **Betroffene Rollen** | Wartung, Bediener. | +| **Lebensphasen** | Restart, Störung, Update. | +| **Komponenten** | SPS, IPC, Antriebscontroller. | +| **Maßnahmenarten** | Sichere Initialisierung, Wiederanlaufschutz, definierte Zustände. | +| **Nachweise** | Restart-Test, Fault-Injection-Test. | + +### HZ-S-016 — Fehlerhafte Sequenzsteuerung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch falsche Reihenfolge von Prozess- oder Sicherheitsaktionen. | +| **Typische Ursachen** | Logikfehler, Sonderfall nicht berücksichtigt, manuelle Eingriffe. | +| **Gefährliche Situation** | Sicherheitsverriegelung wird zu spät aktiviert oder Bewegung beginnt zu früh. | +| **Mögliche Schäden** | Kollision, Quetschung, Materialschaden. | +| **Betroffene Rollen** | Bediener, Einrichter. | +| **Lebensphasen** | Betrieb, Umrüstung, Testbetrieb. | +| **Komponenten** | Ablaufsteuerungen, SPS-Schrittketten. | +| **Maßnahmenarten** | Formale Sequenzmodelle, Tests, Freigabelogik. | +| **Nachweise** | Integrationstest, Designreview. | + +### HZ-S-017 — Fehlerhafte Synchronisation mehrerer Achsen oder Module + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch unkoordinierte Bewegungen kooperierender Einheiten. | +| **Typische Ursachen** | Kommunikationslatenz, Parametrierfehler, Regelungsfehler. | +| **Gefährliche Situation** | Zwei Module treffen gleichzeitig im selben Raum aufeinander. | +| **Mögliche Schäden** | Kollision, Bauteilbruch, Personengefährdung. | +| **Betroffene Rollen** | Bediener, Einrichter. | +| **Lebensphasen** | Betrieb, Inbetriebnahme, Kalibrierung. | +| **Komponenten** | Mehrachssysteme, Robotik, Förderer. | +| **Maßnahmenarten** | Synchronisationsüberwachung, Zeitmodell, Tests. | +| **Nachweise** | Systemtest, Timingmessung. | + +### HZ-S-018 — Datenkorruption + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch fehlerhafte oder unvollständige Daten in Speicher, Übertragung oder Verarbeitung. | +| **Typische Ursachen** | Kommunikationsfehler, Speicherdefekt, Softwarebug, Stromausfall. | +| **Gefährliche Situation** | Maschine arbeitet mit falschen Rezepten, Zuständen oder Grenzwerten. | +| **Mögliche Schäden** | Fehlfunktion, Fehlbewegung, Qualitäts- und Sicherheitsverlust. | +| **Betroffene Rollen** | Bediener, Wartung, Qualität. | +| **Lebensphasen** | Betrieb, Update, Recovery. | +| **Komponenten** | Datenbanken, Rezeptspeicher, Speicherbausteine. | +| **Maßnahmenarten** | Integritätsprüfung, Checksummen, Backup/Restore, Transaktionslogik. | +| **Nachweise** | Systemtest, Recovery-Test. | + +### HZ-S-019 — Update-Fehler in Steuerungssoftware + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch unvollständige, fehlerhafte oder inkompatible Updates. | +| **Typische Ursachen** | Versionskonflikte, Abbruch, fehlende Validierung. | +| **Gefährliche Situation** | Steuerung startet nach Update in falschem Zustand oder mit defekter Funktion. | +| **Mögliche Schäden** | Fehlbewegung, Produktionsausfall, Sicherheitsverlust. | +| **Betroffene Rollen** | Wartung, Softwareingenieur, IT/OT. | +| **Lebensphasen** | Update, Inbetriebnahme, Service. | +| **Komponenten** | SPS, IPC, Firmware, Edge-Systeme. | +| **Maßnahmenarten** | Signierte Updates, Kompatibilitätsprüfung, Rollback. | +| **Nachweise** | Update-Test, Freigabedokument, Rollback-Test. | + +### HZ-S-020 — Rollback-Fehler + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr, dass ein Rückfall auf frühere Versionen Inkonsistenzen oder Funktionsverluste erzeugt. | +| **Typische Ursachen** | Daten-/Schema-Inkompatibilität, fehlende Rückfallstrategie. | +| **Gefährliche Situation** | System läuft nach Rücknahme mit veralteten Parametern oder defektem Zustand. | +| **Mögliche Schäden** | Fehlfunktion, unerkannte Sicherheitslücken, Prozessfehler. | +| **Betroffene Rollen** | Wartung, Softwareingenieur. | +| **Lebensphasen** | Update, Recovery. | +| **Komponenten** | Steuerungssoftware, Rezeptverwaltung, Datenbanken. | +| **Maßnahmenarten** | Migrationsstrategie, Rollback-Test, Versionsmanagement. | +| **Nachweise** | Testprotokoll, Freigabedokument. | + +### HZ-S-021 — Protokollfehler in internen Schnittstellen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch falsche Interpretation oder Verarbeitung von Datenprotokollen. | +| **Typische Ursachen** | Versionsunterschiede, Implementierungsfehler, unklare Spezifikationen. | +| **Gefährliche Situation** | Aktor oder Sensor wird falsch angesteuert oder interpretiert. | +| **Mögliche Schäden** | Fehlbewegung, Diagnoseverlust, Prozessstörung. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Integration, Update. | +| **Komponenten** | Busprotokolle, API-Schnittstellen, Gateways. | +| **Maßnahmenarten** | Interface-Tests, Versionierung, Robustheitstests. | +| **Nachweise** | Integrationstest, Protokollanalyse. | + +### HZ-S-022 — API-Fehler in modularen Anlagen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch fehlerhafte Service-/API-Kommunikation zwischen Modulen. | +| **Typische Ursachen** | Fehlende Validierung, falsche Vertragsannahmen, Timeout-Probleme. | +| **Gefährliche Situation** | Modul erhält unzulässige Befehle oder unvollständige Daten. | +| **Mögliche Schäden** | Fehlverhalten, falsche Freigaben, Sicherheitsverlust. | +| **Betroffene Rollen** | Bediener, Wartung, IT/OT. | +| **Lebensphasen** | Betrieb, Integration, Update. | +| **Komponenten** | Edge-Systeme, Middleware, APIs. | +| **Maßnahmenarten** | Contract-Tests, Input-Validierung, Fallback-Strategien. | +| **Nachweise** | API-Test, Code Review. | + +### HZ-S-023 — Datenvalidierungsfehler + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch ungeprüfte Eingabewerte aus HMI, Sensorik oder Netzwerk. | +| **Typische Ursachen** | Fehlende Grenzwertprüfung, falsches Datenschema, Parsing-Fehler. | +| **Gefährliche Situation** | Maschine übernimmt unplausible Werte und reagiert unsicher. | +| **Mögliche Schäden** | Fehlbewegung, Kollision, Produkt- und Personenschaden. | +| **Betroffene Rollen** | Bediener, Einrichter, IT/OT. | +| **Lebensphasen** | Betrieb, Parametrierung, Integration. | +| **Komponenten** | HMI, Schnittstellen, Rezeptsysteme. | +| **Maßnahmenarten** | Eingabevalidierung, Whitelisting, Plausibilitätschecks. | +| **Nachweise** | Testfälle, Code Review. | + +### HZ-S-024 — Event-Handling-Fehler + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch Verlust, Doppelverarbeitung oder falsche Priorisierung von Ereignissen. | +| **Typische Ursachen** | Queue-Fehler, Reentrancy, fehlerhaftes Callback-Verhalten. | +| **Gefährliche Situation** | Not-Aus- oder Stop-Ereignis wird verzögert oder überschrieben. | +| **Mögliche Schäden** | Fehlender Stopp, unkontrolliertes Verhalten. | +| **Betroffene Rollen** | Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Ausnahmezustände, Update. | +| **Komponenten** | Runtime-Systeme, Ereignisbusse, HMI. | +| **Maßnahmenarten** | Priorisierung, deterministische Verarbeitung, Testfälle. | +| **Nachweise** | Integrationstest, Fault-Injection-Test. | + +### HZ-S-025 — Zeitfehler / falsche Zeitbasis + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Steuerung/Software | +| **Beschreibung** | Gefahr durch inkonsistente Zeitstempel, Uhrensprünge oder falsche Taktraten. | +| **Typische Ursachen** | Unsynchronisierte Uhren, NTP-Fehler, Reset-Effekte. | +| **Gefährliche Situation** | Sequenzen, Logs oder Sicherheitsfristen werden falsch interpretiert. | +| **Mögliche Schäden** | Diagnoseversagen, inkonsistente Steuerung, falsche Freigaben. | +| **Betroffene Rollen** | Wartung, IT/OT, Qualität. | +| **Lebensphasen** | Betrieb, Netzwerkstörung, Update. | +| **Komponenten** | Controller, Gateways, Logger, verteilte Systeme. | +| **Maßnahmenarten** | Zeitsynchronisation, Monotonic Clocks, Plausibilitätsprüfungen. | +| **Nachweise** | Systemtest, Logreview. | + + +--- + +## F. Cyber-Gefährdungen (20) + +### HZ-C-001 — Unautorisierter Zugriff auf Systemfunktionen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr, dass Unbefugte auf Maschinen- oder Steuerungsfunktionen zugreifen. | +| **Typische Ursachen** | Fehlende Authentifizierung, zu weite Rechte, offene Services. | +| **Gefährliche Situation** | Angreifer oder unberechtigte Person ändert Parameter oder startet Funktionen. | +| **Mögliche Schäden** | Fehlbewegung, Produktionsausfall, Sicherheitsverlust. | +| **Betroffene Rollen** | Bediener, IT/OT, Betreiber. | +| **Lebensphasen** | Betrieb, Fernwartung, Service. | +| **Komponenten** | HMI, Weboberflächen, Fernzugriff, APIs. | +| **Maßnahmenarten** | Starke Authentifizierung, RBAC, Netztrennung, Audit-Trail. | +| **Nachweise** | Penetration Test, IAM-Review, Logprüfung. | + +### HZ-C-002 — Passwortangriff / Brute Force + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch systematisches Erraten oder Probieren von Zugangsdaten. | +| **Typische Ursachen** | Schwache Passwörter, fehlende Sperrmechanismen, Default-Zugänge. | +| **Gefährliche Situation** | Angreifer erlangt Zugriff auf Bedien- oder Servicefunktionen. | +| **Mögliche Schäden** | Unautorisierte Änderungen, Datenabfluss, Sicherheitsverlust. | +| **Betroffene Rollen** | IT/OT, Betreiber, Bediener. | +| **Lebensphasen** | Betrieb, Fernzugriff. | +| **Komponenten** | HMI, VPN, Webportal, Servicekonten. | +| **Maßnahmenarten** | MFA, Account-Lockout, Passwortpolicy, Monitoring. | +| **Nachweise** | Penetration Test, Konfigurationsprüfung. | + +### HZ-C-003 — Credential Leak / Abfluss von Zugangsdaten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch kompromittierte Passwörter, Tokens oder Zertifikate. | +| **Typische Ursachen** | Unsichere Speicherung, Klartextdateien, Phishing, fehlende Rotation. | +| **Gefährliche Situation** | Dritte können sich mit gültigen Credentials anmelden. | +| **Mögliche Schäden** | Unautorisierter Zugriff, Manipulation, Datenabfluss. | +| **Betroffene Rollen** | IT/OT, Betreiber, Fernwartungsdienst. | +| **Lebensphasen** | Betrieb, Service, Update. | +| **Komponenten** | Passwortspeicher, APIs, Fernwartungssysteme. | +| **Maßnahmenarten** | Secret-Management, Rotation, MFA, Least Privilege. | +| **Nachweise** | Audit, Konfigurationsprüfung. | + +### HZ-C-004 — Remote Exploit einer Netzwerkkomponente + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr der Ausnutzung einer Schwachstelle aus dem Netzwerk. | +| **Typische Ursachen** | Ungepatchte Software, exponierte Dienste, unsichere Bibliotheken. | +| **Gefährliche Situation** | Angreifer übernimmt oder beeinflusst Steuerungskomponenten. | +| **Mögliche Schäden** | Produktionsausfall, Manipulation, Sicherheitsfunktionseingriff. | +| **Betroffene Rollen** | Betreiber, IT/OT, Bediener. | +| **Lebensphasen** | Betrieb, Fernwartung. | +| **Komponenten** | IPC, Gateways, Webserver, Fernwartungsrouter. | +| **Maßnahmenarten** | Patchmanagement, Segmentierung, Hardening, Schwachstellenscans. | +| **Nachweise** | Vulnerability Scan, Pentest, Patchprotokoll. | + +### HZ-C-005 — API-Missbrauch + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch absichtliche oder unbeabsichtigte Fehlbenutzung von Programmierschnittstellen. | +| **Typische Ursachen** | Fehlende Autorisierung, fehlende Input-Validierung, unsichere Endpunkte. | +| **Gefährliche Situation** | Externe Systeme setzen unzulässige Befehle oder Daten ab. | +| **Mögliche Schäden** | Fehlfunktion, Datenabfluss, Manipulation. | +| **Betroffene Rollen** | IT/OT, Softwareingenieur, Betreiber. | +| **Lebensphasen** | Integration, Betrieb, Update. | +| **Komponenten** | REST-API, OPC UA, Middleware. | +| **Maßnahmenarten** | AuthN/AuthZ, Schema-Validierung, Rate-Limits, Audit-Logging. | +| **Nachweise** | API-Test, Pentest. | + +### HZ-C-006 — Parameter-Manipulation + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr, dass sicherheits- oder prozessrelevante Parameter unbefugt verändert werden. | +| **Typische Ursachen** | Mangelnde Rechtekontrolle, unsichere Protokolle, schwache Authentifizierung. | +| **Gefährliche Situation** | Grenzwerte, Geschwindigkeiten oder Freigaben werden verändert. | +| **Mögliche Schäden** | Kollision, Überlast, Qualitätsverlust, Sicherheitsverlust. | +| **Betroffene Rollen** | Bediener, Betreiber, IT/OT. | +| **Lebensphasen** | Betrieb, Fernwartung, Service. | +| **Komponenten** | HMI, Rezeptverwaltung, SPS-Parameter. | +| **Maßnahmenarten** | Rollenrechte, Signierung, Änderungsprotokoll, Vier-Augen-Freigabe. | +| **Nachweise** | Audit-Logs, Pentest, Konfigurationsreview. | + +### HZ-C-007 — Update-Manipulation + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch manipulierte oder gefälschte Softwareupdates. | +| **Typische Ursachen** | Fehlende Signaturprüfung, unsichere Downloadpfade, kompromittierter Server. | +| **Gefährliche Situation** | Anlage installiert schädliche oder veränderte Software. | +| **Mögliche Schäden** | Backdoor, Funktionsmanipulation, Totalausfall. | +| **Betroffene Rollen** | Betreiber, IT/OT, Wartung. | +| **Lebensphasen** | Update, Service. | +| **Komponenten** | Update-Agent, Firmware-Updater, Fernwartungssystem. | +| **Maßnahmenarten** | Signierte Updates, Secure Boot, Hash-Prüfung, Freigabeprozess. | +| **Nachweise** | Signaturprüfung, Update-Test, Audit. | + +### HZ-C-008 — Firmware-Manipulation + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch unbefugte Änderung der Firmware von Steuerungs- oder Feldgeräten. | +| **Typische Ursachen** | Ungesicherte Schnittstellen, fehlende Integritätsprüfung, physischer Zugriff. | +| **Gefährliche Situation** | Gerät arbeitet mit manipuliertem Verhalten unterhalb der Anwendungsebene. | +| **Mögliche Schäden** | Fehlbewegung, Diagnoseverlust, persistente Kompromittierung. | +| **Betroffene Rollen** | Betreiber, Wartung, IT/OT. | +| **Lebensphasen** | Service, Update, Betrieb. | +| **Komponenten** | Drives, I/O-Module, Sensoren, Controller. | +| **Maßnahmenarten** | Secure Boot, Signatur, Zugriffsbegrenzung, Versionskontrolle. | +| **Nachweise** | Firmware-Integritätsprüfung, Audit. | + +### HZ-C-009 — Malware-Infektion + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch schädliche Software auf Maschinen- oder Engineering-Systemen. | +| **Typische Ursachen** | Wechseldatenträger, ungepatchte Systeme, Phishing, unsichere Downloads. | +| **Gefährliche Situation** | Schadsoftware beeinflusst Steuerung, Verfügbarkeit oder Datenintegrität. | +| **Mögliche Schäden** | Ausfall, Manipulation, Datenverlust. | +| **Betroffene Rollen** | Betreiber, IT/OT, Engineering. | +| **Lebensphasen** | Betrieb, Wartung, Engineering. | +| **Komponenten** | IPC, Engineering-Station, HMI, Server. | +| **Maßnahmenarten** | Application Control, AV/EDR, Segmentierung, Medienkontrolle. | +| **Nachweise** | Security-Audit, Malware-Schutz-Review. | + +### HZ-C-010 — Ransomware-Angriff + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr der Verschlüsselung oder Blockade kritischer Systeme durch Erpressungssoftware. | +| **Typische Ursachen** | Phishing, Remote-Exploit, mangelnde Segmentierung. | +| **Gefährliche Situation** | Produktions- oder Steuerungssysteme werden unbenutzbar. | +| **Mögliche Schäden** | Produktionsstillstand, Datenverlust, Notbetrieb mit Sicherheitsrisiko. | +| **Betroffene Rollen** | Betreiber, IT/OT, Management. | +| **Lebensphasen** | Betrieb. | +| **Komponenten** | Server, HMI, Backends, Historian. | +| **Maßnahmenarten** | Backup/Restore, Segmentierung, MFA, Incident Response. | +| **Nachweise** | Recovery-Test, Security-Audit. | + +### HZ-C-011 — Man-in-the-Middle-Angriff + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr der unbemerkten Manipulation oder Ausleitung von Kommunikationsdaten. | +| **Typische Ursachen** | Unverschlüsselte Kommunikation, unsichere Netzwerke, Zertifikatsprobleme. | +| **Gefährliche Situation** | Steuerbefehle oder Diagnosedaten werden verändert oder mitgelesen. | +| **Mögliche Schäden** | Fehlfunktion, Datenabfluss, Fehlentscheidung. | +| **Betroffene Rollen** | Betreiber, IT/OT. | +| **Lebensphasen** | Betrieb, Fernwartung, Integration. | +| **Komponenten** | Netzwerke, Fernwartung, APIs, OPC UA. | +| **Maßnahmenarten** | Verschlüsselung, Zertifikatsmanagement, Netzsicherheit. | +| **Nachweise** | Security-Test, Konfigurationsreview. | + +### HZ-C-012 — Spoofing von Geräten oder Diensten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch Vortäuschen legitimer Identitäten im Netzwerk. | +| **Typische Ursachen** | Fehlende Geräteauthentifizierung, unsichere Discovery, ARP/DNS-Schwächen. | +| **Gefährliche Situation** | Anlage vertraut gefälschtem Sensor, Gateway oder Server. | +| **Mögliche Schäden** | Fehlsteuerung, Datenverlust, Angriffsfortsetzung. | +| **Betroffene Rollen** | IT/OT, Betreiber. | +| **Lebensphasen** | Betrieb, Integration. | +| **Komponenten** | Sensoren, Gateways, Dienste, Netzwerkkomponenten. | +| **Maßnahmenarten** | Geräteauthentifizierung, Zertifikate, Netzsegmentierung. | +| **Nachweise** | Security-Test, Netzwerkreview. | + +### HZ-C-013 — Replay-Angriff + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch Wiederholung gültiger Kommunikationsnachrichten zu späterem Zeitpunkt. | +| **Typische Ursachen** | Fehlende Nonces/Zeitstempel, unsichere Protokolle. | +| **Gefährliche Situation** | Alter Freigabebefehl wird erneut wirksam. | +| **Mögliche Schäden** | Unerwartete Aktion, unberechtigter Zustand. | +| **Betroffene Rollen** | IT/OT, Betreiber. | +| **Lebensphasen** | Betrieb, Fernwartung. | +| **Komponenten** | Protokolle, APIs, Funkstrecken. | +| **Maßnahmenarten** | Zeitstempel, Sequenznummern, Kryptografie. | +| **Nachweise** | Protokolltest, Pentest. | + +### HZ-C-014 — Denial of Service + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr der Verfügbarkeitsbeeinträchtigung durch Überlast oder Blockade. | +| **Typische Ursachen** | Netzwerkangriff, Ressourcenmangel, Fehlkonfiguration. | +| **Gefährliche Situation** | HMI, API oder Steuerung reagiert nicht mehr rechtzeitig. | +| **Mögliche Schäden** | Stillstand, Verlust von Überwachung/Fernwartung, Fehlreaktionen. | +| **Betroffene Rollen** | Betreiber, IT/OT, Bediener. | +| **Lebensphasen** | Betrieb. | +| **Komponenten** | Netzwerke, Gateways, Webdienste, IPC. | +| **Maßnahmenarten** | Rate-Limits, Segmentierung, Ressourcenbegrenzung, Monitoring. | +| **Nachweise** | Lasttest, Security-Test. | + +### HZ-C-015 — Privilege Escalation + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr, dass Benutzer oder Prozesse unzulässig höhere Rechte erlangen. | +| **Typische Ursachen** | Softwarefehler, falsche Rechtevergabe, veraltete Komponenten. | +| **Gefährliche Situation** | Niedrig privilegierter Zugang führt zu Administrationsrechten. | +| **Mögliche Schäden** | Konfigurationsänderung, Abschaltung, Datenzugriff. | +| **Betroffene Rollen** | Betreiber, IT/OT. | +| **Lebensphasen** | Betrieb, Service. | +| **Komponenten** | Betriebssysteme, Anwendungen, Fernwartung. | +| **Maßnahmenarten** | Least Privilege, Patchmanagement, Hardening, Codeprüfung. | +| **Nachweise** | Pentest, Rechte-Review. | + +### HZ-C-016 — Unsichere Default-Credentials + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch voreingestellte, bekannte oder triviale Zugangsdaten. | +| **Typische Ursachen** | Werkskonfiguration, fehlender Onboarding-Prozess. | +| **Gefährliche Situation** | Unbefugte melden sich mit Standarddaten an. | +| **Mögliche Schäden** | Kompletter Zugriff, Manipulation, Datenabfluss. | +| **Betroffene Rollen** | Betreiber, IT/OT, Hersteller-Service. | +| **Lebensphasen** | Inbetriebnahme, Betrieb. | +| **Komponenten** | HMIs, Router, Kameras, SPS-Webdienste. | +| **Maßnahmenarten** | Erzwungener Passwortwechsel, individuelle Credentials, Deaktivierung Defaults. | +| **Nachweise** | Konfigurationsprüfung, Audit. | + +### HZ-C-017 — Unsichere Schnittstellen / offene Ports + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch unnötig exponierte Dienste und Kommunikationswege. | +| **Typische Ursachen** | Standardkonfiguration, fehlendes Hardening, Testdienste. | +| **Gefährliche Situation** | Angriffsfläche wird vergrößert und für Exploits nutzbar. | +| **Mögliche Schäden** | Kompromittierung, Ausfall, Manipulation. | +| **Betroffene Rollen** | IT/OT, Betreiber. | +| **Lebensphasen** | Inbetriebnahme, Betrieb. | +| **Komponenten** | Controller, IPC, Gateways, Netzwerkgeräte. | +| **Maßnahmenarten** | Hardening, Port-/Dienst-Minimierung, Firewall-Regeln. | +| **Nachweise** | Portscan, Konfigurationsreview. | + +### HZ-C-018 — Datenabfluss + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr des unberechtigten Abflusses sensibler Betriebs-, Personen- oder Rezeptdaten. | +| **Typische Ursachen** | Ungesicherte Schnittstellen, Malware, Fehlkonfiguration, Insider. | +| **Gefährliche Situation** | Daten werden aus OT/IT-Systemen exfiltriert. | +| **Mögliche Schäden** | Know-how-Verlust, Datenschutzverstoß, Missbrauch. | +| **Betroffene Rollen** | Betreiber, IT/OT, Management. | +| **Lebensphasen** | Betrieb, Fernwartung. | +| **Komponenten** | Datenbanken, HMIs, Historian, Cloud-Schnittstellen. | +| **Maßnahmenarten** | Zugriffskontrolle, Verschlüsselung, DLP, Logging. | +| **Nachweise** | Audit-Logs, Security-Audit. | + +### HZ-C-019 — Konfigurationsmanipulation + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch unbefugte oder unerkannte Änderungen an Systemkonfigurationen. | +| **Typische Ursachen** | Fehlende Freigabe, unsichere Schnittstellen, Insiderzugriff. | +| **Gefährliche Situation** | Sicherheitsparameter oder Netzwerkeinstellungen werden verändert. | +| **Mögliche Schäden** | Sicherheitsverlust, Fehlfunktion, Ausfall. | +| **Betroffene Rollen** | IT/OT, Betreiber, Wartung. | +| **Lebensphasen** | Betrieb, Service, Update. | +| **Komponenten** | HMIs, Controller, Netzwerkgeräte. | +| **Maßnahmenarten** | Change Control, Audit-Trail, Signierung, Rechtekonzept. | +| **Nachweise** | Änderungsprotokoll, Audit. | + +### HZ-C-020 — Supply-Chain-Angriff auf Software oder Komponenten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | Cyber | +| **Beschreibung** | Gefahr durch kompromittierte Drittkomponenten, Bibliotheken oder Lieferkette. | +| **Typische Ursachen** | Infizierte Updates, kompromittierte Vendoren, unsichere Dependencies. | +| **Gefährliche Situation** | Schädliche Funktion gelangt über legitime Lieferwege in das Produkt. | +| **Mögliche Schäden** | Backdoors, Manipulation, Datenabfluss, Sicherheitsverlust. | +| **Betroffene Rollen** | Hersteller, Betreiber, IT/OT. | +| **Lebensphasen** | Entwicklung, Beschaffung, Update. | +| **Komponenten** | Open-Source-Bibliotheken, Firmware, Zuliefermodule. | +| **Maßnahmenarten** | SBOM, Supplier Review, Signatur, Vulnerability Management. | +| **Nachweise** | SBOM-Prüfung, Lieferantenbewertung, Security-Audit. | + + +--- + +## G. KI-bezogene Gefährdungen (20) + +### HZ-AI-001 — Fehlklassifikation + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass ein KI-Modell Eingaben falsch klassifiziert und daraus falsche Aktionen folgen. | +| **Typische Ursachen** | Ungeeignete Trainingsdaten, unzureichende Generalisierung, Sensorrauschen. | +| **Gefährliche Situation** | KI erkennt Objekt, Zustand oder Gefahr falsch und gibt Prozess frei bzw. sperrt falsch. | +| **Mögliche Schäden** | Fehlbewegung, Kollision, Qualitätsfehler mit Sicherheitsfolge. | +| **Betroffene Rollen** | Bediener, Einrichter, Betreiber. | +| **Lebensphasen** | Betrieb, Validierung, Re-Training. | +| **Komponenten** | Vision-KI, Qualitäts-KI, Erkennungsmodelle. | +| **Maßnahmenarten** | Validierung, Confidence-Schwellen, Fallback-Logik, Human Override. | +| **Nachweise** | Validierungsbericht, Fehlerratenanalyse, Testdatensatzbericht. | + +### HZ-AI-002 — False Positive + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass ein ungefährlicher Zustand als kritisch erkannt wird. | +| **Typische Ursachen** | Überempfindliches Modell, ungeeignete Features, schlechte Datenqualität. | +| **Gefährliche Situation** | Prozesse stoppen unnötig oder Sicherheitsmaßnahmen werden unpassend ausgelöst. | +| **Mögliche Schäden** | Stillstand, Notreaktionen, Folgefehler, Vertrauensverlust. | +| **Betroffene Rollen** | Bediener, Betreiber. | +| **Lebensphasen** | Betrieb, Tuning. | +| **Komponenten** | Inspektions-KI, Anomalieerkennung. | +| **Maßnahmenarten** | Schwellenwertabstimmung, Review-Mechanismen, Monitoring. | +| **Nachweise** | ROC-/Fehlerratenanalyse, Validierungsprotokoll. | + +### HZ-AI-003 — False Negative + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass ein tatsächlich gefährlicher oder fehlerhafter Zustand nicht erkannt wird. | +| **Typische Ursachen** | Unvollständige Trainingsdaten, schlechte Sensitivität, Drift. | +| **Gefährliche Situation** | Unsichere Lage wird als normal bewertet und Prozess läuft weiter. | +| **Mögliche Schäden** | Personenschaden, Qualitätsverlust, gefährliche Freigabe. | +| **Betroffene Rollen** | Bediener, Betreiber. | +| **Lebensphasen** | Betrieb, Validierung. | +| **Komponenten** | Detektions-KI, Condition Monitoring. | +| **Maßnahmenarten** | Konservative Schwellen, redundante Prüfpfade, Human-in-the-loop. | +| **Nachweise** | Test auf kritische Fälle, Fehlerratenanalyse. | + +### HZ-AI-004 — Modell-Drift + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr durch schleichende Verschlechterung der Modellleistung im Betrieb. | +| **Typische Ursachen** | Geänderte Datenverteilung, neue Materialien, Umgebungsänderungen. | +| **Gefährliche Situation** | Modell wird unzuverlässig, ohne dass es bemerkt wird. | +| **Mögliche Schäden** | Steigende Fehlentscheidungen, Sicherheitsverlust. | +| **Betroffene Rollen** | Betreiber, Qualität, Data/ML-Verantwortliche. | +| **Lebensphasen** | Langzeitbetrieb, Re-Training. | +| **Komponenten** | ML-Modelle im Feld, Vision-Systeme. | +| **Maßnahmenarten** | Drift-Monitoring, Re-Validierung, Fallback, Change Control. | +| **Nachweise** | Monitoring-Berichte, Re-Validierungsprotokoll. | + +### HZ-AI-005 — Bias / systematische Verzerrung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass das Modell bestimmte Klassen, Fälle oder Umgebungen systematisch falsch bewertet. | +| **Typische Ursachen** | Unausgewogene Trainingsdaten, fehlerhafte Label, ungeeignete Features. | +| **Gefährliche Situation** | Bestimmte Werkstücke, Zustände oder Nutzerfälle werden systematisch fehlbewertet. | +| **Mögliche Schäden** | Sicherheitslücken, Qualitätsfehler, Diskriminierungs-/Fehlentscheidungsrisiken. | +| **Betroffene Rollen** | Betreiber, Qualität, ML-Verantwortliche. | +| **Lebensphasen** | Entwicklung, Validierung, Betrieb. | +| **Komponenten** | Klassifikationsmodelle, Visionmodelle. | +| **Maßnahmenarten** | Datensatzanalyse, Balanced Validation, Modellreview. | +| **Nachweise** | Bias-Analyse, Validierungsbericht. | + +### HZ-AI-006 — Unsichere Trainingsdaten + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr durch falsche, manipulierte oder ungeeignete Trainingsdaten. | +| **Typische Ursachen** | Datenvergiftung, schlechte Labelqualität, fehlerhafte Herkunft. | +| **Gefährliche Situation** | Modell lernt gefährliche Entscheidungsregeln. | +| **Mögliche Schäden** | Systematische Fehlklassifikation, Sicherheitsverlust. | +| **Betroffene Rollen** | ML-Team, Betreiber, Qualität. | +| **Lebensphasen** | Entwicklung, Re-Training. | +| **Komponenten** | Datensätze, Annotationstools, Trainingspipeline. | +| **Maßnahmenarten** | Data Governance, Herkunftsnachweis, Datensatzreview. | +| **Nachweise** | Datenfreigabe, Audit, Qualitätsbericht. | + +### HZ-AI-007 — Adversarial Input + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass manipulierte Eingaben das Modell gezielt fehlleiten. | +| **Typische Ursachen** | Angriffe auf Bild-/Signalinput, störende Muster, absichtliche Täuschung. | +| **Gefährliche Situation** | KI erkennt Objekt falsch oder verpasst kritische Zustände. | +| **Mögliche Schäden** | Gefährliche Freigaben, Umgehung von Prüfschritten. | +| **Betroffene Rollen** | Betreiber, IT/OT, ML-Team. | +| **Lebensphasen** | Betrieb. | +| **Komponenten** | Kamerasysteme, Sensorik, Visionmodelle. | +| **Maßnahmenarten** | Robustheitstests, Mehrsensorik, Plausibilisierung, sichere Defaults. | +| **Nachweise** | Robustheitstest, Sicherheitsbericht. | + +### HZ-AI-008 — Overfitting + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass das Modell Trainingsdaten auswendig lernt, aber in realen Situationen versagt. | +| **Typische Ursachen** | Zu kleine Datensätze, unzureichende Validierung, überkomplexes Modell. | +| **Gefährliche Situation** | Modell zeigt gute Testwerte intern, scheitert aber im Feld. | +| **Mögliche Schäden** | Fehlentscheidungen, Sicherheits- und Qualitätsprobleme. | +| **Betroffene Rollen** | ML-Team, Betreiber. | +| **Lebensphasen** | Entwicklung, Freigabe, Feldbetrieb. | +| **Komponenten** | ML-Modelle, Trainingspipeline. | +| **Maßnahmenarten** | Saubere Validierung, unabhängige Testdaten, Monitoring. | +| **Nachweise** | Trainings-/Validierungsreport, Feldtest. | + +### HZ-AI-009 — Underfitting + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass das Modell relevante Muster gar nicht ausreichend erfasst. | +| **Typische Ursachen** | Zu einfaches Modell, schlechte Features, zu wenig Training. | +| **Gefährliche Situation** | Modell liefert grob unzuverlässige oder zufällige Bewertungen. | +| **Mögliche Schäden** | Fehlklassifikation, unnötige Stopps, unerkannte Gefahren. | +| **Betroffene Rollen** | ML-Team, Betreiber. | +| **Lebensphasen** | Entwicklung, Betrieb. | +| **Komponenten** | Klassifikations- und Regressionsmodelle. | +| **Maßnahmenarten** | Modellvalidierung, Modellverbesserung, Grenzwertkonzept. | +| **Nachweise** | Leistungsmetriken, Validierungsbericht. | + +### HZ-AI-010 — Confidence-Fehler / falsche Sicherheitsschwellen + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr durch ungeeignete Interpretation der Modellsicherheit oder Confidence-Scores. | +| **Typische Ursachen** | Schlechte Kalibrierung, falsche Schwelle, Missverständnis der Metrik. | +| **Gefährliche Situation** | Unsicheres Modellurteil wird als ausreichend sicher behandelt. | +| **Mögliche Schäden** | Fehlfreigabe, Fehlreaktion. | +| **Betroffene Rollen** | Betreiber, ML-Team, Softwareingenieur. | +| **Lebensphasen** | Validierung, Betrieb. | +| **Komponenten** | Klassifikatoren, Ensemble-Systeme. | +| **Maßnahmenarten** | Kalibrierung, Schwellenstrategie, Fallback-Regeln. | +| **Nachweise** | Kalibrierungsreport, Validierungstest. | + +### HZ-AI-011 — Interpretationsfehler des KI-Ergebnisses + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass das KI-Ergebnis durch Mensch oder Software falsch interpretiert wird. | +| **Typische Ursachen** | Unklare Ausgaben, schlechte HMI, fehlende Kontextinformationen. | +| **Gefährliche Situation** | Bediener oder Folgekomponente leitet falsche Maßnahme ab. | +| **Mögliche Schäden** | Fehlbedienung, Fehlfreigabe, unnötige Eingriffe. | +| **Betroffene Rollen** | Bediener, Qualität, Betreiber. | +| **Lebensphasen** | Betrieb. | +| **Komponenten** | HMI, Dashboards, Folgealgorithmen. | +| **Maßnahmenarten** | Klare Ausgabedesigns, erklärende Hinweise, Freigabelogik. | +| **Nachweise** | Usability-Test, Bedienkonzeptprüfung. | + +### HZ-AI-012 — Sensor-KI-Mismatch + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass Eingabedatenqualität oder Sensorcharakteristik nicht zum Modell passt. | +| **Typische Ursachen** | Geänderter Kameratyp, neue Beleuchtung, andere Auflösung, Drift. | +| **Gefährliche Situation** | Modell wird mit nicht validierten Eingaben betrieben. | +| **Mögliche Schäden** | Fehlklassifikation, Sicherheitsverlust. | +| **Betroffene Rollen** | Betreiber, ML-Team, Wartung. | +| **Lebensphasen** | Retrofit, Ersatzteilwechsel, Wartung. | +| **Komponenten** | Kameras, Mikrofone, Sensorik, KI-Modelle. | +| **Maßnahmenarten** | Sensorkompatibilitätsprüfung, Re-Validierung, Konfigurationskontrolle. | +| **Nachweise** | Kalibrierprotokoll, Änderungsfreigabe. | + +### HZ-AI-013 — Nicht erklärbare Entscheidung in sicherheitskritischem Kontext + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass kritische Entscheidungen nicht ausreichend nachvollziehbar sind. | +| **Typische Ursachen** | Black-Box-Modelle, fehlende Logging-/Attribution. | +| **Gefährliche Situation** | Fehlverhalten kann nicht analysiert oder sicher begrenzt werden. | +| **Mögliche Schäden** | Falsche Freigaben, nicht erkennbarer Drift, erschwerte Fehlerbehebung. | +| **Betroffene Rollen** | Betreiber, Qualität, Compliance, ML-Team. | +| **Lebensphasen** | Betrieb, Incident-Analyse. | +| **Komponenten** | Deep-Learning-Modelle, komplexe Ensembles. | +| **Maßnahmenarten** | Logging, erklärbare Zusatzmetriken, sichere Hülllogik. | +| **Nachweise** | Dokumentation, Incident-Report, Modellkarte. | + +### HZ-AI-014 — Modellkorruption / beschädigtes Modellartefakt + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr durch defekte, unvollständige oder manipulierte Modellartefakte. | +| **Typische Ursachen** | Speicherfehler, unsichere Updates, Deployment-Fehler. | +| **Gefährliche Situation** | Laufzeitmodell liefert unvorhersehbares Verhalten. | +| **Mögliche Schäden** | Fehlklassifikation, Absturz, Produktionsausfall. | +| **Betroffene Rollen** | Betreiber, ML/Ops, IT/OT. | +| **Lebensphasen** | Deployment, Update, Recovery. | +| **Komponenten** | Modellfiles, Inferenz-Container, Edge-Geräte. | +| **Maßnahmenarten** | Hash-/Signaturprüfung, Versionskontrolle, Rollback. | +| **Nachweise** | Deploy-Protokoll, Integritätsprüfung. | + +### HZ-AI-015 — Falsche Feature-Gewichtung + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass das Modell irrelevante oder instabile Merkmale überbewertet. | +| **Typische Ursachen** | Datenartefakte, Bias, schlechte Feature-Auswahl. | +| **Gefährliche Situation** | Modell reagiert auf Hintergrund statt auf sicherheitsrelevante Merkmale. | +| **Mögliche Schäden** | Instabile Entscheidungen, Fehlklassifikationen. | +| **Betroffene Rollen** | ML-Team, Qualität. | +| **Lebensphasen** | Entwicklung, Validierung, Drift. | +| **Komponenten** | Vision-Modelle, Feature-Engineering. | +| **Maßnahmenarten** | Explainability-Checks, Datensatzreview, Gegenproben. | +| **Nachweise** | Modellanalyse, Validierungsreport. | + +### HZ-AI-016 — Autonomie-Fehler + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass ein KI-System zu weitreichende selbständige Aktionen auslöst. | +| **Typische Ursachen** | Fehlende Begrenzung, übermäßige Delegation, unklare Freigaberegeln. | +| **Gefährliche Situation** | KI steuert Aktoren oder Prozesse ohne ausreichende Sicherheitsgrenzen. | +| **Mögliche Schäden** | Fehlbewegung, Kollision, Prozessentgleisung. | +| **Betroffene Rollen** | Bediener, Betreiber. | +| **Lebensphasen** | Betrieb. | +| **Komponenten** | Autonome Regelung, Optimierungsagenten, adaptive Steuerung. | +| **Maßnahmenarten** | Human Override, Begrenzung des Handlungsraums, sichere Hülllogik. | +| **Nachweise** | Szenariotests, Freigabedokumentation. | + +### HZ-AI-017 — Fallback-Fehler bei KI-Ausfall + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass das System bei Ausfall der KI nicht sicher in einen Ersatzmodus übergeht. | +| **Typische Ursachen** | Fehlende Deterministik, ungeprüfter Notmodus, Integrationsfehler. | +| **Gefährliche Situation** | KI fällt aus und Folgekomponenten erhalten keine sichere Ersatzentscheidung. | +| **Mögliche Schäden** | Prozessstillstand, Fehlverhalten, Sicherheitsverlust. | +| **Betroffene Rollen** | Betreiber, Bediener, Wartung. | +| **Lebensphasen** | Betrieb, Update, Störung. | +| **Komponenten** | Inferenzdienst, HMI, Steuerung. | +| **Maßnahmenarten** | Deterministischer Fallback, Health Checks, Fallback-Test. | +| **Nachweise** | Fault-Injection-Test, Recovery-Test. | + +### HZ-AI-018 — Grenzfall-Fehler / Out-of-Distribution + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr durch Eingaben außerhalb des trainierten Anwendungsbereichs. | +| **Typische Ursachen** | Seltene Varianten, extreme Beleuchtung, unbekannte Objekte, neue Materialien. | +| **Gefährliche Situation** | KI liefert scheinbar sichere, aber unzutreffende Entscheidung für unbekannte Fälle. | +| **Mögliche Schäden** | Fehlfreigabe, Fehlklassifikation, Sicherheitsverlust. | +| **Betroffene Rollen** | Betreiber, Qualität, Bediener. | +| **Lebensphasen** | Betrieb, Produktwechsel. | +| **Komponenten** | Vision-KI, Sensorfusion, Qualitätsprüfung. | +| **Maßnahmenarten** | OOD-Erkennung, konservative Schwellen, Human Review. | +| **Nachweise** | Edge-Case-Test, Validierungsbericht. | + +### HZ-AI-019 — Fehlende Validierung vor Einsatz + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass ein Modell ohne ausreichende betriebliche und sicherheitstechnische Freigabe eingesetzt wird. | +| **Typische Ursachen** | Zeitdruck, fehlender Prozess, unklare Rollen. | +| **Gefährliche Situation** | Modell läuft produktiv, obwohl Leistungsgrenzen unbekannt sind. | +| **Mögliche Schäden** | Unvorhersehbare Fehlentscheidungen, Sicherheits- und Qualitätsrisiken. | +| **Betroffene Rollen** | Management, Betreiber, ML-Team. | +| **Lebensphasen** | Go-Live, Update, Re-Training. | +| **Komponenten** | Neue Modellversionen, Edge-Deployments. | +| **Maßnahmenarten** | Freigabeprozess, Validierung, dokumentierte Akzeptanzkriterien. | +| **Nachweise** | Freigabedokument, Validierungsbericht. | + +### HZ-AI-020 — KI-Update-Fehler + +| Feld | Inhalt | +|------|--------| +| **Kategorie** | KI | +| **Beschreibung** | Gefahr, dass neue Modellversionen das Verhalten ungewollt ändern oder verschlechtern. | +| **Typische Ursachen** | Fehlende Regressionstests, unklare Datenbasis, fehlender Rollback. | +| **Gefährliche Situation** | Neues Modell trifft im Feld schlechtere oder andere Entscheidungen als erwartet. | +| **Mögliche Schäden** | Fehlklassifikation, Stillstand, Sicherheitsverlust. | +| **Betroffene Rollen** | Betreiber, ML/Ops, Qualität. | +| **Lebensphasen** | Update, Re-Training, Deployment. | +| **Komponenten** | Modellregistry, Deploy-Pipeline, Edge-Geräte. | +| **Maßnahmenarten** | Regressionstest, Signierung, Shadow Mode, Rollback. | +| **Nachweise** | Update-Freigabe, Vergleichsreport, Rollback-Test. | + +--- + +## Produktisierung + +### Empfohlene nächste Ableitungen + +- **Normalisierte IDs und Enumerationen** für Rollen, Lebensphasen, Maßnahmenarten und Nachweisarten — als Enum-Bibliothek für die Risk Engine. +- **Maschinenkomponenten-Bibliothek** zur automatischen Hazard-Zuordnung: Welche Komponenten triggern welche Gefährdungen? +- **Regelwerk:** Welche Gefährdungen werden durch welche Komponenten + Lebensphasen + Energiearten getriggert? +- **Risk Engine** mit S/F/P/A oder vergleichbarem Bewertungsmodell (Schwere, Häufigkeit, Wahrscheinlichkeit der Schadenvermeidung). +- **Measure Engine** mit Maßnahmentyp-Hierarchie: + 1. Inhärent sichere Konstruktion + 2. Technische Schutzmaßnahme + 3. Benutzerinformation +- **Evidence Engine** zur automatischen Zuweisung typischer Nachweise je Gefährdung. + +### Beispiel JSON-Schema (nachgelagert) + +```json +{ + "hazard_id": "HZ-M-001", + "title": "Quetschen zwischen bewegten Teilen", + "category": "mechanical", + "description": "...", + "typical_causes": ["..."], + "hazardous_situation": "...", + "possible_harm": ["..."], + "affected_roles": ["R01", "R03"], + "lifecycle_phases": ["LP07", "LP08", "LP19", "LP16"], + "components": ["press", "gripper", "conveyor"], + "preferred_measure_types": ["design", "technical", "information"], + "typical_evidence": ["E01", "E14", "E39"] +} +``` + +### Nutzungshinweis + +Diese Bibliothek ist für den Aufbau einer eigenen CE-Risikobeurteilungs-Engine gedacht. Sie ersetzt keine formale Normenlizenz und keine fallbezogene fachliche Bewertung, kann aber sehr gut als strukturierte interne Wissensbasis, RAG-Basis, Regelbasis oder Seed-Datenbank verwendet werden. + +--- + +## Hazard-Matching-Engine + +Die Hazard-Matching-Engine erweitert die IACE-Plattform um automatische Gefaehrdungserkennung basierend auf Maschinenkomponenten und Energiequellen. + +### Komponentenbibliothek (120 Eintraege) + +120 typisierte Maschinenkomponenten in 11 Kategorien (C001-C120): + +| Kategorie | IDs | Anzahl | Beispiele | +|-----------|-----|--------|-----------| +| mechanical | C001-C020 | 20 | Roboterarm, Greifer, Foerderband, Spindel | +| structural | C021-C030 | 10 | Maschinenrahmen, Schutzgehaeuse, Schutztuer | +| drive | C031-C040 | 10 | Elektromotor, Servomotor, Frequenzumrichter | +| hydraulic | C041-C050 | 10 | Hydraulikpumpe, -zylinder, -ventil, -speicher | +| pneumatic | C051-C060 | 10 | Pneumatikzylinder, Kompressor, Vakuumsauger | +| electrical | C061-C070 | 10 | Schaltschrank, Stromversorgung, Transformator | +| control | C071-C080 | 10 | SPS, Sicherheits-SPS, HMI, IPC | +| sensor | C081-C090 | 10 | Positionssensor, Kamerasystem, Kraftsensor | +| actuator | C091-C100 | 10 | Magnetventil, Linearantrieb, Heizelement | +| safety | C101-C110 | 10 | Not-Halt, Lichtgitter, Sicherheitsschalter | +| it_network | C111-C120 | 10 | Switch, Router, Firewall, KI-Inferenzmodul | + +**API:** `GET /api/v1/iace/component-library?category=mechanical` + +### Energiequellen (20 Eintraege) + +20 Energiequellen-Typen (EN01-EN20): + +| ID | Bezeichnung | +|----|-------------| +| EN01-EN03 | Kinetische Energie (translat./rotat.), Potentielle Energie | +| EN04 | Elektrische Energie | +| EN05-EN06 | Hydraulische / Pneumatische Energie | +| EN07 | Thermische Energie | +| EN08-EN11 | Gespeicherte Energie (elektr./mech./hydr./pneum.) | +| EN12-EN15 | Strahlung, Schall, Vibration | +| EN16-EN20 | Chemische, Magnetische, Cyber, KI-Modell, Ergonomische Belastung | + +**API:** `GET /api/v1/iace/energy-sources` + +### Tag-System (~85 Tags in 5 Domaenen) + +Jede Komponente und Energiequelle traegt Tags, die das Pattern-Matching ermoeglichen: + +| Domaene | Anzahl | Beispiele | +|---------|--------|-----------| +| component | ~30 | `moving_part`, `rotating_part`, `high_voltage`, `has_ai`, `networked` | +| energy | ~19 | `kinetic`, `electrical_energy`, `hydraulic_pressure`, `stored_energy` | +| hazard | ~20 | `crush_risk`, `electric_shock_risk`, `cyber_risk`, `ai_risk` | +| measure | ~10 | `guard_measure`, `interlock_measure`, `software_safety_measure` | +| evidence | ~10 | `design_evidence`, `test_evidence`, `cyber_evidence` | + +**API:** `GET /api/v1/iace/tags?domain=component` + +### Hazard Patterns (44 Regeln) + +44 Hazard-Patterns in 9 Bereichen: + +| Bereich | Pattern-IDs | Anzahl | +|---------|-------------|--------| +| Mechanisch | HP001-HP010 | 10 | +| Elektrisch | HP011-HP015 | 5 | +| Thermisch | HP016-HP018 | 3 | +| Hydraulik/Pneumatik | HP019-HP022 | 4 | +| Laerm/Vibration | HP023-HP025 | 3 | +| Ergonomie | HP026-HP028 | 3 | +| Software/Steuerung | HP029-HP034 | 6 | +| Cyber/Netzwerk | HP035-HP039 | 5 | +| KI-spezifisch | HP040-HP044 | 5 | + +**API:** `GET /api/v1/iace/hazard-patterns` + +### Pattern-Matching Workflow + +``` +POST /api/v1/iace/projects/{id}/match-patterns +{ + "component_library_ids": ["C001", "C061", "C071"], + "energy_source_ids": ["EN01", "EN04"], + "lifecycle_phases": ["normal_operation", "maintenance"], + "custom_tags": [] +} +``` + +**Algorithmus:** +1. Komponenten-IDs → Tags aufloesen +2. Energiequellen-IDs → Tags aufloesen +3. Alle Tags vereinigen +4. 44 Patterns nach Prioritaet pruefen (required AND, excluded NOT) +5. Gefeuerte Patterns → Hazards, Massnahmen, Nachweise sammeln +6. Confidence-Score berechnen + +**Ergebnis anwenden:** +``` +POST /api/v1/iace/projects/{id}/apply-patterns +{ + "accepted_hazards": [...], + "accepted_measures": [...], + "accepted_evidence": [...], + "source_pattern_ids": ["HP001", "HP011", "HP029"] +} +``` +