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:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user