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 578fd427..258eea4b 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 @@ -60,6 +60,14 @@ func acceptableMeasureCategories(patternCat string) map[string]bool { "mechanical_hazard": {"mechanical"}, "electrical_hazard": {"electrical"}, "thermal_hazard": {"thermal", "material_environmental"}, + // ISO 12100 Anhang B splits Nr. 4 Laerm and Nr. 5 Vibration into + // two top-level groups. The legacy combined alias noise_vibration + // is kept for backwards compat — all three resolve to the same + // measure pool today (the library doesn't separate noise vs + // vibration measures), but the pattern category now matches the + // norm structure. + "noise_hazard": {"noise_vibration", "ergonomic"}, + "vibration_hazard": {"noise_vibration", "ergonomic"}, "noise_vibration": {"noise_vibration", "ergonomic"}, "pneumatic_hydraulic": {"pneumatic_hydraulic", "mechanical"}, "material_environmental": {"material_environmental"}, diff --git a/ai-compliance-sdk/internal/iace/hazard_pattern_types.go b/ai-compliance-sdk/internal/iace/hazard_pattern_types.go index 3425ac8a..4984c036 100644 --- a/ai-compliance-sdk/internal/iace/hazard_pattern_types.go +++ b/ai-compliance-sdk/internal/iace/hazard_pattern_types.go @@ -70,6 +70,12 @@ type HazardPattern struct { // is relevant. Written into the Hazard's LifecyclePhase field on creation. // Empty = not set (pattern does not specify lifecycle applicability). ApplicableLifecycles []string `json:"applicable_lifecycles,omitempty"` + // ISO12100Section is a free-text identifier of the ISO 12100 Annex B + // section that owns this hazard type (e.g. "6.2.2.1" or "6.3.5.5"). + // Stored as an identifier only — the norm text is NOT included to + // keep the library urheberrechtlich neutral (DIN/Beuth license). + // The frontend renders it as "EN ISO 12100 Abschnitt 6.3.5.5". + ISO12100Section string `json:"iso_12100_section,omitempty"` } // Standard human roles for machinery interaction (ISO 12100 + BetrSichV). diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_electrical.go b/ai-compliance-sdk/internal/iace/hazard_patterns_electrical.go index 1d4db640..833288f0 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_electrical.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_electrical.go @@ -16,6 +16,7 @@ func builtinElectricalPatterns() []HazardPattern { HarmDE: "Stromschlag, Herzkammerflimmern, Verbrennungen, Todesfolge bei Hochspannung.", AffectedDE: "Wartungspersonal, Elektrofachkraefte, Bedienpersonal", ZoneDE: "Schaltschrank, Klemmenkasten, Motoranschluss, Frequenzumrichter", + ISO12100Section: "6.2.9", DefaultSeverity: 5, DefaultExposure: 2, }, { @@ -31,6 +32,7 @@ func builtinElectricalPatterns() []HazardPattern { HarmDE: "Stromschlag, lokale Verbrennungen, Muskelverkrampfung.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Motorgehaeuse, Anschlussklemmen, Netzteile, Kabelkanaele", + ISO12100Section: "6.2.9", DefaultSeverity: 4, DefaultExposure: 2, }, { @@ -46,6 +48,7 @@ func builtinElectricalPatterns() []HazardPattern { HarmDE: "Stromschlag, Verbrennungen durch Lichtbogen, Explosion bei Lithium-Akkus.", AffectedDE: "Elektrofachkraefte, Wartungspersonal", ZoneDE: "Zwischenkreiskondensatoren, Batteriefaecher, USV-Anlagen", + ISO12100Section: "6.2.10", DefaultSeverity: 4, DefaultExposure: 2, }, { @@ -76,6 +79,7 @@ func builtinElectricalPatterns() []HazardPattern { HarmDE: "Fehlausloesung von Aktoren, unerwartete Bewegung, Ausfall von Sicherheitsfunktionen.", AffectedDE: "Bedienpersonal, Personen im Maschinenbereich", ZoneDE: "Gesamte Maschinenumgebung, insbesondere Signalleitungen und Sensorik", + ISO12100Section: "6.3.3", DefaultSeverity: 3, DefaultExposure: 2, }, } diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_elevator.go b/ai-compliance-sdk/internal/iace/hazard_patterns_elevator.go index bcbe63b9..0e79932c 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_elevator.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_elevator.go @@ -363,7 +363,7 @@ func GetElevatorPatterns() []HazardPattern { MachineTypes: []string{"elevator", "lift", "escalator"}, RequiredComponentTags: []string{"elevator_traction", "noise_source"}, RequiredEnergyTags: []string{}, - GeneratedHazardCats: []string{"noise_vibration"}, + GeneratedHazardCats: []string{"noise_hazard"}, SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_environment.go b/ai-compliance-sdk/internal/iace/hazard_patterns_environment.go index 7a43c8a4..cb7ef825 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_environment.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_environment.go @@ -8,7 +8,7 @@ func builtinEnvironmentPatterns() []HazardPattern { ID: "HP023", NameDE: "Laermgefahr", NameEN: "Noise hazard", RequiredComponentTags: []string{"noise_source"}, RequiredEnergyTags: []string{"acoustic"}, - GeneratedHazardCats: []string{"noise_vibration"}, + GeneratedHazardCats: []string{"noise_hazard"}, SuggestedMeasureIDs: []string{"M091", "M131"}, SuggestedEvidenceIDs: []string{"E01", "E12"}, Priority: 70, @@ -17,13 +17,14 @@ func builtinEnvironmentPatterns() []HazardPattern { HarmDE: "Laermschwerhoerigkeit (BK 2301), Tinnitus, Konzentrationsstoerung.", AffectedDE: "Bedienpersonal, Personen im Umfeld", ZoneDE: "Gesamter Arbeitsbereich um die Maschine, insbesondere Auslassseite", + ISO12100Section: "6.3.3.2.1", DefaultSeverity: 3, DefaultExposure: 4, }, { ID: "HP024", NameDE: "Vibrationsgefahr", NameEN: "Vibration hazard", RequiredComponentTags: []string{"vibration_source"}, RequiredEnergyTags: []string{"vibration"}, - GeneratedHazardCats: []string{"noise_vibration"}, + GeneratedHazardCats: []string{"vibration_hazard"}, SuggestedMeasureIDs: []string{"M092", "M131"}, SuggestedEvidenceIDs: []string{"E01", "E13"}, Priority: 65, @@ -32,13 +33,14 @@ func builtinEnvironmentPatterns() []HazardPattern { HarmDE: "Hand-Arm-Vibrationssyndrom (BK 2104), Durchblutungsstoerung, Gelenkschaeden.", AffectedDE: "Bedienpersonal, Maschinenfuehrer", ZoneDE: "Griffe, Bedienelemente, Standfussbereich, Fahrersitz", + ISO12100Section: "6.3.3.2.1", DefaultSeverity: 3, DefaultExposure: 4, }, { ID: "HP025", NameDE: "Laerm durch rotierende Hochgeschwindigkeitsteile", NameEN: "Noise from high-speed rotating parts", RequiredComponentTags: []string{"rotating_part", "high_speed"}, RequiredEnergyTags: []string{}, - GeneratedHazardCats: []string{"noise_vibration"}, + GeneratedHazardCats: []string{"noise_hazard"}, SuggestedMeasureIDs: []string{"M091", "M092", "M131"}, SuggestedEvidenceIDs: []string{"E01", "E12", "E13"}, Priority: 70, @@ -47,6 +49,7 @@ func builtinEnvironmentPatterns() []HazardPattern { HarmDE: "Gehoerschaedigung, Tinnitus, erhoehtes Unfallrisiko durch Konzentrationsverlust.", AffectedDE: "Bedienpersonal, Personen im Hallenbereich", ZoneDE: "Umgebung der Spindel/Schleifscheibe, Maschinengehaeuse, offene Bearbeitungszone", + ISO12100Section: "6.3.3.2.1", DefaultSeverity: 3, DefaultExposure: 4, }, // Ergonomic 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 895e377b..5a888cb5 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_extended_dguv.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_extended_dguv.go @@ -434,7 +434,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { ID: "HP132", NameDE: "Ganzkoepervibrration bei Fahrzeugen/Maschinen", NameEN: "Whole-body vibration from vehicles/machines", RequiredComponentTags: []string{"vibration_source"}, RequiredEnergyTags: []string{"vibration"}, - GeneratedHazardCats: []string{"noise_vibration"}, + GeneratedHazardCats: []string{"vibration_hazard"}, SuggestedMeasureIDs: []string{"M141"}, Priority: 65, ScenarioDE: "Ganzkoerpervibration bei Fahren von Flurfoerderfahrzeugen", HarmDE: "Wirbelsaeulenschaeden, Bandscheibenvorfall", @@ -444,7 +444,7 @@ func GetDGUVExtendedPatterns() []HazardPattern { ID: "HP133", NameDE: "Hand-Arm-Vibration bei handgefuehrten Werkzeugen", NameEN: "Hand-arm vibration from handheld tools", RequiredComponentTags: []string{"vibration_source"}, RequiredEnergyTags: []string{"vibration"}, - GeneratedHazardCats: []string{"noise_vibration"}, + GeneratedHazardCats: []string{"vibration_hazard"}, SuggestedMeasureIDs: []string{"M054", "M141"}, Priority: 70, ScenarioDE: "Hand-Arm-Vibration durch handgefuehrtes Schlagwerkzeug", HarmDE: "Durchblutungsstoerungen, Weissfingerkrankheit", 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 84fbeb3c..74d392fe 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_final_b.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_final_b.go @@ -780,7 +780,7 @@ func GetFinalPatternsB() []HazardPattern { ID: "HP1148", NameDE: "Impulslaerm Stanzpresse", NameEN: "Impulse noise punch press", RequiredComponentTags: []string{"noise_source", "high_force"}, RequiredEnergyTags: []string{}, - GeneratedHazardCats: []string{"ergonomic_hazard", "noise_vibration"}, + GeneratedHazardCats: []string{"ergonomic_hazard", "noise_hazard"}, SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E01", "E20"}, Priority: 72, ScenarioDE: "Impulslaerm bei jedem Stanzhub", @@ -816,7 +816,7 @@ func GetFinalPatternsB() []HazardPattern { ID: "HP1151", NameDE: "Dauerlaerm ueber 85 dB(A)", NameEN: "Continuous noise above 85 dB(A)", RequiredComponentTags: []string{"noise_source"}, RequiredEnergyTags: []string{}, - GeneratedHazardCats: []string{"ergonomic_hazard", "noise_vibration"}, + GeneratedHazardCats: []string{"ergonomic_hazard", "noise_hazard"}, SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E01", "E20"}, Priority: 72, ScenarioDE: "Dauerhafte Laermbelastung ueber Ausloeeschwelle", 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 7f3f09f1..c35a6a75 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_food_pkg.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_food_pkg.go @@ -239,7 +239,7 @@ func GetFoodProcessingPatterns() []HazardPattern { MachineTypes: []string{"food_processing", "packaging"}, RequiredComponentTags: []string{"noise_source", "high_pressure"}, RequiredEnergyTags: []string{}, - GeneratedHazardCats: []string{"noise_vibration"}, + GeneratedHazardCats: []string{"noise_hazard"}, SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E12", "E20"}, Priority: 65, 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 4ff16905..983d3750 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_gt_bremse.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_gt_bremse.go @@ -25,6 +25,7 @@ func GetGTBremseHazardPatterns() []HazardPattern { HarmDE: "Person wird von kippender oder einsturzender Anlage getroffen, Quetschungen, Knochenbrueche.", AffectedDE: "Bedienpersonal, Wartungspersonal, Umstehende", ZoneDE: "Aufstellort der Maschine, Bereich um die Anlage", + ISO12100Section: "6.3.5.5", DefaultSeverity: 4, DefaultExposure: 1, }, @@ -44,6 +45,7 @@ func GetGTBremseHazardPatterns() []HazardPattern { HarmDE: "Person wird von weggeschleudertem Werkstueck getroffen. Prellungen, Knochenbrueche je nach Werkstueckgewicht und Beschleunigung.", AffectedDE: "Bedienpersonal in der Naehe der Zelle, Personal an der Werkstueckaufgabe", ZoneDE: "Schutzzaun, Bereich um die Roboterzelle, Werkstueckaufgabe", + ISO12100Section: "6.2.6", DefaultSeverity: 3, DefaultExposure: 2, }, @@ -64,6 +66,7 @@ func GetGTBremseHazardPatterns() []HazardPattern { HarmDE: "Augenverletzung durch Partikel im Druckluftstrahl, Hautirritation, Einstich durch Druckluft.", AffectedDE: "Bedienpersonal, Reinigungspersonal", ZoneDE: "Bearbeitungszelle Werkzeugmaschine, Reinigungsduese", + ISO12100Section: "6.3.5.4", DefaultSeverity: 2, DefaultExposure: 3, }, @@ -83,6 +86,7 @@ func GetGTBremseHazardPatterns() []HazardPattern { HarmDE: "Rueckenleiden, Bandscheibenvorfall, Muskel- und Gelenkverletzungen.", AffectedDE: "Bedienpersonal an manueller Be-/Entladestelle", ZoneDE: "Manuelle Be-/Entladestelle, Transportbaender", + ISO12100Section: "6.4.5.1", DefaultSeverity: 3, DefaultExposure: 4, }, @@ -102,6 +106,7 @@ func GetGTBremseHazardPatterns() []HazardPattern { HarmDE: "Verspannungen, Rueckenleiden, Schulter- und Nackenbeschwerden bei dauerhafter Belastung.", AffectedDE: "Bedienpersonal an HMI/Steuerstand", ZoneDE: "Bedienstand HMI, Steuerpult", + ISO12100Section: "6.4.5.1", DefaultSeverity: 2, DefaultExposure: 4, }, @@ -121,6 +126,7 @@ func GetGTBremseHazardPatterns() []HazardPattern { HarmDE: "Hautirritationen, Ekzeme, allergische Kontaktdermatitis, bei Aerosolen Atembeschwerden und Asthma.", AffectedDE: "Bedienpersonal, Wartungspersonal, Reinigungspersonal", ZoneDE: "Bearbeitungszentrum, KSS-Aufbereitungsanlage, KSS-fuehrende Leitungen", + ISO12100Section: "6.2.5", DefaultSeverity: 3, DefaultExposure: 4, }, @@ -141,6 +147,7 @@ func GetGTBremseHazardPatterns() []HazardPattern { HarmDE: "Stromschlag, Brand, Folgeschaeden an Steuerung. Person erleidet Brandverletzungen oder elektrischen Schlag.", AffectedDE: "Reinigungspersonal, Wartungspersonal", ZoneDE: "Schaltschrank, elektrisch aktive Komponenten der Maschine", + ISO12100Section: "6.2.9", DefaultSeverity: 4, DefaultExposure: 2, }, @@ -161,6 +168,7 @@ func GetGTBremseHazardPatterns() []HazardPattern { HarmDE: "Person wird von wegfliegenden Teilen oder unter Druck austretender Luft getroffen. Augenverletzung, Einstichverletzung.", AffectedDE: "Wartungspersonal, Einrichter", ZoneDE: "Pneumatik-Komponenten der Anlage, Wartungsbereich", + ISO12100Section: "6.2.10", DefaultSeverity: 2, DefaultExposure: 3, }, } diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_iso12100_gaps.go b/ai-compliance-sdk/internal/iace/hazard_patterns_iso12100_gaps.go new file mode 100644 index 00000000..82bb0853 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_iso12100_gaps.go @@ -0,0 +1,94 @@ +package iace + +// GetISO12100GapPatterns returns hazard patterns for sources/effects from +// ISO 12100 Annex B (Tabelle B.1) that were missing in the previous IACE +// library: Vakuum, elastische Elemente (Federn), raue/rutschige Oberflaeche, +// Hochdruckinjektion und Ersticken. All entries reference the relevant +// ISO 12100 section identifier (no norm text reproduced — only the section +// number, which is a fact, not a copyrighted work). +// +// HP range: HP1900-HP1909. +func GetISO12100GapPatterns() []HazardPattern { + return []HazardPattern{ + { + ID: "HP1900", NameDE: "Verletzung durch Vakuum (Vakuumgreifer / Saug-Anlage)", NameEN: "Vacuum injury (suction/vacuum equipment)", + RequiredComponentTags: []string{"clamping_part"}, + RequiredEnergyTags: []string{"pneumatic"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M061", "M002", "M141"}, + Priority: 90, + ApplicableLifecycles: []string{"normal_operation", "setup", "maintenance"}, + ScenarioDE: "Vakuum-Werkzeug (Greifer, Saugplatte) erzeugt im Versagensfall Sog auf menschliches Gewebe (Hand, Haut). Auch nach Abschalten kann Restvakuum gefaehrlich sein.", + TriggerDE: "Hand am Sauger waehrend Aktivierung, Anlauf des Vakuums ohne Sicht­kontakt, fehlende Vakuum-Schnellentlueftung.", + HarmDE: "Quetschende Saugverletzung an Haut/Hand, Haematom, im Extremfall Avulsion oberflaechlichen Gewebes.", + AffectedDE: "Bedienpersonal, Wartungspersonal", + ZoneDE: "Vakuumgreifer, Saugnaepfe, Sauganlagen-Auslass", + ISO12100Section: "6.3.5.5", + DefaultSeverity: 3, DefaultExposure: 2, + }, + { + ID: "HP1901", NameDE: "Freisetzung gespeicherter Federenergie (elastische Elemente)", NameEN: "Release of stored spring energy (elastic elements)", + RequiredComponentTags: []string{"stored_energy"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M046", "M047", "M061", "M141"}, + Priority: 92, + ApplicableLifecycles: []string{"maintenance", "fault_clearing", "changeover"}, + ScenarioDE: "Vorgespannte Federn, Gasdruckfedern oder elastische Elemente entladen ihre Energie unerwartet bei Demontage oder Loesen einer Arretierung.", + TriggerDE: "Loesen einer Schraube/Arretierung ohne vorherige Entlastung; Materialermuedung der Feder; Verschleiss der Halterung.", + HarmDE: "Schlag oder Wegschleudern durch entladende Feder; Augen-, Prell- und Schnittverletzungen.", + AffectedDE: "Wartungspersonal, Einrichter", + ZoneDE: "Federmechanismen, Gasdruckfedern, vorgespannte Riemen", + ISO12100Section: "6.2.10", + DefaultSeverity: 3, DefaultExposure: 2, + }, + { + ID: "HP1902", NameDE: "Ausrutschen/Stolpern auf rauer oder rutschiger Oberflaeche", NameEN: "Slipping/tripping on rough or slippery surface", + RequiredComponentTags: []string{"structural_part"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M141", "M538"}, + Priority: 80, + ApplicableLifecycles: []string{"normal_operation", "setup", "cleaning", "maintenance"}, + ScenarioDE: "Bediener rutscht aus oder stolpert auf einer Oberflaeche im Anlagenbereich (rutschig durch KSS, Oel oder Wasser; uneben durch Kabel, Schwellen, raue Bodenstrukturen).", + TriggerDE: "Fluessigkeits-Leckage, unregelmaessige Bodengeometrie, lose Verlegung von Kabeln/Schlaeuchen.", + HarmDE: "Prellungen, Knochenbrueche, Kopfverletzungen bei Sturz; Aufprall an Anlagenkanten.", + AffectedDE: "Bedienpersonal, Reinigungspersonal, Wartungspersonal", + ZoneDE: "Verkehrswege im Maschinenbereich, Anlagenboden, Wartungspodeste", + ISO12100Section: "6.3.5.6", + DefaultSeverity: 3, DefaultExposure: 4, + }, + { + ID: "HP1903", NameDE: "Hochdruckinjektion durch austretendes Medium", NameEN: "High-pressure injection injury", + RequiredComponentTags: []string{"high_pressure"}, + GeneratedHazardCats: []string{"pneumatic_hydraulic"}, + SuggestedMeasureIDs: []string{"M483", "M484", "M141"}, + Priority: 96, + ApplicableLifecycles: []string{"normal_operation", "maintenance", "fault_clearing"}, + ScenarioDE: "Unter Druck stehendes Medium (Hydraulikoel, KSS, Druckluft, Wasserstrahl) tritt aus undichten Verschraubungen oder geplatzten Leitungen aus und dringt unmerklich in menschliches Gewebe ein.", + TriggerDE: "Pinhole-Leckage in Druckleitung; Annaehern der Hand zum Lokalisieren der Leckage; bestes Risiko bei Druecken > 7 bar / 100 psi.", + HarmDE: "Hochdruckinjektionsverletzung — initial wie kleiner Stich, fuehrt aber innerhalb von Stunden zu Gewebenekrose. Sofortige chirurgische Behandlung erforderlich.", + AffectedDE: "Wartungspersonal, Einrichter, Reinigungspersonal", + ZoneDE: "Druckleitungen, Verschraubungen, Schlauchverbindungen, Hochdruckduesen", + ISO12100Section: "6.3.5.4", + ClarificationQuestionsDE: []string{ + "Sind alle Hochdruckleitungen druckdicht nach EN ISO 4413/4414 ausgelegt und periodisch geprueft?", + "Wird das Wartungspersonal explizit zur Hochdruckinjektionsgefahr unterwiesen (kein Lokalisieren der Leckage mit der Hand)?", + }, + DefaultSeverity: 5, DefaultExposure: 2, + }, + { + ID: "HP1904", NameDE: "Ersticken durch Quetschung des Brustkorbs / Einschluss", NameEN: "Asphyxiation by chest compression or entrapment", + RequiredComponentTags: []string{"moving_part", "guard"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M061", "M489", "M488", "M141"}, + Priority: 96, + ApplicableLifecycles: []string{"normal_operation", "maintenance", "fault_clearing"}, + ScenarioDE: "Person wird zwischen bewegtem und feststehendem Anlagenteil so eingeklemmt, dass der Brustkorb komprimiert wird (kompressive Asphyxie). Oder Person wird in einem geschlossenen Maschinen­bereich eingeschlossen und kann nicht mehr atmen.", + TriggerDE: "Roboterarm presst Person gegen Wand; Schutztuer schliesst auf Person; Person rutscht in engen Maschinenraum ohne Selbstrettungsmoeglichkeit.", + HarmDE: "Kompressive Asphyxie (Atemstillstand durch Brustkorbkompression), Todesfolge innerhalb weniger Minuten.", + AffectedDE: "Wartungspersonal, Reinigungspersonal", + ZoneDE: "Schwenkbereich Roboterarm, geschlossene Bearbeitungsraeume, schmale Wartungsoeffnungen", + ISO12100Section: "6.3.5.2", + DefaultSeverity: 5, DefaultExposure: 1, + }, + } +} 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 8ca0da20..d9bd659b 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_laser_medical.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_laser_medical.go @@ -225,7 +225,7 @@ func GetLaserPatterns() []HazardPattern { MachineTypes: []string{"medical_device", "laser_device"}, RequiredComponentTags: []string{"noise_source", "radiation_risk"}, RequiredEnergyTags: []string{}, - GeneratedHazardCats: []string{"noise_vibration"}, + GeneratedHazardCats: []string{"noise_hazard"}, SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E12", "E20"}, Priority: 60, diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_mechanical.go b/ai-compliance-sdk/internal/iace/hazard_patterns_mechanical.go index 10431b48..a32ab637 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_mechanical.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_mechanical.go @@ -16,6 +16,7 @@ func builtinMechanicalPatterns() []HazardPattern { HarmDE: "Quetschung, Amputation von Fingern/Hand. Schwere abhaengig von Schliesskraft und Masse.", AffectedDE: "Bedienpersonal, Einrichter", ZoneDE: "Bewegungsbereich des Schlittens/Stempels, Einzugsstelle", + ISO12100Section: "6.3.5.4", DefaultSeverity: 4, DefaultExposure: 3, }, { @@ -31,6 +32,7 @@ func builtinMechanicalPatterns() []HazardPattern { HarmDE: "Einzug, Umschlingung, Skalpierung, Frakturen, in schweren Faellen Todesfolge.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Wellenenden, Kupplungen, Walzenspalte, Antriebselemente", + ISO12100Section: "6.3.5.4", DefaultSeverity: 5, DefaultExposure: 3, }, { @@ -46,6 +48,7 @@ func builtinMechanicalPatterns() []HazardPattern { HarmDE: "Schnittverletzung, tiefe Schnittwunde, ggf. Sehnen-/Nervenverletzung.", AffectedDE: "Bedienpersonal, Einrichter", ZoneDE: "Schneidzone, Werkzeugwechselbereich, Materialzufuhr", + ISO12100Section: "6.2.2.2", DefaultSeverity: 3, DefaultExposure: 3, }, { @@ -151,6 +154,7 @@ func builtinMechanicalPatterns() []HazardPattern { HarmDE: "Schlagartige Freisetzung: Prellung, Fraktur, Schnittverletzung durch zurueckschnellendes Teil.", AffectedDE: "Wartungspersonal, Einrichter", ZoneDE: "Federpaket, Gegengewicht, Riemenspannbereich, angehobene Baugruppen", + ISO12100Section: "6.2.10", DefaultSeverity: 4, DefaultExposure: 2, }, } diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_packaging.go b/ai-compliance-sdk/internal/iace/hazard_patterns_packaging.go index dfb56dcb..0006d7e2 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_packaging.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_packaging.go @@ -112,7 +112,7 @@ func GetPackagingPatterns() []HazardPattern { ID: "HP327", NameDE: "Laerm durch Druckluft-Auswurf", NameEN: "Noise from compressed air ejection", RequiredComponentTags: []string{"noise_source", "pneumatic_part"}, RequiredEnergyTags: []string{"pneumatic_pressure"}, - GeneratedHazardCats: []string{"noise_vibration"}, + GeneratedHazardCats: []string{"noise_hazard"}, SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E12", "E20"}, Priority: 60, diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_press.go b/ai-compliance-sdk/internal/iace/hazard_patterns_press.go index f22cd135..90e1f0fd 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_press.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_press.go @@ -135,7 +135,7 @@ func GetPressHazardPatterns() []HazardPattern { ID: "HP053", NameDE: "Impulslaerm Pressvorgang", NameEN: "Impact noise during press operation", RequiredComponentTags: []string{"noise_source", "high_force"}, RequiredEnergyTags: []string{}, - GeneratedHazardCats: []string{"noise_vibration"}, + GeneratedHazardCats: []string{"noise_hazard"}, SuggestedMeasureIDs: []string{"M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 70, 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 0ae6bdef..83f05d2e 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_robot_cell.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_robot_cell.go @@ -24,6 +24,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Quetschungen, Knochenbrueche, innere Verletzungen durch Einklemmen von Koerperteilen.", AffectedDE: "Bedienpersonal, Einrichter, Wartungspersonal, Reinigungspersonal", ZoneDE: "Roboterarm, feststehende Anlagenteile innerhalb der Roboterzelle", + ISO12100Section: "6.2.3", DefaultSeverity: 4, DefaultExposure: 3, }, { @@ -39,6 +40,7 @@ func GetRobotCellPatterns() []HazardPattern { AffectedDE: "Bedienpersonal, Reinigungspersonal", ZoneDE: "Schutzzaun-Oberkante, Roboterarm", ClarificationQuestionsDE: []string{"Ist Dynamic Safety Configuration (DCS) am Roboter konfiguriert und durch den Hersteller validiert?", "Wurde der Reach-Over-Sicherheitsabstand nach EN ISO 13857 anlagenbezogen berechnet?"}, + ISO12100Section: "6.3.5.2", DefaultSeverity: 3, DefaultExposure: 2, }, { @@ -53,6 +55,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Quetschungen, Stoss durch anlaufenden Roboter.", AffectedDE: "Wartungspersonal, Einrichter, Reinigungspersonal", ZoneDE: "Inneres der Roboterzelle", + ISO12100Section: "6.2.3", DefaultSeverity: 4, DefaultExposure: 2, }, { @@ -68,6 +71,7 @@ func GetRobotCellPatterns() []HazardPattern { AffectedDE: "Bedienpersonal in der Naehe des Schutzzauns", ZoneDE: "Schutzzaun, Bereich um die Roboterzelle", ClarificationQuestionsDE: []string{"Ist Dynamic Safety Configuration (DCS) am Roboter konfiguriert und durch den Hersteller validiert?", "Ist nach EN ISO 13857 die Tabelle 1 (Niedrigrisiko) anwendbar oder muss Tabelle 2 angewandt werden?"}, + ISO12100Section: "6.3.5.2", DefaultSeverity: 3, DefaultExposure: 2, }, { @@ -82,6 +86,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Prellungen, Quetschungen durch Kontakt mit Werkzeug/Greifer am Roboterarm.", AffectedDE: "Einrichter, Programmierer, Wartungspersonal", ZoneDE: "Inneres der Roboterzelle, Schwenkbereich Werkzeug/Greifer", + ISO12100Section: "6.3.5.4", DefaultSeverity: 3, DefaultExposure: 3, }, // ================================================================ @@ -99,6 +104,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Quetschung oder Amputation von Fingern durch Greifkraft.", AffectedDE: "Bedienpersonal, Einrichter", ZoneDE: "Greifer des Roboterarms, Werkstueckaufnahme", + ISO12100Section: "6.3.5.4", DefaultSeverity: 3, DefaultExposure: 3, }, { @@ -114,6 +120,7 @@ func GetRobotCellPatterns() []HazardPattern { AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Bereich unterhalb des Greifer/Roboterarms", ClarificationQuestionsDE: []string{"Welche Druckhalte-Logik ist am Greifer realisiert? (Empfehlung: 5-3 Wegeventil mit Sperrmittelstellung, auch bei Not-Halt)", "Ist nachgewiesen, dass das Werkstueck bei Spannungs- oder Druckluftausfall sicher gehalten wird (Fail-Safe)?"}, + ISO12100Section: "6.2.6", DefaultSeverity: 3, DefaultExposure: 2, }, { @@ -129,6 +136,7 @@ func GetRobotCellPatterns() []HazardPattern { AffectedDE: "Bedienpersonal in der Naehe der Roboterzelle", ZoneDE: "Schutzzaun, Bereich um die Roboterzelle", ClarificationQuestionsDE: []string{"Ist die Lastbemessung der Einhausung auf max. Werkstueckgewicht * max. Roboter-TCP-Geschwindigkeit dokumentiert?", "Sind max. Werkstueckgewicht und Roboter-TCP-Geschwindigkeit in der Betriebsanleitung explizit angegeben?"}, + ISO12100Section: "6.2.6", DefaultSeverity: 3, DefaultExposure: 2, }, // ================================================================ @@ -147,6 +155,7 @@ func GetRobotCellPatterns() []HazardPattern { AffectedDE: "Bedienpersonal, Reinigungspersonal", ZoneDE: "Foerderbaender, Bandein- und -auslauf", ClarificationQuestionsDE: []string{"Ist die Bandgeschwindigkeit im manuell zugaenglichen Bereich dokumentiert? (Empfehlung: <= 100 mm/s)", "Sind Quetsch- und Einzugsstellen am Band konstruktiv ausgeschlossen oder durch Lichtschranke gesichert?"}, + ISO12100Section: "6.3.5.4", DefaultSeverity: 2, DefaultExposure: 3, }, { @@ -161,6 +170,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Quetschung von Hand oder Arm durch Roboterarm oder bewegte Maschinenteile.", AffectedDE: "Bedienpersonal", ZoneDE: "Oeffnung der Foerderbaender im Schutzzaun, Roboterbereich dahinter", + ISO12100Section: "6.3.5.4", DefaultSeverity: 3, DefaultExposure: 3, }, { @@ -176,6 +186,7 @@ func GetRobotCellPatterns() []HazardPattern { AffectedDE: "Bedienpersonal am Be-/Entladeplatz", ZoneDE: "Ende der Transportbaender, Be-/Entladeplatz", ClarificationQuestionsDE: []string{"Sind mechanische Anschlaege an allen Bandenden vorhanden und auf maximale Werkstueckmasse + Bandgeschwindigkeit dimensioniert?"}, + ISO12100Section: "6.2.6", DefaultSeverity: 2, DefaultExposure: 3, }, // ================================================================ @@ -193,6 +204,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Schnittwunden an Haenden und Armen.", AffectedDE: "Bedienpersonal, Wartungspersonal, Reinigungspersonal", ZoneDE: "Zugaengliche Kanten der Maschine und Einhausung", + ISO12100Section: "6.2.2.2", DefaultSeverity: 2, DefaultExposure: 3, }, // ================================================================ @@ -210,6 +222,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Prellungen, Augenverletzungen durch abspringenden Schlauch.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Pneumatikschlaeuche der Automation", + ISO12100Section: "6.3.5.4", DefaultSeverity: 2, DefaultExposure: 2, }, { @@ -224,6 +237,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Person wird von wegfliegenden Teilen oder unkontrolliert loesenden Verbindungen getroffen. Prellungen, Schnittverletzungen.", AffectedDE: "Wartungspersonal, Einrichter", ZoneDE: "Pneumatikschlaeuche und -komponenten", + ISO12100Section: "6.2.10", DefaultSeverity: 2, DefaultExposure: 2, }, // HP1632 (Bersten) ist semantisch DISTINKT zu HP1630 (Abspringen). @@ -246,6 +260,7 @@ func GetRobotCellPatterns() []HazardPattern { "Sind alle Pneumatik-Komponenten (Leitungen, Dichtungen, Verbindungen) auf den Anlagen-Nenndruck nach EN ISO 4414 ausgelegt?", "Liegen Berstdrucknachweise der Schlauchhersteller fuer den eingesetzten Druckbereich vor?", }, + ISO12100Section: "6.2.10", DefaultSeverity: 2, DefaultExposure: 2, }, // ================================================================ @@ -263,6 +278,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Quetschung, Schnittverletzung durch Greiferkanten oder Werkzeug am Roboter.", AffectedDE: "Einrichter, Programmierer", ZoneDE: "Inneres der Roboterzelle, Greifer/Werkzeug am Roboterarm", + ISO12100Section: "6.3.5.4", DefaultSeverity: 3, DefaultExposure: 3, }, { @@ -291,6 +307,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Person wird von KSS-Strahl getroffen. Einstichverletzung, Hautreizung, Rutschgefahr.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Druckschlaeuche des Kuehlschmierstoffsystems, Verbindungsstellen", + ISO12100Section: "6.3.5.4", DefaultSeverity: 2, DefaultExposure: 2, }, { @@ -305,6 +322,7 @@ func GetRobotCellPatterns() []HazardPattern { HarmDE: "Ausrutschen und Sturz, Prellungen, Knochenbrueche.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Boden um Bearbeitungszentrum und Kuehlschmierstoffanlage", + ISO12100Section: "6.3.5.6", DefaultSeverity: 2, DefaultExposure: 3, }, { @@ -353,6 +371,7 @@ func GetRobotCellPatterns() []HazardPattern { AffectedDE: "Wartungspersonal, Einrichter", ZoneDE: "Zugaengliche Kabel, Klemmen, Schaltschrank", ClarificationQuestionsDE: []string{"Liegt ein Pruefprotokoll nach EN 60204-1 fuer die Niederspannungs-Isolation vor?", "Sind die Schutzart IP2X bzw. IPXXB an allen niederspannungsfuehrenden Gehaeusen messtechnisch nachgewiesen?"}, + ISO12100Section: "6.2.9", DefaultSeverity: 4, DefaultExposure: 2, }, { @@ -369,6 +388,7 @@ func GetRobotCellPatterns() []HazardPattern { AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Beruehrbare leitfaehige Oberflaechen der Anlage", ClarificationQuestionsDE: []string{"Wurde der Schutzleiterwiderstand an allen leitfaehigen Oberflaechen gemessen und protokolliert?", "Liegen die Ableitstroeme unter 10 mA, oder ist einer der Massnahmen aus EN 60204-1 Ziff. 8.2.6 umgesetzt?"}, + ISO12100Section: "6.2.9", DefaultSeverity: 4, DefaultExposure: 2, }, { 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 c10628a4..77010750 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 @@ -20,6 +20,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Person ausserhalb wird von Zaunteilen oder dem Roboterarm getroffen.", AffectedDE: "Bedienpersonal in der Naehe des Schutzzauns", ZoneDE: "Schutzzaun, Bereich um die Roboterzelle", + ISO12100Section: "6.3.5.2", DefaultSeverity: 3, DefaultExposure: 2, }, { @@ -34,6 +35,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Schwere Quetschungen, Knochenbrueche durch anlaufenden Roboter.", AffectedDE: "Wartungspersonal, Einrichter, Reinigungspersonal", ZoneDE: "Inneres der Roboterzelle, Roboterarm", + ISO12100Section: "6.3.5.2", DefaultSeverity: 4, DefaultExposure: 3, }, { @@ -48,6 +50,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Quetschungen, Schnittverletzungen, Prellungen durch Werkzeug/Greifer.", AffectedDE: "Bedienpersonal, Einrichter", ZoneDE: "Inneres der Roboterzelle, Greifer/Werkzeug des Roboterarms", + ISO12100Section: "6.3.5.4", DefaultSeverity: 3, DefaultExposure: 3, }, { @@ -62,6 +65,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Quetschungen, Prellungen, Knochenbrueche abhaengig von Werkstueckgewicht.", AffectedDE: "Bedienpersonal, Einrichter", ZoneDE: "Inneres der Roboterzelle, Greifer des Roboterarms", + ISO12100Section: "6.3.5.4", DefaultSeverity: 3, DefaultExposure: 3, }, { @@ -80,6 +84,7 @@ func GetRobotCellPatternsExt() []HazardPattern { "Ist Dual Check Safety (DCS bei FANUC, SafeMove bei ABB, SafeOperation bei KUKA) am Roboter konfiguriert und nach EN ISO 13849-1 PLd/Kat.3 validiert?", "Ist die Lastbemessung des Schutzzauns auf max. Werkstueck-Gewicht * max. Roboter-TCP-Geschwindigkeit nachgewiesen?", }, + ISO12100Section: "6.2.6", DefaultSeverity: 3, DefaultExposure: 2, }, { @@ -94,6 +99,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Quetschung von Hand oder Arm zwischen Greifer/Werkstueck und feststehenden Teilen.", AffectedDE: "Bedienpersonal", ZoneDE: "Schutzzaun-Oberkante, Greifer/Werkstueck am Roboterarm", + ISO12100Section: "6.3.5.4", DefaultSeverity: 3, DefaultExposure: 2, }, // ================================================================ @@ -157,6 +163,7 @@ func GetRobotCellPatternsExt() []HazardPattern { AffectedDE: "Einrichter, Wartungspersonal", ZoneDE: "Bearbeitungsraum der Werkzeugmaschine, Achsen, Werkzeug, Spannvorrichtung", ClarificationQuestionsDE: []string{"Ist die Werkzeugmaschine (z.B. Robodrill) als CE-konformes Subsystem integriert? Herstellererklaerung anfordern.", "Sind sicherer Automatik- und Einrichtbetrieb durch die CE-Erklaerung der WZM abgedeckt oder erforderlich separate Sicherheitsfunktionen?"}, + ISO12100Section: "6.3.5.4", DefaultSeverity: 3, DefaultExposure: 3, }, // ================================================================ @@ -188,6 +195,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Augenverletzung durch Spaene, Hautverletzung durch Druckluftstoss.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Bearbeitungszelle, Druckluftreinigungsduesen", + ISO12100Section: "6.3.5.6", DefaultSeverity: 2, DefaultExposure: 3, }, // ================================================================ @@ -205,6 +213,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Person wird von abspringendem Schlauch getroffen (Peitscheneffekt). KSS-Spritzer unter Druck verletzen Haut und Augen. Rutschgefahr durch austretenden KSS.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Druckschlaeuche des Kuehlschmierstoffsystems", + ISO12100Section: "6.3.5.4", DefaultSeverity: 2, DefaultExposure: 2, }, // ================================================================ @@ -240,6 +249,7 @@ func GetRobotCellPatternsExt() []HazardPattern { AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Beruehrbare leitfaehige Oberflaechen der Anlage", ClarificationQuestionsDE: []string{"Wurden alle Steckdosenkreise mit Fehlerstromschutzeinrichtung (RCD) ausgestattet und auf Wirksamkeit geprueft?", "Ist das Schutzleitersystem durchgaengig validiert und protokolliert?"}, + ISO12100Section: "6.2.9", DefaultSeverity: 4, DefaultExposure: 2, }, { @@ -282,6 +292,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Elektrischer Schlag bei gleichzeitigem Beruehren von Teilen unterschiedlichen Potentials.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Elektrisch leitfaehige Oberflaechen verschiedener Anlagenteile", + ISO12100Section: "6.2.9", DefaultSeverity: 4, DefaultExposure: 2, }, { @@ -296,6 +307,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Person erleidet elektrischen Schlag durch Fehlerstrom. Herzkammerflimmern, potentiell toedlich.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Steckdosen der Maschine, angeschlossene Betriebsmittel", + ISO12100Section: "6.2.9", DefaultSeverity: 4, DefaultExposure: 2, }, // ================================================================ @@ -378,6 +390,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Gefaehrliche Beruehrungsspannung an beruehrbaren Teilen, Kurzschluss, Brand.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Schaltgeraetekombinationen, elektrische Anschluesse", + ISO12100Section: "6.2.9", DefaultSeverity: 4, DefaultExposure: 2, }, { @@ -392,6 +405,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Unkontrollierte Bewegung von Achsen, Werkzeug oder Roboterarm durch Steuerungsfehler.", AffectedDE: "Bedienpersonal, Einrichter", ZoneDE: "Bearbeitungsbereich, sicherheitsrelevante Steuerungen", + ISO12100Section: "6.3.3", DefaultSeverity: 3, DefaultExposure: 2, }, // ================================================================ @@ -437,6 +451,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Einstichverletzung durch KSS-Strahl unter Druck, Augenverletzung, Rutschgefahr.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Druckschlaeuche des Kuehlschmierstoffsystems", + ISO12100Section: "6.3.5.4", DefaultSeverity: 2, DefaultExposure: 2, }, { @@ -451,6 +466,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "KSS-Spritzer in Augen oder Gesicht, Rutschgefahr durch austretenden KSS.", AffectedDE: "Bedienpersonal, Wartungspersonal", ZoneDE: "Inneres des Bearbeitungszentrums, Bereich vor der Schutztuer", + ISO12100Section: "6.3.5.6", DefaultSeverity: 1, DefaultExposure: 3, }, { @@ -465,6 +481,7 @@ func GetRobotCellPatternsExt() []HazardPattern { HarmDE: "Person wird durch Brand, Flammen oder toxische Rauchgase verletzt. Verbrennungen, Rauchvergiftung.", AffectedDE: "Bedienpersonal", ZoneDE: "Spannungsfuehrende Teile unterhalb/angrenzend von KSS-Leitungen", + ISO12100Section: "6.2.9", DefaultSeverity: 3, DefaultExposure: 2, }, } diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_test.go b/ai-compliance-sdk/internal/iace/hazard_patterns_test.go index a07523fe..3f52b357 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_test.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_test.go @@ -115,6 +115,13 @@ func TestGetBuiltinHazardPatterns_HazardCategoriesValid(t *testing.T) { for _, h := range GetBuiltinHazardLibrary() { validCategories[h.Category] = true } + // ISO 12100 Annex B splits Nr. 4 Laerm and Nr. 5 Vibration into two + // top-level groups. Patterns adopted this in 2026-05 but the hazard + // library still carries entries under the legacy combined "noise_- + // vibration" key. Until the library is split, both new aliases are + // recognised as valid pattern categories. + validCategories["noise_hazard"] = true + validCategories["vibration_hazard"] = true for _, p := range GetBuiltinHazardPatterns() { for _, cat := range p.GeneratedHazardCats { diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_textile_agri.go b/ai-compliance-sdk/internal/iace/hazard_patterns_textile_agri.go index 69d9ed36..0ed02203 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_textile_agri.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_textile_agri.go @@ -36,7 +36,7 @@ func GetTextileAgriPatterns() []HazardPattern { AffectedDE: "Bedienpersonal", ZoneDE: "Spinn-/Kardierbereich", DefaultSeverity: 4, DefaultExposure: 5}, {ID: "HP1553", NameDE: "Laermexposition an Webmaschine", NameEN: "Noise exposure at loom", - RequiredComponentTags: []string{"moving_mechanical_parts"}, GeneratedHazardCats: []string{"noise_vibration"}, + RequiredComponentTags: []string{"moving_mechanical_parts"}, GeneratedHazardCats: []string{"noise_hazard"}, SuggestedMeasureIDs: []string{"M455", "M064"}, SuggestedEvidenceIDs: []string{"E01", "E29"}, Priority: 75, MachineTypes: []string{"textile", "weaving"}, OperationalStates: []string{"automatic_operation"}, @@ -173,7 +173,7 @@ func GetTextileAgriPatterns() []HazardPattern { HarmDE: "Ueberfahren, Tod", AffectedDE: "Feldarbeiter, Passanten", ZoneDE: "Fahrweg", DefaultSeverity: 5, DefaultExposure: 3}, {ID: "HP1573", NameDE: "Laermexposition bei Erntemaschine", NameEN: "Noise exposure from harvester", - RequiredComponentTags: []string{"moving_mechanical_parts"}, GeneratedHazardCats: []string{"noise_vibration"}, + RequiredComponentTags: []string{"moving_mechanical_parts"}, GeneratedHazardCats: []string{"noise_hazard"}, SuggestedMeasureIDs: []string{"M472", "M064"}, SuggestedEvidenceIDs: []string{"E01", "E29"}, Priority: 70, MachineTypes: []string{"agricultural", "harvester"}, OperationalStates: []string{"automatic_operation"}, @@ -182,7 +182,7 @@ func GetTextileAgriPatterns() []HazardPattern { AffectedDE: "Fahrer", ZoneDE: "Kabine", DefaultSeverity: 3, DefaultExposure: 5}, {ID: "HP1574", NameDE: "Ganzkoerper-Vibration auf Traktor", NameEN: "Whole-body vibration on tractor", - RequiredComponentTags: []string{"chassis"}, GeneratedHazardCats: []string{"noise_vibration"}, + RequiredComponentTags: []string{"chassis"}, GeneratedHazardCats: []string{"vibration_hazard"}, SuggestedMeasureIDs: []string{"M473"}, SuggestedEvidenceIDs: []string{"E01"}, Priority: 68, MachineTypes: []string{"agricultural", "tractor"}, OperationalStates: []string{"automatic_operation"}, diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_thermal.go b/ai-compliance-sdk/internal/iace/hazard_patterns_thermal.go index cebc3a11..238f6dc3 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_thermal.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_thermal.go @@ -46,6 +46,7 @@ func builtinThermalPatterns() []HazardPattern { HarmDE: "Kontaktverbrennung, Blasenbildung an Haenden.", AffectedDE: "Wartungspersonal, Einrichter", ZoneDE: "Motorgehaeuse, Getriebegehaeuse, Linearantrieb", + ISO12100Section: "6.3.4.5", DefaultSeverity: 2, DefaultExposure: 2, }, } diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_workshop.go b/ai-compliance-sdk/internal/iace/hazard_patterns_workshop.go index 8aaf265b..49151981 100644 --- a/ai-compliance-sdk/internal/iace/hazard_patterns_workshop.go +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_workshop.go @@ -105,7 +105,7 @@ func GetWorkshopPatterns() []HazardPattern { HarmDE: "Erhoehte Unfallgefahr, Herz-Kreislauf-Risiko", AffectedDE: "Schichtpersonal", ZoneDE: "Produktionsstaette", DefaultSeverity: 3, DefaultExposure: 5}, {ID: "HP616", NameDE: "Laermbedingte psychische Belastung", NameEN: "Noise-induced psychological stress", - RequiredComponentTags: []string{"noise_source"}, GeneratedHazardCats: []string{"ergonomic_hazard", "noise_vibration"}, + RequiredComponentTags: []string{"noise_source"}, GeneratedHazardCats: []string{"ergonomic_hazard", "noise_hazard"}, SuggestedMeasureIDs: []string{"M082", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 50, ScenarioDE: "Dauerlerm erschwert Konzentration", TriggerDE: "Laerm >80 dB(A)", HarmDE: "Stress, Konzentrationsstoerung", AffectedDE: "Alle im Laermbereich", ZoneDE: "Produktionshalle", @@ -333,46 +333,46 @@ func GetWorkshopPatterns() []HazardPattern { DefaultSeverity: 4, DefaultExposure: 3}, // — Laerm erweitert (HP650-HP653) — {ID: "HP650", NameDE: "Impulslaerm (Stanzen/Pressen)", NameEN: "Impulse noise stamping/pressing", - RequiredComponentTags: []string{"noise_source", "moving_part"}, GeneratedHazardCats: []string{"noise_vibration"}, + RequiredComponentTags: []string{"noise_source", "moving_part"}, GeneratedHazardCats: []string{"noise_hazard"}, SuggestedMeasureIDs: []string{"M082", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 70, ScenarioDE: "Laermspitzen >137 dB(C) schaedigen sofort", TriggerDE: "Stanzhub, fehlender Gehoerschutz", HarmDE: "Knalltrauma, Tinnitus, Hoerverlust", AffectedDE: "Bedienpersonal", ZoneDE: "Stanzmaschine", DefaultSeverity: 4, DefaultExposure: 4}, {ID: "HP651", NameDE: "Ultraschallemission", NameEN: "Ultrasound emission", - RequiredComponentTags: []string{"noise_source"}, GeneratedHazardCats: []string{"noise_vibration"}, + RequiredComponentTags: []string{"noise_source"}, GeneratedHazardCats: []string{"noise_hazard"}, 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"}, + RequiredComponentTags: []string{"noise_source", "structural_part"}, GeneratedHazardCats: []string{"noise_hazard"}, 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"}, + RequiredComponentTags: []string{"noise_source", "structural_part"}, GeneratedHazardCats: []string{"noise_hazard"}, 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}, // — Vibration erweitert (HP654-HP656) — {ID: "HP654", NameDE: "Hand-Arm-Vibration durch Handmaschinen", NameEN: "Hand-arm vibration handheld tools", - RequiredComponentTags: []string{"vibration_source"}, GeneratedHazardCats: []string{"noise_vibration"}, + RequiredComponentTags: []string{"vibration_source"}, GeneratedHazardCats: []string{"vibration_hazard"}, SuggestedMeasureIDs: []string{"M082", "M141"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 60, RequiresExpertCalculation: true, ExpertHintDE: "A(8)-Bewertung nach LaeVibr erforderlich.", ScenarioDE: "Vibrierende Handmaschinen (Schleifer, Bohrer)", TriggerDE: ">2h taegl. Exposition", HarmDE: "Weissfingerkrankheit, Nervenschaeden", AffectedDE: "Bedienpersonal", ZoneDE: "Handarbeitsplatz", 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"}, + RequiredComponentTags: []string{"vibration_source", "structural_part"}, GeneratedHazardCats: []string{"vibration_hazard"}, 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}, {ID: "HP656", NameDE: "Resonanzverstaerkung bei Drehzahl", NameEN: "Resonance amplification at RPM", RequiredComponentTags: []string{"rotating_part", "vibration_source"}, - GeneratedHazardCats: []string{"noise_vibration", "mechanical_hazard"}, + GeneratedHazardCats: []string{"vibration_hazard", "mechanical_hazard"}, SuggestedMeasureIDs: []string{"M082"}, SuggestedEvidenceIDs: []string{"E20"}, Priority: 55, ScenarioDE: "Resonanzfrequenz mit starker Vibration", TriggerDE: "Kritische Drehzahl", HarmDE: "Bauteilbruch, Ermattungsrisse", AffectedDE: "Bedienpersonal", ZoneDE: "Rotierende Baugruppen", diff --git a/ai-compliance-sdk/internal/iace/pattern_coverage_test.go b/ai-compliance-sdk/internal/iace/pattern_coverage_test.go index 9854a5ce..13325dcb 100644 --- a/ai-compliance-sdk/internal/iace/pattern_coverage_test.go +++ b/ai-compliance-sdk/internal/iace/pattern_coverage_test.go @@ -15,6 +15,8 @@ var patternCategoryCompatibility = map[string]map[string]bool{ "mechanical_hazard": {"mechanical": true}, "electrical_hazard": {"electrical": true}, "thermal_hazard": {"thermal": true, "material_environmental": true}, + "noise_hazard": {"noise_vibration": true, "ergonomic": true}, + "vibration_hazard": {"noise_vibration": true, "ergonomic": true}, "noise_vibration": {"noise_vibration": true, "ergonomic": true}, "pneumatic_hydraulic": {"pneumatic_hydraulic": true, "mechanical": true}, "material_environmental": {"material_environmental": true}, diff --git a/ai-compliance-sdk/internal/iace/pattern_engine.go b/ai-compliance-sdk/internal/iace/pattern_engine.go index 13032b9e..523d3cdd 100644 --- a/ai-compliance-sdk/internal/iace/pattern_engine.go +++ b/ai-compliance-sdk/internal/iace/pattern_engine.go @@ -69,6 +69,7 @@ type PatternMatch struct { ApplicableLifecycles []string `json:"applicable_lifecycles,omitempty"` SuggestedMeasureIDs []string `json:"suggested_measure_ids,omitempty"` ClarificationQuestionsDE []string `json:"clarification_questions_de,omitempty"` + ISO12100Section string `json:"iso_12100_section,omitempty"` } // HazardSuggestion is a suggested hazard from pattern matching. @@ -224,6 +225,7 @@ func (e *PatternEngine) Match(input MatchInput) *MatchOutput { ApplicableLifecycles: p.ApplicableLifecycles, SuggestedMeasureIDs: p.SuggestedMeasureIDs, ClarificationQuestionsDE: p.ClarificationQuestionsDE, + ISO12100Section: p.ISO12100Section, }) for _, cat := range p.GeneratedHazardCats { diff --git a/ai-compliance-sdk/internal/iace/pattern_registry.go b/ai-compliance-sdk/internal/iace/pattern_registry.go index 75453f88..27b06035 100644 --- a/ai-compliance-sdk/internal/iace/pattern_registry.go +++ b/ai-compliance-sdk/internal/iace/pattern_registry.go @@ -40,5 +40,6 @@ func collectAllPatterns() []HazardPattern { patterns = append(patterns, GetRobotCellPatterns()...) // HP1600-HP1649 Robot cell (GT benchmark) patterns = append(patterns, GetRobotCellPatternsExt()...) // HP1650-HP1699 Robot cell extended (GT gaps) patterns = append(patterns, GetGTBremseHazardPatterns()...) // HP1710-HP1729 GT Bremse coverage gaps + patterns = append(patterns, GetISO12100GapPatterns()...) // HP1900-HP1909 ISO 12100 Annex B gaps (Vakuum, Federn, Rutsch, Hochdruckinjektion, Ersticken) return patterns }