feat: IACE 28 operational hazard patterns (HP066-HP093)

Fault Clearing (HP066-HP072): Jammed parts releasing, hose bursts,
unexpected restart, stored energy, intervention in running machine,
material jam, falling parts during fault clearing

Maintenance (HP073-HP079): Missing LOTO, falls from platforms,
hot parts contact, hazardous substances, electric shock, ergonomic
access, uncontrolled hydraulic lowering

Setup/Changeover (HP080-HP085): Crushing during tool change, burns
from hot tools, heavy tool drops, unintended stroke in setup mode,
wrong parameters, test cycle hits personnel

Transport/Install/Decommission (HP086-HP090): Machine tipping,
crushing during installation, uncontrolled commissioning movement,
residual media, sharp edges

Cleaning (HP091-HP093): Slipping, chemical exposure, draw-in

Lifecycle keywords expanded: werkzeugwechsel, stoerung, fehlersuche,
klemm, blockier, stau → trigger fault_clearing phase patterns

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-05 17:42:38 +02:00
parent a349111a01
commit 85e82d0dfa
3 changed files with 299 additions and 15 deletions
@@ -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,
},
}
}
@@ -49,20 +49,28 @@ var techSpecPattern = regexp.MustCompile(`(\d[\d.,]*)\s*(kN|Tonnen|tonnen|kJ|kW|
var lifecycleKeywords = map[string]string{ var lifecycleKeywords = map[string]string{
"betrieb": "normal_operation", "betrieb": "normal_operation",
"normalbetrieb": "normal_operation", "normalbetrieb": "normal_operation",
"automatikbetrieb":"auto_operation", "automatikbetrieb": "auto_operation",
"einricht": "setup", "einricht": "setup",
"umruest": "changeover", "umruest": "changeover",
"werkzeugwechsel": "changeover",
"wartung": "maintenance", "wartung": "maintenance",
"instandhalt": "maintenance", "instandhalt": "maintenance",
"instandsetz": "repair", "instandsetz": "repair",
"reinig": "cleaning", "reinig": "cleaning",
"transport": "transport", "transport": "transport",
"montage": "assembly", "montage": "assembly",
"installation": "assembly",
"inbetriebnahme": "commissioning", "inbetriebnahme": "commissioning",
"ausserbetriebnahme": "decommissioning", "ausserbetriebnahme": "decommissioning",
"demontage": "disposal", "demontage": "disposal",
"entsorgung": "disposal",
"reparatur": "repair", "reparatur": "repair",
"stoerungsbeseitig":"fault_clearing", "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. // roleKeywords maps German text patterns to role IDs.
@@ -59,6 +59,7 @@ func NewPatternEngine() *PatternEngine {
patterns = append(patterns, GetExtendedHazardPatterns()...) // HP045+ from rule library patterns = append(patterns, GetExtendedHazardPatterns()...) // HP045+ from rule library
patterns = append(patterns, GetPressHazardPatterns()...) // HP045-HP058 press-specific patterns = append(patterns, GetPressHazardPatterns()...) // HP045-HP058 press-specific
patterns = append(patterns, GetCobotHazardPatterns()...) // HP059-HP065 cobot-specific patterns = append(patterns, GetCobotHazardPatterns()...) // HP059-HP065 cobot-specific
patterns = append(patterns, GetOperationalHazardPatterns()...) // HP066-HP093 operational states
return &PatternEngine{ return &PatternEngine{
resolver: NewTagResolver(), resolver: NewTagResolver(),
patterns: patterns, patterns: patterns,