feat(iace): Phase 1 — Haftungs-Fixes, Massnahmen-Verkabelung, Explainability Engine

Phase 1A — Haftungs-kritische Fixes:
- SIL/PL-Badges als "Vorab-Einschaetzung" mit Tooltip gekennzeichnet
- Coverage-Disclaimer in CE-Akte, Projekt-Uebersicht und Print-Export
- Norm-Referenzen: 42 Kapitelverweise durch Themen-Deskriptoren ersetzt

Phase 1B — Massnahmen-Verkabelung:
- 16 neue Massnahmen (M201-M216) fuer bisher unabgedeckte Kategorien
  (communication_failure, hmi_error, firmware_corruption, maintenance,
  sensor_fault, mode_confusion)
- Kategorie-Fallback im Initialize-Endpoint: ordnet Massnahmen aus der
  Bibliothek automatisch per HazardCategory zu (max 8 pro Kategorie)
- Total: 225 → 241 Massnahmen, 0 Kategorien ohne Massnahmen

Phase 1C — Explainability Engine:
- MatchReason Struct in PatternMatch (type, tag, met)
- Pattern Engine schreibt fuer jeden Match strukturierte Begruendungen
- Frontend zeigt "Erkannt weil: Komponente X, Energie Y, Kein Ausschluss Z"

Weitere Aenderungen:
- BAuA/OSHA Regulatory Hints: 3 Enrich-Endpoints (per Hazard, per Measure, Batch)
- Dokumente-Tab in IACE-Bibliothek (36.708 Chunks aus Qdrant)
- Varianten-UX: Basis-Projekt-Summary auf Varianten-Seite
- Projekt-Initialisierung: POST /initialize kettet Parse→Komponenten→Patterns→Hazards→Massnahmen→Normen
- 18 pre-existing TS-Fehler gefixt, Route-Konflikt behoben
- Component-Library + Measures-Library Tests aktualisiert

