fix(iace): set-based measure-category filter + 235 pattern-author fixes

Two-part nachhaltiger fix replacing the previous "fill to 5 mitigations
no matter what" behavior that the GT-Bremse benchmark proved
unfaithful (e.g. HP1625 "scharfe Kanten" returning M005 "Rotations-
bewegung vermeiden" via category fallback; HP1651 "Wiederanlauf
Roboter" returning M054 "Sichere thermische Auslegung" via
mismatched pattern reference).

PART A — Set-based category filter (handlers package):
- acceptableMeasureCategories: replaces 1:1 patternCatToMeasureCat
  with a curated set per pattern category, so e.g.
  safety_function_failure now accepts software_control measures
  (watchdogs, plausibility checks) and emc_hazard accepts both
  electrical and software_control measures
- isCategoryCompatible: gate every measure id against the accepted
  set before creating a mitigation; mismatches log MEASURE-SKIP
- The old category fallback is REMOVED. A hazard whose pattern has
  no category-compatible measure is now created with zero mitigations
  and logged as COVERAGE-GAP — the operator must consult an expert.
  No more silent invention of generic defaults.

PART B — 235 pattern author-error fixes across 26 files:
- HP040-HP044 (AI): M101/M102/M103 (Auffangwanne/Absauganlage) ->
  M133 Anomalieerkennung + M214 Plausibilitaet + M213 Sensor-Redundanz
  + M044 Zweikanalige Steuerung + others
- HP011-HP015, HP104-HP109, HP1085-HP1095, HP1281-HP1334 (electrical):
  M001-M005/M054/M061 placeholders -> M481/M482 Isolation +
  M511-M522 PE/Schutzleiter/RCD/Hauptschalter
- HP110-HP1331 (material_environmental): M101-M103 -> M384-M395
  Brandschutz/Laserschutz + M533/M408 SDB/PSA
- HP800-HP858, HP1178-HP1264 (software/sensor/hmi):
  M101/M104 -> M105/M106/M107/M214 SPS/Watchdog/Plausibilitaet
- HP026, HP611-HP1690 (ergonomic): M001/M082 -> M353-M360 +
  M530-M532 Hebehilfe/ergonomische Hoehe
- HP201-HP1697 (mechanical): M054/M051 -> M002/M008/M061/M141 +
  M487/M488 Tueroeffnung-Stillsetzung/Wiederanlauf
- Plus EMF/Strahlung/Brand/Lärm/Vibration/Kommunikation/Cyber

Coverage shift (Pattern-Author-Fehler bei aktiviertem Set-Filter):
   start:         237 patterns with zero category-compatible measures
   after Stufe 1A:   5 (AI)
   after Stufe 1B:  20 (mechanical Bestand)
   after Stufe 1C:  35 (electrical Bestand)
   after Stufe 1D:  29 (material_environmental)
   after Stufe 1E:  29 (software/sensor/hmi)
   after Stufe 1F:  20 (ergonomic)
   after Stufe 1G:  80 (thermal/comm/radiation/fire/safety)
   final:           0  (28 extended.go/extended2.go duplicates fixed)

New regression tests:
- TestEveryPattern_HasCategoryCompatibleMeasure: every pattern in
  collectAllPatterns() must reference at least one category-compatible
  measure; gaps must be explicitly listed in AllowlistKnownGaps
  (currently empty). Fails CI for any new pattern that drifts.
- TestAcceptableMeasureCategories: pins the set-mapping for the
  7 most-bug-prone pattern categories.
- TestIsCategoryCompatible_EmptyMeasureCat: protects legacy entries.

A separate task #11 tracks 58 HP-ID duplicates between
extended.go/extended2.go and cobot.go/press.go/operational.go —
patterns are semantically different and TestGetBuiltinHazardPatterns_-
UniqueIDs misses them because it only checks HP001-HP044.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-16 21:11:02 +02:00
parent 938f9a6c51
commit 6a3e96d54c
36 changed files with 549 additions and 273 deletions
@@ -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)
@@ -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{
@@ -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)")
}
}
@@ -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
@@ -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.",
@@ -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.",
@@ -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",
@@ -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,
@@ -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.",
@@ -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.",
@@ -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.",
@@ -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.",
@@ -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.",
@@ -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.",
@@ -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.",
@@ -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
@@ -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
@@ -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.",
@@ -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,
@@ -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",
@@ -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",
@@ -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",
@@ -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,
@@ -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.",
@@ -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.",
@@ -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},
@@ -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.",
@@ -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,
@@ -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",
@@ -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.",
@@ -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.",
@@ -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.",
@@ -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.",
@@ -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.",
@@ -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},
@@ -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
}