diff --git a/ai-compliance-sdk/internal/iace/hazard_patterns_operational.go b/ai-compliance-sdk/internal/iace/hazard_patterns_operational.go new file mode 100644 index 0000000..55e1bf6 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/hazard_patterns_operational.go @@ -0,0 +1,275 @@ +package iace + +// GetOperationalHazardPatterns returns patterns for non-normal operating states: +// fault clearing, maintenance, setup, changeover, LOTO, stored energy. +// These hazards are lifecycle-phase-specific — they fire only when the relevant +// phases are present in the project scope. +func GetOperationalHazardPatterns() []HazardPattern { + return []HazardPattern{ + // ================================================================ + // Störungsbeseitigung / Fault Clearing (HP066-HP072) + // ================================================================ + { + ID: "HP066", NameDE: "Verklemmung loest sich unkontrolliert", NameEN: "Jammed part releases uncontrolled", + RequiredComponentTags: []string{"moving_part", "high_force"}, + RequiredLifecycles: []string{"fault_clearing", "maintenance"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M001", "M054"}, + Priority: 94, + RequiresExpertCalculation: true, + ExpertHintDE: "Energiefreischaltung (LOTO) vor manuellen Eingriffen zwingend erforderlich.", + }, + { + ID: "HP067", NameDE: "Schlauch platzt unter Druck", NameEN: "Hose bursts under pressure", + RequiredComponentTags: []string{"hydraulic_part", "high_pressure"}, + RequiredLifecycles: []string{"normal_operation", "fault_clearing"}, + GeneratedHazardCats: []string{"pneumatic_hydraulic"}, + SuggestedMeasureIDs: []string{"M131", "M054"}, + Priority: 92, + ExpertHintDE: "Schlauch-Fangvorrichtungen und Druckentlastung vor Wartung vorsehen.", + }, + { + ID: "HP068", NameDE: "Unerwarteter Wiederanlauf nach Stoerung", NameEN: "Unexpected restart after fault", + RequiredComponentTags: []string{"moving_part", "programmable"}, + RequiredLifecycles: []string{"fault_clearing"}, + GeneratedHazardCats: []string{"mechanical_hazard", "safety_function_failure"}, + SuggestedMeasureIDs: []string{"M106", "M054"}, + Priority: 96, + RequiresExpertCalculation: true, + ExpertHintDE: "Wiederanlaufsperre mit manueller Quittierung erforderlich. SIL/PL-Nachweis.", + }, + { + ID: "HP069", NameDE: "Restenergie nach Abschaltung (gespeichert)", NameEN: "Residual stored energy after shutdown", + RequiredComponentTags: []string{"stored_energy"}, + RequiredLifecycles: []string{"maintenance", "fault_clearing"}, + GeneratedHazardCats: []string{"mechanical_hazard", "electrical_hazard"}, + SuggestedMeasureIDs: []string{"M054", "M001"}, + Priority: 93, + ExpertHintDE: "Energiefreischaltung, Wartezeit und Messung vor Beginn der Arbeiten.", + }, + { + ID: "HP070", NameDE: "Eingriff in laufende Maschine bei Stoerung", NameEN: "Intervention in running machine during fault", + RequiredComponentTags: []string{"moving_part"}, + RequiredLifecycles: []string{"fault_clearing"}, + ExcludedComponentTags: []string{"interlocked"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M005", "M051"}, + Priority: 97, + ExpertHintDE: "Betriebsartenwahlschalter mit reduzierter Geschwindigkeit fuer Stoerungsbeseitigung.", + }, + { + ID: "HP071", NameDE: "Materialstau loest sich schlagartig", NameEN: "Material jam releases suddenly", + RequiredComponentTags: []string{"moving_part", "gravity_risk"}, + RequiredLifecycles: []string{"fault_clearing"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M001", "M054"}, + Priority: 88, + }, + { + ID: "HP072", NameDE: "Herabfallende Teile bei Stoerungsbeseitigung", NameEN: "Falling parts during fault clearing", + RequiredComponentTags: []string{"gravity_risk"}, + RequiredLifecycles: []string{"fault_clearing", "maintenance"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M051", "M141"}, + Priority: 82, + }, + + // ================================================================ + // Wartung / Instandhaltung (HP073-HP079) + // ================================================================ + { + ID: "HP073", NameDE: "Wartung ohne LOTO (Lockout/Tagout)", NameEN: "Maintenance without LOTO", + RequiredComponentTags: []string{"moving_part"}, + RequiredLifecycles: []string{"maintenance"}, + GeneratedHazardCats: []string{"maintenance_hazard"}, + SuggestedMeasureIDs: []string{"M054"}, + Priority: 96, + RequiresExpertCalculation: true, + ExpertHintDE: "LOTO-Verfahren (Lockout/Tagout) fuer alle Energiequellen definieren und schulen.", + }, + { + ID: "HP074", NameDE: "Sturz von Wartungsbuehne / Leiter", NameEN: "Fall from maintenance platform / ladder", + RequiredComponentTags: []string{"structural_part"}, + RequiredLifecycles: []string{"maintenance", "cleaning"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M051"}, + Priority: 78, + }, + { + ID: "HP075", NameDE: "Kontakt mit heissen Teilen bei Wartung", NameEN: "Contact with hot parts during maintenance", + RequiredComponentTags: []string{"high_temperature"}, + RequiredLifecycles: []string{"maintenance"}, + GeneratedHazardCats: []string{"thermal_hazard"}, + SuggestedMeasureIDs: []string{"M054", "M141"}, + Priority: 80, + ExpertHintDE: "Abkuehlzeit definieren. Temperaturanzeige oder -messung vor Arbeitsbeginn.", + }, + { + ID: "HP076", NameDE: "Kontakt mit Gefahrstoffen bei Wartung", NameEN: "Contact with hazardous substances during maintenance", + RequiredComponentTags: []string{"chemical_risk"}, + RequiredLifecycles: []string{"maintenance", "cleaning"}, + GeneratedHazardCats: []string{"material_environmental"}, + SuggestedMeasureIDs: []string{"M141"}, + Priority: 75, + }, + { + ID: "HP077", NameDE: "Elektrischer Schlag bei Wartungsarbeiten", NameEN: "Electric shock during maintenance", + RequiredComponentTags: []string{"high_voltage"}, + RequiredLifecycles: []string{"maintenance", "fault_clearing"}, + GeneratedHazardCats: []string{"electrical_hazard"}, + SuggestedMeasureIDs: []string{"M054"}, + Priority: 95, + RequiresExpertCalculation: true, + ExpertHintDE: "Freischaltung, Sicherung gegen Wiedereinschalten, Spannungsfreiheit feststellen.", + }, + { + ID: "HP078", NameDE: "Ergonomische Belastung bei Wartungszugang", NameEN: "Ergonomic strain at maintenance access", + RequiredComponentTags: []string{"structural_part"}, + RequiredLifecycles: []string{"maintenance"}, + GeneratedHazardCats: []string{"ergonomic"}, + SuggestedMeasureIDs: []string{"M141"}, + Priority: 55, + }, + { + ID: "HP079", NameDE: "Unkontrolliertes Absenken hydraulischer Last", NameEN: "Uncontrolled lowering of hydraulic load", + RequiredComponentTags: []string{"hydraulic_part", "gravity_risk"}, + RequiredLifecycles: []string{"maintenance", "fault_clearing"}, + GeneratedHazardCats: []string{"pneumatic_hydraulic", "mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M131", "M054"}, + Priority: 94, + ExpertHintDE: "Mechanische Absturzsicherung oder Abstuetzung vor Beginn der Arbeiten.", + }, + + // ================================================================ + // Einrichten / Umruesten / Werkzeugwechsel (HP080-HP085) + // ================================================================ + { + ID: "HP080", NameDE: "Quetschen bei Werkzeugwechsel", NameEN: "Crushing during tool change", + RequiredComponentTags: []string{"crush_point", "high_force"}, + RequiredLifecycles: []string{"changeover", "setup"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M001", "M054"}, + Priority: 92, + ExpertHintDE: "Werkzeugwechsel nur bei gesichertem Stossel/Stempel. LOTO erforderlich.", + }, + { + ID: "HP081", NameDE: "Verbrennung bei Werkzeugausbau (heiss)", NameEN: "Burns during hot tool removal", + RequiredComponentTags: []string{"high_temperature"}, + RequiredLifecycles: []string{"changeover"}, + GeneratedHazardCats: []string{"thermal_hazard"}, + SuggestedMeasureIDs: []string{"M141"}, + Priority: 78, + ExpertHintDE: "Abkuehlzeit einhalten. Schutzhandschuhe verwenden.", + }, + { + ID: "HP082", NameDE: "Schweres Werkzeug faellt bei Wechsel", NameEN: "Heavy tool drops during change", + RequiredComponentTags: []string{"gravity_risk", "high_force"}, + RequiredLifecycles: []string{"changeover"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M051"}, + Priority: 85, + ExpertHintDE: "Hebezeug fuer Werkzeuge ueber 25 kg verwenden.", + }, + { + ID: "HP083", NameDE: "Unbeabsichtigter Hub bei Einrichtbetrieb", NameEN: "Unintended stroke in setup mode", + RequiredComponentTags: []string{"moving_part", "crush_point"}, + RequiredLifecycles: []string{"setup"}, + GeneratedHazardCats: []string{"mechanical_hazard", "safety_function_failure"}, + SuggestedMeasureIDs: []string{"M106"}, + Priority: 94, + RequiresExpertCalculation: true, + ExpertHintDE: "Einrichtbetrieb nur mit reduzierter Geschwindigkeit und Zweihandschaltung.", + }, + { + ID: "HP084", NameDE: "Falsche Parametereinstellung nach Umruestung", NameEN: "Wrong parameters after changeover", + RequiredComponentTags: []string{"programmable"}, + RequiredLifecycles: []string{"changeover", "setup"}, + GeneratedHazardCats: []string{"safety_function_failure"}, + SuggestedMeasureIDs: []string{"M106"}, + Priority: 82, + ExpertHintDE: "Parameterverifikation nach jedem Werkzeugwechsel. Checkliste verwenden.", + }, + { + ID: "HP085", NameDE: "Testzyklus trifft Einrichter", NameEN: "Test cycle hits setup personnel", + RequiredComponentTags: []string{"moving_part", "crush_point"}, + RequiredLifecycles: []string{"setup", "commissioning"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M005", "M106"}, + Priority: 90, + ExpertHintDE: "Schutztuer geschlossen bei Testzyklen. Alternativ: Tippbetrieb mit Zustimmtaster.", + }, + + // ================================================================ + // Transport / Montage / Demontage (HP086-HP090) + // ================================================================ + { + ID: "HP086", NameDE: "Kippen der Maschine beim Transport", NameEN: "Machine tipping during transport", + RequiredComponentTags: []string{"structural_part"}, + RequiredLifecycles: []string{"transport"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M051"}, + Priority: 85, + }, + { + ID: "HP087", NameDE: "Quetschen bei Montage/Aufstellung", NameEN: "Crushing during installation", + RequiredComponentTags: []string{"high_force", "gravity_risk"}, + RequiredLifecycles: []string{"assembly"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M051"}, + Priority: 82, + }, + { + ID: "HP088", NameDE: "Unkontrollierte Bewegung bei Inbetriebnahme", NameEN: "Uncontrolled movement during commissioning", + RequiredComponentTags: []string{"moving_part", "programmable"}, + RequiredLifecycles: []string{"commissioning"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M005", "M106"}, + Priority: 90, + }, + { + ID: "HP089", NameDE: "Restmedien bei Demontage (Oel, Gas, Druck)", NameEN: "Residual media during dismantling", + RequiredComponentTags: []string{"hydraulic_part"}, + RequiredLifecycles: []string{"decommissioning", "disposal"}, + GeneratedHazardCats: []string{"material_environmental", "pneumatic_hydraulic"}, + SuggestedMeasureIDs: []string{"M054"}, + Priority: 75, + }, + { + ID: "HP090", NameDE: "Scharfe Kanten bei Demontage", NameEN: "Sharp edges during dismantling", + RequiredComponentTags: []string{"cutting_part"}, + RequiredLifecycles: []string{"decommissioning", "disposal"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M141"}, + Priority: 60, + }, + + // ================================================================ + // Reinigung (HP091-HP093) + // ================================================================ + { + ID: "HP091", NameDE: "Ausrutschen auf nassem/oeligem Boden", NameEN: "Slipping on wet/oily floor", + RequiredComponentTags: []string{"chemical_risk"}, + RequiredLifecycles: []string{"cleaning", "normal_operation"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M141"}, + Priority: 65, + }, + { + ID: "HP092", NameDE: "Chemische Exposition bei Reinigung", NameEN: "Chemical exposure during cleaning", + RequiredComponentTags: []string{"chemical_risk"}, + RequiredLifecycles: []string{"cleaning"}, + GeneratedHazardCats: []string{"material_environmental"}, + SuggestedMeasureIDs: []string{"M141"}, + Priority: 70, + }, + { + ID: "HP093", NameDE: "Einziehen in rotierende Teile bei Reinigung", NameEN: "Draw-in by rotating parts during cleaning", + RequiredComponentTags: []string{"rotating_part"}, + RequiredLifecycles: []string{"cleaning"}, + ExcludedComponentTags: []string{"interlocked"}, + GeneratedHazardCats: []string{"mechanical_hazard"}, + SuggestedMeasureIDs: []string{"M001", "M054"}, + Priority: 88, + }, + } +} diff --git a/ai-compliance-sdk/internal/iace/narrative_parser.go b/ai-compliance-sdk/internal/iace/narrative_parser.go index c49b074..1b46373 100644 --- a/ai-compliance-sdk/internal/iace/narrative_parser.go +++ b/ai-compliance-sdk/internal/iace/narrative_parser.go @@ -47,22 +47,30 @@ var techSpecPattern = regexp.MustCompile(`(\d[\d.,]*)\s*(kN|Tonnen|tonnen|kJ|kW| // lifecycleKeywords maps German text patterns to lifecycle phase IDs. var lifecycleKeywords = map[string]string{ - "betrieb": "normal_operation", - "normalbetrieb": "normal_operation", - "automatikbetrieb":"auto_operation", - "einricht": "setup", - "umruest": "changeover", - "wartung": "maintenance", - "instandhalt": "maintenance", - "instandsetz": "repair", - "reinig": "cleaning", - "transport": "transport", - "montage": "assembly", - "inbetriebnahme": "commissioning", + "betrieb": "normal_operation", + "normalbetrieb": "normal_operation", + "automatikbetrieb": "auto_operation", + "einricht": "setup", + "umruest": "changeover", + "werkzeugwechsel": "changeover", + "wartung": "maintenance", + "instandhalt": "maintenance", + "instandsetz": "repair", + "reinig": "cleaning", + "transport": "transport", + "montage": "assembly", + "installation": "assembly", + "inbetriebnahme": "commissioning", "ausserbetriebnahme": "decommissioning", - "demontage": "disposal", - "reparatur": "repair", - "stoerungsbeseitig":"fault_clearing", + "demontage": "disposal", + "entsorgung": "disposal", + "reparatur": "repair", + "stoerungsbeseitig": "fault_clearing", + "stoerung": "fault_clearing", + "fehlersuche": "fault_clearing", + "klemm": "fault_clearing", + "blockier": "fault_clearing", + "stau": "fault_clearing", } // roleKeywords maps German text patterns to role IDs. diff --git a/ai-compliance-sdk/internal/iace/pattern_engine.go b/ai-compliance-sdk/internal/iace/pattern_engine.go index fcb2df1..d2a93fb 100644 --- a/ai-compliance-sdk/internal/iace/pattern_engine.go +++ b/ai-compliance-sdk/internal/iace/pattern_engine.go @@ -59,6 +59,7 @@ func NewPatternEngine() *PatternEngine { patterns = append(patterns, GetExtendedHazardPatterns()...) // HP045+ from rule library patterns = append(patterns, GetPressHazardPatterns()...) // HP045-HP058 press-specific patterns = append(patterns, GetCobotHazardPatterns()...) // HP059-HP065 cobot-specific + patterns = append(patterns, GetOperationalHazardPatterns()...) // HP066-HP093 operational states return &PatternEngine{ resolver: NewTagResolver(), patterns: patterns,