diff --git a/ai-compliance-sdk/internal/api/handlers/iace_handler_init.go b/ai-compliance-sdk/internal/api/handlers/iace_handler_init.go index 567b537f..3ad99a24 100644 --- a/ai-compliance-sdk/internal/api/handlers/iace_handler_init.go +++ b/ai-compliance-sdk/internal/api/handlers/iace_handler_init.go @@ -273,16 +273,24 @@ func (h *IACEHandler) InitializeProject(c *gin.Context) { } } - // For each hazard: assign up to maxMitigationsPerHazard measures - // Priority 1: Pattern-specific SuggestedMeasureIDs (from the pattern that created this hazard) - // Priority 2: Category fallback (generic measures for the hazard category) + // For each hazard: only pattern-specific SuggestedMeasureIDs are + // used, FILTERED by category. Measures whose HazardCategory is + // incompatible with the pattern's accepted set are skipped with a + // MEASURE-SKIP log entry. There is NO category fallback any more — + // if the pattern author left a hazard without applicable measures, + // the hazard is created with zero mitigations and the operator must + // consult an expert. This is the only honest answer: silently + // inventing generic defaults (the previous behavior) produced + // nonsense like "Rotationsbewegung vermeiden" for a sharp-edge + // hazard. See feat/iace-measure-category-filter for context. + _ = measuresByCat // retained for backwards-compat read by other code paths + _ = patternCatToMeasureCat + zeroMitigationHazards := 0 for _, hazID := range allHazardIDs { hazCat := hazardCatByID[hazID] - measCat := patternCatToMeasureCat(hazCat) + accepted := acceptableMeasureCategories(hazCat) added := 0 - usedIDs := make(map[string]bool) - // Priority 1: Pattern-specific measures if patternMIDs, ok := hazardPatternMeasures[hazID]; ok { for _, mid := range patternMIDs { if added >= maxMitigationsPerHazard { @@ -292,6 +300,11 @@ func (h *IACEHandler) InitializeProject(c *gin.Context) { if !ok { continue } + if !isCategoryCompatible(entry.HazardCategory, accepted) { + fmt.Printf("MEASURE-SKIP: pattern-cat=%s acceptable=%v but mid=%s has cat=%s (%q) — skipping mismatch\n", + hazCat, keysOf(accepted), mid, entry.HazardCategory, entry.Name) + continue + } rt := iace.ReductionType(entry.ReductionType) if rt == "" { @@ -306,30 +319,20 @@ func (h *IACEHandler) InitializeProject(c *gin.Context) { } else { created++ added++ - usedIDs[mid] = true } } } - // Priority 2: Category fallback (skip already-used IDs) - for _, m := range measuresByCat[measCat] { - if added >= maxMitigationsPerHazard || usedIDs[m.ID] { - continue - } - rt := iace.ReductionType(m.ReductionType) - if rt == "" { - rt = iace.ReductionTypeInformation - } - _, cerr := h.store.CreateMitigation(ctx, iace.CreateMitigationRequest{ - HazardID: hazID, ReductionType: rt, - Name: m.Name, Description: m.Description, - }) - if cerr == nil { - created++ - added++ - } + if added == 0 { + zeroMitigationHazards++ + fmt.Printf("COVERAGE-GAP: hazard %s (cat=%s) has no pattern-specific measures — operator must consult expert\n", + hazID, hazCat) } } + if zeroMitigationHazards > 0 { + fmt.Printf("COVERAGE-GAP-SUMMARY: %d/%d hazards in this project have no mitigations and need expert review\n", + zeroMitigationHazards, len(allHazardIDs)) + } patternMeasureCount := 0 for _, mids := range hazardPatternMeasures { patternMeasureCount += len(mids) diff --git a/ai-compliance-sdk/internal/api/handlers/iace_handler_init_helpers.go b/ai-compliance-sdk/internal/api/handlers/iace_handler_init_helpers.go index 9479b13e..578fd427 100644 --- a/ai-compliance-sdk/internal/api/handlers/iace_handler_init_helpers.go +++ b/ai-compliance-sdk/internal/api/handlers/iace_handler_init_helpers.go @@ -45,6 +45,91 @@ func extractNarrativeFromMetadata(metadata json.RawMessage) string { return result } +// acceptableMeasureCategories returns the set of measure HazardCategory values +// that are semantically applicable to a hazard with the given pattern category. +// The mapping is a *set*, not a single value — many pattern categories accept +// measures from several measure-library categories that are conceptually +// related. E.g. a safety_function_failure hazard is sensibly mitigated by +// software_control measures like watchdogs, plausibility checks or self-tests, +// not just by the (almost empty) safety_function category. +// +// "general" is implicit — handled in isCategoryCompatible and not duplicated +// in every set below. +func acceptableMeasureCategories(patternCat string) map[string]bool { + sets := map[string][]string{ + "mechanical_hazard": {"mechanical"}, + "electrical_hazard": {"electrical"}, + "thermal_hazard": {"thermal", "material_environmental"}, + "noise_vibration": {"noise_vibration", "ergonomic"}, + "pneumatic_hydraulic": {"pneumatic_hydraulic", "mechanical"}, + "material_environmental": {"material_environmental"}, + "chemical_risk": {"material_environmental", "thermal"}, + "ergonomic": {"ergonomic"}, + "ergonomic_hazard": {"ergonomic"}, + "fire_explosion": {"thermal", "material_environmental"}, + "radiation_hazard": {"material_environmental"}, + "emc_hazard": {"electrical", "software_control"}, + "maintenance_hazard": {"mechanical"}, + "safety_function_failure": {"safety_function", "software_control"}, + "software_fault": {"software_control"}, + "sensor_fault": {"software_control"}, + "configuration_error": {"software_control"}, + "update_failure": {"software_control"}, + "hmi_error": {"software_control"}, + "mode_confusion": {"software_control"}, + "unauthorized_access": {"cyber_network", "software_control"}, + "communication_failure": {"cyber_network", "software_control"}, + "firmware_corruption": {"cyber_network", "software_control"}, + "logging_audit_failure": {"cyber_network", "software_control"}, + "ai_misclassification": {"ai_specific", "software_control"}, + "false_classification": {"ai_specific", "software_control"}, + "model_drift": {"ai_specific", "software_control"}, + "data_poisoning": {"ai_specific", "software_control"}, + "sensor_spoofing": {"ai_specific", "software_control"}, + "unintended_bias": {"ai_specific", "software_control"}, + // Edge-case pattern categories from legacy authors. Treated as + // synonyms of their primary hazard category so existing patterns + // keep matching the right measure pool. + "noise_source": {"noise_vibration", "ergonomic"}, + "vibration_source": {"noise_vibration", "ergonomic"}, + "high_temperature": {"thermal", "material_environmental"}, + "material_environmental_hazard": {"material_environmental"}, + } + out := map[string]bool{"general": true} + if list, ok := sets[patternCat]; ok { + for _, c := range list { + out[c] = true + } + } + return out +} + +// isCategoryCompatible reports whether a measure with HazardCategory measureCat +// is semantically applicable to a hazard whose acceptable measure categories +// are listed in accepted. Empty measureCat is always allowed (legacy entries), +// "general" measures are pre-seeded into accepted by acceptableMeasureCategories. +// +// Without this guard, patterns silently inherit nonsense mitigations (e.g. +// HP1651 "robot restart while person in cell" inheriting M054 "Sichere +// thermische Auslegung" — a thermal-design measure used as generic default in +// ~100 mechanical patterns). The Fachmann benchmark rejects such mismatches. +func isCategoryCompatible(measureCat string, accepted map[string]bool) bool { + if measureCat == "" { + return true + } + return accepted[measureCat] +} + +// keysOf returns the sorted keys of a string-bool set, used for diagnostic +// log messages that report which measure categories were accepted for a hazard. +func keysOf(s map[string]bool) []string { + out := make([]string, 0, len(s)) + for k := range s { + out = append(out, k) + } + return out +} + // patternCatToMeasureCat maps pattern hazard categories to measure categories. func patternCatToMeasureCat(patternCat string) string { m := map[string]string{ diff --git a/ai-compliance-sdk/internal/api/handlers/iace_handler_init_helpers_test.go b/ai-compliance-sdk/internal/api/handlers/iace_handler_init_helpers_test.go new file mode 100644 index 00000000..c5a9e802 --- /dev/null +++ b/ai-compliance-sdk/internal/api/handlers/iace_handler_init_helpers_test.go @@ -0,0 +1,57 @@ +package handlers + +import "testing" + +// TestAcceptableMeasureCategories pins the set-based category acceptance map. +// Each pattern category accepts not just its own measure category but a +// curated set of semantically related ones — a safety_function_failure +// pattern is sensibly mitigated by software_control measures (watchdogs, +// plausibility checks), not just by the near-empty safety_function category. +func TestAcceptableMeasureCategories(t *testing.T) { + cases := []struct { + patternCat string + mustAccept []string // measure categories that MUST be accepted + mustReject []string // measure categories that MUST be rejected + }{ + // mechanical hazards: own + general only + {"mechanical_hazard", []string{"mechanical", "general"}, []string{"thermal", "electrical"}}, + // electrical hazards: own + general only + {"electrical_hazard", []string{"electrical", "general"}, []string{"thermal", "mechanical"}}, + // safety-function failures accept watchdogs (software_control) + {"safety_function_failure", []string{"safety_function", "software_control", "general"}, []string{"mechanical", "thermal"}}, + // EMC accepts electrical + software (shielding + filter logic both apply) + {"emc_hazard", []string{"electrical", "software_control", "general"}, []string{"mechanical"}}, + // AI failures accept ai_specific + software_control + {"false_classification", []string{"ai_specific", "software_control", "general"}, []string{"mechanical", "electrical"}}, + // Fire/explosion accepts thermal + material_environmental + {"fire_explosion", []string{"thermal", "material_environmental", "general"}, []string{"mechanical", "electrical"}}, + // Unknown pattern category: only general + {"unknown_made_up_cat", []string{"general"}, []string{"mechanical", "electrical"}}, + } + for _, c := range cases { + accepted := acceptableMeasureCategories(c.patternCat) + for _, mc := range c.mustAccept { + if !isCategoryCompatible(mc, accepted) { + t.Errorf("patternCat=%q must accept measureCat=%q but rejected (set=%v)", + c.patternCat, mc, accepted) + } + } + for _, mc := range c.mustReject { + if isCategoryCompatible(mc, accepted) { + t.Errorf("patternCat=%q must reject measureCat=%q but accepted (set=%v)", + c.patternCat, mc, accepted) + } + } + } +} + +// TestIsCategoryCompatible_EmptyMeasureCat pins that legacy measures with +// no HazardCategory set are always allowed — they would otherwise silently +// disappear during the re-init, since the audit found ~80 such entries in +// older library files. +func TestIsCategoryCompatible_EmptyMeasureCat(t *testing.T) { + accepted := acceptableMeasureCategories("mechanical_hazard") + if !isCategoryCompatible("", accepted) { + t.Error("empty measure category must be accepted (legacy entries)") + } +} diff --git a/ai-compliance-sdk/internal/iace/gt_coverage_test.go b/ai-compliance-sdk/internal/iace/gt_coverage_test.go index 2437e8dd..0564d5a4 100644 --- a/ai-compliance-sdk/internal/iace/gt_coverage_test.go +++ b/ai-compliance-sdk/internal/iace/gt_coverage_test.go @@ -49,6 +49,12 @@ func TestGTBremse_PinnedHazardToMeasureMappings(t *testing.T) { {"1.22", "HP1711", []string{"M501", "M502", "M536"}}, // GT 1.24: Eingeschlossen in Zelle — Innenoeffnung + bewusster Wiederanlauf {"1.24", "HP1603", []string{"M489", "M488"}}, + // GT 1.12/1.24 (HP1651 Wiederanlauf-Variante): Wiederanlauf-Schutz-Measures — + // NOT thermal (M054 was wrongly placed here and surfaced as + // "Sichere thermische Auslegung" for a restart hazard) + {"1.12/1.24", "HP1651", []string{"M488", "M487", "M489", "M490"}}, + // GT 1.1 (HP1625 sharp edges): edge-specific only, no rotational/distance fillers + {"1.1", "HP1625", []string{"M003", "M004", "M027"}}, // GT 1.26: Foerderband-Geschwindigkeit < 100 mm/s {"1.26", "HP1620", []string{"M498", "M499"}}, // GT 1.27: Mechanischer Anschlag am Bandende diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_agv_agri.go b/ai-compliance-sdk/internal/iace/hazard_patterns_agv_agri.go index a361fc1c..14543154 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_agv_agri.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_agv_agri.go @@ -180,7 +180,7 @@ func GetAGVAgriPatterns() []HazardPattern { RequiredEnergyTags: []string{}, ExcludedComponentTags: []string{"single_agv_system"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M054", "M106"}, + SuggestedMeasureIDs: []string{"M002", "M008", "M061", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 78, ScenarioDE: "Zwei AGVs kollidieren an einer Kreuzung oder im engen Gang. Ladung wird verschoben, umstehende Personen gefaehrdet.", @@ -195,7 +195,7 @@ func GetAGVAgriPatterns() []HazardPattern { RequiredComponentTags: []string{"agv", "sensor_part", "electrical_part"}, RequiredEnergyTags: []string{"electrical"}, GeneratedHazardCats: []string{"electrical_hazard", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M106"}, + SuggestedMeasureIDs: []string{"M478", "M479", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 72, ScenarioDE: "Elektromagnetische Stoerungen (Schweissgeraete, Frequenzumrichter) beeinflussen AGV-Sensorik oder Steuerung.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_ai.go b/ai-compliance-sdk/internal/iace/hazard_patterns_ai.go index b2259d1b..22d0e0d4 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_ai.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_ai.go @@ -8,7 +8,7 @@ func builtinAIPatterns() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"false_classification"}, - SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedMeasureIDs: []string{"M133", "M214", "M213", "M044", "M119"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 90, ScenarioDE: "KI-Modell klassifiziert Objekt oder Zustand falsch und loest darauf basierend eine gefaehrliche Aktion aus.", @@ -23,7 +23,7 @@ func builtinAIPatterns() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"model_drift"}, - SuggestedMeasureIDs: []string{"M103"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M214", "M112"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 85, ScenarioDE: "KI-Modell verliert ueber Zeit an Genauigkeit, weil sich Eingangsdaten schleichend veraendern.", @@ -38,7 +38,7 @@ func builtinAIPatterns() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"cyber", "ai_model"}, GeneratedHazardCats: []string{"data_poisoning"}, - SuggestedMeasureIDs: []string{"M101", "M116"}, + SuggestedMeasureIDs: []string{"M188", "M133", "M113", "M214", "M187"}, SuggestedEvidenceIDs: []string{"E01", "E15", "E16"}, Priority: 85, ScenarioDE: "Angreifer manipuliert Trainingsdaten oder Eingangssignale, um das KI-Modell gezielt zu taeuschen.", @@ -53,7 +53,7 @@ func builtinAIPatterns() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"unintended_bias"}, - SuggestedMeasureIDs: []string{"M101"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M204"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 75, ScenarioDE: "KI-Modell trifft systematisch ungleiche Entscheidungen fuer bestimmte Personengruppen oder Bedingungen.", @@ -68,7 +68,7 @@ func builtinAIPatterns() []HazardPattern { RequiredComponentTags: []string{"has_ai", "sensor_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"sensor_spoofing"}, - SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedMeasureIDs: []string{"M213", "M214", "M119", "M133"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 80, ScenarioDE: "Sensor, der KI-Eingangsdaten liefert, wird manipuliert oder liefert durch Verschmutzung/Defekt falsche Werte.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_cnc.go b/ai-compliance-sdk/internal/iace/hazard_patterns_cnc.go index 2e50ff67..282197a5 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_cnc.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_cnc.go @@ -129,7 +129,7 @@ func GetCNCHazardPatterns() []HazardPattern { ID: "HP1408", NameDE: "Falscher Werkzeug-Offset", NameEN: "Wrong tool offset after setup", RequiredComponentTags: []string{"cutting_tool", "programmable"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M041", "M050"}, + SuggestedMeasureIDs: []string{"M008", "M001", "M061", "M141"}, SuggestedEvidenceIDs: []string{"E14"}, Priority: 78, MachineTypes: cncTypes, OperationalStates: []string{"teach_mode"}, @@ -220,7 +220,7 @@ func GetCNCHazardPatterns() []HazardPattern { ID: "HP1414", NameDE: "Rutschgefahr durch KSS-Leckage am Boden", NameEN: "Slip hazard from MWF leakage on floor", RequiredComponentTags: []string{"cutting_tool"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M420", "M101"}, + SuggestedMeasureIDs: []string{"M538", "M484", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 65, MachineTypes: cncTypes, ScenarioDE: "KSS-Leckage erzeugt rutschigen Bodenbelag um die Werkzeugmaschine", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_cobot.go b/ai-compliance-sdk/internal/iace/hazard_patterns_cobot.go index 5f9c32b7..facfade9 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_cobot.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_cobot.go @@ -49,7 +49,7 @@ func GetCobotHazardPatterns() []HazardPattern { RequiredComponentTags: []string{"afterrun_risk", "moving_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M002", "M494", "M487", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 90, RequiresExpertCalculation: true, diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_cyber.go b/ai-compliance-sdk/internal/iace/hazard_patterns_cyber.go index b52220f7..4eff4182 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_cyber.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_cyber.go @@ -23,7 +23,7 @@ func builtinCyberPatterns() []HazardPattern { RequiredComponentTags: []string{"networked", "it_component"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"communication_failure"}, - SuggestedMeasureIDs: []string{"M114", "M115"}, + SuggestedMeasureIDs: []string{"M113", "M106", "M119", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E17"}, Priority: 80, ScenarioDE: "Netzwerkverbindung zwischen Steuerungskomponenten faellt aus; Maschine verliert Synchronisation.", @@ -68,7 +68,7 @@ func builtinCyberPatterns() []HazardPattern { RequiredComponentTags: []string{"it_component", "has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"unauthorized_access", "firmware_corruption"}, - SuggestedMeasureIDs: []string{"M116", "M118"}, + SuggestedMeasureIDs: []string{"M186", "M188", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E18", "E19"}, Priority: 75, ScenarioDE: "Kompromittierte Komponente oder Bibliothek wird in der Lieferkette eingeschleust.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended.go b/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended.go index c75d02b9..caba0af6 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended.go @@ -13,7 +13,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"has_software", "programmable"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M102", "M103"}, + SuggestedMeasureIDs: []string{"M111", "M107", "M106", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14"}, Priority: 85, ScenarioDE: "Dynamischer Speicher der Steuerung laeuft voll; Steuerungsprogramm verhaelt sich undefiniert oder stuerzt ab.", @@ -28,7 +28,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"has_software", "programmable"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedMeasureIDs: []string{"M040", "M044", "M106", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14"}, Priority: 85, ScenarioDE: "Zwei Tasks greifen gleichzeitig auf gemeinsame Ressource zu; Zustandsinformation wird inkonsistent.", @@ -43,7 +43,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"has_software", "programmable"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M103"}, + SuggestedMeasureIDs: []string{"M107", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14"}, Priority: 80, ScenarioDE: "Regelkreis teilt durch einen Sensorwert, der unerwartet Null wird; Stellgroesse laeuft ins Unendliche.", @@ -58,7 +58,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedMeasureIDs: []string{"M111", "M214", "M107", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14"}, Priority: 75, ScenarioDE: "Integer-Ueberlauf in der Steuerung wandelt grossen Positivwert in negativen Wert und kehrt Bewegungsrichtung um.", @@ -88,7 +88,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"has_software", "programmable"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M102", "M103"}, + SuggestedMeasureIDs: []string{"M106", "M107", "M044", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14"}, Priority: 80, ScenarioDE: "Zwei oder mehr Tasks der Steuerung blockieren sich gegenseitig; Steuerung reagiert nicht mehr.", @@ -148,7 +148,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"sensor_part", "has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedMeasureIDs: []string{"M214", "M213", "M119", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14"}, Priority: 75, ScenarioDE: "Sensor liefert Wert ausserhalb seines Messbereichs; Steuerungssoftware interpretiert ihn falsch.", @@ -178,7 +178,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"has_software", "networked"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M114"}, + SuggestedMeasureIDs: []string{"M040", "M106", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14"}, Priority: 70, ScenarioDE: "Fehlerhafte Zeitstempel fuehren dazu, dass Prozessschritte in falscher Reihenfolge ausgefuehrt werden.", @@ -193,7 +193,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedMeasureIDs: []string{"M111", "M107", "M188", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14", "E16"}, Priority: 85, ScenarioDE: "Pufferueberlauf in der Steuerungssoftware ueberschreibt angrenzende Speicherbereiche und fuehrt zu undefiniertem Verhalten.", @@ -208,7 +208,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"has_software", "programmable"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M103"}, + SuggestedMeasureIDs: []string{"M107", "M105", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14"}, Priority: 80, ScenarioDE: "Nicht abgefangene Programmausnahme fuehrt zum Absturz der Steuerung ohne geordnete Abschaltung.", @@ -379,7 +379,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"it_component", "has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"unauthorized_access", "firmware_corruption"}, - SuggestedMeasureIDs: []string{"M116", "M118"}, + SuggestedMeasureIDs: []string{"M186", "M188", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E18", "E19"}, Priority: 75, ScenarioDE: "Kompromittierte Hardware oder Software wird ueber die Lieferkette in die Anlage eingebracht.", @@ -424,7 +424,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"has_software"}, RequiredEnergyTags: []string{"cyber"}, GeneratedHazardCats: []string{"unauthorized_access"}, - SuggestedMeasureIDs: []string{"M116", "M138"}, + SuggestedMeasureIDs: []string{"M188", "M186", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E18", "E19"}, Priority: 80, ScenarioDE: "Steuerungssoftware oder Betriebssystem wird nicht gepatcht; bekannte CVEs sind ausnutzbar.", @@ -439,7 +439,7 @@ func GetCyberExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"has_software", "it_component"}, RequiredEnergyTags: []string{"cyber"}, GeneratedHazardCats: []string{"firmware_corruption"}, - SuggestedMeasureIDs: []string{"M116", "M142"}, + SuggestedMeasureIDs: []string{"M186", "M188", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E16"}, Priority: 70, ScenarioDE: "Angreifer manipuliert Backup-Daten; bei Wiederherstellung wird kompromittierte Konfiguration eingespielt.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended2.go b/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended2.go index 5602bbff..fd9125d0 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended2.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended2.go @@ -27,7 +27,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"unintended_bias", "false_classification"}, - SuggestedMeasureIDs: []string{"M101"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 80, ScenarioDE: "Einseitige Trainingsdaten fuehren dazu, dass das KI-Modell bestimmte Varianten systematisch falsch klassifiziert.", @@ -42,7 +42,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai", "sensor_part"}, RequiredEnergyTags: []string{"ai_model", "cyber"}, GeneratedHazardCats: []string{"data_poisoning", "sensor_spoofing"}, - SuggestedMeasureIDs: []string{"M101", "M116"}, + SuggestedMeasureIDs: []string{"M133", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15", "E16"}, Priority: 85, ScenarioDE: "Gezielt veraenderte Eingabedaten (Adversarial Patches) taeuschen das Bilderkennungssystem und erzwingen Fehlklassifikation.", @@ -57,7 +57,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"model_drift"}, - SuggestedMeasureIDs: []string{"M103"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 75, ScenarioDE: "KI-Modell verliert durch veraenderte Prozessbedingungen ueber Wochen schleichend an Genauigkeit.", @@ -72,7 +72,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai", "programmable"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"software_fault", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M101", "M104"}, + SuggestedMeasureIDs: []string{"M044", "M227", "M105", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E07", "E15"}, Priority: 95, RequiresExpertCalculation: true, @@ -89,7 +89,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai", "user_interface"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"false_classification"}, - SuggestedMeasureIDs: []string{"M101"}, + SuggestedMeasureIDs: []string{"M133", "M204", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 70, ScenarioDE: "KI-System gibt Empfehlung ohne Begruendung; Bediener folgt blindlings einer fehlerhaften Empfehlung.", @@ -104,7 +104,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"false_classification"}, - SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 80, ScenarioDE: "KI trifft bei Eingabedaten nahe der Entscheidungsgrenze unzuverlaessige Entscheidungen mit schwankender Konfidenz.", @@ -119,7 +119,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai", "programmable"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M102", "M103"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M105", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 85, ScenarioDE: "RL-Agent entdeckt unbeabsichtigte Strategie zur Reward-Maximierung, die gefaehrliches Verhalten einschliesst.", @@ -134,7 +134,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"unintended_bias"}, - SuggestedMeasureIDs: []string{"M101"}, + SuggestedMeasureIDs: []string{"M186", "M187", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 70, ScenarioDE: "KI-System verarbeitet Kamerabilder mit erkennbaren Personen ohne Einwilligung oder Rechtsgrundlage.", @@ -149,7 +149,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai", "safety_device"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M101", "M104"}, + SuggestedMeasureIDs: []string{"M105", "M227", "M044", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E07", "E15"}, Priority: 95, RequiresExpertCalculation: true, @@ -166,7 +166,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"model_drift"}, - SuggestedMeasureIDs: []string{"M103"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 75, ScenarioDE: "Grundlegende Aenderung des Produktionsprozesses macht das KI-Modell ungueltig, da es auf alten Zusammenhaengen basiert.", @@ -181,7 +181,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai", "user_interface"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"false_classification"}, - SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedMeasureIDs: []string{"M133", "M214", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 80, ScenarioDE: "KI-System meldet einen Zustand mit hoher Konfidenz, der in Wirklichkeit nicht vorliegt (Halluzination).", @@ -196,7 +196,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai", "networked"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"communication_failure", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M101", "M104", "M115"}, + SuggestedMeasureIDs: []string{"M109", "M113", "M106", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15", "E17"}, Priority: 90, ScenarioDE: "Sicherheitsrelevante KI-Funktion benoetigt Cloud-Verbindung; bei Netzwerkausfall ist die Sicherheit nicht gewaehrleistet.", @@ -211,7 +211,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"false_classification"}, - SuggestedMeasureIDs: []string{"M101", "M102"}, + SuggestedMeasureIDs: []string{"M044", "M119", "M133", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15"}, Priority: 75, ScenarioDE: "KI-System ist alleiniger Qualitaetsgate ohne Backup-Pruefung; bei KI-Ausfall passieren alle Teile unkontrolliert.", @@ -226,7 +226,7 @@ func GetCyberExtendedPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_ai"}, RequiredEnergyTags: []string{"ai_model"}, GeneratedHazardCats: []string{"model_drift"}, - SuggestedMeasureIDs: []string{"M103"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E15", "E21"}, Priority: 80, ScenarioDE: "KI-basierte Wartungsvorhersage unterschaetzt Verschleiss und empfiehlt Wartung zu spaet.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended3.go b/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended3.go index cb79b9e0..daa4b5b6 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended3.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_cyber_extended3.go @@ -13,7 +13,7 @@ func GetCyberExtendedPatterns3() []HazardPattern { RequiredComponentTags: []string{"networked", "it_component"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"communication_failure"}, - SuggestedMeasureIDs: []string{"M114", "M115"}, + SuggestedMeasureIDs: []string{"M113", "M106", "M119", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E17"}, Priority: 85, ScenarioDE: "Kompletter Feldbusausfall trennt SPS von allen Antrieben und Sensoren; Maschine verliert Kontrolle.", @@ -28,7 +28,7 @@ func GetCyberExtendedPatterns3() []HazardPattern { RequiredComponentTags: []string{"networked"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"communication_failure"}, - SuggestedMeasureIDs: []string{"M114", "M115"}, + SuggestedMeasureIDs: []string{"M113", "M106", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E17"}, Priority: 80, ScenarioDE: "Einzelne Telegramme im Echtzeit-Bussystem gehen verloren; Antrieb erhaelt keinen neuen Sollwert und behlt den alten.", @@ -58,7 +58,7 @@ func GetCyberExtendedPatterns3() []HazardPattern { RequiredComponentTags: []string{"networked", "it_component"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"communication_failure"}, - SuggestedMeasureIDs: []string{"M115"}, + SuggestedMeasureIDs: []string{"M113", "M106", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E17"}, Priority: 70, ScenarioDE: "Gateway zwischen Feldbus und Leitebene faellt aus; SCADA verliert Sicht auf Prozess, Alarme kommen nicht durch.", @@ -88,7 +88,7 @@ func GetCyberExtendedPatterns3() []HazardPattern { RequiredComponentTags: []string{"networked"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"communication_failure"}, - SuggestedMeasureIDs: []string{"M114"}, + SuggestedMeasureIDs: []string{"M113", "M186", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E17"}, Priority: 65, ScenarioDE: "Zwei Geraete im Maschinennetzwerk haben dieselbe IP-Adresse; Kommunikation ist unzuverlaessig.", @@ -103,7 +103,7 @@ func GetCyberExtendedPatterns3() []HazardPattern { RequiredComponentTags: []string{"networked", "has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"communication_failure", "software_fault"}, - SuggestedMeasureIDs: []string{"M114"}, + SuggestedMeasureIDs: []string{"M040", "M106", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14", "E17"}, Priority: 75, ScenarioDE: "PTP/NTP-Synchronisation im Netzwerk geht verloren; zeitgesteuerte Aktionen werden asynchron ausgefuehrt.", @@ -118,7 +118,7 @@ func GetCyberExtendedPatterns3() []HazardPattern { RequiredComponentTags: []string{"networked", "safety_device"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"communication_failure", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M114", "M115"}, + SuggestedMeasureIDs: []string{"M113", "M106", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E07", "E17"}, Priority: 85, ScenarioDE: "Netzwerk-Ueberlastung verzoegert sicherheitsrelevante Telegramme ueber die maximale Reaktionszeit hinaus.", @@ -133,7 +133,7 @@ func GetCyberExtendedPatterns3() []HazardPattern { RequiredComponentTags: []string{"networked", "it_component"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"communication_failure"}, - SuggestedMeasureIDs: []string{"M114"}, + SuggestedMeasureIDs: []string{"M113", "M186", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E17"}, Priority: 60, ScenarioDE: "Falsche Routing-Konfiguration leitet Steuerbefehle an falsches Teilnetz oder laesst sie ins Leere laufen.", @@ -148,7 +148,7 @@ func GetCyberExtendedPatterns3() []HazardPattern { RequiredComponentTags: []string{"networked", "it_component"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"communication_failure"}, - SuggestedMeasureIDs: []string{"M115"}, + SuggestedMeasureIDs: []string{"M113", "M119", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E17"}, Priority: 75, ScenarioDE: "Managed Switch in Ring-Topologie faellt aus; Ring-Redundanz uebernimmt, aber Umschaltzeit stoert Echtzeit-Kommunikation.", @@ -212,7 +212,7 @@ func GetCyberExtendedPatterns3() []HazardPattern { RequiredComponentTags: []string{"user_interface", "has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M103"}, + SuggestedMeasureIDs: []string{"M205", "M204", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14"}, Priority: 75, ScenarioDE: "HMI zeigt falschen Messwert (z. B. falsche Zuordnung von Sensor zu Anzeige) und Bediener reagiert falsch.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_electrical.go b/ai-compliance-sdk/internal/iace/hazard_patterns_electrical.go index ac132b22..1d4db640 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_electrical.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_electrical.go @@ -8,7 +8,7 @@ func builtinElectricalPatterns() []HazardPattern { RequiredComponentTags: []string{"high_voltage"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M061", "M062", "M063", "M121"}, + SuggestedMeasureIDs: []string{"M481", "M482", "M088", "M265", "M522"}, SuggestedEvidenceIDs: []string{"E01", "E04", "E10"}, Priority: 95, ScenarioDE: "Person beruehrt spannungsfuehrende Teile durch defekte Isolation oder ungesicherten Zugang.", @@ -23,7 +23,7 @@ func builtinElectricalPatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M061", "M064", "M121"}, + SuggestedMeasureIDs: []string{"M482", "M481", "M089", "M508", "M522"}, SuggestedEvidenceIDs: []string{"E01", "E04", "E10"}, Priority: 85, ScenarioDE: "Elektrische Bauteile (Motoren, Netzteile, Schaltgeraete) stellen bei Defekt oder offenem Gehaeuse eine Beruehrungsgefahr dar.", @@ -38,7 +38,7 @@ func builtinElectricalPatterns() []HazardPattern { RequiredComponentTags: []string{"stored_energy"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M062", "M063", "M121", "M123"}, + SuggestedMeasureIDs: []string{"M046", "M047", "M138", "M522", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E10"}, Priority: 85, ScenarioDE: "Kondensatoren, Batterien oder Frequenzumrichter halten nach Abschalten gefaehrliche Restspannung.", @@ -68,7 +68,7 @@ func builtinElectricalPatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electromagnetic"}, GeneratedHazardCats: []string{"emc_hazard"}, - SuggestedMeasureIDs: []string{"M066", "M121"}, + SuggestedMeasureIDs: []string{"M478", "M479", "M044", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E10"}, Priority: 70, ScenarioDE: "Elektromagnetische Stoerungen beeinflussen Steuerungssignale und loesen unerwartete Maschinenbewegungen aus.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_elevator.go b/ai-compliance-sdk/internal/iace/hazard_patterns_elevator.go index 13dd4ca8..bcbe63b9 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_elevator.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_elevator.go @@ -264,7 +264,7 @@ func GetElevatorPatterns() []HazardPattern { RequiredComponentTags: []string{"elevator_car", "moving_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M054", "M106"}, + SuggestedMeasureIDs: []string{"M008", "M001", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 75, ScenarioDE: "Fahrkorb steht nicht buendig mit dem Stockwerksboden. Stufenbildung von mehr als 20mm.", @@ -412,7 +412,7 @@ func GetElevatorPatterns() []HazardPattern { RequiredComponentTags: []string{"elevator_door", "moving_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M054", "M106"}, + SuggestedMeasureIDs: []string{"M061", "M002", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 78, ScenarioDE: "Tuerschliessmechanismus uebt zu grosse Kraft aus. Passagiere werden beim Schliessen der Tueren getroffen.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_environment.go b/ai-compliance-sdk/internal/iace/hazard_patterns_environment.go index 85fa04a1..7a43c8a4 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_environment.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_environment.go @@ -55,7 +55,7 @@ func builtinEnvironmentPatterns() []HazardPattern { RequiredComponentTags: []string{"user_interface"}, RequiredEnergyTags: []string{"ergonomic"}, GeneratedHazardCats: []string{"ergonomic"}, - SuggestedMeasureIDs: []string{"M126", "M121"}, + SuggestedMeasureIDs: []string{"M029", "M030", "M032", "M033", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E24"}, Priority: 50, ScenarioDE: "Bediener arbeitet in unguenstiger Koerperhaltung (stehend, gebeugt, verdreht) ueber laengere Schichtdauer.", @@ -85,7 +85,7 @@ func builtinEnvironmentPatterns() []HazardPattern { RequiredComponentTags: []string{"user_interface", "programmable"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"hmi_error", "mode_confusion"}, - SuggestedMeasureIDs: []string{"M126", "M127", "M121"}, + SuggestedMeasureIDs: []string{"M204", "M205", "M206", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14", "E24"}, Priority: 70, ScenarioDE: "Bediener verwechselt Betriebsarten oder aktiviert falsche Funktion durch unklare HMI-Gestaltung.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_extended.go b/ai-compliance-sdk/internal/iace/hazard_patterns_extended.go index 1d36a0a6..656a8e76 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_extended.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_extended.go @@ -17,7 +17,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"maintenance"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M121"}, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E21"}, Priority: 80, // Source: R341 @@ -28,7 +28,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"kinetic"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M106"}, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E08"}, Priority: 80, // Source: R340 @@ -39,7 +39,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"ai_misclassification"}, - SuggestedMeasureIDs: []string{"M103"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E15"}, Priority: 75, // Source: R590, R1090 @@ -50,7 +50,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"installation", "operation"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M062"}, + SuggestedMeasureIDs: []string{"M481", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 80, // Source: R065, R570, R1070 @@ -61,7 +61,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"installation", "operation"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M062"}, + SuggestedMeasureIDs: []string{"M481", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 80, // Source: R317, R318 @@ -72,7 +72,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"ai_misclassification"}, - SuggestedMeasureIDs: []string{"M082"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 75, // Source: R074, R328 @@ -105,7 +105,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"maintenance", "operation"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M061", "M063", "M121"}, + SuggestedMeasureIDs: []string{"M481", "M482", "M141"}, SuggestedEvidenceIDs: []string{"E10", "E20"}, Priority: 80, // Source: R061, R062, R315, R316, R566, R567, R1066, R1067 @@ -127,7 +127,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"restart"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M106"}, + SuggestedMeasureIDs: []string{"M061", "M141"}, SuggestedEvidenceIDs: []string{"E08"}, Priority: 80, // Source: R339, R598, R1098 @@ -138,7 +138,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"kinetic"}, RequiredLifecycles: []string{"automatic_operation", "cleaning", "operation"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051", "M054", "M121"}, + SuggestedMeasureIDs: []string{"M061", "M002", "M141"}, SuggestedEvidenceIDs: []string{"E20", "E21"}, Priority: 80, // Source: R053, R054, R556, R557, R1056, R1057 @@ -149,7 +149,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"kinetic"}, RequiredLifecycles: []string{"cleaning", "operation"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051", "M054", "M121"}, + SuggestedMeasureIDs: []string{"M061", "M002", "M141"}, SuggestedEvidenceIDs: []string{"E20", "E21"}, Priority: 80, // Source: R305, R306 @@ -160,7 +160,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"thermal"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M022"}, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E14"}, Priority: 70, // Source: R581, R1081 @@ -182,7 +182,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M103"}, + SuggestedMeasureIDs: []string{"M105", "M141"}, SuggestedEvidenceIDs: []string{"E14"}, Priority: 70, // Source: R596, R1096 @@ -193,7 +193,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"unauthorized_access"}, - SuggestedMeasureIDs: []string{"M116"}, + SuggestedMeasureIDs: []string{"M188", "M186", "M141"}, SuggestedEvidenceIDs: []string{"E16"}, Priority: 85, // Source: R587, R1087 @@ -204,7 +204,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{}, RequiredLifecycles: []string{"software_update"}, GeneratedHazardCats: []string{"update_failure"}, - SuggestedMeasureIDs: []string{"M104"}, + SuggestedMeasureIDs: []string{"M188", "M186", "M141"}, SuggestedEvidenceIDs: []string{"E18"}, Priority: 70, // Source: R338, R597, R1097 @@ -215,7 +215,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"thermal"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M015"}, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 70, // Source: R326, R580, R1080 @@ -226,7 +226,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"thermal"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M015"}, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 70, // Source: R072 @@ -248,7 +248,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"thermal"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M015"}, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E10"}, Priority: 70, // Source: R071, R325, R579, R1079 @@ -325,7 +325,7 @@ func getExtendedHazardPatternsA() []HazardPattern { RequiredEnergyTags: []string{"hydraulic_pressure"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"pneumatic_hydraulic"}, - SuggestedMeasureIDs: []string{"M022"}, + SuggestedMeasureIDs: []string{"M522", "M539", "M141"}, SuggestedEvidenceIDs: []string{"E14"}, Priority: 70, // Source: R574, R1074 diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_extended2.go b/ai-compliance-sdk/internal/iace/hazard_patterns_extended2.go index ed788470..ffa2dc09 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_extended2.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_extended2.go @@ -10,7 +10,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"communication_failure"}, - SuggestedMeasureIDs: []string{"M116"}, + SuggestedMeasureIDs: []string{"M113", "M106", "M141"}, SuggestedEvidenceIDs: []string{"E08"}, Priority: 70, // Source: R075, R329, R585, R1085 @@ -43,7 +43,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"hydraulic_pressure"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M021"}, + SuggestedMeasureIDs: []string{"M482", "M481", "M522", "M141"}, SuggestedEvidenceIDs: []string{"E11"}, Priority: 80, // Source: R560, R1060 @@ -76,7 +76,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"model_drift"}, - SuggestedMeasureIDs: []string{"M103"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E15"}, Priority: 75, // Source: R078, R332, R589, R1089 @@ -109,7 +109,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"kinetic"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M052"}, + SuggestedMeasureIDs: []string{"M061", "M002", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 80, // Source: R336, R594, R1094 @@ -142,7 +142,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"maintenance", "operation"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M061", "M121"}, + SuggestedMeasureIDs: []string{"M481", "M482", "M141"}, SuggestedEvidenceIDs: []string{"E14", "E20"}, Priority: 80, // Source: R063, R311, R312, R568, R1068 @@ -153,7 +153,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"sensor_fault"}, - SuggestedMeasureIDs: []string{"M082"}, + SuggestedMeasureIDs: []string{"M214", "M119", "M141"}, SuggestedEvidenceIDs: []string{"E08"}, Priority: 70, // Source: R073, R327, R582, R1082 @@ -175,7 +175,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M103"}, + SuggestedMeasureIDs: []string{"M533", "M141"}, SuggestedEvidenceIDs: []string{"E14"}, Priority: 70, // Source: R553, R1053 @@ -208,7 +208,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"kinetic"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051"}, + SuggestedMeasureIDs: []string{"M061", "M002", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 80, // Source: R558, R1058 @@ -230,7 +230,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"kinetic"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051"}, + SuggestedMeasureIDs: []string{"M061", "M002", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 80, // Source: R565, R1065 @@ -274,7 +274,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"kinetic"}, RequiredLifecycles: []string{"maintenance", "operation"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051"}, + SuggestedMeasureIDs: []string{"M061", "M002", "M141"}, SuggestedEvidenceIDs: []string{"E14", "E20"}, Priority: 80, // Source: R059, R060 @@ -296,7 +296,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"inspection", "operation"}, GeneratedHazardCats: []string{"electrical_hazard", "thermal_hazard"}, - SuggestedMeasureIDs: []string{"M014", "M062"}, + SuggestedMeasureIDs: []string{"M481", "M477", "M141"}, SuggestedEvidenceIDs: []string{"E10"}, Priority: 80, // Source: R064, R313, R314, R569, R1069 @@ -307,7 +307,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"sensor_fault"}, - SuggestedMeasureIDs: []string{"M103"}, + SuggestedMeasureIDs: []string{"M214", "M119", "M141"}, SuggestedEvidenceIDs: []string{"E15"}, Priority: 70, // Source: R077, R331, R588, R1088 @@ -318,7 +318,7 @@ func getExtendedHazardPatternsB() []HazardPattern { RequiredEnergyTags: []string{"electrical_energy"}, RequiredLifecycles: []string{"operation"}, GeneratedHazardCats: []string{"ai_misclassification"}, - SuggestedMeasureIDs: []string{"M082"}, + SuggestedMeasureIDs: []string{"M133", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 75, // Source: R584, R1084 diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_extended3.go b/ai-compliance-sdk/internal/iace/hazard_patterns_extended3.go index ae6f24ee..43545be6 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_extended3.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_extended3.go @@ -95,7 +95,7 @@ func GetExtendedHazardPatterns2() []HazardPattern { RequiredEnergyTags: []string{}, RequiredLifecycles: []string{"maintenance"}, GeneratedHazardCats: []string{"maintenance_hazard"}, - SuggestedMeasureIDs: []string{"M121"}, + SuggestedMeasureIDs: []string{"M186", "M141"}, SuggestedEvidenceIDs: []string{"E14", "E20"}, Priority: 70, ScenarioDE: "Nicht-originale Ersatzteile oder improvisierte Reparaturen beeintraechtigen die Sicherheit.", @@ -146,7 +146,7 @@ func GetExtendedHazardPatterns2() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M014"}, + SuggestedMeasureIDs: []string{"M088", "M329", "M141"}, SuggestedEvidenceIDs: []string{"E10"}, Priority: 55, ScenarioDE: "Statische Aufladung bei Folientransport oder Granulat fuehrt zu Funkenbildung.", @@ -161,7 +161,7 @@ func GetExtendedHazardPatterns2() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "high_voltage"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M061", "M062"}, + SuggestedMeasureIDs: []string{"M515", "M511", "M514", "M512"}, SuggestedEvidenceIDs: []string{"E10", "E14"}, Priority: 90, ScenarioDE: "Korrodierte oder unterbrochene Schutzleiter fuehren bei Isolationsfehler zu Koerperdurchstroemung.", @@ -176,7 +176,7 @@ func GetExtendedHazardPatterns2() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "stored_energy"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M061", "M121"}, + SuggestedMeasureIDs: []string{"M047", "M046", "M522", "M141"}, SuggestedEvidenceIDs: []string{"E10", "E14"}, Priority: 90, ScenarioDE: "Kondensatoren oder Zwischenkreise halten Spannung nach Abschaltung.", @@ -423,7 +423,7 @@ func GetExtendedHazardPatterns2() []HazardPattern { RequiredComponentTags: []string{"has_software", "programmable"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M103"}, + SuggestedMeasureIDs: []string{"M186", "M187", "M141"}, SuggestedEvidenceIDs: []string{"E14", "E15"}, Priority: 75, ScenarioDE: "Steuerungsparameter gehen bei Spannungsausfall verloren, Maschine startet mit Werkseinstellungen.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_extended_dguv.go b/ai-compliance-sdk/internal/iace/hazard_patterns_extended_dguv.go index 92ec52b7..895e377b 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_extended_dguv.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_extended_dguv.go @@ -101,7 +101,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"gravity_risk", "moving_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051"}, + SuggestedMeasureIDs: []string{"M008", "M002", "M061", "M141"}, Priority: 80, MachineTypes: []string{"crane", "construction"}, ScenarioDE: "Unkontrolliertes Schwingen einer angehobenen Last", HarmDE: "Quetschung, Erschlagen durch pendelnde Last", TriggerDE: "Schraeger Zug oder ploetzliches Abstoppen", AffectedDE: "Kranfuehrer, Anschlaeger", ZoneDE: "Schwenkbereich des Krans", DefaultSeverity: 4, DefaultExposure: 3, @@ -125,7 +125,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"high_voltage", "electrical_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard", "thermal_hazard"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M520", "M477", "M138", "M141"}, Priority: 95, ExpertHintDE: "Lichtbogenschutz (Arc Flash) — PSA Kategorie und Schutzabstand berechnen.", ScenarioDE: "Lichtbogenbildung bei Kurzschluss in Schaltanlage", HarmDE: "Schwere Verbrennungen, Augenverletzungen, Gehoerschaden", @@ -136,7 +136,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "stored_energy"}, RequiredEnergyTags: []string{"stored_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M047", "M522", "M141"}, Priority: 88, ExpertHintDE: "Entladezeit abwarten oder Entladewiderstand vorsehen. Spannungsfreiheit messen.", ScenarioDE: "Elektrischer Schlag durch geladenen Kondensator nach Abschaltung", HarmDE: "Elektrischer Schlag, Herzrhythmusstoerungen", @@ -147,7 +147,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M088", "M329", "M141"}, Priority: 72, ScenarioDE: "Statische Entladung zuendet brennbare Atmosphaere", HarmDE: "Verbrennung, Explosion", TriggerDE: "Funkenentladung bei ungeerdetem Material", AffectedDE: "Bedienpersonal", ZoneDE: "Ex-Bereich, Lackierzone", DefaultSeverity: 4, DefaultExposure: 2, @@ -157,7 +157,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"high_voltage"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M088", "M515", "M514", "M518"}, Priority: 92, ScenarioDE: "Koerperdurchstroemung bei defekter Schutzerdung", HarmDE: "Elektrischer Schlag, Herzkammerflimmern, Tod", TriggerDE: "Beruehrung eines fehlerhaft geerdeten Gehaeuses", AffectedDE: "Bedienpersonal", ZoneDE: "Maschinengehaeuse, Schaltschrank", DefaultSeverity: 5, DefaultExposure: 3, @@ -167,7 +167,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electromagnetic"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M046", "M047", "M141"}, Priority: 70, ScenarioDE: "Gefaehrliche Induktionsspannung in abgeschalteter Leitung", HarmDE: "Elektrischer Schlag", TriggerDE: "Parallelfuehrung zu aktiven Hochspannungsleitungen", AffectedDE: "Elektrofachkraft", ZoneDE: "Kabeltrasse, Freileitungsbereich", DefaultSeverity: 3, DefaultExposure: 2, @@ -177,7 +177,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard", "thermal_hazard"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M520", "M519", "M141"}, Priority: 85, ScenarioDE: "Kabelbrand durch Ueberstrom bei fehlender Absicherung", HarmDE: "Verbrennungen, Rauchvergiftung, Anlagenbrand", TriggerDE: "Ueberlast oder defekte Sicherung", AffectedDE: "Alle Personen im Gebaeude", ZoneDE: "Kabelkanal, Verteiler", DefaultSeverity: 4, DefaultExposure: 2, @@ -191,7 +191,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"chemical_risk"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M054", "M124"}, + SuggestedMeasureIDs: []string{"M388", "M386", "M385", "M384", "M141"}, Priority: 95, RequiresExpertCalculation: true, ExpertHintDE: "Explosionsschutz-Dokument erforderlich. Zoneneinteilung und Zuendquellenanalyse.", @@ -310,7 +310,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electromagnetic"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M141", "M533"}, Priority: 70, ScenarioDE: "Exposition gegenueber elektromagnetischen Feldern bei Induktionsanlage", HarmDE: "Erwaermung von Implantaten, Herzschrittmacher-Stoerung", TriggerDE: "Aufenthalt im Nahfeld ohne Abschirmung", AffectedDE: "Bedienpersonal, Implantattraeger", ZoneDE: "Induktionsanlage", DefaultSeverity: 3, DefaultExposure: 3, @@ -320,7 +320,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"sensor_part"}, RequiredEnergyTags: []string{"radiation"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M001", "M054"}, + SuggestedMeasureIDs: []string{"M392", "M141", "M533"}, Priority: 95, RequiresExpertCalculation: true, ExpertHintDE: "Strahlenschutzbeauftragter und Genehmigung erforderlich.", @@ -356,7 +356,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"chemical_risk"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M054", "M124"}, + SuggestedMeasureIDs: []string{"M388", "M385", "M386", "M141"}, Priority: 96, RequiresExpertCalculation: true, ExpertHintDE: "Explosionsschutz-Dokument. ATEX-Zoneneinteilung erforderlich.", @@ -378,7 +378,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"chemical_risk", "cutting_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M054", "M124"}, + SuggestedMeasureIDs: []string{"M386", "M387", "M141"}, Priority: 92, ExpertHintDE: "Metallbraende nur mit Spezialloeschmittel (Klasse D). Kein Wasser!", ScenarioDE: "Metallbrand bei Schleifen/Fraesen von Leichtmetallstaub", HarmDE: "Unkontrollierbarer Brand, Explosion bei Wasserloeschversuch", @@ -401,7 +401,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"chemical_risk"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M385", "M386", "M141"}, Priority: 80, ScenarioDE: "Erhoehte Entzuendbarkeit aller Materialien bei Sauerstoffanreicherung", HarmDE: "Schnelle Brandausbreitung, schwere Verbrennungen", TriggerDE: "Sauerstoffleckage in geschlossenem Raum", AffectedDE: "Alle Personen im Bereich", ZoneDE: "Sauerstoff-Versorgungsanlage", DefaultSeverity: 4, DefaultExposure: 2, @@ -435,7 +435,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { RequiredComponentTags: []string{"vibration_source"}, RequiredEnergyTags: []string{"vibration"}, GeneratedHazardCats: []string{"noise_vibration"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M141"}, Priority: 65, ScenarioDE: "Ganzkoerpervibration bei Fahren von Flurfoerderfahrzeugen", HarmDE: "Wirbelsaeulenschaeden, Bandscheibenvorfall", TriggerDE: "Langzeitexposition auf ungefedertem Sitz", AffectedDE: "Fahrpersonal", ZoneDE: "Fahrzeugfuehrerstand", DefaultSeverity: 3, DefaultExposure: 4, diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_final_b.go b/ai-compliance-sdk/internal/iace/hazard_patterns_final_b.go index e85f2f02..84fbeb3c 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_final_b.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_final_b.go @@ -10,7 +10,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003", "M054"}, + SuggestedMeasureIDs: []string{"M481", "M482", "M265", "M139", "M475"}, SuggestedEvidenceIDs: []string{"E01", "E06", "E08"}, Priority: 85, ScenarioDE: "Person beruehrt aktive Leiter bei offener Abdeckung", TriggerDE: "Wartung ohne Freischalten, defekte Isolation", HarmDE: "Stromschlag, Herzrhythmusstoerung", @@ -22,7 +22,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "structural_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M515", "M518", "M516", "M517", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 80, ScenarioDE: "Maschinengehaeuse fuehrt Spannung bei Isolationsfehler", TriggerDE: "Isolationsversagen, fehlender Schutzleiter", HarmDE: "Stromschlag durch Gehaeuse", @@ -46,7 +46,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "structural_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M477", "M521", "M139", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 72, ScenarioDE: "Kriechstrom fliesst ueber nasse Maschinenflaeche", TriggerDE: "Reinigung mit Wasser, Kondensation, Leckage", HarmDE: "Stromschlag, Muskelverkrampfung", @@ -58,7 +58,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electrical"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M088", "M329", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 55, ScenarioDE: "Elektrostatische Entladung zuendet Atmosphaere", TriggerDE: "Statische Aufladung bei Schuettgut/Folie, Funke", HarmDE: "Brand, leichte Verbrennung", @@ -71,7 +71,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "moving_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M508", "M509", "M520", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 75, ScenarioDE: "Kabelisolierung durch Scheuern oder Quetschung beschaedigt", TriggerDE: "Kabel in Bewegungsbereich, scharfe Kante", HarmDE: "Brand, Stromschlag", @@ -83,7 +83,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard", "thermal_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M510", "M477", "M520", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 70, ScenarioDE: "Lockere Klemme verursacht Lichtbogen und Brand", TriggerDE: "Vibration lockert Klemme, Oxidation", HarmDE: "Schaltschrankbrand", @@ -95,7 +95,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "structural_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M521", "M508", "M539"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 72, ScenarioDE: "Wasser dringt in elektrische Komponente ein", TriggerDE: "Undichte Kabeldurchfuehrung, Ueberflutung", HarmDE: "Kurzschluss, Brand", @@ -108,7 +108,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "high_temperature"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard", "thermal_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M520", "M519", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 72, ScenarioDE: "Motor ueberhitzt durch dauerhaften Ueberlastbetrieb", TriggerDE: "Zu hohe Last, blockierter Antrieb, fehlender Schutz", HarmDE: "Wicklungsbrand, Rauchentwicklung", @@ -120,7 +120,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard", "thermal_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M520", "M519", "M138", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 75, ScenarioDE: "Zu duenner Kabelquerschnitt fuehrt zu Kabelbrand", TriggerDE: "Falsche Dimensionierung, fehlende Sicherung", HarmDE: "Kabelbrand, Brandausbreitung", @@ -132,7 +132,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "high_temperature"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard", "thermal_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M521", "M520", "M519", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 70, ScenarioDE: "Schaltschrank ueberhitzt durch defekte Kuehlung", TriggerDE: "Luefter defekt, Filter verstopft, Ueberbelegung", HarmDE: "Komponentenausfall, Brand", @@ -487,7 +487,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"chemical_risk"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M124"}, + SuggestedMeasureIDs: []string{"M533", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 62, ScenarioDE: "Chemikalie wird mit Getraenk verwechselt", TriggerDE: "Umfuellen in Trinkflaschen, fehlende Kennzeichnung", HarmDE: "Akute Vergiftung", @@ -659,7 +659,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"chemical_risk", "structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M124"}, + SuggestedMeasureIDs: []string{"M406", "M407", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 72, ScenarioDE: "Legionellen vermehren sich im Kuehlkreislauf", TriggerDE: "Stagnation, Temperatur 25-50C, fehlende Wartung", HarmDE: "Legionaerspneumonie", @@ -671,7 +671,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M124"}, + SuggestedMeasureIDs: []string{"M414", "M406", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 60, ScenarioDE: "Schimmelsporen aus Lueftung werden eingeatmet", TriggerDE: "Feuchtigkeit im Kanal, fehlende Filterwartung", HarmDE: "Allergische Alveolitis", @@ -744,7 +744,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"radiation_risk", "sensor_part"}, RequiredEnergyTags: []string{"radiation"}, GeneratedHazardCats: []string{"radiation_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M054"}, + SuggestedMeasureIDs: []string{"M392", "M141"}, SuggestedEvidenceIDs: []string{"E08", "E20"}, Priority: 80, ScenarioDE: "Ionisierende Strahlung aus Roentgenpruefanlage", TriggerDE: "Defekte Abschirmung, Zugang bei Betrieb", HarmDE: "Strahlenkrankheit, Krebs", @@ -756,7 +756,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"radiation_risk"}, RequiredEnergyTags: []string{"radiation"}, GeneratedHazardCats: []string{"radiation_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M005", "M054"}, + SuggestedMeasureIDs: []string{"M391", "M392", "M394", "M141"}, SuggestedEvidenceIDs: []string{"E08", "E20"}, Priority: 82, ScenarioDE: "Laserstrahl trifft Auge oder Haut", TriggerDE: "Reflexion, offene Abdeckung, fehlende Brille", HarmDE: "Netzhautverbrennung, Erblindung", @@ -768,7 +768,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"radiation_risk", "electrical_part"}, RequiredEnergyTags: []string{"electromagnetic"}, GeneratedHazardCats: []string{"radiation_hazard", "emc_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M054"}, + SuggestedMeasureIDs: []string{"M392", "M141"}, SuggestedEvidenceIDs: []string{"E08", "E20"}, Priority: 68, ScenarioDE: "Starkes EMF-Feld durch HF-Anlage/Induktionsofen", TriggerDE: "Aufenthalt im Nahfeld, fehlende Abschirmung", HarmDE: "Erwaermung Gewebe, Herzschrittmacher", @@ -842,7 +842,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"chemical_risk", "structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M001", "M054", "M124"}, + SuggestedMeasureIDs: []string{"M385", "M533", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08", "E20"}, Priority: 85, ScenarioDE: "Inertgas verdraengt Sauerstoff im Raum", TriggerDE: "Stickstoff-/Argonleck, Loeschanlage loest aus", HarmDE: "Bewusstlosigkeit, Erstickungstod", @@ -854,7 +854,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"chemical_risk"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M001", "M054", "M124"}, + SuggestedMeasureIDs: []string{"M385", "M533", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E20"}, Priority: 80, ScenarioDE: "CO2 aus Gaerprozess verdraengt Sauerstoff in Grube/Keller", TriggerDE: "Betreten ohne Gasmessung, fehlende Lueftung", HarmDE: "Bewusstlosigkeit, Tod", @@ -866,7 +866,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M001", "M054"}, + SuggestedMeasureIDs: []string{"M385", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E20"}, Priority: 82, ScenarioDE: "Sauerstoff wird durch Arbeiten in engem Raum verbraucht", TriggerDE: "Schweissen/Schneiden in Behaelter ohne Lueftung", HarmDE: "Sauerstoffmangel, Erstickung", @@ -903,7 +903,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"chemical_risk", "high_temperature"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M001", "M124"}, + SuggestedMeasureIDs: []string{"M385", "M533", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E20"}, Priority: 82, ScenarioDE: "CO entsteht bei unvollstaendiger Verbrennung", TriggerDE: "Verbrennungsmotor in Halle, defekter Abzug", HarmDE: "CO-Vergiftung, Tod", @@ -987,7 +987,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"chemical_risk"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental", "thermal_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M124"}, + SuggestedMeasureIDs: []string{"M385", "M386", "M533", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E20"}, Priority: 78, ScenarioDE: "Falsches Mischen erzeugt unkontrollierte Reaktion", TriggerDE: "Verwechslung Chemikalien, falsche Reihenfolge", HarmDE: "Explosion, Spritzer, Verbrennung", @@ -1023,7 +1023,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"radiation_risk", "electrical_part"}, RequiredEnergyTags: []string{"electromagnetic"}, GeneratedHazardCats: []string{"radiation_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M054"}, + SuggestedMeasureIDs: []string{"M392", "M141"}, SuggestedEvidenceIDs: []string{"E08", "E20"}, Priority: 65, ScenarioDE: "Mikrowellenstrahlung tritt aus defekter Abschirmung", TriggerDE: "Beschaedigte Dichtung, fehlende Wartung", HarmDE: "Gewebeerwaermung, Augenschaden", @@ -1035,7 +1035,7 @@ func GetFinalPatternsB() []HazardPattern { RequiredComponentTags: []string{"radiation_risk", "structural_part"}, RequiredEnergyTags: []string{"radiation"}, GeneratedHazardCats: []string{"radiation_hazard"}, - SuggestedMeasureIDs: []string{"M124"}, + SuggestedMeasureIDs: []string{"M385", "M141", "M533"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, ScenarioDE: "Radon sammelt sich in schlecht belueftetem Keller", TriggerDE: "Fehlende Lueftung, geologisch belastetes Gebiet", HarmDE: "Lungenkrebs bei Langzeitexposition", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_final_c.go b/ai-compliance-sdk/internal/iace/hazard_patterns_final_c.go index b81b136e..5642bb7a 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_final_c.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_final_c.go @@ -107,7 +107,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"programmable", "has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M186", "M187", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 55, ScenarioDE: "Lizenzablauf deaktiviert Sicherheitsoptionen", TriggerDE: "Abgelaufene Runtime-Lizenz, Dongle fehlt", HarmDE: "Reduzierter Funktionsumfang", @@ -144,7 +144,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"sensor_fault"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M214", "M227", "M119", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 65, ScenarioDE: "Schleichende Messwertabweichung unerkannt", TriggerDE: "Alterung, Temperatureinfluss", HarmDE: "Grenzwert wird nicht erkannt", @@ -156,7 +156,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part", "chemical_risk"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"sensor_fault"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M214", "M119", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 68, ScenarioDE: "Verschmutzter Sensor erkennt Objekt nicht", TriggerDE: "Staub, Oel, Spaene auf Sensorflaeche", HarmDE: "Schutzeinrichtung unwirksam", @@ -180,7 +180,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part", "moving_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"sensor_fault"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M119", "M213", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 70, ScenarioDE: "Sensorkabel bricht durch Biegewechsel", TriggerDE: "Kabel in Schleppkette, scharfe Kante", HarmDE: "Sensorausfall, Blindflug", @@ -192,7 +192,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part", "electrical_part"}, RequiredEnergyTags: []string{"electrical"}, GeneratedHazardCats: []string{"sensor_fault", "electrical_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M119", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 65, ScenarioDE: "Feuchtigkeit verursacht Kurzschluss am Sensor", TriggerDE: "Reinigung mit Wasser, Kondensation", HarmDE: "Sensorausfall, Fehlsignal", @@ -204,7 +204,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"sensor_fault", "configuration_error"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M227", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 68, ScenarioDE: "Ersatzsensor wird ohne Kalibrierung eingebaut", TriggerDE: "Fehlende Kalibriervorschrift, Zeitdruck", HarmDE: "Systematischer Messfehler", @@ -216,7 +216,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"sensor_fault"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M227", "M119", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 58, ScenarioDE: "Gealterter Sensor reagiert traege oder gar nicht", TriggerDE: "Ueberschrittene Lebensdauer, keine Pruefung", HarmDE: "Schleichender Funktionsverlust", @@ -228,7 +228,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part", "structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"sensor_fault"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M119", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 55, ScenarioDE: "Sensor faellt durch Frost aus", TriggerDE: "Kondenswasser gefriert, Gehaeuse bricht", HarmDE: "Sensorausfall bei Kaelte", @@ -240,7 +240,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part", "vibration_source"}, RequiredEnergyTags: []string{"vibration"}, GeneratedHazardCats: []string{"sensor_fault"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M227", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 60, ScenarioDE: "Vibration verschiebt Sensor aus Sollposition", TriggerDE: "Dauervibration, lockere Verschraubung", HarmDE: "Falsche Erfassung, Blindzone", @@ -265,7 +265,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "moving_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard", "thermal_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M520", "M519", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 72, ScenarioDE: "Blockierter Motor ueberhitzt und raucht", TriggerDE: "Mechanische Blockade, fehlender Motorschutz", HarmDE: "Motorbrand, Rauchentwicklung", @@ -374,7 +374,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"user_interface", "has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"hmi_error"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M205", "M215", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 72, ScenarioDE: "Anzeige suggeriert sicheren Zustand obwohl gefaehrlich", TriggerDE: "Softwarefehler, verzoegerte Aktualisierung", HarmDE: "Fehleinschaetzung durch Bediener", @@ -386,7 +386,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"user_interface"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"hmi_error", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M204", "M107", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 70, ScenarioDE: "Blockierte Taste sendet Dauersignal fuer Bewegung", TriggerDE: "Verschmutzung, mechanischer Defekt", HarmDE: "Ungewollte Maschinenbewegung", @@ -398,7 +398,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"user_interface", "has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"hmi_error"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M204", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 62, ScenarioDE: "Touchscreen registriert falsche Position", TriggerDE: "Kalibrierungsfehler, Sprung im Display", HarmDE: "Falscher Befehl wird ausgeloest", @@ -410,7 +410,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"user_interface"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"hmi_error", "ergonomic"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M204", "M205", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 52, ScenarioDE: "Display ist bei Gegenlicht nicht ablesbar", TriggerDE: "Sonneneinstrahlung, reflexionsstarke Scheibe", HarmDE: "Fehlablesung, falsche Aktion", @@ -422,7 +422,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"user_interface", "has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"hmi_error"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M204", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 55, ScenarioDE: "HMI-Sprache nicht verstaendlich fuer Bediener", TriggerDE: "Fremdsprachiger Bediener, keine Uebersetzung", HarmDE: "Fehlbedienung durch Missverstaendnis", @@ -435,7 +435,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M051"}, + SuggestedMeasureIDs: []string{"M227", "M105", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 85, ScenarioDE: "Not-Halt-Taster loest bei Betaetigung nicht aus", TriggerDE: "Kontaktfehler, Kabelbruch, mechanischer Defekt", HarmDE: "Maschine laeuft trotz Not-Halt", @@ -447,7 +447,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M051"}, + SuggestedMeasureIDs: []string{"M227", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 82, ScenarioDE: "Lichtvorhang erkennt Eingriff nicht", TriggerDE: "Verschmutzung, Fremdlicht, Dejustierung", HarmDE: "Ungeschuetzter Zugang zur Gefahrstelle", @@ -459,7 +459,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M005", "M051"}, + SuggestedMeasureIDs: []string{"M227", "M105", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 85, ScenarioDE: "Schutztuerschalter wird absichtlich ueberbrueckt", TriggerDE: "Manipulation mit Draht/Magnet, Produktionsdruck", HarmDE: "Zugang bei laufender Maschine", @@ -471,7 +471,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part", "moving_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M051"}, + SuggestedMeasureIDs: []string{"M227", "M044", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 80, ScenarioDE: "Zweihandschaltung loest auch mit einer Hand aus", TriggerDE: "Kontakt klemmt, Zeitfenster zu gross", HarmDE: "Hand im Gefahrbereich bei Ausloesung", @@ -483,7 +483,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M051"}, + SuggestedMeasureIDs: []string{"M227", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 78, ScenarioDE: "Schaltmatte reagiert nicht auf Personengewicht", TriggerDE: "Defekte Zelle, zu leichte Person, Ueberbrueckung", HarmDE: "Maschine startet trotz Anwesenheit", @@ -519,7 +519,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part", "rotating_part"}, RequiredEnergyTags: []string{"rotational"}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M051"}, + SuggestedMeasureIDs: []string{"M227", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 75, ScenarioDE: "Drehzahlwaechter erkennt Ueberdrehzahl nicht", TriggerDE: "Sensordefekt, falsche Parametrierung", HarmDE: "Bauteilversagen durch Ueberdrehzahl", @@ -531,7 +531,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part", "moving_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M051"}, + SuggestedMeasureIDs: []string{"M227", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 72, ScenarioDE: "Positionssensor meldet falschen Achsstandort", TriggerDE: "Encoderdefekt, Signalverlust", HarmDE: "Kollision, Ueberfahren Endlage", @@ -604,7 +604,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"ergonomic"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M357", "M360", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 78, ScenarioDE: "Taetigkeit ohne aktuelle Gefaehrdungsbeurteilung", TriggerDE: "Neue Maschine, geaenderte Taetigkeit, kein Update", HarmDE: "Unerkannte Gefahren", @@ -640,7 +640,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"ergonomic"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M360", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 68, ScenarioDE: "Niemand fuehlt sich fuer Maschinenabschaltung verantwortlich", TriggerDE: "Fehlende Rollenzuweisung, Schichtwechsel", HarmDE: "Maschine laeuft unkontrolliert", @@ -652,7 +652,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"ergonomic"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M360", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 70, ScenarioDE: "Betriebsanweisung fehlt oder ist veraltet", TriggerDE: "Neue Maschine, fehlende Aktualisierung", HarmDE: "Fehlbedienung, Unfall", @@ -677,7 +677,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"ergonomic"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M033", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 55, ScenarioDE: "Zu dunkler Arbeitsplatz fuehrt zu Fehlhandlung", TriggerDE: "Defekte Lampen, Blendung, Schattenbereiche", HarmDE: "Fehlgriff, Stolpersturz", @@ -713,7 +713,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"ergonomic"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M030", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 68, ScenarioDE: "Enger Arbeitsplatz behindert Flucht bei Gefahr", TriggerDE: "Verstellter Fluchtweg, enge Bauweise", HarmDE: "Verzoegerte Flucht, Einschluss", @@ -919,7 +919,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"fire_explosion"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M390", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 78, ScenarioDE: "Fluchtweg durch Paletten oder Material verstellt", TriggerDE: "Fehlende Ordnung, Platzmangel", HarmDE: "Einschluss bei Brand, Panik", @@ -931,7 +931,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"sensor_part", "structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"fire_explosion", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M385", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 80, ScenarioDE: "Brandmelder erkennt Rauch nicht rechtzeitig", TriggerDE: "Defekter Melder, leere Batterie, Staub", HarmDE: "Verzoegerte Evakuierung", @@ -943,7 +943,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"fire_explosion"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M387", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 72, ScenarioDE: "Kein funktionsfaehiger Loescher am Brandort", TriggerDE: "Fehlende Pruefung, Entnahme nicht ersetzt", HarmDE: "Brand kann sich ausbreiten", @@ -955,7 +955,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"fire_explosion"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M390", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 65, ScenarioDE: "Personal kennt Fluchtweg und Sammelplatz nicht", TriggerDE: "Fehlende Uebung, veralteter Plan", HarmDE: "Chaotische Evakuierung", @@ -979,7 +979,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"ergonomic"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 72, ScenarioDE: "Kein Notruf moeglich mangels Telefon/Empfang", TriggerDE: "Kein Mobilnetz, kein Festnetz, Keller", HarmDE: "Verzoegerte Rettung", @@ -991,7 +991,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"fire_explosion"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M384", "M390", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 72, ScenarioDE: "Brandschutztuer wird verkeilt und kann nicht schliessen", TriggerDE: "Bequemlichkeit, Lueftung, Transport", HarmDE: "Brandausbreitung ueber Abschnitte", @@ -1003,7 +1003,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"chemical_risk", "structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"fire_explosion"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M383", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E20"}, Priority: 72, ScenarioDE: "ATEX-Zonen nicht dokumentiert oder veraltet", TriggerDE: "Fehlende Zoneneinteilung, neue Stoffe", HarmDE: "Ungeeignete Betriebsmittel in Zone", @@ -1015,7 +1015,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"chemical_risk", "structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"fire_explosion"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M384", "M386", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 68, ScenarioDE: "Zu viel brennbares Material gelagert", TriggerDE: "Ueberfuelltes Lager, Kartons neben Maschine", HarmDE: "Schnelle Brandausbreitung", @@ -1027,7 +1027,7 @@ func GetFinalPatternsC() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"fire_explosion", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M386", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 78, ScenarioDE: "Sprinkler-/Loeschanlage funktioniert nicht bei Brand", TriggerDE: "Ventil geschlossen, Pumpe defekt, keine Wartung", HarmDE: "Brand wird nicht eingedaemmt", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_final_d.go b/ai-compliance-sdk/internal/iace/hazard_patterns_final_d.go index 2e9388bf..4c7e64c8 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_final_d.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_final_d.go @@ -107,7 +107,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part", "maintenance"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"ergonomic", "maintenance_hazard"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M035", "M037", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 62, ScenarioDE: "Wartungsstelle nur in Zwangshaltung erreichbar", TriggerDE: "Enge Konstruktion, fehlende Wartungsoeffnung", HarmDE: "Fehlhandlung, Ueberlastung", @@ -119,7 +119,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"user_interface", "structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"hmi_error", "ergonomic"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M204", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 58, ScenarioDE: "Bediener verwechselt Taster durch unguenstige Anordnung", TriggerDE: "Aehnliche Taster nebeneinander, keine Farbcodierung", HarmDE: "Falscher Befehl, Unfall", @@ -193,7 +193,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M005"}, + SuggestedMeasureIDs: []string{"M227", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 85, ScenarioDE: "Schutzhaube oder Verkleidung dauerhaft entfernt", TriggerDE: "Bequemlichkeit, schnellerer Zugang", HarmDE: "Direkter Zugang zur Gefahrstelle", @@ -205,7 +205,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part", "sensor_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M005", "M051"}, + SuggestedMeasureIDs: []string{"M227", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 85, ScenarioDE: "Sicherheitsschalter wird mit Draht/Magnet ueberbrueckt", TriggerDE: "Produktionsdruck, haeufige Stoerungen", HarmDE: "Sicherheitsfunktion vollstaendig unwirksam", @@ -217,7 +217,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M227", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 78, ScenarioDE: "Schalter mit Klebeband oder Draht fixiert", TriggerDE: "Ergonomieprobleme, Dauerbetrieb", HarmDE: "Sicherheitsfunktion dauerhaft aus", @@ -229,7 +229,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"sensor_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure", "sensor_fault"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M227", "M214", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 80, ScenarioDE: "Sicherheitssensor absichtlich abgedeckt oder verdreht", TriggerDE: "Fehlalarme, Produktionsstoerung", HarmDE: "Sicherheitssensor erkennt Gefahr nicht", @@ -327,7 +327,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "structural_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard", "mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M521", "M522", "M539", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 58, ScenarioDE: "Hochwasser flutet Maschinenraum/Keller", TriggerDE: "Starkregen, Flusshochwasser, Rohrbruch", HarmDE: "Stromschlag, Maschinenschaden", @@ -339,7 +339,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "structural_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M138", "M329", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 55, ScenarioDE: "Blitzeinschlag zerstoert Steuerungselektronik", TriggerDE: "Fehlender Blitzschutz, Ueberspannungsschutz", HarmDE: "Steuerungsausfall, Brand", @@ -363,7 +363,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part", "has_software"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 55, ScenarioDE: "Extreme Kaelte oder Hitze fuehrt zu Funktionsausfall", TriggerDE: "Ausfall Klimatisierung, extreme Witterung", HarmDE: "Unvorhersehbares Maschinenverhalten", @@ -424,7 +424,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part", "programmable"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M051"}, + SuggestedMeasureIDs: []string{"M227", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 78, ScenarioDE: "Not-Halt stoppt nur eigene Maschine, nicht verkettete", TriggerDE: "Fehlende Not-Halt-Verkettung, Design-Fehler", HarmDE: "Nachbaranlage laeuft weiter", @@ -449,7 +449,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part", "electrical_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M188", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 72, ScenarioDE: "Ersatzkomponente passt nicht zur Sicherheitsarchitektur", TriggerDE: "Falscher Ersatztyp, andere Kennwerte", HarmDE: "Sicherheitsfunktion beeintraechtigt", @@ -485,7 +485,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M005"}, + SuggestedMeasureIDs: []string{"M227", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 80, ScenarioDE: "Schutzeinrichtung fuer Umbau entfernt und nicht remontiert", TriggerDE: "Vergessen nach Umbau, kein Pruefschritt", HarmDE: "Dauerhaft ungeschuetzte Gefahrstelle", @@ -620,7 +620,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"ergonomic"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M360", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 68, ScenarioDE: "Keiner fuehlt sich verantwortlich bei mehreren Bedienern", TriggerDE: "Fehlende Rollenzuweisung", HarmDE: "Doppel- oder Nichthandlung", @@ -644,7 +644,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"ergonomic"}, - SuggestedMeasureIDs: []string{"M001"}, + SuggestedMeasureIDs: []string{"M033", "M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 68, ScenarioDE: "Bediener kann anderen nicht sehen", TriggerDE: "Grosse Maschine, verdeckter Bereich", HarmDE: "Start trotz Person im Gefahrbereich", @@ -668,7 +668,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"structural_part", "sensor_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M005"}, + SuggestedMeasureIDs: []string{"M227", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 72, ScenarioDE: "Schutzbereiche zweier Maschinen ueberlappen sich", TriggerDE: "Zu enger Aufstellungsabstand", HarmDE: "Zugang trotz Sicherheitssignal", @@ -937,7 +937,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"chemical_risk", "structural_part"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M124"}, + SuggestedMeasureIDs: []string{"M405", "M414", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 72, ScenarioDE: "Absauganlage ist zu schwach oder defekt", TriggerDE: "Verstopfter Filter, defekter Ventilator", HarmDE: "Erhoehte Gefahrstoffkonzentration", @@ -949,7 +949,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"maintenance", "electrical_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard", "mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003", "M005"}, + SuggestedMeasureIDs: []string{"M522", "M539", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06", "E08"}, Priority: 85, ScenarioDE: "Maschine wird gewartet ohne Energietrennung", TriggerDE: "Kein LOTO-Verfahren, Zeitdruck", HarmDE: "Unerwarteter Anlauf, Stromschlag", @@ -973,7 +973,7 @@ func GetFinalPatternsD() []HazardPattern { RequiredComponentTags: []string{"chemical_risk", "structural_part"}, RequiredEnergyTags: []string{"electrical"}, GeneratedHazardCats: []string{"fire_explosion", "electrical_hazard"}, - SuggestedMeasureIDs: []string{"M001", "M003"}, + SuggestedMeasureIDs: []string{"M088", "M329", "M385", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E06"}, Priority: 72, ScenarioDE: "Schuettgut laedt sich auf und Funke zuendet Staub", TriggerDE: "Nicht geerdete Behaelter, trockene Luft", HarmDE: "Staubexplosion, Brand", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_food_pkg.go b/ai-compliance-sdk/internal/iace/hazard_patterns_food_pkg.go index b4a27486..7f3f09f1 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_food_pkg.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_food_pkg.go @@ -125,7 +125,7 @@ func GetFoodProcessingPatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M003", "M004"}, + SuggestedMeasureIDs: []string{"M521", "M518", "M539", "M141"}, SuggestedEvidenceIDs: []string{"E04", "E10"}, Priority: 94, RequiresExpertCalculation: true, diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_gt_bremse.go b/ai-compliance-sdk/internal/iace/hazard_patterns_gt_bremse.go index 8f2a0ac7..4ff16905 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_gt_bremse.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_gt_bremse.go @@ -113,7 +113,7 @@ func GetGTBremseHazardPatterns() []HazardPattern { ID: "HP1715", NameDE: "Hautirritation/Atembeschwerden durch KSS-Hautkontakt", NameEN: "Skin irritation/respiratory issues from coolant skin contact", RequiredComponentTags: []string{}, GeneratedHazardCats: []string{"material_environmental_hazard"}, - SuggestedMeasureIDs: []string{"M408", "M533", "M538"}, + SuggestedMeasureIDs: []string{"M408", "M533", "M406", "M141"}, Priority: 88, ApplicableLifecycles: []string{"normal_operation", "cleaning", "maintenance"}, ScenarioDE: "Person hat Hautkontakt mit Kuehlschmierstoff bei Arbeiten am Bearbeitungszentrum oder an angrenzenden KSS-fuehrenden Komponenten.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_laser_medical.go b/ai-compliance-sdk/internal/iace/hazard_patterns_laser_medical.go index 596c4ed0..8ca0da20 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_laser_medical.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_laser_medical.go @@ -9,7 +9,7 @@ func GetLaserPatterns() []HazardPattern { RequiredComponentTags: []string{"radiation_risk"}, RequiredEnergyTags: []string{"radiation"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M001", "M005", "M054"}, + SuggestedMeasureIDs: []string{"M391", "M392", "M394", "M395", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08", "E24"}, Priority: 98, RequiresExpertCalculation: true, @@ -60,7 +60,7 @@ func GetLaserPatterns() []HazardPattern { RequiredComponentTags: []string{"radiation_risk"}, RequiredEnergyTags: []string{"radiation"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M001", "M005", "M054"}, + SuggestedMeasureIDs: []string{"M392", "M394", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E08"}, Priority: 95, ScenarioDE: "Laserstrahl reflektiert an poliertem Werkstueck und trifft Personen ausserhalb der Schutzzone.", @@ -143,7 +143,7 @@ func GetLaserPatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "high_voltage"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M003", "M004", "M054"}, + SuggestedMeasureIDs: []string{"M481", "M482", "M088", "M522", "M141"}, SuggestedEvidenceIDs: []string{"E04", "E10"}, Priority: 95, RequiresExpertCalculation: true, @@ -210,7 +210,7 @@ func GetLaserPatterns() []HazardPattern { RequiredComponentTags: []string{"radiation_risk", "interlocked"}, RequiredEnergyTags: []string{"radiation"}, GeneratedHazardCats: []string{"material_environmental", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M001", "M005", "M106"}, + SuggestedMeasureIDs: []string{"M392", "M393", "M394", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E07", "E08"}, Priority: 96, ScenarioDE: "Laserstrahl tritt durch Spalt oder defekte Tuerverriegelung aus der Schutzeinhausung aus.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_maintenance_ext.go b/ai-compliance-sdk/internal/iace/hazard_patterns_maintenance_ext.go index 48458167..621dc4ad 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_maintenance_ext.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_maintenance_ext.go @@ -57,7 +57,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP707", OperationalStates: []string{"maintenance"}, HumanRoles: []string{"maintenance_tech"}, NameDE: "Verbrennung an heissen Teilen", NameEN: "Burn on hot parts during maintenance", RequiredComponentTags: []string{"high_temperature"}, RequiredLifecycles: []string{"maintenance"}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E10"}, Priority: 60, + SuggestedMeasureIDs: []string{"M141", "M535"}, SuggestedEvidenceIDs: []string{"E10"}, Priority: 60, ScenarioDE: "Maschine nicht abgekuehlt vor Wartung", TriggerDE: "Zu kurze Abkuehlzeit", HarmDE: "Kontaktverbrennungen", AffectedDE: "Instandhalter", ZoneDE: "Heizplatten, Motorgehaeuse", DefaultSeverity: 3, DefaultExposure: 4}, @@ -71,7 +71,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP709", OperationalStates: []string{"maintenance"}, HumanRoles: []string{"maintenance_tech"}, NameDE: "Biologische Gefaehrdung bei KSS-Wartung", NameEN: "Biological hazard MWF maintenance", RequiredComponentTags: []string{"chemical_risk"}, RequiredLifecycles: []string{"maintenance"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, + SuggestedMeasureIDs: []string{"M406", "M407", "M408", "M533", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, ScenarioDE: "Verkeimter Kuehlschmierstoff", TriggerDE: "Altes KSS, Biofilme", HarmDE: "Hautinfektionen, Atemwegsbeschwerden", AffectedDE: "Instandhalter", ZoneDE: "KSS-System", DefaultSeverity: 2, DefaultExposure: 3}, @@ -93,7 +93,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP712", OperationalStates: []string{"teach_mode", "manual_operation"}, HumanRoles: []string{"programmer", "maintenance_tech"}, NameDE: "Unkontrollierte Bewegung nach Probelauf", NameEN: "Uncontrolled movement test run", RequiredComponentTags: []string{"moving_part", "programmable"}, RequiredLifecycles: []string{"setup"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M106", "M054"}, SuggestedEvidenceIDs: []string{"E08"}, Priority: 80, + SuggestedMeasureIDs: []string{"M488", "M487", "M493", "M141"}, SuggestedEvidenceIDs: []string{"E08"}, Priority: 80, ScenarioDE: "Testlauf mit Person im Gefahrenbereich", TriggerDE: "Volle Geschwindigkeit, kein Schutz", HarmDE: "Erfassen, Quetschen", AffectedDE: "Einrichter", ZoneDE: "Arbeitsraum", DefaultSeverity: 5, DefaultExposure: 3}, @@ -114,7 +114,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP715", NameDE: "Stromschlag bei Steckerwechsel", NameEN: "Shock during connector change", RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electrical"}, RequiredLifecycles: []string{"setup"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E09"}, Priority: 65, + SuggestedMeasureIDs: []string{"M522", "M539", "M518", "M141"}, SuggestedEvidenceIDs: []string{"E09"}, Priority: 65, ScenarioDE: "Steckverbinder unter Spannung gewechselt", TriggerDE: "Nicht spannungsfrei", HarmDE: "Stromschlag, Lichtbogen", AffectedDE: "Einrichter", ZoneDE: "Sensoranschluesse", DefaultSeverity: 3, DefaultExposure: 3}, @@ -128,7 +128,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP717", NameDE: "Materialverwechslung bei Produktwechsel", NameEN: "Material mix-up product change", RequiredComponentTags: []string{"structural_part"}, RequiredLifecycles: []string{"setup"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, + SuggestedMeasureIDs: []string{"M533", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, ScenarioDE: "Falsches Material", TriggerDE: "Verwechslung, fehlende Kennzeichnung", HarmDE: "Werkzeugbruch, Splitterflug", AffectedDE: "Bedienpersonal", ZoneDE: "Materialzufuhr", DefaultSeverity: 3, DefaultExposure: 3}, @@ -171,14 +171,14 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP723", NameDE: "Unerwarteter Wiederanlauf bei Stoerung", NameEN: "Unexpected restart fault clearing", RequiredComponentTags: []string{"moving_part", "programmable"}, RequiredLifecycles: []string{"fault_clearing"}, GeneratedHazardCats: []string{"mechanical_hazard", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M106", "M054"}, SuggestedEvidenceIDs: []string{"E08"}, Priority: 95, + SuggestedMeasureIDs: []string{"M488", "M487", "M527", "M106", "M141"}, SuggestedEvidenceIDs: []string{"E08"}, Priority: 95, ScenarioDE: "SPS startet Maschine automatisch nach Fehler", TriggerDE: "Fehlende Wiederanlaufsperre", HarmDE: "Erfassen durch anlaufende Teile, Tod", AffectedDE: "Alle im Gefahrenbereich", ZoneDE: "Arbeitsraum", DefaultSeverity: 5, DefaultExposure: 3}, {ID: "HP724", NameDE: "Kontakt mit heissen Medien bei Stoerung", NameEN: "Hot media contact during fault", RequiredComponentTags: []string{"high_temperature", "high_pressure"}, RequiredLifecycles: []string{"fault_clearing"}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E10"}, Priority: 70, + SuggestedMeasureIDs: []string{"M141", "M533"}, SuggestedEvidenceIDs: []string{"E10"}, Priority: 70, ScenarioDE: "Heisses Medium tritt bei Reparatur aus", TriggerDE: "Nicht druckentlastete Leitung", HarmDE: "Verbruehungen, Dampfverbrennungen", AffectedDE: "Instandhalter", ZoneDE: "Medienleitungen", DefaultSeverity: 4, DefaultExposure: 3}, @@ -192,14 +192,14 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP726", NameDE: "Giftige Daempfe bei Stoerung", NameEN: "Toxic fumes during fault", RequiredComponentTags: []string{"chemical_risk"}, RequiredLifecycles: []string{"fault_clearing"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 70, + SuggestedMeasureIDs: []string{"M395", "M414", "M533", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 70, ScenarioDE: "Stoerung setzt giftige Daempfe frei", TriggerDE: "Ueberhitzung, Materialaustritt", HarmDE: "Vergiftung, Atemwegsschaeden", AffectedDE: "Bedienpersonal", ZoneDE: "Stoerungsstelle", DefaultSeverity: 4, DefaultExposure: 3}, {ID: "HP727", NameDE: "Fehlende Beleuchtung bei Nacht-Stoerung", NameEN: "Insufficient light night fault", RequiredComponentTags: []string{"programmable"}, RequiredLifecycles: []string{"fault_clearing"}, GeneratedHazardCats: []string{"ergonomic_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 40, + SuggestedMeasureIDs: []string{"M033", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 40, ScenarioDE: "Stoerungsbeseitigung nachts bei schlechtem Licht", TriggerDE: "Fehlendes Licht", HarmDE: "Stolpern, Fehlgriff", AffectedDE: "Nachtschichtpersonal", ZoneDE: "Maschinenumgebung", DefaultSeverity: 2, DefaultExposure: 3}, @@ -213,7 +213,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP729", NameDE: "Fehldiagnose fuehrt zu Folgestoerung", NameEN: "Misdiagnosis causes secondary fault", RequiredComponentTags: []string{"programmable"}, RequiredLifecycles: []string{"fault_clearing"}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, + SuggestedMeasureIDs: []string{"M107", "M227", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, ScenarioDE: "Falsche Fehleranalyse fuehrt zu unsachgemaesser Reparatur", TriggerDE: "Fehlendes Diagnosetool", HarmDE: "Folgestoerung mit groesserem Schaden", AffectedDE: "Bedienpersonal", ZoneDE: "Steuerung", DefaultSeverity: 4, DefaultExposure: 2}, @@ -242,7 +242,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP903", NameDE: "Rueckenschaden durch manuelles Tragen", NameEN: "Back injury manual carrying", RequiredComponentTags: []string{"structural_part"}, RequiredLifecycles: []string{"transport"}, GeneratedHazardCats: []string{"ergonomic_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, + SuggestedMeasureIDs: []string{"M354", "M530", "M031", "M360", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, ScenarioDE: "Maschinenteile manuell statt mit Hebehilfe getragen", TriggerDE: "Fehlende Hebemittel", HarmDE: "Bandscheibenvorfall", AffectedDE: "Montagepersonal", ZoneDE: "Transportwege", DefaultSeverity: 3, DefaultExposure: 4}, @@ -321,7 +321,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP914", NameDE: "Giftige Reinigungsmittel-Daempfe", NameEN: "Toxic cleaner fumes", RequiredComponentTags: []string{"chemical_risk"}, RequiredLifecycles: []string{"cleaning"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 65, + SuggestedMeasureIDs: []string{"M395", "M533", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 65, ScenarioDE: "Reinigungsmittel-Daempfe in geschlossenem Raum", TriggerDE: "Fehlende Lueftung", HarmDE: "Atemwegsveraetzung, Vergiftung", AffectedDE: "Reinigungspersonal", ZoneDE: "Maschineninneres", DefaultSeverity: 4, DefaultExposure: 3}, @@ -365,7 +365,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP920", NameDE: "Kontaminierte Teile bei Entsorgung", NameEN: "Contaminated parts disposal", RequiredComponentTags: []string{"chemical_risk"}, RequiredLifecycles: []string{"decommissioning"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, + SuggestedMeasureIDs: []string{"M533", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, ScenarioDE: "Kontaminierte Teile unsachgemaess entsorgt", TriggerDE: "Fehlende Trennung", HarmDE: "Umweltverschmutzung, Hautkontakt", AffectedDE: "Entsorgungspersonal", ZoneDE: "Demontagebereich", DefaultSeverity: 2, DefaultExposure: 3}, @@ -432,7 +432,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP929", NameDE: "Sprachbarriere bei Sicherheitskommunikation", NameEN: "Language barrier safety communication", RequiredComponentTags: []string{"structural_part"}, RequiredLifecycles: []string{"maintenance"}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, + SuggestedMeasureIDs: []string{"M141", "M360"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, ScenarioDE: "Sicherheitsanweisungen nicht verstanden", TriggerDE: "Nur deutschsprachige Unterweisung", HarmDE: "Fehlverhalten durch Missverstaendnis", AffectedDE: "Fremdfirmenpersonal", ZoneDE: "Einsatzbereich", DefaultSeverity: 3, DefaultExposure: 3}, @@ -446,7 +446,7 @@ func GetMaintenanceExtPatterns() []HazardPattern { {ID: "HP931", NameDE: "Schnittstellenproblem an Gewerkeuebergaengen", NameEN: "Interface problem trade boundaries", RequiredComponentTags: []string{"structural_part"}, RequiredLifecycles: []string{"maintenance"}, GeneratedHazardCats: []string{"safety_function_failure"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 60, + SuggestedMeasureIDs: []string{"M141", "M360"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 60, ScenarioDE: "Verantwortungsluecke zwischen Gewerken", TriggerDE: "Unklare Zustaendigkeiten", HarmDE: "Vernachlaessigte Sicherheit", AffectedDE: "Alle Gewerke", ZoneDE: "Schnittstellen", DefaultSeverity: 3, DefaultExposure: 3}, diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_mechanical.go b/ai-compliance-sdk/internal/iace/hazard_patterns_mechanical.go index 74c35b70..10431b48 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_mechanical.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_mechanical.go @@ -143,7 +143,7 @@ func builtinMechanicalPatterns() []HazardPattern { RequiredComponentTags: []string{"stored_energy"}, RequiredEnergyTags: []string{"mechanical"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M010", "M121", "M123"}, + SuggestedMeasureIDs: []string{"M008", "M061", "M535", "M141", "M001"}, SuggestedEvidenceIDs: []string{"E01", "E20"}, Priority: 80, ScenarioDE: "Gespannte Federn, angehobene Lasten oder gespannte Riemen geben gespeicherte Energie unkontrolliert frei.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_medical_pressure.go b/ai-compliance-sdk/internal/iace/hazard_patterns_medical_pressure.go index 08ddd193..364fa7e4 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_medical_pressure.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_medical_pressure.go @@ -10,7 +10,7 @@ func GetMedicalDevicePatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part"}, RequiredEnergyTags: []string{"electrical_energy"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M003", "M004"}, + SuggestedMeasureIDs: []string{"M476", "M518", "M515", "M141"}, SuggestedEvidenceIDs: []string{"E04", "E10"}, Priority: 97, RequiresExpertCalculation: true, @@ -29,7 +29,7 @@ func GetMedicalDevicePatterns() []HazardPattern { RequiredComponentTags: []string{"electrical_part", "has_software"}, RequiredEnergyTags: []string{"electrical_energy", "stored_energy"}, GeneratedHazardCats: []string{"electrical_hazard", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M003", "M106"}, + SuggestedMeasureIDs: []string{"M515", "M514", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E07", "E10", "E14"}, Priority: 98, RequiresExpertCalculation: true, diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_operational.go b/ai-compliance-sdk/internal/iace/hazard_patterns_operational.go index 1e22b82f..f5557c35 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_operational.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_operational.go @@ -45,7 +45,7 @@ func GetOperationalHazardPatterns() []HazardPattern { RequiredComponentTags: []string{"moving_part", "programmable"}, RequiredLifecycles: []string{"fault_clearing"}, GeneratedHazardCats: []string{"mechanical_hazard", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M106", "M054"}, + SuggestedMeasureIDs: []string{"M488", "M487", "M106", "M141"}, Priority: 96, RequiresExpertCalculation: true, ExpertHintDE: "Wiederanlaufsperre mit manueller Quittierung erforderlich. SIL/PL-Nachweis.", @@ -124,7 +124,7 @@ func GetOperationalHazardPatterns() []HazardPattern { RequiredComponentTags: []string{"moving_part"}, RequiredLifecycles: []string{"maintenance"}, GeneratedHazardCats: []string{"maintenance_hazard"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M522", "M539", "M141"}, Priority: 96, RequiresExpertCalculation: true, ExpertHintDE: "LOTO-Verfahren (Lockout/Tagout) fuer alle Energiequellen definieren und schulen.", @@ -140,7 +140,7 @@ func GetOperationalHazardPatterns() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredLifecycles: []string{"maintenance", "cleaning"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051"}, + SuggestedMeasureIDs: []string{"M061", "M002", "M141"}, Priority: 78, ScenarioDE: "Wartungspersonal steigt auf Buehne oder Leiter fuer Arbeiten an erhoehter Stelle", TriggerDE: "Abrutschen von Leiter oder Stolpern auf Wartungsbuehne ohne Gelaender", @@ -183,7 +183,7 @@ func GetOperationalHazardPatterns() []HazardPattern { RequiredComponentTags: []string{"high_voltage"}, RequiredLifecycles: []string{"maintenance", "fault_clearing"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M482", "M481", "M522", "M141"}, Priority: 95, RequiresExpertCalculation: true, ExpertHintDE: "Freischaltung, Sicherung gegen Wiedereinschalten, Spannungsfreiheit feststellen.", @@ -262,7 +262,7 @@ func GetOperationalHazardPatterns() []HazardPattern { RequiredComponentTags: []string{"gravity_risk", "high_force"}, RequiredLifecycles: []string{"changeover"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051"}, + SuggestedMeasureIDs: []string{"M530", "M007", "M008", "M141"}, Priority: 85, ExpertHintDE: "Hebezeug fuer Werkzeuge ueber 25 kg verwenden.", ScenarioDE: "Einrichter hebt schweres Werkzeug manuell ohne Hebezeug bei Werkzeugwechsel", @@ -277,7 +277,7 @@ func GetOperationalHazardPatterns() []HazardPattern { RequiredComponentTags: []string{"moving_part", "crush_point"}, RequiredLifecycles: []string{"setup"}, GeneratedHazardCats: []string{"mechanical_hazard", "safety_function_failure"}, - SuggestedMeasureIDs: []string{"M106"}, + SuggestedMeasureIDs: []string{"M491", "M493", "M492", "M141"}, Priority: 94, RequiresExpertCalculation: true, ExpertHintDE: "Einrichtbetrieb nur mit reduzierter Geschwindigkeit und Zweihandschaltung.", @@ -327,7 +327,7 @@ func GetOperationalHazardPatterns() []HazardPattern { RequiredComponentTags: []string{"structural_part"}, RequiredLifecycles: []string{"transport"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051"}, + SuggestedMeasureIDs: []string{"M507", "M002", "M141"}, Priority: 85, ScenarioDE: "Maschine wird mittels Kran oder Gabelstapler transportiert, Schwerpunkt nicht korrekt", TriggerDE: "Maschine kippt wegen falsch gesetzter Anschlagpunkte oder asymmetrischer Last", @@ -341,7 +341,7 @@ func GetOperationalHazardPatterns() []HazardPattern { RequiredComponentTags: []string{"high_force", "gravity_risk"}, RequiredLifecycles: []string{"assembly"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051"}, + SuggestedMeasureIDs: []string{"M530", "M002", "M061", "M141"}, Priority: 82, ScenarioDE: "Montagepersonal positioniert schwere Maschinenkomponente bei Erstaufstellung", TriggerDE: "Bauteil rutscht von Unterlage oder Hebezeug versagt beim Absetzen", @@ -369,7 +369,7 @@ func GetOperationalHazardPatterns() []HazardPattern { RequiredComponentTags: []string{"hydraulic_part"}, RequiredLifecycles: []string{"decommissioning", "disposal"}, GeneratedHazardCats: []string{"material_environmental", "pneumatic_hydraulic"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M533", "M141"}, Priority: 75, ScenarioDE: "Demontagepersonal loest Leitungen oder Behaelter mit Restmedien bei Ausserbetriebnahme", TriggerDE: "Austritt von Restoel, Druckluft oder Gas beim Loesen von Verschraubungen", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_packaging.go b/ai-compliance-sdk/internal/iace/hazard_patterns_packaging.go index 074d3455..dfb56dcb 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_packaging.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_packaging.go @@ -218,7 +218,7 @@ func GetPackagingPatterns() []HazardPattern { RequiredComponentTags: []string{"interlocked", "gravity_risk"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M051", "M054"}, + SuggestedMeasureIDs: []string{"M008", "M061", "M002", "M141"}, SuggestedEvidenceIDs: []string{"E08"}, Priority: 70, ScenarioDE: "Schwere Schutzhaube faellt unkontrolliert zu oder schlaegt beim Oeffnen gegen Bediener.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_robot_cell.go b/ai-compliance-sdk/internal/iace/hazard_patterns_robot_cell.go index dd3b1a4f..9cc9b01b 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_robot_cell.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_robot_cell.go @@ -179,7 +179,7 @@ func GetRobotCellPatterns() []HazardPattern { ID: "HP1625", NameDE: "Schneiden an scharfen Kanten der Einhausung", NameEN: "Cutting on sharp enclosure edges", RequiredComponentTags: []string{"guard"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M003"}, + SuggestedMeasureIDs: []string{"M003", "M004", "M027"}, Priority: 97, ApplicableLifecycles: []string{"normal_operation", "setup", "cleaning", "maintenance", "fault_clearing"}, ScenarioDE: "Person schneidet sich an nicht entgrateten oder scharfkantigen Blechen der Einhausung oder Verkleidung.", @@ -269,7 +269,7 @@ func GetRobotCellPatterns() []HazardPattern { ID: "HP1635", NameDE: "Ausrutschen durch KSS-Leckage", NameEN: "Slipping due to coolant leakage", RequiredComponentTags: []string{}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M420"}, + SuggestedMeasureIDs: []string{"M538", "M484", "M141"}, Priority: 97, MachineTypes: []string{"cnc", "metalworking", "automotive"}, ApplicableLifecycles: []string{"normal_operation", "setup", "cleaning", "maintenance", "fault_clearing"}, ScenarioDE: "Kuehlschmierstoff tritt aus und bildet rutschigen Belag auf dem Boden. Person rutscht aus und stuerzt.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_robot_cell_ext.go b/ai-compliance-sdk/internal/iace/hazard_patterns_robot_cell_ext.go index 1a1abbf3..4051d6f0 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_robot_cell_ext.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_robot_cell_ext.go @@ -26,7 +26,7 @@ func GetRobotCellPatternsExt() []HazardPattern { ID: "HP1651", NameDE: "Wiederanlauf Roboter waehrend Person in Zelle", NameEN: "Robot restart while person inside cell", RequiredComponentTags: []string{"moving_part", "guard"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M054", "M061", "M141"}, + SuggestedMeasureIDs: []string{"M488", "M487", "M489", "M490", "M141"}, Priority: 99, ApplicableLifecycles: []string{"normal_operation", "setup", "cleaning", "maintenance", "fault_clearing", "changeover"}, ScenarioDE: "Person befindet sich in der Roboterzelle. Schutztuer wird geschlossen und Roboter startet ohne dass sichergestellt ist, dass niemand im Gefahrenbereich ist.", @@ -144,7 +144,7 @@ func GetRobotCellPatternsExt() []HazardPattern { ID: "HP1666", NameDE: "Quetschen/Scheren im Bearbeitungsraum der WZM", NameEN: "Crushing/shearing inside machine tool workspace", RequiredComponentTags: []string{"moving_part"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{"M054"}, + SuggestedMeasureIDs: []string{"M524", "M525", "M487", "M141"}, Priority: 98, MachineTypes: []string{"cnc", "metalworking", "automotive", "robotics_cobot"}, ApplicableLifecycles: []string{"setup", "maintenance", "fault_clearing"}, ScenarioDE: "Person greift in den Bearbeitungsraum der Werkzeugmaschine und wird von beweglichen Achsen, Werkzeug oder Spannvorrichtung verletzt.", @@ -299,7 +299,7 @@ func GetRobotCellPatternsExt() []HazardPattern { ID: "HP1690", NameDE: "Ergonomisch unguenstige Einlegeposition", NameEN: "Unfavorable ergonomic loading position", RequiredComponentTags: []string{"entanglement_risk"}, GeneratedHazardCats: []string{"ergonomic_hazard"}, - SuggestedMeasureIDs: []string{}, + SuggestedMeasureIDs: []string{"M532", "M029", "M357", "M141"}, Priority: 85, ApplicableLifecycles: []string{"normal_operation"}, ScenarioDE: "Person muss Werkstuecke in ergonomisch unguenstiger Hoehe oder Reichweite auf das Foerderband auflegen oder entnehmen.", @@ -313,7 +313,7 @@ func GetRobotCellPatternsExt() []HazardPattern { ID: "HP1691", NameDE: "Unergonomische Position der Bedienelemente", NameEN: "Unfavorable ergonomic position of controls", RequiredComponentTags: []string{}, GeneratedHazardCats: []string{"ergonomic_hazard"}, - SuggestedMeasureIDs: []string{}, + SuggestedMeasureIDs: []string{"M531", "M029", "M357", "M141"}, Priority: 85, ApplicableLifecycles: []string{"normal_operation", "setup"}, ScenarioDE: "Person bedient Anlage in ergonomisch unguenstiger Position ueber laengere Zeit.", @@ -347,7 +347,7 @@ func GetRobotCellPatternsExt() []HazardPattern { ID: "HP1697", NameDE: "Anlage bricht durch unzureichenden Untergrund ein", NameEN: "Machine collapses through insufficient floor", RequiredComponentTags: []string{"high_force"}, GeneratedHazardCats: []string{"mechanical_hazard"}, - SuggestedMeasureIDs: []string{}, + SuggestedMeasureIDs: []string{"M507", "M141"}, Priority: 88, ApplicableLifecycles: []string{"normal_operation", "setup", "commissioning"}, ScenarioDE: "Untergrund bricht unter dem Maschinengewicht ein. Personen im Umfeld werden von kippender oder absackender Anlage eingeklemmt.", @@ -378,7 +378,7 @@ func GetRobotCellPatternsExt() []HazardPattern { ID: "HP1699", NameDE: "EMV-Stoereinfluss auf Sicherheitsfunktionen", NameEN: "EMC interference with safety functions", RequiredComponentTags: []string{}, GeneratedHazardCats: []string{"radiation_hazard"}, - SuggestedMeasureIDs: []string{"M478", "M479"}, + SuggestedMeasureIDs: []string{"M478", "M479", "M141"}, Priority: 97, ApplicableLifecycles: []string{"normal_operation", "setup"}, ScenarioDE: "EMV-Stoerungen verursachen unerwartete Maschinenbewegungen. Person im Gefahrenbereich wird von unkontrolliert bewegten Teilen getroffen.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_software.go b/ai-compliance-sdk/internal/iace/hazard_patterns_software.go index c70918be..a08f3e3f 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_software.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_software.go @@ -9,7 +9,7 @@ func builtinSoftwarePatterns() []HazardPattern { RequiredEnergyTags: []string{}, ExcludedComponentTags: []string{"has_ai"}, GeneratedHazardCats: []string{"software_fault"}, - SuggestedMeasureIDs: []string{"M101", "M102", "M103"}, + SuggestedMeasureIDs: []string{"M105", "M106", "M107", "M112", "M141"}, SuggestedEvidenceIDs: []string{"E01", "E14"}, Priority: 85, ScenarioDE: "Softwarefehler (Logikfehler, Race Condition, Ueberlauf) fuehrt zu unbeabsichtigter Maschinenbewegung.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_thermal.go b/ai-compliance-sdk/internal/iace/hazard_patterns_thermal.go index fabf336d..cebc3a11 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_thermal.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_thermal.go @@ -38,7 +38,7 @@ func builtinThermalPatterns() []HazardPattern { RequiredComponentTags: []string{"actuator_part", "high_temperature"}, RequiredEnergyTags: []string{}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M071", "M121"}, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 75, ScenarioDE: "Aktuatoren (Servomotoren, Linearantriebe) erwaermen sich im Dauerbetrieb ueber die Beruehrtemperaturgrenze.", diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_workshop.go b/ai-compliance-sdk/internal/iace/hazard_patterns_workshop.go index 8a67155d..8aaf265b 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_workshop.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_workshop.go @@ -75,32 +75,32 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 3, DefaultExposure: 5}, {ID: "HP611", NameDE: "Zwangshaltung bei Maschinenarbeit", NameEN: "Forced posture during machine work", RequiredComponentTags: []string{"structural_part"}, GeneratedHazardCats: []string{"ergonomic_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, + SuggestedMeasureIDs: []string{"M355", "M357", "M360", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, ScenarioDE: "Buecken, Ueberkopfarbeit, Knien", TriggerDE: "Schlechte Arbeitsplatzgestaltung", HarmDE: "Muskel-Skelett-Erkrankungen", AffectedDE: "Bedienpersonal", ZoneDE: "Maschinenarbeitsplatz", DefaultSeverity: 3, DefaultExposure: 5}, {ID: "HP612", NameDE: "Ermuedung durch Steharbeit", NameEN: "Fatigue from standing work", RequiredComponentTags: []string{"structural_part"}, GeneratedHazardCats: []string{"ergonomic_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 40, + SuggestedMeasureIDs: []string{"M358", "M353", "M357", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 40, ScenarioDE: "Dauerhafte Steharbeit ohne Stuetzmoeglichkeit", TriggerDE: "Fehlende Stehhilfe", HarmDE: "Venenprobleme, Gelenkbeschwerden", AffectedDE: "Bedienpersonal", ZoneDE: "Bedienposition", DefaultSeverity: 2, DefaultExposure: 5}, {ID: "HP613", NameDE: "Repetitive Bewegung (RSI)", NameEN: "Repetitive motion (RSI)", RequiredComponentTags: []string{"moving_part"}, GeneratedHazardCats: []string{"ergonomic_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, + SuggestedMeasureIDs: []string{"M353", "M358", "M357", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, ScenarioDE: "Gleiche Handbewegungen bei Beschickung/Entnahme", TriggerDE: "Hohe Taktfrequenz", HarmDE: "Karpaltunnelsyndrom, Sehnenscheidenentzuendung", AffectedDE: "Bedienpersonal", ZoneDE: "Beschickungsbereich", DefaultSeverity: 3, DefaultExposure: 5}, {ID: "HP614", NameDE: "Bildschirmarbeit mit schlechter Ergonomie", NameEN: "Screen work poor ergonomics", RequiredComponentTags: []string{"programmable"}, GeneratedHazardCats: []string{"ergonomic_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 40, + SuggestedMeasureIDs: []string{"M029", "M032", "M357", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 40, ScenarioDE: "HMI-Arbeit mit unguenstiger Blickhoehe", TriggerDE: "Falsche Bildschirmhoehe, Blendung", HarmDE: "Augenbelastung, Nackenschmerzen", AffectedDE: "Bedienpersonal", ZoneDE: "Bedienterminal", DefaultSeverity: 2, DefaultExposure: 5}, // — Psychische Belastung (HP615-HP617) — {ID: "HP615", NameDE: "Belastung durch Schichtarbeit", NameEN: "Strain from shift work", RequiredComponentTags: []string{"structural_part"}, GeneratedHazardCats: []string{"ergonomic_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 40, + SuggestedMeasureIDs: []string{"M358", "M357", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 40, ScenarioDE: "Schichtarbeit stoert Biorhythmus", TriggerDE: "Fehlende Schichtrotation", HarmDE: "Erhoehte Unfallgefahr, Herz-Kreislauf-Risiko", AffectedDE: "Schichtpersonal", ZoneDE: "Produktionsstaette", DefaultSeverity: 3, DefaultExposure: 5}, @@ -112,7 +112,7 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 3, DefaultExposure: 5}, {ID: "HP617", NameDE: "Zeitdruck und Monotonie", NameEN: "Time pressure and monotony", RequiredComponentTags: []string{"structural_part"}, GeneratedHazardCats: []string{"ergonomic_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 42, + SuggestedMeasureIDs: []string{"M358", "M357", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 42, ScenarioDE: "Hohe Taktbindung fuehrt zu Konzentrationsverlust", TriggerDE: "Enge Taktzeiten", HarmDE: "Fehlbedienungen, Unfallrisiko", AffectedDE: "Bedienpersonal", ZoneDE: "Maschinenarbeitsplatz", DefaultSeverity: 3, DefaultExposure: 4}, @@ -133,7 +133,7 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 3, DefaultExposure: 3}, {ID: "HP620", NameDE: "Elektrostatische Entladung (ESD)", NameEN: "Electrostatic discharge", RequiredComponentTags: []string{"electrical_part"}, GeneratedHazardCats: []string{"electrical_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E09"}, Priority: 50, + SuggestedMeasureIDs: []string{"M088", "M329", "M141"}, SuggestedEvidenceIDs: []string{"E09"}, Priority: 50, ScenarioDE: "Elektrostatische Aufladung an Maschinenteilen", TriggerDE: "Trockene Luft, fehlende Erdung", HarmDE: "Funkenbildung, Zuendquelle im Ex-Bereich", AffectedDE: "Bedienpersonal", ZoneDE: "Foerderbaender", DefaultSeverity: 2, DefaultExposure: 4}, @@ -154,7 +154,7 @@ func GetWorkshopPatterns() []HazardPattern { // — Thermische Gefaehrdungen erweitert (HP623-HP627) — {ID: "HP623", NameDE: "Kaelteverletzung bei Tieftemperaturprozess", NameEN: "Cold injury cryogenic process", RequiredComponentTags: []string{"high_temperature"}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E10", "E20"}, Priority: 65, + SuggestedMeasureIDs: []string{"M141", "M533"}, SuggestedEvidenceIDs: []string{"E10", "E20"}, Priority: 65, ScenarioDE: "Hautkontakt mit Kryogasen (LN2, CO2)", TriggerDE: "Fehlende Schutzhandschuhe", HarmDE: "Erfrierungen, Kaelteverbrennungen", AffectedDE: "Bedienpersonal", ZoneDE: "Kuehlanlage", DefaultSeverity: 3, DefaultExposure: 3}, @@ -175,14 +175,14 @@ func GetWorkshopPatterns() []HazardPattern { {ID: "HP626", NameDE: "Verbrennung an heisser Oberflaeche", NameEN: "Burn on hot surface", RequiredComponentTags: []string{"high_temperature"}, RequiredEnergyTags: []string{"thermal"}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E10"}, Priority: 60, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E10"}, Priority: 60, ScenarioDE: "Beruehrung heisser Maschinenteile ohne Markierung", TriggerDE: "Fehlende Isolierung/Warnung", HarmDE: "Kontaktverbrennungen", AffectedDE: "Bedienpersonal", ZoneDE: "Motorgehaeuse, Heizplatten", DefaultSeverity: 3, DefaultExposure: 4}, {ID: "HP627", NameDE: "Strahlungswaerme von Oefen", NameEN: "Radiant heat from furnaces", RequiredComponentTags: []string{"high_temperature"}, RequiredEnergyTags: []string{"thermal"}, GeneratedHazardCats: []string{"thermal_hazard"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E10", "E20"}, Priority: 55, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E10", "E20"}, Priority: 55, ScenarioDE: "IR-Strahlung von offenen Oefen belastet Personal", TriggerDE: "Fehlender Strahlungsschutz", HarmDE: "Hautverbrennungen, Augenschaeden", AffectedDE: "Bedienpersonal", ZoneDE: "Ofenbereich", DefaultSeverity: 3, DefaultExposure: 4}, @@ -221,7 +221,7 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 4, DefaultExposure: 3}, {ID: "HP633", NameDE: "Hautresorption giftiger Substanzen", NameEN: "Dermal absorption toxic substances", RequiredComponentTags: []string{"chemical_risk"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 60, + SuggestedMeasureIDs: []string{"M408", "M533", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 60, ScenarioDE: "Giftaufnahme ueber Haut (Isocyanate, Epoxide)", TriggerDE: "Fehlende Schutzhandschuhe", HarmDE: "Sensibilisierung, Dermatitis", AffectedDE: "Bedienpersonal", ZoneDE: "Harzverarbeitung", DefaultSeverity: 3, DefaultExposure: 4}, @@ -234,7 +234,7 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 5, DefaultExposure: 3}, {ID: "HP635", NameDE: "Sensibilisierung durch Kuehlschmierstoffe", NameEN: "Sensitization from MWF", RequiredComponentTags: []string{"chemical_risk", "cutting_part"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, + SuggestedMeasureIDs: []string{"M408", "M406", "M533", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, ScenarioDE: "Langzeitkontakt mit KSS-Nebel", TriggerDE: "Hautkontakt, verkeimte KSS", HarmDE: "Kontaktekzem, Asthma", AffectedDE: "Maschinenbediener", ZoneDE: "Bearbeitungsraum", DefaultSeverity: 3, DefaultExposure: 5}, @@ -269,7 +269,7 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 4, DefaultExposure: 3}, {ID: "HP640", NameDE: "Selbstentzuendung oelgetraenkter Lappen", NameEN: "Spontaneous combustion oily rags", RequiredComponentTags: []string{"chemical_risk"}, GeneratedHazardCats: []string{"thermal_hazard", "material_environmental"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, + SuggestedMeasureIDs: []string{"M385", "M386", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, ScenarioDE: "Oelgetraenkte Tuecher entzuenden sich", TriggerDE: "Zusammengeknuellte Lappen", HarmDE: "Brand, Rauchentwicklung", AffectedDE: "Alle Personen", ZoneDE: "Werkstatt, Abfallbehaelter", DefaultSeverity: 3, DefaultExposure: 3}, @@ -282,19 +282,19 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 4, DefaultExposure: 3}, {ID: "HP642", NameDE: "Schimmel in feuchten Raeumen", NameEN: "Mould in damp rooms", RequiredComponentTags: []string{"structural_part"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, + SuggestedMeasureIDs: []string{"M141", "M533"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, ScenarioDE: "Dauerfeuchtigkeit foerdert Schimmelwachstum", TriggerDE: "Ungenuegender Luftwechsel", HarmDE: "Atemwegsbeschwerden, Allergien", AffectedDE: "Alle im Raum", ZoneDE: "Kellerraeume, Feuchtzonen", DefaultSeverity: 2, DefaultExposure: 5}, {ID: "HP643", NameDE: "Zeckenstich bei Aussenarbeit", NameEN: "Tick bite outdoor work", RequiredComponentTags: []string{"structural_part"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 40, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 40, ScenarioDE: "Zecken uebertragen FSME/Borreliose", TriggerDE: "Arbeit im Gestruepp", HarmDE: "FSME, Borreliose", AffectedDE: "Aussendienstpersonal", ZoneDE: "Aussengelaende", DefaultSeverity: 4, DefaultExposure: 2}, {ID: "HP644", NameDE: "Hantavirus durch Nagetierkontakt", NameEN: "Hantavirus from rodent contact", RequiredComponentTags: []string{"structural_part"}, GeneratedHazardCats: []string{"material_environmental"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, ScenarioDE: "Staub mit Nagerkot in selten gereinigten Raeumen", TriggerDE: "Aufwirbeln von Staub", HarmDE: "Hantavirus, Nierenschaeden", AffectedDE: "Lagerpersonal", ZoneDE: "Lager, Keller", DefaultSeverity: 4, DefaultExposure: 2}, @@ -308,14 +308,14 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 5, DefaultExposure: 2}, {ID: "HP646", NameDE: "UV-Strahlung bei Haertung/Desinfektion", NameEN: "UV radiation curing/disinfection", RequiredComponentTags: []string{"radiation_source"}, GeneratedHazardCats: []string{"radiation_hazard"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 60, + SuggestedMeasureIDs: []string{"M392", "M394", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 60, ScenarioDE: "Offener UV-Strahler exponiert Personal", TriggerDE: "Defekter Schutzschirm", HarmDE: "Hautkrebs, Augenentzuendung", AffectedDE: "Bedienpersonal", ZoneDE: "UV-Haertungsanlage", DefaultSeverity: 3, DefaultExposure: 3}, {ID: "HP647", NameDE: "Infrarotstrahlung am Schmelzofen", NameEN: "IR radiation at melting furnace", RequiredComponentTags: []string{"high_temperature", "radiation_source"}, RequiredEnergyTags: []string{"thermal"}, GeneratedHazardCats: []string{"radiation_hazard", "thermal_hazard"}, - SuggestedMeasureIDs: []string{"M005", "M082"}, SuggestedEvidenceIDs: []string{"E10", "E20"}, Priority: 60, + SuggestedMeasureIDs: []string{"M392", "M141", "M533"}, SuggestedEvidenceIDs: []string{"E10", "E20"}, Priority: 60, ScenarioDE: "IR-Strahlung von offenen Oefen", TriggerDE: "Fehlende IR-Schutzbrille", HarmDE: "Katarakt, Hautverbrennung", AffectedDE: "Ofenpersonal", ZoneDE: "Schmelzofen", DefaultSeverity: 3, DefaultExposure: 4}, @@ -327,7 +327,7 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 3, DefaultExposure: 3}, {ID: "HP649", NameDE: "Radonexposition in Kellerraeumen", NameEN: "Radon in underground rooms", RequiredComponentTags: []string{"structural_part"}, GeneratedHazardCats: []string{"radiation_hazard"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, + SuggestedMeasureIDs: []string{"M385", "M533", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, ScenarioDE: "Radon in schlecht beluefteten Kellern", TriggerDE: "Risse im Fundament, keine Lueftung", HarmDE: "Lungenkrebs bei Langzeitexposition", AffectedDE: "Kellerpersonal", ZoneDE: "Keller", DefaultSeverity: 4, DefaultExposure: 3}, @@ -340,19 +340,19 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 4, DefaultExposure: 4}, {ID: "HP651", NameDE: "Ultraschallemission", NameEN: "Ultrasound emission", RequiredComponentTags: []string{"noise_source"}, GeneratedHazardCats: []string{"noise_vibration"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, ScenarioDE: "Ultraschallgeraete emittieren unhorbaren Schall", TriggerDE: "Offener Betrieb ohne Kapselung", HarmDE: "Kopfschmerzen, Uebelkeit", AffectedDE: "Bedienpersonal", ZoneDE: "US-Reinigungsbad", DefaultSeverity: 2, DefaultExposure: 4}, {ID: "HP652", NameDE: "Infraschall durch Grossmaschinen", NameEN: "Infrasound from large machines", RequiredComponentTags: []string{"noise_source", "structural_part"}, GeneratedHazardCats: []string{"noise_vibration"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, ScenarioDE: "Tieffrequenter Schall <20 Hz", TriggerDE: "Ungedaempfte Aufstellung, Resonanz", HarmDE: "Schwindel, Konzentrationsstoerung", AffectedDE: "Alle im Gebaeude", ZoneDE: "Kompressorraum", DefaultSeverity: 2, DefaultExposure: 4}, {ID: "HP653", NameDE: "Koerperschall ins Gebaeude", NameEN: "Structure-borne sound", RequiredComponentTags: []string{"noise_source", "structural_part"}, GeneratedHazardCats: []string{"noise_vibration"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 45, ScenarioDE: "Vibrationen uebertragen sich ueber Fundamente", TriggerDE: "Fehlende Schwingungsisolation", HarmDE: "Laermbelaestigung in Nachbarraeumen", AffectedDE: "Bueropersonal", ZoneDE: "Angrenzende Raeume", DefaultSeverity: 2, DefaultExposure: 5}, @@ -366,7 +366,7 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 3, DefaultExposure: 5}, {ID: "HP655", NameDE: "Ganzkoerpervibration auf Fahrersitz", NameEN: "Whole-body vibration driver seat", RequiredComponentTags: []string{"vibration_source", "structural_part"}, GeneratedHazardCats: []string{"noise_vibration"}, - SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, + SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, ScenarioDE: "Vibration uebertraegt sich auf Koerper", TriggerDE: "Defekte Sitzfederung, Unebenheiten", HarmDE: "Bandscheibenschaeden, LWS-Beschwerden", AffectedDE: "Fahrerpersonal", ZoneDE: "Fahrersitz", DefaultSeverity: 3, DefaultExposure: 5}, diff --git a/ai-compliance-sdk/internal/iace/pattern_coverage_test.go b/ai-compliance-sdk/internal/iace/pattern_coverage_test.go new file mode 100644 index 00000000..e76c5787 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/pattern_coverage_test.go @@ -0,0 +1,125 @@ +package iace + +import ( + "sort" + "testing" +) + +// patternCategoryCompatibility mirrors the Go runtime helper +// `acceptableMeasureCategories` in internal/api/handlers/iace_handler_init_helpers.go. +// Kept here so the test does not depend on the handlers package (which would +// introduce an import cycle). If the runtime map changes, this table must be +// updated in lockstep — there is no fallback any more, so a drift would mean +// hazards going to the operator with zero mitigations. +var patternCategoryCompatibility = map[string]map[string]bool{ + "mechanical_hazard": {"mechanical": true}, + "electrical_hazard": {"electrical": true}, + "thermal_hazard": {"thermal": true, "material_environmental": true}, + "noise_vibration": {"noise_vibration": true, "ergonomic": true}, + "pneumatic_hydraulic": {"pneumatic_hydraulic": true, "mechanical": true}, + "material_environmental": {"material_environmental": true}, + "chemical_risk": {"material_environmental": true, "thermal": true}, + "ergonomic": {"ergonomic": true}, + "ergonomic_hazard": {"ergonomic": true}, + "fire_explosion": {"thermal": true, "material_environmental": true}, + "radiation_hazard": {"material_environmental": true}, + "emc_hazard": {"electrical": true, "software_control": true}, + "maintenance_hazard": {"mechanical": true}, + "safety_function_failure": {"safety_function": true, "software_control": true}, + "software_fault": {"software_control": true}, + "sensor_fault": {"software_control": true}, + "configuration_error": {"software_control": true}, + "update_failure": {"software_control": true}, + "hmi_error": {"software_control": true}, + "mode_confusion": {"software_control": true}, + "unauthorized_access": {"cyber_network": true, "software_control": true}, + "communication_failure": {"cyber_network": true, "software_control": true}, + "firmware_corruption": {"cyber_network": true, "software_control": true}, + "logging_audit_failure": {"cyber_network": true, "software_control": true}, + "ai_misclassification": {"ai_specific": true, "software_control": true}, + "false_classification": {"ai_specific": true, "software_control": true}, + "model_drift": {"ai_specific": true, "software_control": true}, + "data_poisoning": {"ai_specific": true, "software_control": true}, + "sensor_spoofing": {"ai_specific": true, "software_control": true}, + "unintended_bias": {"ai_specific": true, "software_control": true}, + "noise_source": {"noise_vibration": true, "ergonomic": true}, + "vibration_source": {"noise_vibration": true, "ergonomic": true}, + "high_temperature": {"thermal": true, "material_environmental": true}, + "material_environmental_hazard": {"material_environmental": true}, +} + +// TestEveryPattern_HasCategoryCompatibleMeasure is the contract that replaces +// the old category fallback: every hazard pattern must reference at least one +// measure whose HazardCategory is compatible with the pattern's hazard cats, +// or with "general". Without this, the operator-facing UI shows a hazard with +// zero mitigations and a "consult expert" placeholder — which is fine for +// rare edge cases but must not become the default state. +// +// New patterns added to the library must satisfy this test. The 2026-05 +// Bremse benchmark drove down zero-surv from 237 → 0 — that floor is now +// enforced. +// +// Patterns explicitly known to have no library coverage today should be added +// to AllowlistKnownGaps with a TODO and an issue link; the test still fails +// if anything not on that list has zero coverage. +var AllowlistKnownGaps = map[string]string{ + // hp-id -> rationale (must be filled when adding) +} + +func TestEveryPattern_HasCategoryCompatibleMeasure(t *testing.T) { + measureCat := map[string]string{} + for _, m := range GetProtectiveMeasureLibrary() { + measureCat[m.ID] = m.HazardCategory + } + + patterns := collectAllPatterns() + gaps := []string{} + for _, p := range patterns { + if _, allowed := AllowlistKnownGaps[p.ID]; allowed { + continue + } + accepted := map[string]bool{"general": true} + for _, hc := range p.GeneratedHazardCats { + for c := range patternCategoryCompatibility[hc] { + accepted[c] = true + } + } + hasCompatible := false + for _, mid := range p.SuggestedMeasureIDs { + mc, ok := measureCat[mid] + if !ok { + continue + } + if mc == "" || accepted[mc] { + hasCompatible = true + break + } + } + if !hasCompatible { + gaps = append(gaps, p.ID+" (cats="+joinCats(p.GeneratedHazardCats)+")") + } + } + sort.Strings(gaps) + if len(gaps) > 0 { + t.Errorf("%d patterns have no category-compatible measure (add to AllowlistKnownGaps or fix SuggestedMeasureIDs):", len(gaps)) + const maxList = 20 + for i, g := range gaps { + if i >= maxList { + t.Errorf(" ... and %d more", len(gaps)-maxList) + break + } + t.Errorf(" - %s", g) + } + } +} + +func joinCats(cats []string) string { + out := "" + for i, c := range cats { + if i > 0 { + out += "," + } + out += c + } + return out +}