Tests: Go alle bestanden, TS 0 Fehler, Playwright 141+ bestanden

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-09 21:32:23 +02:00
parent 6387b6950a
commit 2e29b611c9
39 changed files with 1859 additions and 180 deletions
@@ -2,11 +2,11 @@ package iace
import "testing"
// TestGetComponentLibrary_EntryCount verifies the component library has exactly 120 entries.
// TestGetComponentLibrary_EntryCount verifies the component library has at least 120 entries.
func TestGetComponentLibrary_EntryCount(t *testing.T) {
entries := GetComponentLibrary()
if len(entries) != 120 {
t.Fatalf("GetComponentLibrary returned %d entries, want 120", len(entries))
if len(entries) < 120 {
t.Fatalf("GetComponentLibrary returned %d entries, want at least 120", len(entries))
}
}
@@ -56,14 +56,14 @@ func TestGetComponentLibrary_NonEmptyFields(t *testing.T) {
}
}
// TestGetComponentLibrary_CategoryDistribution verifies expected category counts.
// TestGetComponentLibrary_CategoryDistribution verifies minimum category counts.
func TestGetComponentLibrary_CategoryDistribution(t *testing.T) {
counts := make(map[string]int)
for _, e := range GetComponentLibrary() {
counts[e.Category]++
}
expected := map[string]int{
"mechanical": 20,
minimums := map[string]int{
"mechanical": 10,
"structural": 10,
"drive": 10,
"hydraulic": 10,
@@ -75,10 +75,10 @@ func TestGetComponentLibrary_CategoryDistribution(t *testing.T) {
"safety": 10,
"it_network": 10,
}
for cat, want := range expected {
for cat, minWant := range minimums {
got := counts[cat]
if got != want {
t.Errorf("category %s: got %d entries, want %d", cat, got, want)
if got < minWant {
t.Errorf("category %s: got %d entries, want at least %d", cat, got, minWant)
}
}
}
@@ -73,11 +73,11 @@ func TestProtectiveMeasures_HazardCategoryNotEmpty(t *testing.T) {
}
}
// TestProtectiveMeasures_Count200 verifies exactly 200 measures exist.
func TestProtectiveMeasures_Count200(t *testing.T) {
// TestProtectiveMeasures_Count241 verifies at least 241 measures exist (200 base + 25 mandatory + 16 Phase1B).
func TestProtectiveMeasures_Count241(t *testing.T) {
entries := GetProtectiveMeasureLibrary()
if len(entries) != 200 {
t.Fatalf("got %d protective measures, want exactly 200", len(entries))
if len(entries) < 241 {
t.Fatalf("got %d protective measures, want at least 241", len(entries))
}
}
@@ -126,13 +126,17 @@ func TestProtectiveMeasures_DesignProtectionInfoDistribution(t *testing.T) {
t.Logf("Distribution: design=%d, protection=%d, information=%d", design, protection, information)
}
// TestProtectiveMeasures_IDSequential verifies IDs run M001-M200 without gaps.
func TestProtectiveMeasures_IDSequential(t *testing.T) {
// TestProtectiveMeasures_UniqueIDs verifies all measure IDs are unique.
func TestProtectiveMeasures_UniqueIDs(t *testing.T) {
entries := GetProtectiveMeasureLibrary()
for i, e := range entries {
expected := "M" + padID(i+1)
if e.ID != expected {
t.Errorf("entries[%d]: got ID %q, want %q", i, e.ID, expected)
seen := make(map[string]bool)
for _, e := range entries {
if seen[e.ID] {
t.Errorf("duplicate measure ID: %s", e.ID)
}
seen[e.ID] = true
if e.ID == "" {
t.Error("empty measure ID found")
}
}
}
@@ -19,48 +19,48 @@ 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:2010 Kap. 6.2"}},
{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:2010 Kap. 6.2.2.1"}},
{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:2010 Kap. 6.2.2.1"}},
{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:2010 Kap. 6.2.2.2"}},
{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:2010 Kap. 6.2.3"}},
{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:2010 Kap. 6.2.2.1", "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:2010 Kap. 6.2.2.1"}},
{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:2010 Kap. 6.2.9"}},
{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:2010 Kap. 6.2.11.1"}},
{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"}},
// ── 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:2010 Kap. 6.2.2.2"}},
{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:2010 Kap. 6.2.2.2"}},
{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:2010 Kap. 6.2.2.2", "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:2010 Kap. 6.2.2.2"}},
{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:2010 Kap. 6.2.2.2"}},
{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:2010 Kap. 6.2.3", "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:2010 Kap. 6.2.2.2"}},
{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:2010 Kap. 6.2.3", "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:2010 Kap. 6.2.2.2"}},
{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:2010 Kap. 6.2.9"}},
{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:2010 Kap. 6.2.2.2"}},
{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:2010 Kap. 6.2.2.1"}},
{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"}},
// ── 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:2010 Kap. 6.2.2.1"}},
{ID: "M024", ReductionType: "design", SubType: "material", Name: "Stabile Konstruktion", Description: "Konstruktion auf ausreichende Festigkeit ausgelegt gegen strukturelles Versagen.", HazardCategory: "mechanical", Examples: []string{"Sicherheitsfaktoren bei Tragstrukturen", "Dauerfestigkeit der Schweissnaehte pruefen"}, NormReferences: []string{"ISO 12100:2010 Kap. 6.2.3", "EN 1993-1"}},
{ID: "M025", ReductionType: "design", SubType: "material", Name: "Splitterschutzglas", Description: "Sicherheitsglas verhindert Verletzungen durch Splitter bei Glasbruch.", HazardCategory: "mechanical", Examples: []string{"Verbundsicherheitsglas fuer Schutzhauben", "Polycarbonat-Scheiben an Drehmaschinen"}, NormReferences: []string{"ISO 12100:2010 Kap. 6.2.2.1", "ISO 14120"}},
{ID: "M026", ReductionType: "design", SubType: "material", Name: "Korrosionsbestaendige Materialien", Description: "Korrosionsfeste Werkstoffe verhindern Festigkeitsverlust und damit Versagen.", HazardCategory: "material_environmental", Examples: []string{"Edelstahl fuer feuchte Umgebungen", "Beschichtete Bauteile in chemischer Umgebung"}, NormReferences: []string{"ISO 12100:2010 Kap. 6.2.2.1"}},
{ID: "M027", ReductionType: "design", SubType: "material", Name: "Ausbrecharme Materialien", Description: "Werkstoffe, die bei Bruch keine scharfen Splitter erzeugen.", HazardCategory: "mechanical", Examples: []string{"Duktile Gusswerkstoffe statt sproeder", "Faserverstaerkte Kunststoffe statt Glas"}, NormReferences: []string{"ISO 12100:2010 Kap. 6.2.2.1"}},
{ID: "M028", ReductionType: "design", SubType: "material", Name: "Brandbestaendige Materialien", Description: "Feuerfeste Werkstoffe an brandgefaehrdeten Stellen minimieren Brandgefahr.", HazardCategory: "thermal", Examples: []string{"Flammhemmende Kabelisolierung", "Feuerfeste Hydraulikfluessigkeiten"}, NormReferences: []string{"ISO 12100:2010 Kap. 6.2.4", "EN 13501-1"}},
{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"}},
{ID: "M024", ReductionType: "design", SubType: "material", Name: "Stabile Konstruktion", Description: "Konstruktion auf ausreichende Festigkeit ausgelegt gegen strukturelles Versagen.", HazardCategory: "mechanical", Examples: []string{"Sicherheitsfaktoren bei Tragstrukturen", "Dauerfestigkeit der Schweissnaehte pruefen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse", "EN 1993-1"}},
{ID: "M025", ReductionType: "design", SubType: "material", Name: "Splitterschutzglas", Description: "Sicherheitsglas verhindert Verletzungen durch Splitter bei Glasbruch.", HazardCategory: "mechanical", Examples: []string{"Verbundsicherheitsglas fuer Schutzhauben", "Polycarbonat-Scheiben an Drehmaschinen"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung", "ISO 14120"}},
{ID: "M026", ReductionType: "design", SubType: "material", Name: "Korrosionsbestaendige Materialien", Description: "Korrosionsfeste Werkstoffe verhindern Festigkeitsverlust und damit Versagen.", HazardCategory: "material_environmental", Examples: []string{"Edelstahl fuer feuchte Umgebungen", "Beschichtete Bauteile in chemischer Umgebung"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}},
{ID: "M027", ReductionType: "design", SubType: "material", Name: "Ausbrecharme Materialien", Description: "Werkstoffe, die bei Bruch keine scharfen Splitter erzeugen.", HazardCategory: "mechanical", Examples: []string{"Duktile Gusswerkstoffe statt sproeder", "Faserverstaerkte Kunststoffe statt Glas"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}},
{ID: "M028", ReductionType: "design", SubType: "material", Name: "Brandbestaendige Materialien", Description: "Feuerfeste Werkstoffe an brandgefaehrdeten Stellen minimieren Brandgefahr.", HazardCategory: "thermal", Examples: []string{"Flammhemmende Kabelisolierung", "Feuerfeste Hydraulikfluessigkeiten"}, NormReferences: []string{"ISO 12100 — Ergonomische Grundsaetze", "EN 13501-1"}},
// ── Ergonomics (M029-M038) ──────────────────────────────────────────
{ID: "M029", ReductionType: "design", SubType: "ergonomics", Name: "Ergonomische Arbeitshoehe", Description: "Arbeitshoehe ist an Bedienergroesse anpassbar fuer belastungsarmes Arbeiten.", HazardCategory: "ergonomic", Examples: []string{"Hoehenverstellbare Arbeitstische", "Bedienfeld auf Ellbogenhoehe"}, NormReferences: []string{"EN 614-1", "ISO 12100:2010 Kap. 6.2.8"}},
{ID: "M029", ReductionType: "design", SubType: "ergonomics", Name: "Ergonomische Arbeitshoehe", Description: "Arbeitshoehe ist an Bedienergroesse anpassbar fuer belastungsarmes Arbeiten.", HazardCategory: "ergonomic", Examples: []string{"Hoehenverstellbare Arbeitstische", "Bedienfeld auf Ellbogenhoehe"}, NormReferences: []string{"EN 614-1", "ISO 12100 — Elektrische Energieversorgung"}},
{ID: "M030", ReductionType: "design", SubType: "ergonomics", Name: "Greifraum-Optimierung", Description: "Bedienelemente sind in ergonomisch guenstiger Reichweite platziert.", HazardCategory: "ergonomic", Examples: []string{"Haeufig genutzte Taster im Nahbereich", "Reichweitendiagramme bei der Planung anwenden"}, NormReferences: []string{"EN 614-1", "EN 894-3"}},
{ID: "M031", ReductionType: "design", SubType: "ergonomics", Name: "Gewichtsreduzierung Handhabung", Description: "Gewicht von Handwerkzeugen und Handhabungsteilen unter ergonomischen Grenzwerten.", HazardCategory: "ergonomic", Examples: []string{"Gewicht von Handwerkzeugen unter 2,5 kg", "Hebevorrichtungen fuer schwere Teile"}, NormReferences: []string{"EN 1005-2", "ISO 11228-1"}},
{ID: "M032", ReductionType: "design", SubType: "ergonomics", Name: "Intuitive Bedienoberflaeche", Description: "Bedienelemente und Anzeigen sind logisch angeordnet gegen Fehlbedienung.", HazardCategory: "ergonomic", Examples: []string{"Einheitliche Farbcodierung", "Logische Anordnung der Bedienelemente"}, NormReferences: []string{"EN 894-1", "EN 894-2", "EN 894-3"}},
{ID: "M033", ReductionType: "design", SubType: "ergonomics", Name: "Gute Sichtbarkeit", Description: "Sicherheitsrelevante Bereiche sind vom Bedienstandort einsehbar.", HazardCategory: "ergonomic", Examples: []string{"Transparente Schutzhauben verwenden", "Kamerabasierte Sichthilfen installieren"}, NormReferences: []string{"EN 614-1", "ISO 12100:2010 Kap. 6.2.8"}},
{ID: "M033", ReductionType: "design", SubType: "ergonomics", Name: "Gute Sichtbarkeit", Description: "Sicherheitsrelevante Bereiche sind vom Bedienstandort einsehbar.", HazardCategory: "ergonomic", Examples: []string{"Transparente Schutzhauben verwenden", "Kamerabasierte Sichthilfen installieren"}, NormReferences: []string{"EN 614-1", "ISO 12100 — Elektrische Energieversorgung"}},
{ID: "M034", ReductionType: "design", SubType: "ergonomics", Name: "Sichere Mensch-Maschine-Interaktion", Description: "Schnittstelle Bediener/Maschine schliesst gefaehrliche Missverstaendnisse aus.", HazardCategory: "ergonomic", Examples: []string{"Eindeutige Statusindikatoren", "Bestaetigung vor kritischen Befehlen"}, NormReferences: []string{"EN 894-1", "IEC 60447"}},
{ID: "M035", ReductionType: "design", SubType: "ergonomics", Name: "Sichere Wartungszugaenge", Description: "Wartungsbereiche sind gefahrlos zugaenglich ohne Demontage von Schutzeinrichtungen.", HazardCategory: "ergonomic", Examples: []string{"Wartungsklappen mit Sicherheitsverriegelung", "Ausreichende Arbeitsflaeche im Wartungsbereich"}, NormReferences: []string{"EN 547-3", "ISO 12100:2010 Kap. 6.2.8"}},
{ID: "M036", ReductionType: "design", SubType: "ergonomics", Name: "Sichere Montagepunkte", Description: "Montagepunkte fuer sicheres Handling waehrend Montage und Demontage.", HazardCategory: "ergonomic", Examples: []string{"Anschlagpunkte fuer Hebezeuge", "Passstifte fuer lagegenaue Montage"}, NormReferences: []string{"ISO 12100:2010 Kap. 6.2.8"}},
{ID: "M035", ReductionType: "design", SubType: "ergonomics", Name: "Sichere Wartungszugaenge", Description: "Wartungsbereiche sind gefahrlos zugaenglich ohne Demontage von Schutzeinrichtungen.", HazardCategory: "ergonomic", Examples: []string{"Wartungsklappen mit Sicherheitsverriegelung", "Ausreichende Arbeitsflaeche im Wartungsbereich"}, NormReferences: []string{"EN 547-3", "ISO 12100 — Elektrische Energieversorgung"}},
{ID: "M036", ReductionType: "design", SubType: "ergonomics", Name: "Sichere Montagepunkte", Description: "Montagepunkte fuer sicheres Handling waehrend Montage und Demontage.", HazardCategory: "ergonomic", Examples: []string{"Anschlagpunkte fuer Hebezeuge", "Passstifte fuer lagegenaue Montage"}, NormReferences: []string{"ISO 12100 — Elektrische Energieversorgung"}},
{ID: "M037", ReductionType: "design", SubType: "ergonomics", Name: "Sichere Servicezugaenge", Description: "Servicebereiche sind bei abgeschalteter Maschine sicher zugaenglich.", HazardCategory: "ergonomic", Examples: []string{"Servicetreppen und -plattformen", "Beleuchtung im Servicebereich"}, NormReferences: []string{"EN 547-3", "ISO 14122-3"}},
{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"}},
@@ -68,23 +68,23 @@ func getDesignMeasures() []ProtectiveMeasureEntry {
{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:2010 Kap. 6.2.11.4", "IEC 60204-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:2010 Kap. 6.2.10"}},
{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 Kap. 5.4", "ISO 12100:2010 Kap. 6.2.10"}},
{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 Kap. 9.2.5.4"}},
{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:2010 Kap. 6.2.11.10", "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:2010 Kap. 6.2.11.4", "IEC 60204-1"}},
{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"}},
// ── 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:2010 Kap. 6.2.9"}},
{ID: "M052", ReductionType: "design", SubType: "fluid_design", Name: "Sichere Pneumatikdimensionierung", Description: "Pneumatik so ausgelegt, dass Druckverlust zu sicherem Zustand fuehrt.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Federrueckstellung bei Druckausfall", "Druckbegrenzer in Versorgungsleitungen"}, NormReferences: []string{"ISO 4414", "ISO 12100:2010 Kap. 6.2.9"}},
{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"}},
{ID: "M052", ReductionType: "design", SubType: "fluid_design", Name: "Sichere Pneumatikdimensionierung", Description: "Pneumatik so ausgelegt, dass Druckverlust zu sicherem Zustand fuehrt.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Federrueckstellung bei Druckausfall", "Druckbegrenzer in Versorgungsleitungen"}, NormReferences: []string{"ISO 4414", "ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}},
{ID: "M053", ReductionType: "design", SubType: "fluid_design", Name: "Druckbegrenzung", Description: "Passive Druckbegrenzung verhindert Ueberschreiten des zulaessigen Drucks.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Berstscheiben an Druckbehaeltern", "Ueberdruckventile in Hydraulikkreisen"}, NormReferences: []string{"ISO 4413", "EN 764-7"}},
{ID: "M054", ReductionType: "design", SubType: "fluid_design", Name: "Sichere thermische Auslegung", Description: "Thermische Belastung beruecksichtigt zur Vermeidung von Ueberhitzung und Brandgefahr.", HazardCategory: "thermal", Examples: []string{"Waermeableitung durch Kuehlrippen", "Brandlast durch Materialwahl minimieren"}, NormReferences: []string{"ISO 12100:2010 Kap. 6.2.4"}},
{ID: "M055", ReductionType: "design", SubType: "fluid_design", Name: "Temperaturbegrenzung", Description: "Zugaengliche Oberflaechen erreichen keine gefaehrlichen Temperaturen.", HazardCategory: "thermal", Examples: []string{"Oberflaechentemperatur unter 43 Grad Celsius", "Thermische Abschirmungen an Oefen"}, NormReferences: []string{"EN ISO 13732-1", "ISO 12100:2010 Kap. 6.2.4"}},
{ID: "M056", ReductionType: "design", SubType: "fluid_design", Name: "Passive Kuehlung", Description: "Waermeabfuhr ohne aktive Komponenten verhindert Kuehlungsausfall.", HazardCategory: "thermal", Examples: []string{"Natuerliche Konvektion durch Rippendesign", "Waermeleitrohre (Heatpipes) einsetzen"}, NormReferences: []string{"ISO 12100:2010 Kap. 6.2.4"}},
{ID: "M054", ReductionType: "design", SubType: "fluid_design", Name: "Sichere thermische Auslegung", Description: "Thermische Belastung beruecksichtigt zur Vermeidung von Ueberhitzung und Brandgefahr.", HazardCategory: "thermal", Examples: []string{"Waermeableitung durch Kuehlrippen", "Brandlast durch Materialwahl minimieren"}, NormReferences: []string{"ISO 12100 — Ergonomische Grundsaetze"}},
{ID: "M055", ReductionType: "design", SubType: "fluid_design", Name: "Temperaturbegrenzung", Description: "Zugaengliche Oberflaechen erreichen keine gefaehrlichen Temperaturen.", HazardCategory: "thermal", Examples: []string{"Oberflaechentemperatur unter 43 Grad Celsius", "Thermische Abschirmungen an Oefen"}, NormReferences: []string{"EN ISO 13732-1", "ISO 12100 — Ergonomische Grundsaetze"}},
{ID: "M056", ReductionType: "design", SubType: "fluid_design", Name: "Passive Kuehlung", Description: "Waermeabfuhr ohne aktive Komponenten verhindert Kuehlungsausfall.", HazardCategory: "thermal", Examples: []string{"Natuerliche Konvektion durch Rippendesign", "Waermeleitrohre (Heatpipes) einsetzen"}, NormReferences: []string{"ISO 12100 — Ergonomische Grundsaetze"}},
{ID: "M057", ReductionType: "design", SubType: "fluid_design", Name: "Sichere Leitungsfuehrung", Description: "Hydraulik-/Pneumatikleitungen sind vor Beschaedigung geschuetzt.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Leitungen in geschuetzten Kanaelen", "Farbcodierte Leitungen"}, NormReferences: []string{"ISO 4413", "ISO 4414"}},
{ID: "M058", ReductionType: "design", SubType: "fluid_design", Name: "Sichere Entlueftung", Description: "Entlueftungssysteme stellen sicheren Druckabbau bei Wartung und Notfall sicher.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Entlueftungspunkte an Druckbehaeltern", "Manuelle Entlueftung mit Sicherheitsventil"}, NormReferences: []string{"ISO 4413", "ISO 4414"}},
@@ -189,5 +189,37 @@ func getInformationMeasures() []ProtectiveMeasureEntry {
{ID: "M198", ReductionType: "information", SubType: "organizational", Name: "Wartungscheckliste", Description: "Systematische Abarbeitung aller Wartungspunkte mit Dokumentation.", HazardCategory: "general", Examples: []string{"Checkliste woechentliche Wartung", "Oelstand und Filter pruefen"}, NormReferences: []string{"BetrSichV §10"}},
{ID: "M199", ReductionType: "information", SubType: "organizational", Name: "Schichtwechsel-Checkliste", Description: "Checkliste fuer sichere Uebergabe zwischen Schichten.", HazardCategory: "general", Examples: []string{"Maschinenzustand dokumentieren", "Offene Stoerungen uebergeben"}, NormReferences: []string{"DGUV Vorschrift 1"}},
{ID: "M200", ReductionType: "information", SubType: "organizational", Name: "Cyber-Security-Hinweise fuer Betreiber", Description: "Hinweise zum Schutz der Maschinensteuerung vor Cyberangriffen.", HazardCategory: "cyber_network", Examples: []string{"Netzwerksicherheitshinweise", "Regelmaessige Aktualisierung empfehlen"}, NormReferences: []string{"IEC 62443-2-1", "VDI/VDE 2182"}},
// ══════════════════════════════════════════════════════════════════
// Phase 1B: Neue Massnahmen fuer bisher unabgedeckte Kategorien
// ══════════════════════════════════════════════════════════════════
// ── Kommunikationsausfall (communication_failure) ────────────────
{ID: "M201", ReductionType: "design", SubType: "control_design", Name: "Kommunikationsredundanz", Description: "Sicherheitskritische Kommunikationspfade werden redundant ausgefuehrt, so dass der Ausfall eines Kanals nicht zum Verlust der Sicherheitsfunktion fuehrt.", HazardCategory: "cyber_network", Examples: []string{"Dual-Channel Safety-Bus", "Redundante Ethernet-Verbindung"}, NormReferences: []string{"IEC 62443 — Netzwerk-Redundanz", "ISO 13849-1 — Redundanz-Architektur"}},
{ID: "M202", ReductionType: "design", SubType: "control_design", Name: "Kommunikations-Timeout mit sicherem Zustand", Description: "Bei Ausbleiben erwarteter Nachrichten innerhalb definierter Zeitfenster wird automatisch ein sicherer Zustand hergestellt.", HazardCategory: "cyber_network", Examples: []string{"Watchdog-Timeout auf Safety-Bus", "Heartbeat-Ueberwachung zwischen SPS und Antrieb"}, NormReferences: []string{"IEC 61784 — Feldbussicherheit", "ISO 13849-1 — Fehlererkennung"}},
{ID: "M203", ReductionType: "design", SubType: "control_design", Name: "Fallback-Betrieb bei Kommunikationsverlust", Description: "Ein definierter Notbetriebsmodus stellt grundlegende Sicherheitsfunktionen auch ohne aktive Kommunikation sicher.", HazardCategory: "cyber_network", Examples: []string{"Lokale Sicherheitssteuerung bei Busverlust", "Autonomer Not-Halt ohne Netzwerk"}, NormReferences: []string{"IEC 62443 — Ausfallsicherheit", "ISO 12100 — Inhaerent sichere Konstruktion"}},
// ── HMI-Fehler (hmi_error) ──────────────────────────────────────
{ID: "M204", ReductionType: "design", SubType: "control_design", Name: "HMI-Usability-Pruefung", Description: "Systematische Pruefung der Benutzeroberflaeche auf Fehlbedienungspotenzial, insbesondere fuer sicherheitskritische Bedienhandlungen.", HazardCategory: "software_control", Examples: []string{"Usability-Test mit Bedienpersonal", "FMEA der Bedienoberflaeche"}, NormReferences: []string{"ISO 12100 — Ergonomische Grundsaetze", "EN 894 — Ergonomische Anforderungen an Anzeigen und Stellteile"}},
{ID: "M205", ReductionType: "design", SubType: "control_design", Name: "Eindeutiges visuelles Feedback", Description: "Jede sicherheitsrelevante Zustandsaenderung wird dem Bediener durch eindeutige visuelle, akustische oder haptische Rueckmeldung angezeigt.", HazardCategory: "software_control", Examples: []string{"Ampelsignal fuer Maschinenzustand", "Akustisches Signal bei Betriebsartwechsel"}, NormReferences: []string{"IEC 60204-1 — Anzeigeelemente", "ISO 7731 — Gefahrensignale"}},
{ID: "M206", ReductionType: "design", SubType: "control_design", Name: "Betriebsarten-Anzeige mit Bestaetigung", Description: "Die aktive Betriebsart wird jederzeit eindeutig angezeigt. Wechsel sicherheitskritischer Betriebsarten erfordern aktive Bestaetigung.", HazardCategory: "software_control", Examples: []string{"Schluesselschalter fuer Betriebsartwechsel", "Quittierungspflicht bei Teach-Mode"}, NormReferences: []string{"ISO 12100 — Betriebsarten", "IEC 60204-1 — Betriebsartenwahl"}},
// ── Firmware-Korruption (firmware_corruption) ────────────────────
{ID: "M207", ReductionType: "design", SubType: "control_design", Name: "Secure Boot und Firmware-Integritaetspruefung", Description: "Beim Systemstart wird die Integritaet der Firmware kryptografisch geprueft. Manipulierte oder beschaedigte Firmware wird nicht ausgefuehrt.", HazardCategory: "cyber_network", Examples: []string{"Hash-Verifikation beim Boot", "Signierte Firmware-Images"}, NormReferences: []string{"IEC 62443 — Integritaetspruefung", "EU CRA — Software-Sicherheit"}},
{ID: "M208", ReductionType: "design", SubType: "control_design", Name: "Signierte Firmware-Updates", Description: "Firmware-Updates werden nur akzeptiert wenn sie kryptografisch signiert und verifiziert sind. Unsignierte Updates werden abgelehnt.", HazardCategory: "cyber_network", Examples: []string{"RSA/ECDSA-signierte Update-Pakete", "Zertifikatsbasierte Verifikation"}, NormReferences: []string{"IEC 62443 — Patch-Management", "EU CRA — Update-Sicherheit"}},
{ID: "M209", ReductionType: "design", SubType: "control_design", Name: "Firmware-Rollback-Mechanismus", Description: "Bei fehlgeschlagenem Update kann automatisch auf die letzte funktionierende Firmware-Version zurueckgesetzt werden.", HazardCategory: "cyber_network", Examples: []string{"A/B-Partition-Schema", "Recovery-Partition"}, NormReferences: []string{"IEC 62443 — Ausfallsicherheit", "EU CRA — Verfuegbarkeit"}},
// ── Wartungsgefaehrdung (maintenance_hazard) ─────────────────────
{ID: "M210", ReductionType: "protection", SubType: "procedural", Name: "Lockout/Tagout-Verfahren (LOTO)", Description: "Vor Wartungsarbeiten werden alle Energiequellen gesperrt und gegen Wiedereinschalten gesichert. Entsperrung nur durch befugte Person.", HazardCategory: "mechanical", Examples: []string{"Vorhangschloss am Hauptschalter", "LOTO-Station mit persoenlichen Schloessern"}, NormReferences: []string{"ISO 14118 — Energietrennung", "TRBS 1112 — Instandhaltung"}},
{ID: "M211", ReductionType: "information", SubType: "documentation", Name: "Wartungsanleitung mit Sicherheitshinweisen", Description: "Detaillierte Wartungsanleitung die alle sicherheitsrelevanten Schritte, erforderliche PSA und Restgefahren dokumentiert.", HazardCategory: "mechanical", Examples: []string{"Wartungshandbuch mit Schritt-fuer-Schritt-Anleitung", "Warnhinweise bei Restenergie"}, NormReferences: []string{"ISO 12100 — Benutzerinformation", "EN IEC 82079-1 — Gebrauchsanleitungen"}},
{ID: "M212", ReductionType: "protection", SubType: "procedural", Name: "Freigabeverfahren nach Wartung", Description: "Nach Wartungsarbeiten wird ein dokumentierter Freigabeprozess durchlaufen bevor die Maschine wieder in Betrieb genommen wird.", HazardCategory: "mechanical", Examples: []string{"Checkliste Inbetriebnahme nach Wartung", "Funktionspruefung Schutzeinrichtungen"}, NormReferences: []string{"BetrSichV — Pruefpflichten", "TRBS 1201 — Pruefungen"}},
// ── Sensor-Fehler (sensor_fault) ─────────────────────────────────
{ID: "M213", ReductionType: "design", SubType: "control_design", Name: "Sensor-Redundanz fuer Sicherheitsfunktionen", Description: "Sicherheitsrelevante Sensoren werden redundant (2-kanalig) ausgefuehrt. Diskrepanz zwischen Kanaelen fuehrt zum sicheren Zustand.", HazardCategory: "software_control", Examples: []string{"Doppelter Positionssensor", "Redundante Druckmessung"}, NormReferences: []string{"ISO 13849-1 — Kategorie 3/4", "IEC 62061 — SIL-Architektur"}},
{ID: "M214", ReductionType: "design", SubType: "control_design", Name: "Plausibilitaetspruefung Sensordaten", Description: "Sensordaten werden auf physikalische Plausibilitaet und zulaessige Aenderungsraten geprueft. Unplausible Werte loesen Sicherheitsreaktion aus.", HazardCategory: "software_control", Examples: []string{"Bereichsueberwachung Temperatur", "Gradientenueberwachung Drehzahl"}, NormReferences: []string{"ISO 13849-1 — Fehlererkennung", "IEC 61508 — Diagnostik"}},
// ── Betriebsarten-Verwechslung (mode_confusion) ─────────────────
{ID: "M215", ReductionType: "design", SubType: "control_design", Name: "Eindeutige Betriebsartenanzeige", Description: "Die aktive Betriebsart wird permanent und eindeutig am Bedienpult und auf dem HMI angezeigt. Keine Verwechslungsgefahr zwischen Modi.", HazardCategory: "software_control", Examples: []string{"LED-Anzeige je Betriebsart", "Farbcodierung auf HMI-Bildschirm"}, NormReferences: []string{"IEC 60204-1 — Betriebsartenwahl", "ISO 12100 — Betriebsarten"}},
{ID: "M216", ReductionType: "design", SubType: "control_design", Name: "Zustandsbestaetigung bei kritischem Moduswechsel", Description: "Wechsel in sicherheitskritische Betriebsarten erfordert eine bewusste Zwei-Schritt-Bestaetigung des Bedieners.", HazardCategory: "software_control", Examples: []string{"Schluesselschalter + Quittierung", "Hold-to-Run im Einrichtbetrieb"}, NormReferences: []string{"ISO 12100 — Betriebsarten", "IEC 60204-1 — Zustimmungsschalter"}},
}
}
@@ -19,12 +19,21 @@ type MatchOutput struct {
ResolvedTags []string `json:"resolved_tags"`
}
// MatchReason explains why a specific check passed or was relevant for a pattern match.
type MatchReason struct {
Type string `json:"type"` // "required_component_tag", "required_energy_tag", "lifecycle_match", "no_exclusion"
Tag string `json:"tag"`
Met bool `json:"met"`
}
// PatternMatch records which pattern fired and why.
type PatternMatch struct {
PatternID string `json:"pattern_id"`
PatternName string `json:"pattern_name"`
Priority int `json:"priority"`
MatchedTags []string `json:"matched_tags"`
// Explainability: structured reasons why this pattern fired
MatchReasons []MatchReason `json:"match_reasons,omitempty"`
// Detail fields from the pattern definition
ScenarioDE string `json:"scenario_de,omitempty"`
TriggerDE string `json:"trigger_de,omitempty"`
@@ -136,16 +145,34 @@ func (e *PatternEngine) Match(input MatchInput) *MatchOutput {
continue
}
// Collect the tags that contributed to this match
// Collect the tags that contributed + build explainability reasons
var matchedTags []string
var reasons []MatchReason
for _, t := range p.RequiredComponentTags {
if tagSet[t] {
matchedTags = append(matchedTags, t)
reasons = append(reasons, MatchReason{Type: "required_component_tag", Tag: t, Met: true})
}
}
for _, t := range p.RequiredEnergyTags {
if tagSet[t] {
matchedTags = append(matchedTags, t)
reasons = append(reasons, MatchReason{Type: "required_energy_tag", Tag: t, Met: true})
}
}
for _, t := range p.ExcludedComponentTags {
reasons = append(reasons, MatchReason{Type: "no_exclusion", Tag: t, Met: !tagSet[t]})
}
if len(p.RequiredLifecycles) > 0 {
for _, lc := range p.RequiredLifecycles {
found := false
for _, ilc := range input.LifecyclePhases {
if ilc == lc {
found = true
break
}
}
reasons = append(reasons, MatchReason{Type: "lifecycle_match", Tag: lc, Met: found})
}
}
@@ -154,6 +181,7 @@ func (e *PatternEngine) Match(input MatchInput) *MatchOutput {
PatternName: p.NameDE,
Priority: p.Priority,
MatchedTags: matchedTags,
MatchReasons: reasons,
ScenarioDE: p.ScenarioDE,
TriggerDE: p.TriggerDE,
HarmDE: p.HarmDE,