diff --git a/ai-compliance-sdk/internal/iace/engine.go b/ai-compliance-sdk/internal/iace/engine.go index 814f4ab..11318a6 100644 --- a/ai-compliance-sdk/internal/iace/engine.go +++ b/ai-compliance-sdk/internal/iace/engine.go @@ -123,6 +123,73 @@ func (e *RiskEngine) CalculateResidualRisk(severity, exposure, probability int, return inherent * (1 - cEff) } +// RiskTrajectoryStep represents one step in the risk reduction trajectory. +type RiskTrajectoryStep struct { + Stage string `json:"stage"` // "inherent", "after_design", "after_protection", "after_information" + Severity int `json:"severity"` + Exposure int `json:"exposure"` + Probability int `json:"probability"` + RiskScore float64 `json:"risk_score"` + RiskLevel string `json:"risk_level"` + IsAcceptable bool `json:"is_acceptable"` +} + +// CalculateRiskTrajectory computes the step-by-step risk reduction when measures +// are applied in ISO 12100 hierarchy order: design → protection → information. +// Each measure's RiskReduction deltas are cumulated per stage. +// Parameters are clamped to minimum 1 after each stage. +func (e *RiskEngine) CalculateRiskTrajectory( + severity, exposure, probability int, + measures []ProtectiveMeasureEntry, +) []RiskTrajectoryStep { + s, ex, p := clamp(severity, 1, 5), clamp(exposure, 1, 5), clamp(probability, 1, 5) + + // Inherent risk (no measures) + steps := []RiskTrajectoryStep{{ + Stage: "inherent", Severity: s, Exposure: ex, Probability: p, + RiskScore: float64(s * ex * p), + RiskLevel: string(e.DetermineRiskLevel(float64(s * ex * p))), + }} + + // Group measures by reduction type in hierarchy order + stages := []struct { + name string + rtype string + }{ + {"after_design", "design"}, + {"after_protection", "protection"}, + {"after_protection", "protective"}, // MandatoryNorm measures use "protective" + {"after_information", "information"}, + } + + for _, stage := range stages { + dS, dE, dP := 0, 0, 0 + for _, m := range measures { + if m.ReductionType != stage.rtype || m.RiskReduction == nil { + continue + } + dS += m.RiskReduction.SeverityDelta + dE += m.RiskReduction.ExposureDelta + dP += m.RiskReduction.ProbabilityDelta + } + if dS == 0 && dE == 0 && dP == 0 { + continue + } + s = clamp(s+dS, 1, 5) + ex = clamp(ex+dE, 1, 5) + p = clamp(p+dP, 1, 5) + score := float64(s * ex * p) + level := e.DetermineRiskLevel(score) + steps = append(steps, RiskTrajectoryStep{ + Stage: stage.name, Severity: s, Exposure: ex, Probability: p, + RiskScore: score, RiskLevel: string(level), + IsAcceptable: score < 15, + }) + } + + return steps +} + // DetermineRiskLevel classifies the residual risk into a RiskLevel category. // // Thresholds: diff --git a/ai-compliance-sdk/internal/iace/measures_library.go b/ai-compliance-sdk/internal/iace/measures_library.go index fff8092..7aee34f 100644 --- a/ai-compliance-sdk/internal/iace/measures_library.go +++ b/ai-compliance-sdk/internal/iace/measures_library.go @@ -25,30 +25,30 @@ func GetProtectiveMeasureLibrary() []ProtectiveMeasureEntry { func getDesignMeasures() []ProtectiveMeasureEntry { return []ProtectiveMeasureEntry{ // ── Geometry (M001-M010) ───────────────────────────────────────────── - {ID: "M001", ReductionType: "design", SubType: "geometry", Name: "Gefahrstelle konstruktiv eliminieren", Description: "Durch konstruktive Gestaltung wird die Gefahrstelle vollstaendig beseitigt.", HazardCategory: "mechanical", Examples: []string{"Quetschstelle durch Geometrieaenderung entfernen", "Einzugsstelle durch vergroesserten Spalt eliminieren"}, NormReferences: []string{"ISO 12100 — Inhaerent sichere Konstruktion"}}, - {ID: "M002", ReductionType: "design", SubType: "geometry", Name: "Sicherheitsabstaende vergroessern", Description: "Abstaende zwischen Gefahrstellen und zugaenglichen Bereichen werden nach Norm dimensioniert.", HazardCategory: "mechanical", Examples: []string{"Greifabstand an Walzen vergroessern", "Abstand zu heissen Oberflaechen erhoehen"}, NormReferences: []string{"ISO 13857", "ISO 13854"}}, - {ID: "M003", ReductionType: "design", SubType: "geometry", Name: "Scharfe Kanten entfernen", Description: "Alle zugaenglichen Kanten werden abgerundet oder entgratet.", HazardCategory: "mechanical", Examples: []string{"Radien an Blechkanten anbringen", "Entgratung aller Stanzteile sicherstellen"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, - {ID: "M004", ReductionType: "design", SubType: "geometry", Name: "Sichere Geometrie", Description: "Die Bauteilgeometrie vermeidet Quetsch-, Scher- und Einzugsstellen.", HazardCategory: "mechanical", Examples: []string{"Abgerundete Formteile statt scharfkantiger verwenden", "Spaltmasse an Fuehrungen einhalten"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, - {ID: "M005", ReductionType: "design", SubType: "geometry", Name: "Rotationsbewegung vermeiden", Description: "Rotierende Teile werden durch Alternativloesungen ersetzt.", HazardCategory: "mechanical", Examples: []string{"Linearantrieb statt Drehantrieb verwenden", "Riemenantrieb durch Zahnstange ersetzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, - {ID: "M006", ReductionType: "design", SubType: "geometry", Name: "Kollisionsfreie Bewegungsbahnen", Description: "Bewegungsbahnen werden so geplant, dass Kollisionen mit Personen ausgeschlossen sind.", HazardCategory: "mechanical", Examples: []string{"Verfahrwege ausserhalb des Bedienerbereichs legen", "Bewegungsbahnen in der Simulation pruefen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse"}}, - {ID: "M007", ReductionType: "design", SubType: "geometry", Name: "Sichere Greiferkonstruktion", Description: "Greifersysteme verhindern unkontrolliertes Freisetzen von Werkstuecken.", HazardCategory: "mechanical", Examples: []string{"Formschluessige Greiferbacken verwenden", "Federbelastete Greifer fuer Fail-Safe"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung", "ISO 10218-2"}}, - {ID: "M008", ReductionType: "design", SubType: "geometry", Name: "Sichere Werkstueckaufnahme", Description: "Werkstueckaufnahmen verhindern Herausschleudern bei allen Betriebszustaenden.", HazardCategory: "mechanical", Examples: []string{"Spannvorrichtung mit Formschluss", "Automatische Spannkontrolle integrieren"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, - {ID: "M009", ReductionType: "design", SubType: "geometry", Name: "Sichere Kabelfuehrung", Description: "Elektrische Leitungen werden vor mechanischer Beschaedigung und Hitze geschuetzt.", HazardCategory: "electrical", Examples: []string{"Kabelkanaele mit Deckel verwenden", "Leitungen in Schleppketten fuehren"}, NormReferences: []string{"IEC 60204-1", "ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}}, - {ID: "M010", ReductionType: "design", SubType: "geometry", Name: "Sichere Sensorposition", Description: "Sensoren werden zuverlaessig messend und vor mechanischer Beschaedigung geschuetzt positioniert.", HazardCategory: "software_control", Examples: []string{"Sensoren in geschuetzten Nischen montieren", "Sensoren ausserhalb des Gefahrbereichs platzieren"}, NormReferences: []string{"ISO 12100 — Sicherheitsbezogene Steuerungssysteme"}}, + {ID: "M001", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Gefahrstelle konstruktiv eliminieren", Description: "Durch konstruktive Gestaltung wird die Gefahrstelle vollstaendig beseitigt.", HazardCategory: "mechanical", Examples: []string{"Quetschstelle durch Geometrieaenderung entfernen", "Einzugsstelle durch vergroesserten Spalt eliminieren"}, NormReferences: []string{"ISO 12100 — Inhaerent sichere Konstruktion"}}, + {ID: "M002", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sicherheitsabstaende vergroessern", Description: "Abstaende zwischen Gefahrstellen und zugaenglichen Bereichen werden nach Norm dimensioniert.", HazardCategory: "mechanical", Examples: []string{"Greifabstand an Walzen vergroessern", "Abstand zu heissen Oberflaechen erhoehen"}, NormReferences: []string{"ISO 13857", "ISO 13854"}}, + {ID: "M003", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Scharfe Kanten entfernen", Description: "Alle zugaenglichen Kanten werden abgerundet oder entgratet.", HazardCategory: "mechanical", Examples: []string{"Radien an Blechkanten anbringen", "Entgratung aller Stanzteile sicherstellen"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, + {ID: "M004", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sichere Geometrie", Description: "Die Bauteilgeometrie vermeidet Quetsch-, Scher- und Einzugsstellen.", HazardCategory: "mechanical", Examples: []string{"Abgerundete Formteile statt scharfkantiger verwenden", "Spaltmasse an Fuehrungen einhalten"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, + {ID: "M005", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Rotationsbewegung vermeiden", Description: "Rotierende Teile werden durch Alternativloesungen ersetzt.", HazardCategory: "mechanical", Examples: []string{"Linearantrieb statt Drehantrieb verwenden", "Riemenantrieb durch Zahnstange ersetzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, + {ID: "M006", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Kollisionsfreie Bewegungsbahnen", Description: "Bewegungsbahnen werden so geplant, dass Kollisionen mit Personen ausgeschlossen sind.", HazardCategory: "mechanical", Examples: []string{"Verfahrwege ausserhalb des Bedienerbereichs legen", "Bewegungsbahnen in der Simulation pruefen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse"}}, + {ID: "M007", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sichere Greiferkonstruktion", Description: "Greifersysteme verhindern unkontrolliertes Freisetzen von Werkstuecken.", HazardCategory: "mechanical", Examples: []string{"Formschluessige Greiferbacken verwenden", "Federbelastete Greifer fuer Fail-Safe"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung", "ISO 10218-2"}}, + {ID: "M008", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sichere Werkstueckaufnahme", Description: "Werkstueckaufnahmen verhindern Herausschleudern bei allen Betriebszustaenden.", HazardCategory: "mechanical", Examples: []string{"Spannvorrichtung mit Formschluss", "Automatische Spannkontrolle integrieren"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, + {ID: "M009", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sichere Kabelfuehrung", Description: "Elektrische Leitungen werden vor mechanischer Beschaedigung und Hitze geschuetzt.", HazardCategory: "electrical", Examples: []string{"Kabelkanaele mit Deckel verwenden", "Leitungen in Schleppketten fuehren"}, NormReferences: []string{"IEC 60204-1", "ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}}, + {ID: "M010", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sichere Sensorposition", Description: "Sensoren werden zuverlaessig messend und vor mechanischer Beschaedigung geschuetzt positioniert.", HazardCategory: "software_control", Examples: []string{"Sensoren in geschuetzten Nischen montieren", "Sensoren ausserhalb des Gefahrbereichs platzieren"}, NormReferences: []string{"ISO 12100 — Sicherheitsbezogene Steuerungssysteme"}}, // ── Force / Energy (M011-M022) ────────────────────────────────────── - {ID: "M011", ReductionType: "design", SubType: "force_energy", Name: "Bewegungsenergie reduzieren", Description: "Kinetische Energie beweglicher Maschinenteile wird auf ein sicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Masse beweglicher Teile verringern", "Hublaenge verkuerzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, - {ID: "M012", ReductionType: "design", SubType: "force_energy", Name: "Geschwindigkeit reduzieren", Description: "Verfahrgeschwindigkeit wird konstruktiv auf ein verletzungssicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Maximale Achsgeschwindigkeit mechanisch begrenzen", "Drehzahlbegrenzer einbauen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, - {ID: "M013", ReductionType: "design", SubType: "force_energy", Name: "Kraft begrenzen", Description: "Die maximal auftretende Kraft wird konstruktiv so begrenzt, dass keine Verletzungsgefahr besteht.", HazardCategory: "mechanical", Examples: []string{"Federbelastete Kraftbegrenzung einsetzen", "Antriebsdrehmoment begrenzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten", "ISO/TS 15066"}}, - {ID: "M014", ReductionType: "design", SubType: "force_energy", Name: "Kinematik aendern", Description: "Bewegungsart oder -richtung wird umgestaltet, sodass die Gefaehrdung entfaellt.", HazardCategory: "mechanical", Examples: []string{"Linearbewegung statt Rotation einsetzen", "Bewegungsrichtung von Bedienerseite wegfuehren"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, - {ID: "M015", ReductionType: "design", SubType: "force_energy", Name: "Gewicht reduzieren", Description: "Gewicht beweglicher Maschinenteile wird minimiert zur Verringerung der Verletzungsschwere.", HazardCategory: "mechanical", Examples: []string{"Leichtbauwerkstoffe fuer bewegliche Arme", "Hohlprofile statt Vollmaterial"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, - {ID: "M016", ReductionType: "design", SubType: "force_energy", Name: "Redundante Konstruktion", Description: "Sicherheitskritische Bauteile sind mehrfach ausgefuehrt fuer Ausfallsicherheit.", HazardCategory: "mechanical", Examples: []string{"Doppelte Tragseile an Hebezeugen", "Redundante Bremssysteme vorsehen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse", "ISO 13849-1"}}, - {ID: "M017", ReductionType: "design", SubType: "force_energy", Name: "Mechanische Begrenzung", Description: "Feste mechanische Anschlaege begrenzen den Bewegungsbereich.", HazardCategory: "mechanical", Examples: []string{"Feste Endanschlaege an Linearachsen", "Drehwinkelbegrenzung an Drehachsen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, - {ID: "M018", ReductionType: "design", SubType: "force_energy", Name: "Schwerkraftsichere Konstruktion", Description: "Konstruktion verhindert unkontrollierte Bewegung durch Schwerkraft bei Energieausfall.", HazardCategory: "mechanical", Examples: []string{"Lasthalteventile in Hubzylindern", "Federspeicherbremsen an Vertikalachsen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse", "EN 693"}}, - {ID: "M019", ReductionType: "design", SubType: "force_energy", Name: "Energiebegrenzung", Description: "Die gesamt verfuegbare Energie im System wird konstruktiv auf ein sicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Kleine Pneumatikzylinder statt grosser verwenden", "Niedrigdruck-Hydraulik einsetzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, - {ID: "M020", ReductionType: "design", SubType: "force_energy", Name: "Sichere Energieuebertragung", Description: "Energieleitungen werden so verlegt, dass Leckagen oder Brueche keine Gefaehrdung darstellen.", HazardCategory: "electrical", Examples: []string{"Schleppketten fuer flexible Leitungen", "Doppelwandige Druckleitungen verwenden"}, NormReferences: []string{"ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}}, - {ID: "M021", ReductionType: "design", SubType: "force_energy", Name: "Nachgiebige Elemente", Description: "Maschinenteile im Kontaktbereich werden nachgiebig gestaltet zur Verletzungsminimierung.", HazardCategory: "mechanical", Examples: []string{"Polsterungen an Klemmpunkten", "Federnd gelagerte Anschlaege"}, NormReferences: []string{"ISO/TS 15066", "ISO 12100 — Physikalische Kenndaten"}}, - {ID: "M022", ReductionType: "design", SubType: "force_energy", Name: "Sichere Kraftuebertragung", Description: "Kraftuebertragungselemente sind gesichert gegen Bruch oder Loesen.", HazardCategory: "mechanical", Examples: []string{"Wellensicherungen gegen Axialverschiebung", "Sicherheitswellen mit Sollbruchstelle"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, + {ID: "M011", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Bewegungsenergie reduzieren", Description: "Kinetische Energie beweglicher Maschinenteile wird auf ein sicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Masse beweglicher Teile verringern", "Hublaenge verkuerzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, + {ID: "M012", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Geschwindigkeit reduzieren", Description: "Verfahrgeschwindigkeit wird konstruktiv auf ein verletzungssicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Maximale Achsgeschwindigkeit mechanisch begrenzen", "Drehzahlbegrenzer einbauen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, + {ID: "M013", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Kraft begrenzen", Description: "Die maximal auftretende Kraft wird konstruktiv so begrenzt, dass keine Verletzungsgefahr besteht.", HazardCategory: "mechanical", Examples: []string{"Federbelastete Kraftbegrenzung einsetzen", "Antriebsdrehmoment begrenzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten", "ISO/TS 15066"}}, + {ID: "M014", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Kinematik aendern", Description: "Bewegungsart oder -richtung wird umgestaltet, sodass die Gefaehrdung entfaellt.", HazardCategory: "mechanical", Examples: []string{"Linearbewegung statt Rotation einsetzen", "Bewegungsrichtung von Bedienerseite wegfuehren"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, + {ID: "M015", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Gewicht reduzieren", Description: "Gewicht beweglicher Maschinenteile wird minimiert zur Verringerung der Verletzungsschwere.", HazardCategory: "mechanical", Examples: []string{"Leichtbauwerkstoffe fuer bewegliche Arme", "Hohlprofile statt Vollmaterial"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, + {ID: "M016", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Redundante Konstruktion", Description: "Sicherheitskritische Bauteile sind mehrfach ausgefuehrt fuer Ausfallsicherheit.", HazardCategory: "mechanical", Examples: []string{"Doppelte Tragseile an Hebezeugen", "Redundante Bremssysteme vorsehen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse", "ISO 13849-1"}}, + {ID: "M017", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Mechanische Begrenzung", Description: "Feste mechanische Anschlaege begrenzen den Bewegungsbereich.", HazardCategory: "mechanical", Examples: []string{"Feste Endanschlaege an Linearachsen", "Drehwinkelbegrenzung an Drehachsen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, + {ID: "M018", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Schwerkraftsichere Konstruktion", Description: "Konstruktion verhindert unkontrollierte Bewegung durch Schwerkraft bei Energieausfall.", HazardCategory: "mechanical", Examples: []string{"Lasthalteventile in Hubzylindern", "Federspeicherbremsen an Vertikalachsen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse", "EN 693"}}, + {ID: "M019", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Energiebegrenzung", Description: "Die gesamt verfuegbare Energie im System wird konstruktiv auf ein sicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Kleine Pneumatikzylinder statt grosser verwenden", "Niedrigdruck-Hydraulik einsetzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, + {ID: "M020", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Sichere Energieuebertragung", Description: "Energieleitungen werden so verlegt, dass Leckagen oder Brueche keine Gefaehrdung darstellen.", HazardCategory: "electrical", Examples: []string{"Schleppketten fuer flexible Leitungen", "Doppelwandige Druckleitungen verwenden"}, NormReferences: []string{"ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}}, + {ID: "M021", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Nachgiebige Elemente", Description: "Maschinenteile im Kontaktbereich werden nachgiebig gestaltet zur Verletzungsminimierung.", HazardCategory: "mechanical", Examples: []string{"Polsterungen an Klemmpunkten", "Federnd gelagerte Anschlaege"}, NormReferences: []string{"ISO/TS 15066", "ISO 12100 — Physikalische Kenndaten"}}, + {ID: "M022", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Sichere Kraftuebertragung", Description: "Kraftuebertragungselemente sind gesichert gegen Bruch oder Loesen.", HazardCategory: "mechanical", Examples: []string{"Wellensicherungen gegen Axialverschiebung", "Sicherheitswellen mit Sollbruchstelle"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, // ── Material (M023-M028) ──────────────────────────────────────────── {ID: "M023", ReductionType: "design", SubType: "material", Name: "Sichere Materialwahl", Description: "Werkstoffe werden so gewaehlt, dass sie keine zusaetzlichen Gefaehrdungen verursachen.", HazardCategory: "material_environmental", Examples: []string{"Nicht-toxische Kunststoffe waehlen", "Korrosionsbestaendige Legierungen einsetzen"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, @@ -71,18 +71,18 @@ func getDesignMeasures() []ProtectiveMeasureEntry { {ID: "M038", ReductionType: "design", SubType: "ergonomics", Name: "Vibrationsarme Konstruktion", Description: "Vibrationen und Koerperschall werden an der Quelle minimiert.", HazardCategory: "noise_vibration", Examples: []string{"Schwingungsdaempfer an Motoren", "Elastische Maschinenlagerung"}, NormReferences: []string{"ISO 5349-1", "EN 1032"}}, // ── Control Design (M039-M050) ────────────────────────────────────── - {ID: "M039", ReductionType: "design", SubType: "control_design", Name: "Sichere Software-Fallbacks", Description: "Steuerungssoftware enthaelt Rueckfallstrategien fuer sichere Zustaende bei Fehlern.", HazardCategory: "software_control", Examples: []string{"Standardwerte bei Sensorausfall", "Sicherer Stopp bei unplausiblen Daten"}, NormReferences: []string{"IEC 62443-4-1", "ISO 13849-1"}}, - {ID: "M040", ReductionType: "design", SubType: "control_design", Name: "Deterministische Steuerungslogik", Description: "Steuerungslogik erzeugt bei identischen Eingaben immer identische Ausgaben.", HazardCategory: "software_control", Examples: []string{"Keine Zufallselemente in Sicherheitsfunktionen", "Feste Zykluszeiten fuer Safety-Tasks"}, NormReferences: []string{"IEC 61508-3", "IEC 62443-4-1"}}, - {ID: "M041", ReductionType: "design", SubType: "control_design", Name: "Definierte Zustandsmaschine", Description: "Alle Maschinenzustaende und Uebergaenge sind vollstaendig definiert und abgesichert.", HazardCategory: "software_control", Examples: []string{"Zustandsdiagramm erstellen", "Ungueltige Uebergaenge softwareseitig blockieren"}, NormReferences: []string{"IEC 61508-3", "ISO 13849-1"}}, - {ID: "M042", ReductionType: "design", SubType: "control_design", Name: "Sichere Restart-Logik", Description: "Neustart nur durch bewusste Bedienerhandlung, kein automatischer Wiederanlauf.", HazardCategory: "software_control", Examples: []string{"Automatischen Wiederanlauf nach Netzausfall verhindern", "Quittierungspflicht vor Neustart"}, NormReferences: []string{"ISO 12100 — Stillsetzen im Notfall", "IEC 60204-1"}}, - {ID: "M043", ReductionType: "design", SubType: "control_design", Name: "Sichere Fehlermodi", Description: "Jeder erkannte Fehler fuehrt automatisch in einen vordefinierten sicheren Zustand.", HazardCategory: "software_control", Examples: []string{"Fail-Safe bei Sensorausfall", "Fehlerkatalog mit sicheren Zustaenden"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}}, - {ID: "M044", ReductionType: "design", SubType: "control_design", Name: "Zweikanalige Steuerung", Description: "Sicherheitsfunktionen werden ueber zwei unabhaengige Kanaele ausgefuehrt.", HazardCategory: "software_control", Examples: []string{"Kategorie-3/4-Architektur nach ISO 13849", "Zwei getrennte Abschaltpfade"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}}, - {ID: "M045", ReductionType: "design", SubType: "control_design", Name: "Steuerungstechnische Sicherheit", Description: "Steuerungsarchitektur ist auf Fehlererkennung und sichere Reaktion ausgelegt.", HazardCategory: "software_control", Examples: []string{"Cross-Monitoring zwischen Kanaelen", "Diversitaere Signalverarbeitung"}, NormReferences: []string{"ISO 13849-1", "IEC 61508"}}, - {ID: "M046", ReductionType: "design", SubType: "control_design", Name: "Sichere Energieabschaltung", Description: "Maschine kann jederzeit sicher von allen Energiequellen getrennt werden.", HazardCategory: "electrical", Examples: []string{"Hauptschalter mit Absperrmoeglichkeit", "Pneumatik-Absperrventil am Eingang"}, NormReferences: []string{"IEC 60204-1", "ISO 12100 — Automatisierungstechnik"}}, - {ID: "M047", ReductionType: "design", SubType: "control_design", Name: "Sichere Energieentladung", Description: "Alle gespeicherten Energien werden nach Abschalten kontrolliert abgebaut.", HazardCategory: "electrical", Examples: []string{"Kondensatoren ueber Entladewiderstaende", "Druckspeicher ueber Entlastungsventil"}, NormReferences: []string{"IEC 60204-1 — Trennen und Ausschalten", "ISO 12100 — Automatisierungstechnik"}}, - {ID: "M048", ReductionType: "design", SubType: "control_design", Name: "Sichere Notzustaende", Description: "Fuer alle Notsituationen sind definierte Zustaende festgelegt.", HazardCategory: "general", Examples: []string{"Not-Halt-Zustand mit definierten Positionen", "Evakuierungszustand mit geoeffneten Schutztoren"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}}, - {ID: "M049", ReductionType: "design", SubType: "control_design", Name: "Sichere Betriebsartenwahl", Description: "Umschaltung zwischen Betriebsarten ist abgesichert und nur kontrolliert moeglich.", HazardCategory: "software_control", Examples: []string{"Schluesselschalter fuer Betriebsarten", "Sichere Betriebsartenerkennung in SPS"}, NormReferences: []string{"ISO 12100 — Sicherheitsbezogene Steuerungssysteme0", "IEC 60204-1"}}, - {ID: "M050", ReductionType: "design", SubType: "control_design", Name: "Sicherer Anlauf nach Stoerung", Description: "Wiederanlauf nach Stoerung folgt definierter Prozedur mit Bedienerfreigabe.", HazardCategory: "software_control", Examples: []string{"Schrittweiser Anlauf nach Fehler", "Pruefsequenz vor Produktionsfreigabe"}, NormReferences: []string{"ISO 12100 — Stillsetzen im Notfall", "IEC 60204-1"}}, + {ID: "M039", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Software-Fallbacks", Description: "Steuerungssoftware enthaelt Rueckfallstrategien fuer sichere Zustaende bei Fehlern.", HazardCategory: "software_control", Examples: []string{"Standardwerte bei Sensorausfall", "Sicherer Stopp bei unplausiblen Daten"}, NormReferences: []string{"IEC 62443-4-1", "ISO 13849-1"}}, + {ID: "M040", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Deterministische Steuerungslogik", Description: "Steuerungslogik erzeugt bei identischen Eingaben immer identische Ausgaben.", HazardCategory: "software_control", Examples: []string{"Keine Zufallselemente in Sicherheitsfunktionen", "Feste Zykluszeiten fuer Safety-Tasks"}, NormReferences: []string{"IEC 61508-3", "IEC 62443-4-1"}}, + {ID: "M041", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Definierte Zustandsmaschine", Description: "Alle Maschinenzustaende und Uebergaenge sind vollstaendig definiert und abgesichert.", HazardCategory: "software_control", Examples: []string{"Zustandsdiagramm erstellen", "Ungueltige Uebergaenge softwareseitig blockieren"}, NormReferences: []string{"IEC 61508-3", "ISO 13849-1"}}, + {ID: "M042", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Restart-Logik", Description: "Neustart nur durch bewusste Bedienerhandlung, kein automatischer Wiederanlauf.", HazardCategory: "software_control", Examples: []string{"Automatischen Wiederanlauf nach Netzausfall verhindern", "Quittierungspflicht vor Neustart"}, NormReferences: []string{"ISO 12100 — Stillsetzen im Notfall", "IEC 60204-1"}}, + {ID: "M043", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Fehlermodi", Description: "Jeder erkannte Fehler fuehrt automatisch in einen vordefinierten sicheren Zustand.", HazardCategory: "software_control", Examples: []string{"Fail-Safe bei Sensorausfall", "Fehlerkatalog mit sicheren Zustaenden"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}}, + {ID: "M044", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Zweikanalige Steuerung", Description: "Sicherheitsfunktionen werden ueber zwei unabhaengige Kanaele ausgefuehrt.", HazardCategory: "software_control", Examples: []string{"Kategorie-3/4-Architektur nach ISO 13849", "Zwei getrennte Abschaltpfade"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}}, + {ID: "M045", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Steuerungstechnische Sicherheit", Description: "Steuerungsarchitektur ist auf Fehlererkennung und sichere Reaktion ausgelegt.", HazardCategory: "software_control", Examples: []string{"Cross-Monitoring zwischen Kanaelen", "Diversitaere Signalverarbeitung"}, NormReferences: []string{"ISO 13849-1", "IEC 61508"}}, + {ID: "M046", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Energieabschaltung", Description: "Maschine kann jederzeit sicher von allen Energiequellen getrennt werden.", HazardCategory: "electrical", Examples: []string{"Hauptschalter mit Absperrmoeglichkeit", "Pneumatik-Absperrventil am Eingang"}, NormReferences: []string{"IEC 60204-1", "ISO 12100 — Automatisierungstechnik"}}, + {ID: "M047", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Energieentladung", Description: "Alle gespeicherten Energien werden nach Abschalten kontrolliert abgebaut.", HazardCategory: "electrical", Examples: []string{"Kondensatoren ueber Entladewiderstaende", "Druckspeicher ueber Entlastungsventil"}, NormReferences: []string{"IEC 60204-1 — Trennen und Ausschalten", "ISO 12100 — Automatisierungstechnik"}}, + {ID: "M048", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Notzustaende", Description: "Fuer alle Notsituationen sind definierte Zustaende festgelegt.", HazardCategory: "general", Examples: []string{"Not-Halt-Zustand mit definierten Positionen", "Evakuierungszustand mit geoeffneten Schutztoren"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}}, + {ID: "M049", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Betriebsartenwahl", Description: "Umschaltung zwischen Betriebsarten ist abgesichert und nur kontrolliert moeglich.", HazardCategory: "software_control", Examples: []string{"Schluesselschalter fuer Betriebsarten", "Sichere Betriebsartenerkennung in SPS"}, NormReferences: []string{"ISO 12100 — Sicherheitsbezogene Steuerungssysteme0", "IEC 60204-1"}}, + {ID: "M050", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sicherer Anlauf nach Stoerung", Description: "Wiederanlauf nach Stoerung folgt definierter Prozedur mit Bedienerfreigabe.", HazardCategory: "software_control", Examples: []string{"Schrittweiser Anlauf nach Fehler", "Pruefsequenz vor Produktionsfreigabe"}, NormReferences: []string{"ISO 12100 — Stillsetzen im Notfall", "IEC 60204-1"}}, // ── Fluid Design (M051-M058) ──────────────────────────────────────── {ID: "M051", ReductionType: "design", SubType: "fluid_design", Name: "Sichere Hydraulikdimensionierung", Description: "Hydrauliksystem so ausgelegt, dass Druckspitzen keine unkontrollierten Bewegungen verursachen.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Druckspeicher mit Berstscheibe", "Hydraulikleitungen druckfest dimensioniert"}, NormReferences: []string{"ISO 4413", "ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}}, diff --git a/ai-compliance-sdk/internal/iace/measures_library_ext.go b/ai-compliance-sdk/internal/iace/measures_library_ext.go index bd31248..27dd721 100644 --- a/ai-compliance-sdk/internal/iace/measures_library_ext.go +++ b/ai-compliance-sdk/internal/iace/measures_library_ext.go @@ -4,29 +4,29 @@ package iace func getProtectiveMeasures() []ProtectiveMeasureEntry { return []ProtectiveMeasureEntry{ // ── Fixed Guards (M061-M066) ──────────────────────────────────────── - {ID: "M061", ReductionType: "protection", SubType: "fixed_guard", Name: "Feste trennende Schutzeinrichtung", Description: "Fest montierte Barriere verhindert Zugang zum Gefahrbereich, nur mit Werkzeug entfernbar.", HazardCategory: "mechanical", Examples: []string{"Verschraubte Schutzverkleidung an Antrieben", "Schutzhaube ueber Riementrieb"}, NormReferences: []string{"ISO 14120", "ISO 12100 — Technische Schutzeinrichtungen"}}, - {ID: "M062", ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzzaun", Description: "Feststehender Zaun umgibt den Gefahrbereich vollstaendig.", HazardCategory: "mechanical", Examples: []string{"Stahlgitterzaun um Roboterzelle", "Polycarbonat-Schutzwand an Drehmaschine"}, NormReferences: []string{"ISO 14120", "ISO 13857"}}, - {ID: "M063", ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzhaube", Description: "Feststehende Haube kapselt rotierende oder sich bewegende Teile ein.", HazardCategory: "mechanical", Examples: []string{"Schutzhaube ueber Riemenantrieb", "Kapselung ueber Kupplungen"}, NormReferences: []string{"ISO 14120"}}, - {ID: "M064", ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzverkleidung mit Zugangsschlitz", Description: "Feste Verkleidung mit definierten Oeffnungen begrenzt den Zugang auf zul. Masse.", HazardCategory: "mechanical", Examples: []string{"Materialzufuehr-Schlitz an Presse", "Einlegeoeffnung mit Sicherheitsabstand"}, NormReferences: []string{"ISO 13857", "ISO 14120"}}, - {ID: "M065", ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzgitter fuer Lueftungsoeffnungen", Description: "Gitter an Lueftungsschlitzen verhindert Hindurchgreifen in rotierende Teile.", HazardCategory: "mechanical", Examples: []string{"Fingerschutzgitter an Lueftern", "Schutzgitter an Motorgehaeuse"}, NormReferences: []string{"ISO 13857", "ISO 14120"}}, - {ID: "M066", ReductionType: "protection", SubType: "fixed_guard", Name: "Tunnelfoermige Schutzeinhausung", Description: "Tunnelschutz am Materialein-/auslauf verhindert Zugriff in die Maschine.", HazardCategory: "mechanical", Examples: []string{"Foerderbandtunnel an Uebergabestellen", "Schutztunnel an Stanzenauslauf"}, NormReferences: []string{"ISO 14120", "ISO 13857"}}, + {ID: "M061", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Feste trennende Schutzeinrichtung", Description: "Fest montierte Barriere verhindert Zugang zum Gefahrbereich, nur mit Werkzeug entfernbar.", HazardCategory: "mechanical", Examples: []string{"Verschraubte Schutzverkleidung an Antrieben", "Schutzhaube ueber Riementrieb"}, NormReferences: []string{"ISO 14120", "ISO 12100 — Technische Schutzeinrichtungen"}}, + {ID: "M062", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzzaun", Description: "Feststehender Zaun umgibt den Gefahrbereich vollstaendig.", HazardCategory: "mechanical", Examples: []string{"Stahlgitterzaun um Roboterzelle", "Polycarbonat-Schutzwand an Drehmaschine"}, NormReferences: []string{"ISO 14120", "ISO 13857"}}, + {ID: "M063", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzhaube", Description: "Feststehende Haube kapselt rotierende oder sich bewegende Teile ein.", HazardCategory: "mechanical", Examples: []string{"Schutzhaube ueber Riemenantrieb", "Kapselung ueber Kupplungen"}, NormReferences: []string{"ISO 14120"}}, + {ID: "M064", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzverkleidung mit Zugangsschlitz", Description: "Feste Verkleidung mit definierten Oeffnungen begrenzt den Zugang auf zul. Masse.", HazardCategory: "mechanical", Examples: []string{"Materialzufuehr-Schlitz an Presse", "Einlegeoeffnung mit Sicherheitsabstand"}, NormReferences: []string{"ISO 13857", "ISO 14120"}}, + {ID: "M065", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzgitter fuer Lueftungsoeffnungen", Description: "Gitter an Lueftungsschlitzen verhindert Hindurchgreifen in rotierende Teile.", HazardCategory: "mechanical", Examples: []string{"Fingerschutzgitter an Lueftern", "Schutzgitter an Motorgehaeuse"}, NormReferences: []string{"ISO 13857", "ISO 14120"}}, + {ID: "M066", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Tunnelfoermige Schutzeinhausung", Description: "Tunnelschutz am Materialein-/auslauf verhindert Zugriff in die Maschine.", HazardCategory: "mechanical", Examples: []string{"Foerderbandtunnel an Uebergabestellen", "Schutztunnel an Stanzenauslauf"}, NormReferences: []string{"ISO 14120", "ISO 13857"}}, // ── Movable Guards (M067-M072) ────────────────────────────────────── - {ID: "M067", ReductionType: "protection", SubType: "movable_guard", Name: "Bewegliche Schutzeinrichtung mit Verriegelung", Description: "Bewegliche Schutzeinrichtung mit Sicherheitsschalter, Maschine stoppt bei Oeffnung.", HazardCategory: "mechanical", Examples: []string{"Schwenkbare Schutzhaube mit Sicherheitsschalter", "Klappbare Schutzabdeckung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}}, - {ID: "M068", ReductionType: "protection", SubType: "movable_guard", Name: "Verriegelung mit Zuhaltung", Description: "Schutztuer kann nur bei stillstehender Maschine geoeffnet werden.", HazardCategory: "mechanical", Examples: []string{"Elektromagnetische Zuhaltung", "Bolzenverriegelung mit Positionsueberwachung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}}, - {ID: "M069", ReductionType: "protection", SubType: "movable_guard", Name: "Codierte Sicherheitsschalter", Description: "RFID-codierte Schalter verhindern Umgehung der Schutzeinrichtung.", HazardCategory: "mechanical", Examples: []string{"RFID-Sicherheitsschalter an Schutztuer", "Codierte Schalter mit Manipulationsschutz"}, NormReferences: []string{"ISO 14119", "EN 1088"}}, - {ID: "M070", ReductionType: "protection", SubType: "movable_guard", Name: "Verriegelungssystem mit Fluchtentriegelung", Description: "Zuhaltung kann von innen ohne Werkzeug geoeffnet werden (Personenschutz).", HazardCategory: "mechanical", Examples: []string{"Fluchtentriegelung an Einhausung", "Innenliegende Notentriegelung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}}, - {ID: "M071", ReductionType: "protection", SubType: "movable_guard", Name: "Startverriegelung", Description: "Maschine startet nur wenn alle Schutzeinrichtungen in Schutzstellung sind.", HazardCategory: "mechanical", Examples: []string{"Start nur bei geschlossener Schutztuer", "Automatische Rueckmeldung aller Schutzpositionen"}, NormReferences: []string{"ISO 14119", "ISO 12100 — Technische Schutzeinrichtungen"}}, - {ID: "M072", ReductionType: "protection", SubType: "movable_guard", Name: "Zeitverzoegerte Zuhaltung", Description: "Zuhaltung gibt erst nach Auslauf gefaehrlicher Bewegungen frei.", HazardCategory: "mechanical", Examples: []string{"Zeitrelais an Spindelstopp", "Verzoegerte Tuerfreigabe nach Pressstopp"}, NormReferences: []string{"ISO 14119"}}, + {ID: "M067", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Bewegliche Schutzeinrichtung mit Verriegelung", Description: "Bewegliche Schutzeinrichtung mit Sicherheitsschalter, Maschine stoppt bei Oeffnung.", HazardCategory: "mechanical", Examples: []string{"Schwenkbare Schutzhaube mit Sicherheitsschalter", "Klappbare Schutzabdeckung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}}, + {ID: "M068", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Verriegelung mit Zuhaltung", Description: "Schutztuer kann nur bei stillstehender Maschine geoeffnet werden.", HazardCategory: "mechanical", Examples: []string{"Elektromagnetische Zuhaltung", "Bolzenverriegelung mit Positionsueberwachung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}}, + {ID: "M069", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Codierte Sicherheitsschalter", Description: "RFID-codierte Schalter verhindern Umgehung der Schutzeinrichtung.", HazardCategory: "mechanical", Examples: []string{"RFID-Sicherheitsschalter an Schutztuer", "Codierte Schalter mit Manipulationsschutz"}, NormReferences: []string{"ISO 14119", "EN 1088"}}, + {ID: "M070", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Verriegelungssystem mit Fluchtentriegelung", Description: "Zuhaltung kann von innen ohne Werkzeug geoeffnet werden (Personenschutz).", HazardCategory: "mechanical", Examples: []string{"Fluchtentriegelung an Einhausung", "Innenliegende Notentriegelung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}}, + {ID: "M071", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Startverriegelung", Description: "Maschine startet nur wenn alle Schutzeinrichtungen in Schutzstellung sind.", HazardCategory: "mechanical", Examples: []string{"Start nur bei geschlossener Schutztuer", "Automatische Rueckmeldung aller Schutzpositionen"}, NormReferences: []string{"ISO 14119", "ISO 12100 — Technische Schutzeinrichtungen"}}, + {ID: "M072", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Zeitverzoegerte Zuhaltung", Description: "Zuhaltung gibt erst nach Auslauf gefaehrlicher Bewegungen frei.", HazardCategory: "mechanical", Examples: []string{"Zeitrelais an Spindelstopp", "Verzoegerte Tuerfreigabe nach Pressstopp"}, NormReferences: []string{"ISO 14119"}}, // ── Electro-sensitive (M073-M079) ─────────────────────────────────── - {ID: "M073", ReductionType: "protection", SubType: "electro_sensitive", Name: "Lichtvorhang Typ 2", Description: "Optoelektronischer Schutz mit 30mm Aufloesung fuer Koerpererkennung.", HazardCategory: "mechanical", Examples: []string{"Koerperschutz-Lichtvorhang an Verpackungsmaschine", "Zugangsschutz an Palettieranlage"}, NormReferences: []string{"IEC 61496-1", "IEC 61496-2"}}, - {ID: "M074", ReductionType: "protection", SubType: "electro_sensitive", Name: "Lichtvorhang Typ 4", Description: "Optoelektronischer Schutz mit 14mm Aufloesung fuer Handschutz.", HazardCategory: "mechanical", Examples: []string{"Handschutz-Lichtgitter an Pressenzufuehrung", "Fingerschutz an Abkantpresse"}, NormReferences: []string{"IEC 61496-1", "IEC 61496-2"}}, - {ID: "M075", ReductionType: "protection", SubType: "electro_sensitive", Name: "Laserscanner", Description: "Flaechenscanner ueberwacht Bodenbereich mit Warn- und Schutzfeld.", HazardCategory: "mechanical", Examples: []string{"Sicherheitslaserscanner an mobiler Plattform", "Multizonen-Scanner mit anpassbaren Feldern"}, NormReferences: []string{"IEC 61496-3", "ISO 13855"}}, - {ID: "M076", ReductionType: "protection", SubType: "electro_sensitive", Name: "Sicherheitslichtschranke", Description: "Einstrahl-Lichtschranke ueberwacht Zugang und loest Stopp aus.", HazardCategory: "mechanical", Examples: []string{"Einstrahl-Lichtschranke an Maschinenzugang", "Reflex-Lichtschranke an Auswurfoeffnung"}, NormReferences: []string{"IEC 61496-1", "ISO 13855"}}, - {ID: "M077", ReductionType: "protection", SubType: "electro_sensitive", Name: "Kamerabasiertes Schutzsystem", Description: "Bildverarbeitungssystem erkennt Personen im Gefahrbereich dreidimensional.", HazardCategory: "mechanical", Examples: []string{"3D-Kamerasystem an Roboterzelle", "Stereokamera-Absicherung an Portal"}, NormReferences: []string{"IEC 61496-4", "ISO 13855"}}, - {ID: "M078", ReductionType: "protection", SubType: "electro_sensitive", Name: "Radarbasiertes Schutzsystem", Description: "Radarsensor erkennt Personen auch bei Staub, Nebel oder Verschmutzung.", HazardCategory: "mechanical", Examples: []string{"Radarsensor an Outdoor-Anlage", "Radarueberwachung bei verschmutzter Umgebung"}, NormReferences: []string{"IEC 61496-1"}}, - {ID: "M079", ReductionType: "protection", SubType: "electro_sensitive", Name: "Ultraschallsensor-Absicherung", Description: "Ultraschallsensoren erkennen Personen anhand reflektierter Schallwellen.", HazardCategory: "mechanical", Examples: []string{"Ultraschallnaeherungssensor an Fahrzeugen", "Kollisionswarnung an FTS"}, NormReferences: []string{"IEC 61496-1"}}, + {ID: "M073", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Lichtvorhang Typ 2", Description: "Optoelektronischer Schutz mit 30mm Aufloesung fuer Koerpererkennung.", HazardCategory: "mechanical", Examples: []string{"Koerperschutz-Lichtvorhang an Verpackungsmaschine", "Zugangsschutz an Palettieranlage"}, NormReferences: []string{"IEC 61496-1", "IEC 61496-2"}}, + {ID: "M074", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Lichtvorhang Typ 4", Description: "Optoelektronischer Schutz mit 14mm Aufloesung fuer Handschutz.", HazardCategory: "mechanical", Examples: []string{"Handschutz-Lichtgitter an Pressenzufuehrung", "Fingerschutz an Abkantpresse"}, NormReferences: []string{"IEC 61496-1", "IEC 61496-2"}}, + {ID: "M075", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Laserscanner", Description: "Flaechenscanner ueberwacht Bodenbereich mit Warn- und Schutzfeld.", HazardCategory: "mechanical", Examples: []string{"Sicherheitslaserscanner an mobiler Plattform", "Multizonen-Scanner mit anpassbaren Feldern"}, NormReferences: []string{"IEC 61496-3", "ISO 13855"}}, + {ID: "M076", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Sicherheitslichtschranke", Description: "Einstrahl-Lichtschranke ueberwacht Zugang und loest Stopp aus.", HazardCategory: "mechanical", Examples: []string{"Einstrahl-Lichtschranke an Maschinenzugang", "Reflex-Lichtschranke an Auswurfoeffnung"}, NormReferences: []string{"IEC 61496-1", "ISO 13855"}}, + {ID: "M077", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Kamerabasiertes Schutzsystem", Description: "Bildverarbeitungssystem erkennt Personen im Gefahrbereich dreidimensional.", HazardCategory: "mechanical", Examples: []string{"3D-Kamerasystem an Roboterzelle", "Stereokamera-Absicherung an Portal"}, NormReferences: []string{"IEC 61496-4", "ISO 13855"}}, + {ID: "M078", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Radarbasiertes Schutzsystem", Description: "Radarsensor erkennt Personen auch bei Staub, Nebel oder Verschmutzung.", HazardCategory: "mechanical", Examples: []string{"Radarsensor an Outdoor-Anlage", "Radarueberwachung bei verschmutzter Umgebung"}, NormReferences: []string{"IEC 61496-1"}}, + {ID: "M079", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Ultraschallsensor-Absicherung", Description: "Ultraschallsensoren erkennen Personen anhand reflektierter Schallwellen.", HazardCategory: "mechanical", Examples: []string{"Ultraschallnaeherungssensor an Fahrzeugen", "Kollisionswarnung an FTS"}, NormReferences: []string{"IEC 61496-1"}}, // ── Pressure-sensitive (M080-M082) ────────────────────────────────── {ID: "M080", ReductionType: "protection", SubType: "pressure_sensitive", Name: "Schaltmatte", Description: "Druckempfindliche Bodenmatte erkennt Betreten des Gefahrbereichs.", HazardCategory: "mechanical", Examples: []string{"Sicherheitsmatte vor Roboterzelle", "Schaltmatte unter Palettierstation"}, NormReferences: []string{"ISO 13856-1", "ISO 13855"}}, @@ -34,10 +34,10 @@ func getProtectiveMeasures() []ProtectiveMeasureEntry { {ID: "M082", ReductionType: "protection", SubType: "pressure_sensitive", Name: "Schaltpuffer", Description: "Druckempfindliche Pufferelemente an Fahrzeugkanten erkennen Kollisionen.", HazardCategory: "mechanical", Examples: []string{"Schaltpuffer an FTS/AGV", "Bumper an Shuttle-System"}, NormReferences: []string{"ISO 13856-3", "ISO 3691-4"}}, // ── Emergency Stop (M083-M086) ────────────────────────────────────── - {ID: "M083", ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt Kategorie 0", Description: "Sofortiges Abschalten aller Aktoren durch Unterbrechung der Energiezufuhr.", HazardCategory: "general", Examples: []string{"Pilztaster an jedem Bedienfeld", "Drahtloser Not-Halt fuer mobile Bedienung"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}}, - {ID: "M084", ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt Kategorie 1", Description: "Kontrolliertes Stillsetzen, dann Energietrennung nach Stillstand.", HazardCategory: "general", Examples: []string{"Kontrolliertes Abbremsen vor Abschaltung", "Gesteuerter Stopp mit anschliessender Energietrennung"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}}, - {ID: "M085", ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt-Seilzug", Description: "Reissleine entlang langer Foerderstrecken fuer sofortigen Stopp.", HazardCategory: "general", Examples: []string{"Seilzug-Nothalt an Bandfoerderern", "Reissleine entlang Rollenbahnen"}, NormReferences: []string{"ISO 13850", "EN 620"}}, - {ID: "M086", ReductionType: "protection", SubType: "emergency_stop", Name: "Notabschaltung", Description: "Sofortige Trennung von der Energieversorgung bei unmittelbarer Lebensgefahr.", HazardCategory: "general", Examples: []string{"Notabschaltung am Hauptschalter", "Schnellablass fuer Hydraulikdruck"}, NormReferences: []string{"IEC 60204-1 — Sicherer Halt", "ISO 12100 — Technische Schutzeinrichtungen"}}, + {ID: "M083", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt Kategorie 0", Description: "Sofortiges Abschalten aller Aktoren durch Unterbrechung der Energiezufuhr.", HazardCategory: "general", Examples: []string{"Pilztaster an jedem Bedienfeld", "Drahtloser Not-Halt fuer mobile Bedienung"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}}, + {ID: "M084", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt Kategorie 1", Description: "Kontrolliertes Stillsetzen, dann Energietrennung nach Stillstand.", HazardCategory: "general", Examples: []string{"Kontrolliertes Abbremsen vor Abschaltung", "Gesteuerter Stopp mit anschliessender Energietrennung"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}}, + {ID: "M085", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt-Seilzug", Description: "Reissleine entlang langer Foerderstrecken fuer sofortigen Stopp.", HazardCategory: "general", Examples: []string{"Seilzug-Nothalt an Bandfoerderern", "Reissleine entlang Rollenbahnen"}, NormReferences: []string{"ISO 13850", "EN 620"}}, + {ID: "M086", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "emergency_stop", Name: "Notabschaltung", Description: "Sofortige Trennung von der Energieversorgung bei unmittelbarer Lebensgefahr.", HazardCategory: "general", Examples: []string{"Notabschaltung am Hauptschalter", "Schnellablass fuer Hydraulikdruck"}, NormReferences: []string{"IEC 60204-1 — Sicherer Halt", "ISO 12100 — Technische Schutzeinrichtungen"}}, // ── Electrical Protection (M087-M094) ─────────────────────────────── {ID: "M087", ReductionType: "protection", SubType: "electrical_protection", Name: "Fehlerstromschutzschalter RCD", Description: "Erkennt Fehlerstromanteile und trennt den Stromkreis zum Schutz vor Stromschlag.", HazardCategory: "electrical", Examples: []string{"RCD 30mA fuer Steckdosenkreise", "RCD Typ B fuer Frequenzumrichter"}, NormReferences: []string{"IEC 60204-1", "DIN VDE 0100-410"}}, @@ -61,41 +61,41 @@ func getProtectiveMeasures() []ProtectiveMeasureEntry { {ID: "M101", ReductionType: "protection", SubType: "fluid_protection", Name: "Auffangeinrichtung fuer Betriebsfluide", Description: "Auffangwannen verhindern Umweltkontamination und Rutschgefahr bei Leckagen.", HazardCategory: "material_environmental", Examples: []string{"Oelwanne unter Hydraulikaggregat", "Auffangrinne unter Schmierstoffleitungen"}, NormReferences: []string{"ISO 12100 — Technische Schutzeinrichtungen"}}, // ── Extraction (M102-M104) ────────────────────────────────────────── - {ID: "M102", ReductionType: "protection", SubType: "extraction", Name: "Absauganlage", Description: "Absaugung entfernt gesundheitsschaedliche Daempfe, Staub und Rauch.", HazardCategory: "material_environmental", Examples: []string{"Schweissrauchabsaugung", "Staubabsaugung an Holzbearbeitungsmaschine"}, NormReferences: []string{"EN 626-1", "EN 1093-1"}}, - {ID: "M103", ReductionType: "protection", SubType: "extraction", Name: "Oelnebelabscheider", Description: "Filtert Oelnebel aus der Maschinenumgebung zum Schutz der Atemwege.", HazardCategory: "material_environmental", Examples: []string{"Oelnebelabscheider an CNC-Maschine", "Aerosolabscheider an Kuehlschmiermittel"}, NormReferences: []string{"EN 1093-1"}}, - {ID: "M104", ReductionType: "protection", SubType: "extraction", Name: "Spaenesauganlage", Description: "Absaugsystem entfernt Metallspaene und verhindert Verletzungen durch Spaeneflug.", HazardCategory: "mechanical", Examples: []string{"Spaenefoerderer an Drehmaschine", "Spaeneabsaugung an Fraesmaschine"}, NormReferences: []string{"EN 1093-1"}}, + {ID: "M102", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "extraction", Name: "Absauganlage", Description: "Absaugung entfernt gesundheitsschaedliche Daempfe, Staub und Rauch.", HazardCategory: "material_environmental", Examples: []string{"Schweissrauchabsaugung", "Staubabsaugung an Holzbearbeitungsmaschine"}, NormReferences: []string{"EN 626-1", "EN 1093-1"}}, + {ID: "M103", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "extraction", Name: "Oelnebelabscheider", Description: "Filtert Oelnebel aus der Maschinenumgebung zum Schutz der Atemwege.", HazardCategory: "material_environmental", Examples: []string{"Oelnebelabscheider an CNC-Maschine", "Aerosolabscheider an Kuehlschmiermittel"}, NormReferences: []string{"EN 1093-1"}}, + {ID: "M104", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "extraction", Name: "Spaenesauganlage", Description: "Absaugsystem entfernt Metallspaene und verhindert Verletzungen durch Spaeneflug.", HazardCategory: "mechanical", Examples: []string{"Spaenefoerderer an Drehmaschine", "Spaeneabsaugung an Fraesmaschine"}, NormReferences: []string{"EN 1093-1"}}, // ── Safety Control (M105-M113) ────────────────────────────────────── - {ID: "M105", ReductionType: "protection", SubType: "safety_control", Name: "Sichere SPS", Description: "Fehlersichere SPS fuehrt sicherheitsrelevante Funktionen redundant aus.", HazardCategory: "software_control", Examples: []string{"Zweikanalige SPS mit Kreuzvergleich", "SIL-3-zertifizierte Safety-SPS"}, NormReferences: []string{"IEC 62061", "ISO 13849-1"}}, - {ID: "M106", ReductionType: "protection", SubType: "safety_control", Name: "Watchdog", Description: "Timer ueberwacht Steuerungssoftware und loest sicheren Zustand bei Ausfall aus.", HazardCategory: "software_control", Examples: []string{"Hardware-Watchdog auf Safety-SPS", "Fenster-Watchdog mit engem Zeitfenster"}, NormReferences: []string{"IEC 61508-2", "ISO 13849-1"}}, - {ID: "M107", ReductionType: "protection", SubType: "safety_control", Name: "Sichere Fehlerbehandlung", Description: "Jeder erkannte Fehler wird systematisch in definierten sicheren Zustand ueberfuehrt.", HazardCategory: "software_control", Examples: []string{"Exception-Handler fuer kritische Bereiche", "Unbehandelte Fehler loesen sicheren Stopp aus"}, NormReferences: []string{"IEC 61508-3", "IEC 62443-4-1"}}, - {ID: "M108", ReductionType: "protection", SubType: "safety_control", Name: "Sichere Recovery", Description: "Nach Fehler wird Maschine in Ausgangszustand zurueckgesetzt vor Weiterbetrieb.", HazardCategory: "software_control", Examples: []string{"Referenzfahrt nach Steuerungswiederanlauf", "Konfigurationscheck nach Recovery"}, NormReferences: []string{"IEC 62061", "ISO 12100 — Steuerungssicherheit"}}, - {ID: "M109", ReductionType: "protection", SubType: "safety_control", Name: "Sichere Degradationsstrategie", Description: "Bei Teilausfaellen Uebergang in Modus mit reduzierter Leistung aber erhaltener Sicherheit.", HazardCategory: "software_control", Examples: []string{"Reduzierte Geschwindigkeit bei Sensorausfall", "Automatischer Wechsel auf Handbetrieb"}, NormReferences: []string{"IEC 62061", "ISO 13849-1"}}, - {ID: "M110", ReductionType: "protection", SubType: "safety_control", Name: "Automatische Abschaltung bei Fehler", Description: "Bei schwerwiegenden Fehlern automatische sichere Abschaltung.", HazardCategory: "software_control", Examples: []string{"Stopp-Kategorie 0 bei kritischem Fehler", "Energietrennung bei unbehebbarem Fehler"}, NormReferences: []string{"IEC 60204-1", "ISO 13850"}}, - {ID: "M111", ReductionType: "protection", SubType: "safety_control", Name: "Sichere Speicherverwaltung", Description: "Steuerungssoftware verwendet sichere Speicherverwaltung gegen Datenverlust.", HazardCategory: "software_control", Examples: []string{"Speicherschutz fuer Safety-Bereiche", "Stack-Overflow-Schutz implementieren"}, NormReferences: []string{"IEC 61508-3"}}, - {ID: "M112", ReductionType: "protection", SubType: "safety_control", Name: "Selbsttest", Description: "Sicherheitsbaugruppen fuehren automatische Selbsttests durch und melden Fehler.", HazardCategory: "software_control", Examples: []string{"Anlauftestung des Lichtgitters", "ROM-CRC-Pruefung bei Steuerungsstart"}, NormReferences: []string{"IEC 61508-2", "ISO 13849-1"}}, - {ID: "M113", ReductionType: "protection", SubType: "safety_control", Name: "Sichere Kommunikationsprotokolle", Description: "Sichere Industrieprotokolle fuer authentifizierte Steuerungskommunikation.", HazardCategory: "software_control", Examples: []string{"PROFIsafe fuer SPS-Kommunikation", "CIP Safety fuer EtherNet/IP"}, NormReferences: []string{"IEC 61784-3", "IEC 62280"}}, + {ID: "M105", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere SPS", Description: "Fehlersichere SPS fuehrt sicherheitsrelevante Funktionen redundant aus.", HazardCategory: "software_control", Examples: []string{"Zweikanalige SPS mit Kreuzvergleich", "SIL-3-zertifizierte Safety-SPS"}, NormReferences: []string{"IEC 62061", "ISO 13849-1"}}, + {ID: "M106", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Watchdog", Description: "Timer ueberwacht Steuerungssoftware und loest sicheren Zustand bei Ausfall aus.", HazardCategory: "software_control", Examples: []string{"Hardware-Watchdog auf Safety-SPS", "Fenster-Watchdog mit engem Zeitfenster"}, NormReferences: []string{"IEC 61508-2", "ISO 13849-1"}}, + {ID: "M107", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere Fehlerbehandlung", Description: "Jeder erkannte Fehler wird systematisch in definierten sicheren Zustand ueberfuehrt.", HazardCategory: "software_control", Examples: []string{"Exception-Handler fuer kritische Bereiche", "Unbehandelte Fehler loesen sicheren Stopp aus"}, NormReferences: []string{"IEC 61508-3", "IEC 62443-4-1"}}, + {ID: "M108", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere Recovery", Description: "Nach Fehler wird Maschine in Ausgangszustand zurueckgesetzt vor Weiterbetrieb.", HazardCategory: "software_control", Examples: []string{"Referenzfahrt nach Steuerungswiederanlauf", "Konfigurationscheck nach Recovery"}, NormReferences: []string{"IEC 62061", "ISO 12100 — Steuerungssicherheit"}}, + {ID: "M109", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere Degradationsstrategie", Description: "Bei Teilausfaellen Uebergang in Modus mit reduzierter Leistung aber erhaltener Sicherheit.", HazardCategory: "software_control", Examples: []string{"Reduzierte Geschwindigkeit bei Sensorausfall", "Automatischer Wechsel auf Handbetrieb"}, NormReferences: []string{"IEC 62061", "ISO 13849-1"}}, + {ID: "M110", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Automatische Abschaltung bei Fehler", Description: "Bei schwerwiegenden Fehlern automatische sichere Abschaltung.", HazardCategory: "software_control", Examples: []string{"Stopp-Kategorie 0 bei kritischem Fehler", "Energietrennung bei unbehebbarem Fehler"}, NormReferences: []string{"IEC 60204-1", "ISO 13850"}}, + {ID: "M111", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere Speicherverwaltung", Description: "Steuerungssoftware verwendet sichere Speicherverwaltung gegen Datenverlust.", HazardCategory: "software_control", Examples: []string{"Speicherschutz fuer Safety-Bereiche", "Stack-Overflow-Schutz implementieren"}, NormReferences: []string{"IEC 61508-3"}}, + {ID: "M112", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Selbsttest", Description: "Sicherheitsbaugruppen fuehren automatische Selbsttests durch und melden Fehler.", HazardCategory: "software_control", Examples: []string{"Anlauftestung des Lichtgitters", "ROM-CRC-Pruefung bei Steuerungsstart"}, NormReferences: []string{"IEC 61508-2", "ISO 13849-1"}}, + {ID: "M113", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere Kommunikationsprotokolle", Description: "Sichere Industrieprotokolle fuer authentifizierte Steuerungskommunikation.", HazardCategory: "software_control", Examples: []string{"PROFIsafe fuer SPS-Kommunikation", "CIP Safety fuer EtherNet/IP"}, NormReferences: []string{"IEC 61784-3", "IEC 62280"}}, // ── Monitoring (M114-M120) ────────────────────────────────────────── - {ID: "M114", ReductionType: "protection", SubType: "monitoring", Name: "Sichere Positionsueberwachung", Description: "Redundante Positionserfassung mit Plausibilitaetspruefung an Sicherheitsachsen.", HazardCategory: "mechanical", Examples: []string{"Doppelte Absolutwertgeber an Servoachsen", "Sichere Positionsauswertung ueber Safety-SPS"}, NormReferences: []string{"IEC 61800-5-2", "IEC 62061"}}, - {ID: "M115", ReductionType: "protection", SubType: "monitoring", Name: "Sichere Geschwindigkeitsueberwachung", Description: "Geschwindigkeit wird sicher ueberwacht mit Stopp bei Ueberschreitung.", HazardCategory: "mechanical", Examples: []string{"Sichere Drehzahlueberwachung an Spindeln", "Geschwindigkeitsbegrenzung im Einrichtbetrieb"}, NormReferences: []string{"IEC 61800-5-2", "IEC 62061"}}, - {ID: "M116", ReductionType: "protection", SubType: "monitoring", Name: "Temperaturueberwachung", Description: "Temperatursensoren loesen Schutzreaktion bei Grenzwertueberschreitung aus.", HazardCategory: "thermal", Examples: []string{"Temperaturfuehler an Motorwicklungen", "Thermoelement an Hydrauliktank"}, NormReferences: []string{"ISO 12100 — Technische Schutzeinrichtungen"}}, - {ID: "M117", ReductionType: "protection", SubType: "monitoring", Name: "Vibrationsueberwachung", Description: "Schwingungssensoren warnen vor drohendem Komponentenversagen.", HazardCategory: "noise_vibration", Examples: []string{"Beschleunigungssensoren an Hauptlagern", "Grenzwertbasierte Vibrationswarnung"}, NormReferences: []string{"ISO 10816-1", "ISO 13373-1"}}, - {ID: "M118", ReductionType: "protection", SubType: "monitoring", Name: "Druckueberwachung", Description: "Druckueberwachung in Hydraulik/Pneumatik mit Schutzreaktion bei Grenzwert.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Druckschalter in Hydraulik-Hauptleitung", "Differenzdruck-Ueberwachung an Filtern"}, NormReferences: []string{"ISO 4413", "ISO 4414"}}, - {ID: "M119", ReductionType: "protection", SubType: "monitoring", Name: "Redundante Sensorik", Description: "Sicherheitskritische Messstellen mit zwei unabhaengigen Sensoren und Vergleich.", HazardCategory: "software_control", Examples: []string{"Zweikanalige Positionserfassung", "Diversitaere Druckmessung"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}}, - {ID: "M120", ReductionType: "protection", SubType: "monitoring", Name: "Zustandsueberwachung (Condition Monitoring)", Description: "Kontinuierliche Maschinenzustandsueberwachung fuer fruehzeitige Fehlererkennung.", HazardCategory: "general", Examples: []string{"Condition-Monitoring-System fuer Lager", "Trendanalyse fuer Motorstroeme"}, NormReferences: []string{"ISO 13379-1", "ISO 17359"}}, + {ID: "M114", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Sichere Positionsueberwachung", Description: "Redundante Positionserfassung mit Plausibilitaetspruefung an Sicherheitsachsen.", HazardCategory: "mechanical", Examples: []string{"Doppelte Absolutwertgeber an Servoachsen", "Sichere Positionsauswertung ueber Safety-SPS"}, NormReferences: []string{"IEC 61800-5-2", "IEC 62061"}}, + {ID: "M115", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Sichere Geschwindigkeitsueberwachung", Description: "Geschwindigkeit wird sicher ueberwacht mit Stopp bei Ueberschreitung.", HazardCategory: "mechanical", Examples: []string{"Sichere Drehzahlueberwachung an Spindeln", "Geschwindigkeitsbegrenzung im Einrichtbetrieb"}, NormReferences: []string{"IEC 61800-5-2", "IEC 62061"}}, + {ID: "M116", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Temperaturueberwachung", Description: "Temperatursensoren loesen Schutzreaktion bei Grenzwertueberschreitung aus.", HazardCategory: "thermal", Examples: []string{"Temperaturfuehler an Motorwicklungen", "Thermoelement an Hydrauliktank"}, NormReferences: []string{"ISO 12100 — Technische Schutzeinrichtungen"}}, + {ID: "M117", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Vibrationsueberwachung", Description: "Schwingungssensoren warnen vor drohendem Komponentenversagen.", HazardCategory: "noise_vibration", Examples: []string{"Beschleunigungssensoren an Hauptlagern", "Grenzwertbasierte Vibrationswarnung"}, NormReferences: []string{"ISO 10816-1", "ISO 13373-1"}}, + {ID: "M118", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Druckueberwachung", Description: "Druckueberwachung in Hydraulik/Pneumatik mit Schutzreaktion bei Grenzwert.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Druckschalter in Hydraulik-Hauptleitung", "Differenzdruck-Ueberwachung an Filtern"}, NormReferences: []string{"ISO 4413", "ISO 4414"}}, + {ID: "M119", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Redundante Sensorik", Description: "Sicherheitskritische Messstellen mit zwei unabhaengigen Sensoren und Vergleich.", HazardCategory: "software_control", Examples: []string{"Zweikanalige Positionserfassung", "Diversitaere Druckmessung"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}}, + {ID: "M120", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Zustandsueberwachung (Condition Monitoring)", Description: "Kontinuierliche Maschinenzustandsueberwachung fuer fruehzeitige Fehlererkennung.", HazardCategory: "general", Examples: []string{"Condition-Monitoring-System fuer Lager", "Trendanalyse fuer Motorstroeme"}, NormReferences: []string{"ISO 13379-1", "ISO 17359"}}, // ── Cybersecurity (M121-M130) ─────────────────────────────────────── - {ID: "M121", ReductionType: "protection", SubType: "cybersecurity", Name: "Zugangskontrolle", Description: "Physisches/elektronisches Zugangskontrollsystem fuer autorisierte Bedienung.", HazardCategory: "cyber_network", Examples: []string{"RFID-Chipkarten fuer Maschinenzugang", "Schluesselsystem fuer Betriebsartenwahl"}, NormReferences: []string{"IEC 62443-3-3", "ISO 12100 — Steuerungssicherheit"}}, - {ID: "M122", ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Netzwerksegmentierung", Description: "Maschinennetzwerk von anderen Netzwerken getrennt gegen Uebergreifen von Angriffen.", HazardCategory: "cyber_network", Examples: []string{"OT-Netzwerk per VLAN trennen", "DMZ zwischen Office und Produktion"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-2-1"}}, - {ID: "M123", ReductionType: "protection", SubType: "cybersecurity", Name: "Firewall", Description: "Konfigurierte Firewall schuetzt Steuerungsnetzwerk vor unautorisiertem Verkehr.", HazardCategory: "cyber_network", Examples: []string{"Industrie-Firewall vor SPS-Netzwerk", "Deep-Packet-Inspection fuer Industrieprotokolle"}, NormReferences: []string{"IEC 62443-3-3"}}, - {ID: "M124", ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Fernwartung", Description: "Fernzugriff nur ueber verschluesselte, authentifizierte, zeitbegrenzte Verbindungen.", HazardCategory: "cyber_network", Examples: []string{"VPN fuer Fernwartung", "Fernzugriff nur nach lokaler Freigabe"}, NormReferences: []string{"IEC 62443-3-3", "VDI/VDE 2182"}}, - {ID: "M125", ReductionType: "protection", SubType: "cybersecurity", Name: "Signierte Software-Updates", Description: "Updates werden vor Installation auf Authentizitaet und Integritaet geprueft.", HazardCategory: "cyber_network", Examples: []string{"Code-Signing fuer Steuerungssoftware", "Hash-Pruefung vor Update-Installation"}, NormReferences: []string{"IEC 62443-4-1", "IEC 62443-4-2"}}, - {ID: "M126", ReductionType: "protection", SubType: "cybersecurity", Name: "Integritaetspruefung", Description: "Regelmaessige automatische Pruefung der Steuerungssoftware-Integritaet.", HazardCategory: "cyber_network", Examples: []string{"CRC-Pruefung bei jedem Start", "Hash-Verifizierung der Firmware im Betrieb"}, NormReferences: []string{"IEC 62443-4-2"}}, - {ID: "M127", ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Bootkette", Description: "Secure Boot laed nur vertrauenswuerdige Software beim Steuerungsstart.", HazardCategory: "cyber_network", Examples: []string{"Secure Boot im BIOS", "Chain-of-Trust bis zur Applikation"}, NormReferences: []string{"IEC 62443-4-2", "NIST SP 800-147"}}, - {ID: "M128", ReductionType: "protection", SubType: "cybersecurity", Name: "Verschluesselte Kommunikation", Description: "Alle sicherheitsrelevanten Kommunikationsverbindungen sind verschluesselt.", HazardCategory: "cyber_network", Examples: []string{"TLS fuer HMI-Kommunikation", "OPC UA mit Sign&Encrypt"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-2"}}, - {ID: "M129", ReductionType: "protection", SubType: "cybersecurity", Name: "Audit-Trail", Description: "Alle sicherheitsrelevanten Aktionen unveraenderbar mit Zeitstempel protokolliert.", HazardCategory: "cyber_network", Examples: []string{"Geschuetztes Logfile fuer Sicherheitsereignisse", "Aenderungshistorie fuer Konfiguration"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-2"}}, - {ID: "M130", ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Parameteraenderung", Description: "Sicherheitsparameter-Aenderungen erfordern Authentifizierung und Protokollierung.", HazardCategory: "cyber_network", Examples: []string{"Parameterschutz ueber Zugangsstufen", "Vier-Augen-Prinzip bei Safety-Parametern"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-1"}}, + {ID: "M121", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Zugangskontrolle", Description: "Physisches/elektronisches Zugangskontrollsystem fuer autorisierte Bedienung.", HazardCategory: "cyber_network", Examples: []string{"RFID-Chipkarten fuer Maschinenzugang", "Schluesselsystem fuer Betriebsartenwahl"}, NormReferences: []string{"IEC 62443-3-3", "ISO 12100 — Steuerungssicherheit"}}, + {ID: "M122", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Netzwerksegmentierung", Description: "Maschinennetzwerk von anderen Netzwerken getrennt gegen Uebergreifen von Angriffen.", HazardCategory: "cyber_network", Examples: []string{"OT-Netzwerk per VLAN trennen", "DMZ zwischen Office und Produktion"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-2-1"}}, + {ID: "M123", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Firewall", Description: "Konfigurierte Firewall schuetzt Steuerungsnetzwerk vor unautorisiertem Verkehr.", HazardCategory: "cyber_network", Examples: []string{"Industrie-Firewall vor SPS-Netzwerk", "Deep-Packet-Inspection fuer Industrieprotokolle"}, NormReferences: []string{"IEC 62443-3-3"}}, + {ID: "M124", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Fernwartung", Description: "Fernzugriff nur ueber verschluesselte, authentifizierte, zeitbegrenzte Verbindungen.", HazardCategory: "cyber_network", Examples: []string{"VPN fuer Fernwartung", "Fernzugriff nur nach lokaler Freigabe"}, NormReferences: []string{"IEC 62443-3-3", "VDI/VDE 2182"}}, + {ID: "M125", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Signierte Software-Updates", Description: "Updates werden vor Installation auf Authentizitaet und Integritaet geprueft.", HazardCategory: "cyber_network", Examples: []string{"Code-Signing fuer Steuerungssoftware", "Hash-Pruefung vor Update-Installation"}, NormReferences: []string{"IEC 62443-4-1", "IEC 62443-4-2"}}, + {ID: "M126", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Integritaetspruefung", Description: "Regelmaessige automatische Pruefung der Steuerungssoftware-Integritaet.", HazardCategory: "cyber_network", Examples: []string{"CRC-Pruefung bei jedem Start", "Hash-Verifizierung der Firmware im Betrieb"}, NormReferences: []string{"IEC 62443-4-2"}}, + {ID: "M127", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Bootkette", Description: "Secure Boot laed nur vertrauenswuerdige Software beim Steuerungsstart.", HazardCategory: "cyber_network", Examples: []string{"Secure Boot im BIOS", "Chain-of-Trust bis zur Applikation"}, NormReferences: []string{"IEC 62443-4-2", "NIST SP 800-147"}}, + {ID: "M128", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Verschluesselte Kommunikation", Description: "Alle sicherheitsrelevanten Kommunikationsverbindungen sind verschluesselt.", HazardCategory: "cyber_network", Examples: []string{"TLS fuer HMI-Kommunikation", "OPC UA mit Sign&Encrypt"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-2"}}, + {ID: "M129", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Audit-Trail", Description: "Alle sicherheitsrelevanten Aktionen unveraenderbar mit Zeitstempel protokolliert.", HazardCategory: "cyber_network", Examples: []string{"Geschuetztes Logfile fuer Sicherheitsereignisse", "Aenderungshistorie fuer Konfiguration"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-2"}}, + {ID: "M130", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Parameteraenderung", Description: "Sicherheitsparameter-Aenderungen erfordern Authentifizierung und Protokollierung.", HazardCategory: "cyber_network", Examples: []string{"Parameterschutz ueber Zugangsstufen", "Vier-Augen-Prinzip bei Safety-Parametern"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-1"}}, // ── Alarmierung (M131-M133) ───────────────────────────────────────── {ID: "M131", ReductionType: "protection", SubType: "monitoring", Name: "Optische Alarmierung", Description: "Signalleuchten zeigen Betriebszustand und warnen bei Gefahr.", HazardCategory: "general", Examples: []string{"Signalleuchte gelb bei Warnung, rot bei Gefahr", "Blinkende Warnleuchte vor Maschinenstart"}, NormReferences: []string{"IEC 60204-1 — Melde- und Bedienelemente", "IEC 60073"}}, @@ -141,23 +141,23 @@ func getInformationMeasures() []ProtectiveMeasureEntry { {ID: "M160", ReductionType: "information", SubType: "manual", Name: "Entsorgungsanleitung", Description: "Fachgerechte und sichere Entsorgung der Maschine und Betriebsstoffe.", HazardCategory: "material_environmental", Examples: []string{"Gefahrstoffe identifizieren", "Entsorgungsnachweis fuer Fluide"}, NormReferences: []string{"MRL 2006/42/EG — Betriebsanleitung"}}, // ── Training (M161-M168) ──────────────────────────────────────────── - {ID: "M161", ReductionType: "information", SubType: "training", Name: "Erstunterweisung Bediener", Description: "Initiale Sicherheitsunterweisung vor erstem Maschinenbetrieb.", HazardCategory: "general", Examples: []string{"Einweisungsprogramm fuer neue Bediener", "Praktische Uebung am Not-Halt"}, NormReferences: []string{"BetrSichV §12", "DGUV Vorschrift 1"}}, - {ID: "M162", ReductionType: "information", SubType: "training", Name: "Jaehrliche Wiederholungsunterweisung", Description: "Regelmaessige Auffrischung der Sicherheitskenntnisse.", HazardCategory: "general", Examples: []string{"Jaehrliche Sicherheitsschulung", "Schulungsnachweise dokumentieren"}, NormReferences: []string{"ArbSchG §12", "DGUV Vorschrift 1"}}, - {ID: "M163", ReductionType: "information", SubType: "training", Name: "LOTO-Schulung", Description: "Schulung zum Lockout-Tagout-Verfahren fuer Wartungspersonal.", HazardCategory: "electrical", Examples: []string{"Praktische LOTO-Uebung an der Maschine", "Zertifizierung fuer LOTO-Berechtigung"}, NormReferences: []string{"ISO 14118", "DGUV Vorschrift 3"}}, - {ID: "M164", ReductionType: "information", SubType: "training", Name: "Benutzerrollenbeschreibung", Description: "Dokumentation der Aufgaben, Verantwortlichkeiten und Qualifikationen pro Rolle.", HazardCategory: "general", Examples: []string{"Rollenbeschreibung Maschinenbediener", "Qualifikationsanforderungen Instandhalter"}, NormReferences: []string{"BetrSichV", "DGUV Vorschrift 1"}}, - {ID: "M165", ReductionType: "information", SubType: "training", Name: "Notfalltraining", Description: "Praktische Uebungen fuer Notfallsituationen an der Maschine.", HazardCategory: "general", Examples: []string{"Not-Halt-Uebung mit allen Bedienern", "Erste-Hilfe-Training maschinenspezifisch"}, NormReferences: []string{"ArbSchG §10", "DGUV Vorschrift 1"}}, - {ID: "M166", ReductionType: "information", SubType: "training", Name: "Cybersecurity-Awareness-Training", Description: "Schulung zu IT-Sicherheitsrisiken an Maschinen und Steuerungen.", HazardCategory: "cyber_network", Examples: []string{"Passwortsicherheit an HMI", "Erkennung von Social Engineering"}, NormReferences: []string{"IEC 62443-2-1"}}, - {ID: "M167", ReductionType: "information", SubType: "training", Name: "Schulung Schutzeinrichtungen", Description: "Unterweisung zur korrekten Funktion und Pruefung aller Schutzeinrichtungen.", HazardCategory: "general", Examples: []string{"Funktionstest der Lichtgitter erklaeren", "Pruefung der Schutztuerverriegelung zeigen"}, NormReferences: []string{"BetrSichV §12", "DGUV Vorschrift 1"}}, - {ID: "M168", ReductionType: "information", SubType: "training", Name: "Gefahrstoffunterweisung", Description: "Schulung zum sicheren Umgang mit Gefahrstoffen an der Maschine.", HazardCategory: "material_environmental", Examples: []string{"Umgang mit Kuehlschmiermitteln", "Verhalten bei Oelleckage"}, NormReferences: []string{"GefStoffV §14", "DGUV Vorschrift 1"}}, + {ID: "M161", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Erstunterweisung Bediener", Description: "Initiale Sicherheitsunterweisung vor erstem Maschinenbetrieb.", HazardCategory: "general", Examples: []string{"Einweisungsprogramm fuer neue Bediener", "Praktische Uebung am Not-Halt"}, NormReferences: []string{"BetrSichV §12", "DGUV Vorschrift 1"}}, + {ID: "M162", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Jaehrliche Wiederholungsunterweisung", Description: "Regelmaessige Auffrischung der Sicherheitskenntnisse.", HazardCategory: "general", Examples: []string{"Jaehrliche Sicherheitsschulung", "Schulungsnachweise dokumentieren"}, NormReferences: []string{"ArbSchG §12", "DGUV Vorschrift 1"}}, + {ID: "M163", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "LOTO-Schulung", Description: "Schulung zum Lockout-Tagout-Verfahren fuer Wartungspersonal.", HazardCategory: "electrical", Examples: []string{"Praktische LOTO-Uebung an der Maschine", "Zertifizierung fuer LOTO-Berechtigung"}, NormReferences: []string{"ISO 14118", "DGUV Vorschrift 3"}}, + {ID: "M164", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Benutzerrollenbeschreibung", Description: "Dokumentation der Aufgaben, Verantwortlichkeiten und Qualifikationen pro Rolle.", HazardCategory: "general", Examples: []string{"Rollenbeschreibung Maschinenbediener", "Qualifikationsanforderungen Instandhalter"}, NormReferences: []string{"BetrSichV", "DGUV Vorschrift 1"}}, + {ID: "M165", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Notfalltraining", Description: "Praktische Uebungen fuer Notfallsituationen an der Maschine.", HazardCategory: "general", Examples: []string{"Not-Halt-Uebung mit allen Bedienern", "Erste-Hilfe-Training maschinenspezifisch"}, NormReferences: []string{"ArbSchG §10", "DGUV Vorschrift 1"}}, + {ID: "M166", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Cybersecurity-Awareness-Training", Description: "Schulung zu IT-Sicherheitsrisiken an Maschinen und Steuerungen.", HazardCategory: "cyber_network", Examples: []string{"Passwortsicherheit an HMI", "Erkennung von Social Engineering"}, NormReferences: []string{"IEC 62443-2-1"}}, + {ID: "M167", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Schulung Schutzeinrichtungen", Description: "Unterweisung zur korrekten Funktion und Pruefung aller Schutzeinrichtungen.", HazardCategory: "general", Examples: []string{"Funktionstest der Lichtgitter erklaeren", "Pruefung der Schutztuerverriegelung zeigen"}, NormReferences: []string{"BetrSichV §12", "DGUV Vorschrift 1"}}, + {ID: "M168", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Gefahrstoffunterweisung", Description: "Schulung zum sicheren Umgang mit Gefahrstoffen an der Maschine.", HazardCategory: "material_environmental", Examples: []string{"Umgang mit Kuehlschmiermitteln", "Verhalten bei Oelleckage"}, NormReferences: []string{"GefStoffV §14", "DGUV Vorschrift 1"}}, // ── PPE (M169-M175) ───────────────────────────────────────────────── - {ID: "M169", ReductionType: "information", SubType: "ppe", Name: "Schutzbrille", Description: "Augenschutz gegen Spaeneflug, Spritzer und UV-Strahlung.", HazardCategory: "mechanical", Examples: []string{"Schutzbrille bei Schleifarbeiten", "Vollsichtbrille bei chemischen Spritzern"}, NormReferences: []string{"EN 166", "PSA-BV"}}, - {ID: "M170", ReductionType: "information", SubType: "ppe", Name: "Gehoerschutz Kapsel", Description: "Kapselgehoerschuetzer bei Laermpegeln ueber 85 dB(A).", HazardCategory: "noise_vibration", Examples: []string{"Kapselgehoerschutz an lauten Maschinen", "Aktiver Gehoerschutz fuer Kommunikation"}, NormReferences: []string{"EN 352-1", "LärmVibrationsArbSchV"}}, - {ID: "M171", ReductionType: "information", SubType: "ppe", Name: "Schutzhandschuhe mechanisch", Description: "Handschuhe gegen Schnitt-, Stich- und Abriebverletzungen.", HazardCategory: "mechanical", Examples: []string{"Schnittschutzhandschuhe Level 5", "Vibrationsschutz-Handschuhe"}, NormReferences: []string{"EN 388", "PSA-BV"}}, - {ID: "M172", ReductionType: "information", SubType: "ppe", Name: "Sicherheitsschuhe S3", Description: "Sicherheitsschuhe mit Zehenschutzkappe und durchtrittsicherer Sohle.", HazardCategory: "mechanical", Examples: []string{"S3-Schuhe im Produktionsbereich", "S5-Gummistiefel bei Nassreinigung"}, NormReferences: []string{"EN ISO 20345", "PSA-BV"}}, - {ID: "M173", ReductionType: "information", SubType: "ppe", Name: "Atemschutz FFP2/FFP3", Description: "Atemschutzmaske gegen Staub, Rauch und Aerosole.", HazardCategory: "material_environmental", Examples: []string{"FFP2-Maske bei Schweissrauch", "FFP3-Maske bei Feinstaub"}, NormReferences: []string{"EN 149", "GefStoffV"}}, - {ID: "M174", ReductionType: "information", SubType: "ppe", Name: "Schutzkleidung chemisch", Description: "Chemikalienschutzkleidung gegen Spritzer und Kontamination.", HazardCategory: "material_environmental", Examples: []string{"Chemikalienschuerze an Galvanikanlage", "Vollschutzanzug bei Reinigungsarbeiten"}, NormReferences: []string{"EN 14605", "GefStoffV"}}, - {ID: "M175", ReductionType: "information", SubType: "ppe", Name: "Schutzhelm", Description: "Kopfschutz gegen herabfallende Teile und Anstossen.", HazardCategory: "mechanical", Examples: []string{"Industrieschutzhelm in Montagehalle", "Anstosskappen in niedrigen Bereichen"}, NormReferences: []string{"EN 397", "PSA-BV"}}, + {ID: "M169", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Schutzbrille", Description: "Augenschutz gegen Spaeneflug, Spritzer und UV-Strahlung.", HazardCategory: "mechanical", Examples: []string{"Schutzbrille bei Schleifarbeiten", "Vollsichtbrille bei chemischen Spritzern"}, NormReferences: []string{"EN 166", "PSA-BV"}}, + {ID: "M170", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Gehoerschutz Kapsel", Description: "Kapselgehoerschuetzer bei Laermpegeln ueber 85 dB(A).", HazardCategory: "noise_vibration", Examples: []string{"Kapselgehoerschutz an lauten Maschinen", "Aktiver Gehoerschutz fuer Kommunikation"}, NormReferences: []string{"EN 352-1", "LärmVibrationsArbSchV"}}, + {ID: "M171", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Schutzhandschuhe mechanisch", Description: "Handschuhe gegen Schnitt-, Stich- und Abriebverletzungen.", HazardCategory: "mechanical", Examples: []string{"Schnittschutzhandschuhe Level 5", "Vibrationsschutz-Handschuhe"}, NormReferences: []string{"EN 388", "PSA-BV"}}, + {ID: "M172", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Sicherheitsschuhe S3", Description: "Sicherheitsschuhe mit Zehenschutzkappe und durchtrittsicherer Sohle.", HazardCategory: "mechanical", Examples: []string{"S3-Schuhe im Produktionsbereich", "S5-Gummistiefel bei Nassreinigung"}, NormReferences: []string{"EN ISO 20345", "PSA-BV"}}, + {ID: "M173", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Atemschutz FFP2/FFP3", Description: "Atemschutzmaske gegen Staub, Rauch und Aerosole.", HazardCategory: "material_environmental", Examples: []string{"FFP2-Maske bei Schweissrauch", "FFP3-Maske bei Feinstaub"}, NormReferences: []string{"EN 149", "GefStoffV"}}, + {ID: "M174", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Schutzkleidung chemisch", Description: "Chemikalienschutzkleidung gegen Spritzer und Kontamination.", HazardCategory: "material_environmental", Examples: []string{"Chemikalienschuerze an Galvanikanlage", "Vollschutzanzug bei Reinigungsarbeiten"}, NormReferences: []string{"EN 14605", "GefStoffV"}}, + {ID: "M175", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Schutzhelm", Description: "Kopfschutz gegen herabfallende Teile und Anstossen.", HazardCategory: "mechanical", Examples: []string{"Industrieschutzhelm in Montagehalle", "Anstosskappen in niedrigen Bereichen"}, NormReferences: []string{"EN 397", "PSA-BV"}}, // ── Organizational (M176-M192) ────────────────────────────────────── {ID: "M176", ReductionType: "information", SubType: "organizational", Name: "Zugangsregelung", Description: "Organisatorische Festlegung wer unter welchen Bedingungen Zugang erhaelt.", HazardCategory: "general", Examples: []string{"Zugangsberechtigungsliste fuehren", "Begleitpflicht fuer Besucher"}, NormReferences: []string{"BetrSichV", "DGUV Vorschrift 1"}}, diff --git a/ai-compliance-sdk/internal/iace/models_api.go b/ai-compliance-sdk/internal/iace/models_api.go index d08c040..13d9d91 100644 --- a/ai-compliance-sdk/internal/iace/models_api.go +++ b/ai-compliance-sdk/internal/iace/models_api.go @@ -184,8 +184,25 @@ type ProtectiveMeasureEntry struct { // When true, the measure must be implemented if the referenced norm is applied. // The norm creates a "presumption of conformity" — deviating requires the // manufacturer to independently prove equivalent safety. - Mandatory bool `json:"mandatory,omitempty"` - MandatoryNorm string `json:"mandatory_norm,omitempty"` // e.g. "EN 1726-1 Kap. 5.3" + Mandatory bool `json:"mandatory,omitempty"` + MandatoryNorm string `json:"mandatory_norm,omitempty"` + // RiskReduction describes the typical risk reduction effect of this measure. + // Used by the Suppression Engine to automatically calculate residual risk + // when measures are assigned to hazards. + RiskReduction *RiskReduction `json:"risk_reduction,omitempty"` +} + +// RiskReduction describes how a protective measure reduces risk parameters. +// Deltas are negative integers (e.g. -2 means "reduces by 2 levels"). +// The Suppression Engine cumulates deltas across all assigned measures +// and clamps each parameter to a minimum of 1. +type RiskReduction struct { + // SeverityDelta reduces the severity rating (e.g. -1 for PPE, -2 for inherent safe design). + SeverityDelta int `json:"severity_delta,omitempty"` + // ExposureDelta reduces the exposure/frequency rating (e.g. -2 for fixed guard, -1 for interlock). + ExposureDelta int `json:"exposure_delta,omitempty"` + // ProbabilityDelta reduces the probability rating (e.g. -2 for interlock, -1 for training). + ProbabilityDelta int `json:"probability_delta,omitempty"` } // ValidateMitigationHierarchyRequest is the request for hierarchy validation diff --git a/ai-compliance-sdk/internal/iace/risk_trajectory_test.go b/ai-compliance-sdk/internal/iace/risk_trajectory_test.go new file mode 100644 index 0000000..43ea842 --- /dev/null +++ b/ai-compliance-sdk/internal/iace/risk_trajectory_test.go @@ -0,0 +1,161 @@ +package iace + +import "testing" + +func TestRiskTrajectory_NoMeasures(t *testing.T) { + engine := NewRiskEngine() + steps := engine.CalculateRiskTrajectory(4, 4, 3, nil) + if len(steps) != 1 { + t.Fatalf("expected 1 step (inherent only), got %d", len(steps)) + } + if steps[0].Stage != "inherent" { + t.Errorf("expected stage 'inherent', got %q", steps[0].Stage) + } + if steps[0].RiskScore != 48 { + t.Errorf("expected risk score 48 (4×4×3), got %.1f", steps[0].RiskScore) + } +} + +func TestRiskTrajectory_DesignMeasuresReduce(t *testing.T) { + engine := NewRiskEngine() + measures := []ProtectiveMeasureEntry{ + {ID: "M001", ReductionType: "design", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}}, + {ID: "M012", ReductionType: "design", RiskReduction: &RiskReduction{SeverityDelta: -2}}, + } + steps := engine.CalculateRiskTrajectory(4, 4, 3, measures) + + if len(steps) != 2 { + t.Fatalf("expected 2 steps (inherent + after_design), got %d", len(steps)) + } + + // After design: S=4+(-1)+(-2)=1, E=4+(-1)=3, P=3 → 1×3×3 = 9 + after := steps[1] + if after.Stage != "after_design" { + t.Errorf("expected stage 'after_design', got %q", after.Stage) + } + if after.Severity != 1 { + t.Errorf("expected severity 1, got %d", after.Severity) + } + if after.Exposure != 3 { + t.Errorf("expected exposure 3, got %d", after.Exposure) + } + if after.RiskScore != 9 { + t.Errorf("expected risk score 9, got %.1f", after.RiskScore) + } +} + +func TestRiskTrajectory_FullHierarchy(t *testing.T) { + engine := NewRiskEngine() + measures := []ProtectiveMeasureEntry{ + {ID: "M001", ReductionType: "design", RiskReduction: &RiskReduction{ExposureDelta: -1}}, + {ID: "M067", ReductionType: "protection", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}}, + {ID: "M161", ReductionType: "information", RiskReduction: &RiskReduction{ProbabilityDelta: -1}}, + } + // Start: S=4, E=4, P=3 → 48 + steps := engine.CalculateRiskTrajectory(4, 4, 3, measures) + + if len(steps) != 4 { + t.Fatalf("expected 4 steps, got %d", len(steps)) + } + + // Inherent: 4×4×3 = 48 + if steps[0].RiskScore != 48 { + t.Errorf("inherent: expected 48, got %.1f", steps[0].RiskScore) + } + // After design: S=4, E=3, P=3 → 36 + if steps[1].RiskScore != 36 { + t.Errorf("after_design: expected 36, got %.1f", steps[1].RiskScore) + } + // After protection: S=4, E=1, P=2 → 8 + if steps[2].RiskScore != 8 { + t.Errorf("after_protection: expected 8, got %.1f", steps[2].RiskScore) + } + // After information: S=4, E=1, P=1 → 4 + if steps[3].RiskScore != 4 { + t.Errorf("after_information: expected 4, got %.1f", steps[3].RiskScore) + } + if !steps[3].IsAcceptable { + t.Error("final risk 4 should be acceptable") + } +} + +func TestRiskTrajectory_ClampMinimum1(t *testing.T) { + engine := NewRiskEngine() + // Very aggressive reduction that would push below 1 + measures := []ProtectiveMeasureEntry{ + {ID: "M001", ReductionType: "design", RiskReduction: &RiskReduction{SeverityDelta: -5, ExposureDelta: -5, ProbabilityDelta: -5}}, + } + steps := engine.CalculateRiskTrajectory(3, 3, 3, measures) + + after := steps[1] + if after.Severity != 1 || after.Exposure != 1 || after.Probability != 1 { + t.Errorf("expected all clamped to 1, got S=%d E=%d P=%d", after.Severity, after.Exposure, after.Probability) + } + if after.RiskScore != 1 { + t.Errorf("expected minimum risk score 1, got %.1f", after.RiskScore) + } +} + +func TestRiskTrajectory_OnlyProtectionMeasures(t *testing.T) { + engine := NewRiskEngine() + // No design measures, only protection + measures := []ProtectiveMeasureEntry{ + {ID: "M067", ReductionType: "protection", RiskReduction: &RiskReduction{ExposureDelta: -2}}, + } + steps := engine.CalculateRiskTrajectory(4, 4, 3, measures) + + // Should have 2 steps: inherent + after_protection (no after_design) + if len(steps) != 2 { + t.Fatalf("expected 2 steps, got %d", len(steps)) + } + if steps[1].Stage != "after_protection" { + t.Errorf("expected stage after_protection, got %q", steps[1].Stage) + } + // S=4, E=2, P=3 → 24 + if steps[1].RiskScore != 24 { + t.Errorf("expected 24, got %.1f", steps[1].RiskScore) + } +} + +func TestRiskTrajectory_MeasuresWithoutRiskReduction(t *testing.T) { + engine := NewRiskEngine() + // Measures without RiskReduction should be skipped (no delta) + measures := []ProtectiveMeasureEntry{ + {ID: "M151", ReductionType: "information", Name: "Betriebsanleitung"}, + } + steps := engine.CalculateRiskTrajectory(3, 3, 3, measures) + + if len(steps) != 1 { + t.Fatalf("expected 1 step (measures without RiskReduction have no effect), got %d", len(steps)) + } +} + +func TestRiskTrajectory_MandatoryMeasuresAsProtective(t *testing.T) { + engine := NewRiskEngine() + // MN measures have ReductionType "protective" — should be grouped with "protection" + measures := []ProtectiveMeasureEntry{ + {ID: "MN001", ReductionType: "protective", RiskReduction: &RiskReduction{ProbabilityDelta: -1}}, + } + steps := engine.CalculateRiskTrajectory(4, 4, 3, measures) + + if len(steps) != 2 { + t.Fatalf("expected 2 steps, got %d", len(steps)) + } + if steps[1].Stage != "after_protection" { + t.Errorf("expected after_protection for 'protective' type, got %q", steps[1].Stage) + } +} + +func TestRiskReduction_OnMeasureLibrary(t *testing.T) { + // Verify that the library has measures with RiskReduction profiles + measures := GetProtectiveMeasureLibrary() + withReduction := 0 + for _, m := range measures { + if m.RiskReduction != nil { + withReduction++ + } + } + if withReduction < 80 { + t.Errorf("expected at least 80 measures with RiskReduction profiles, got %d", withReduction) + } +}