Files
Benjamin Admin 3b2006ebce
All checks were successful
CI/CD / go-lint (push) Has been skipped
CI/CD / python-lint (push) Has been skipped
CI/CD / nodejs-lint (push) Has been skipped
CI/CD / test-go-ai-compliance (push) Successful in 44s
CI/CD / test-python-backend-compliance (push) Successful in 33s
CI/CD / test-python-document-crawler (push) Successful in 22s
CI/CD / test-python-dsms-gateway (push) Successful in 19s
CI/CD / validate-canonical-controls (push) Successful in 13s
CI/CD / Deploy (push) Successful in 4s
feat(iace): add hazard-matching-engine with component library, tag system, and pattern engine
Implements Phases 1-4 of the IACE Hazard-Matching-Engine:
- 120 machine components (C001-C120) in 11 categories
- 20 energy sources (EN01-EN20)
- ~85 tag taxonomy across 5 domains
- 44 hazard patterns with AND/NOT matching logic
- Pattern engine with tag resolution and confidence scoring
- 8 new API endpoints (component-library, energy-sources, tags, patterns, match/apply)
- Completeness gate G09 for pattern matching
- 320 tests passing (36 new)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 08:50:11 +01:00

459 lines
20 KiB
Go

package iace
// HazardPattern defines a rule that matches component/energy tags to
// hazards, measures, and evidence. When a pattern's required tags are all
// present (AND) and none of its excluded tags are present (NOT), it fires.
type HazardPattern struct {
ID string `json:"id"`
NameDE string `json:"name_de"`
NameEN string `json:"name_en"`
RequiredComponentTags []string `json:"required_component_tags"`
RequiredEnergyTags []string `json:"required_energy_tags"`
RequiredLifecycles []string `json:"required_lifecycle_phases"`
ExcludedComponentTags []string `json:"excluded_component_tags"`
GeneratedHazardCats []string `json:"generated_hazard_categories"`
SuggestedMeasureIDs []string `json:"suggested_measure_ids"`
SuggestedEvidenceIDs []string `json:"suggested_evidence_ids"`
Priority int `json:"priority"`
}
// GetBuiltinHazardPatterns returns ~44 built-in hazard patterns organized
// by domain (mechanical, electrical, thermal, hydraulic/pneumatic,
// noise/vibration, ergonomic, software/control, cyber/network, AI-specific).
func GetBuiltinHazardPatterns() []HazardPattern {
return []HazardPattern{
// ====================================================================
// Mechanical Patterns (HP001-HP010)
// ====================================================================
{
ID: "HP001", NameDE: "Quetschgefahr durch bewegte Teile", NameEN: "Crush risk from moving parts",
RequiredComponentTags: []string{"moving_part"},
RequiredEnergyTags: []string{"kinetic"},
GeneratedHazardCats: []string{"mechanical_hazard"},
SuggestedMeasureIDs: []string{"M001", "M005", "M051", "M054"},
SuggestedEvidenceIDs: []string{"E01", "E08", "E20"},
Priority: 95,
},
{
ID: "HP002", NameDE: "Einzugsgefahr durch rotierende Teile", NameEN: "Entanglement risk from rotating parts",
RequiredComponentTags: []string{"rotating_part"},
RequiredEnergyTags: []string{"rotational"},
GeneratedHazardCats: []string{"mechanical_hazard"},
SuggestedMeasureIDs: []string{"M002", "M051", "M053", "M121"},
SuggestedEvidenceIDs: []string{"E01", "E08"},
Priority: 95,
},
{
ID: "HP003", NameDE: "Schnittgefahr durch Schneidwerkzeuge", NameEN: "Cut risk from cutting tools",
RequiredComponentTags: []string{"cutting_part"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"mechanical_hazard"},
SuggestedMeasureIDs: []string{"M003", "M051", "M054", "M131"},
SuggestedEvidenceIDs: []string{"E01", "E08"},
Priority: 90,
},
{
ID: "HP004", NameDE: "Klemmgefahr an Quetsch-/Klemmstellen", NameEN: "Pinch risk at clamping points",
RequiredComponentTags: []string{"pinch_point"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"mechanical_hazard"},
SuggestedMeasureIDs: []string{"M001", "M004", "M051", "M121"},
SuggestedEvidenceIDs: []string{"E01", "E08"},
Priority: 85,
},
{
ID: "HP005", NameDE: "Quetschgefahr an Quetschstellen", NameEN: "Crush risk at crush points",
RequiredComponentTags: []string{"crush_point"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"mechanical_hazard"},
SuggestedMeasureIDs: []string{"M001", "M005", "M054"},
SuggestedEvidenceIDs: []string{"E01", "E08"},
Priority: 90,
},
{
ID: "HP006", NameDE: "Gefahr durch hohe Kraefte", NameEN: "Risk from high forces",
RequiredComponentTags: []string{"high_force"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"mechanical_hazard"},
SuggestedMeasureIDs: []string{"M001", "M005", "M051", "M106"},
SuggestedEvidenceIDs: []string{"E01", "E07", "E08"},
Priority: 90,
},
{
ID: "HP007", NameDE: "Gefahr durch hohe Geschwindigkeit", NameEN: "Risk from high speed",
RequiredComponentTags: []string{"high_speed"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"mechanical_hazard"},
SuggestedMeasureIDs: []string{"M002", "M051", "M053", "M054"},
SuggestedEvidenceIDs: []string{"E01", "E08"},
Priority: 85,
},
{
ID: "HP008", NameDE: "Absturzgefahr / Herabfallende Teile", NameEN: "Fall/drop risk",
RequiredComponentTags: []string{"gravity_risk"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"mechanical_hazard"},
SuggestedMeasureIDs: []string{"M009", "M121", "M131"},
SuggestedEvidenceIDs: []string{"E01", "E20"},
Priority: 85,
},
{
ID: "HP009", NameDE: "Gefahr durch Spannvorrichtungen", NameEN: "Clamping device risk",
RequiredComponentTags: []string{"clamping_part"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"mechanical_hazard"},
SuggestedMeasureIDs: []string{"M004", "M051", "M121"},
SuggestedEvidenceIDs: []string{"E01", "E08"},
Priority: 80,
},
{
ID: "HP010", NameDE: "Gefahr durch gespeicherte mechanische Energie", NameEN: "Stored mechanical energy risk",
RequiredComponentTags: []string{"stored_energy"},
RequiredEnergyTags: []string{"mechanical"},
GeneratedHazardCats: []string{"mechanical_hazard"},
SuggestedMeasureIDs: []string{"M010", "M121", "M123"},
SuggestedEvidenceIDs: []string{"E01", "E20"},
Priority: 80,
},
// ====================================================================
// Electrical Patterns (HP011-HP015)
// ====================================================================
{
ID: "HP011", NameDE: "Stromschlaggefahr durch Hochspannung", NameEN: "Electric shock risk from high voltage",
RequiredComponentTags: []string{"high_voltage"},
RequiredEnergyTags: []string{"electrical_energy"},
GeneratedHazardCats: []string{"electrical_hazard"},
SuggestedMeasureIDs: []string{"M061", "M062", "M063", "M121"},
SuggestedEvidenceIDs: []string{"E01", "E04", "E10"},
Priority: 95,
},
{
ID: "HP012", NameDE: "Gefahr durch elektrische Komponenten", NameEN: "Risk from electrical components",
RequiredComponentTags: []string{"electrical_part"},
RequiredEnergyTags: []string{"electrical_energy"},
GeneratedHazardCats: []string{"electrical_hazard"},
SuggestedMeasureIDs: []string{"M061", "M064", "M121"},
SuggestedEvidenceIDs: []string{"E01", "E04", "E10"},
Priority: 85,
},
{
ID: "HP013", NameDE: "Gefahr durch gespeicherte elektrische Energie", NameEN: "Stored electrical energy risk",
RequiredComponentTags: []string{"stored_energy"},
RequiredEnergyTags: []string{"electrical_energy"},
GeneratedHazardCats: []string{"electrical_hazard"},
SuggestedMeasureIDs: []string{"M062", "M063", "M121", "M123"},
SuggestedEvidenceIDs: []string{"E01", "E10"},
Priority: 85,
},
{
ID: "HP014", NameDE: "Kurzschluss-/Lichtbogengefahr", NameEN: "Short circuit / arc flash risk",
RequiredComponentTags: []string{"high_voltage", "electrical_part"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"electrical_hazard", "thermal_hazard"},
SuggestedMeasureIDs: []string{"M061", "M065", "M131"},
SuggestedEvidenceIDs: []string{"E01", "E04", "E10"},
Priority: 90,
},
{
ID: "HP015", NameDE: "EMV-Stoerungsgefahr", NameEN: "EMC interference risk",
RequiredComponentTags: []string{"electrical_part"},
RequiredEnergyTags: []string{"electromagnetic"},
GeneratedHazardCats: []string{"emc_hazard"},
SuggestedMeasureIDs: []string{"M066", "M121"},
SuggestedEvidenceIDs: []string{"E01", "E10"},
Priority: 70,
},
// ====================================================================
// Thermal Patterns (HP016-HP018)
// ====================================================================
{
ID: "HP016", NameDE: "Verbrennungsgefahr durch heisse Oberflaechen", NameEN: "Burn risk from hot surfaces",
RequiredComponentTags: []string{"high_temperature"},
RequiredEnergyTags: []string{"thermal"},
GeneratedHazardCats: []string{"thermal_hazard"},
SuggestedMeasureIDs: []string{"M071", "M121", "M131"},
SuggestedEvidenceIDs: []string{"E01", "E20"},
Priority: 85,
},
{
ID: "HP017", NameDE: "Strahlungsgefahr (Laser/optisch)", NameEN: "Radiation risk (laser/optical)",
RequiredComponentTags: []string{"radiation_risk"},
RequiredEnergyTags: []string{"radiation"},
GeneratedHazardCats: []string{"thermal_hazard"},
SuggestedMeasureIDs: []string{"M072", "M051", "M131"},
SuggestedEvidenceIDs: []string{"E01", "E20"},
Priority: 85,
},
{
ID: "HP018", NameDE: "Verbrennungsgefahr durch Aktuatoren", NameEN: "Burn risk from actuators",
RequiredComponentTags: []string{"actuator_part", "high_temperature"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"thermal_hazard"},
SuggestedMeasureIDs: []string{"M071", "M121"},
SuggestedEvidenceIDs: []string{"E01"},
Priority: 75,
},
// ====================================================================
// Hydraulic / Pneumatic Patterns (HP019-HP022)
// ====================================================================
{
ID: "HP019", NameDE: "Hydraulikdruck-Gefahr", NameEN: "Hydraulic pressure hazard",
RequiredComponentTags: []string{"hydraulic_part"},
RequiredEnergyTags: []string{"hydraulic_pressure"},
GeneratedHazardCats: []string{"pneumatic_hydraulic"},
SuggestedMeasureIDs: []string{"M081", "M082", "M121", "M123"},
SuggestedEvidenceIDs: []string{"E01", "E05", "E11"},
Priority: 90,
},
{
ID: "HP020", NameDE: "Pneumatikdruck-Gefahr", NameEN: "Pneumatic pressure hazard",
RequiredComponentTags: []string{"pneumatic_part"},
RequiredEnergyTags: []string{"pneumatic_pressure"},
GeneratedHazardCats: []string{"pneumatic_hydraulic"},
SuggestedMeasureIDs: []string{"M083", "M084", "M121"},
SuggestedEvidenceIDs: []string{"E01", "E06", "E11"},
Priority: 85,
},
{
ID: "HP021", NameDE: "Gefahr durch gespeicherten Hydraulikdruck", NameEN: "Stored hydraulic pressure risk",
RequiredComponentTags: []string{"hydraulic_part", "stored_energy"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"pneumatic_hydraulic"},
SuggestedMeasureIDs: []string{"M081", "M082", "M123"},
SuggestedEvidenceIDs: []string{"E01", "E05", "E11"},
Priority: 90,
},
{
ID: "HP022", NameDE: "Gefahr durch Druckluftspeicher", NameEN: "Stored pneumatic pressure risk",
RequiredComponentTags: []string{"pneumatic_part", "stored_energy"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"pneumatic_hydraulic"},
SuggestedMeasureIDs: []string{"M083", "M084", "M123"},
SuggestedEvidenceIDs: []string{"E01", "E06", "E11"},
Priority: 85,
},
// ====================================================================
// Noise / Vibration Patterns (HP023-HP025)
// ====================================================================
{
ID: "HP023", NameDE: "Laermgefahr", NameEN: "Noise hazard",
RequiredComponentTags: []string{"noise_source"},
RequiredEnergyTags: []string{"acoustic"},
GeneratedHazardCats: []string{"noise_vibration"},
SuggestedMeasureIDs: []string{"M091", "M131"},
SuggestedEvidenceIDs: []string{"E01", "E12"},
Priority: 70,
},
{
ID: "HP024", NameDE: "Vibrationsgefahr", NameEN: "Vibration hazard",
RequiredComponentTags: []string{"vibration_source"},
RequiredEnergyTags: []string{"vibration"},
GeneratedHazardCats: []string{"noise_vibration"},
SuggestedMeasureIDs: []string{"M092", "M131"},
SuggestedEvidenceIDs: []string{"E01", "E13"},
Priority: 65,
},
{
ID: "HP025", NameDE: "Laerm durch rotierende Hochgeschwindigkeitsteile", NameEN: "Noise from high-speed rotating parts",
RequiredComponentTags: []string{"rotating_part", "high_speed"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"noise_vibration"},
SuggestedMeasureIDs: []string{"M091", "M092", "M131"},
SuggestedEvidenceIDs: []string{"E01", "E12", "E13"},
Priority: 70,
},
// ====================================================================
// Ergonomic Patterns (HP026-HP028)
// ====================================================================
{
ID: "HP026", NameDE: "Ergonomische Belastung an Bedienstationen", NameEN: "Ergonomic risk at operator stations",
RequiredComponentTags: []string{"user_interface"},
RequiredEnergyTags: []string{"ergonomic"},
GeneratedHazardCats: []string{"ergonomic"},
SuggestedMeasureIDs: []string{"M126", "M121"},
SuggestedEvidenceIDs: []string{"E01", "E24"},
Priority: 50,
},
{
ID: "HP027", NameDE: "Ergonomische Belastung bei Wartung in der Hoehe", NameEN: "Ergonomic risk for work at height",
RequiredComponentTags: []string{"structural_part", "gravity_risk"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"ergonomic", "mechanical_hazard"},
SuggestedMeasureIDs: []string{"M121", "M131"},
SuggestedEvidenceIDs: []string{"E01", "E20"},
Priority: 60,
},
{
ID: "HP028", NameDE: "Fehlbedienungsgefahr", NameEN: "Mode confusion / misoperation risk",
RequiredComponentTags: []string{"user_interface", "programmable"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"hmi_error", "mode_confusion"},
SuggestedMeasureIDs: []string{"M126", "M127", "M121"},
SuggestedEvidenceIDs: []string{"E01", "E14", "E24"},
Priority: 70,
},
// ====================================================================
// Software / Control Patterns (HP029-HP034)
// ====================================================================
{
ID: "HP029", NameDE: "Software-Fehler in Steuerung", NameEN: "Software fault in controller",
RequiredComponentTags: []string{"has_software", "programmable"},
RequiredEnergyTags: []string{},
ExcludedComponentTags: []string{"has_ai"},
GeneratedHazardCats: []string{"software_fault"},
SuggestedMeasureIDs: []string{"M101", "M102", "M103"},
SuggestedEvidenceIDs: []string{"E01", "E14"},
Priority: 85,
},
{
ID: "HP030", NameDE: "Sicherheitsfunktionsversagen", NameEN: "Safety function failure",
RequiredComponentTags: []string{"safety_device"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"safety_function_failure"},
SuggestedMeasureIDs: []string{"M104", "M105", "M051"},
SuggestedEvidenceIDs: []string{"E01", "E07", "E08", "E09"},
Priority: 95,
},
{
ID: "HP031", NameDE: "Konfigurationsfehler", NameEN: "Configuration error",
RequiredComponentTags: []string{"programmable"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"configuration_error"},
SuggestedMeasureIDs: []string{"M145", "M146", "M121"},
SuggestedEvidenceIDs: []string{"E01", "E14"},
Priority: 70,
},
{
ID: "HP032", NameDE: "Fehlende Protokollierung / Audit", NameEN: "Missing logging / audit",
RequiredComponentTags: []string{"has_software"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"logging_audit_failure"},
SuggestedMeasureIDs: []string{"M142", "M149"},
SuggestedEvidenceIDs: []string{"E01"},
Priority: 50,
},
{
ID: "HP033", NameDE: "Update-Fehler / Rollback-Problem", NameEN: "Update failure / rollback problem",
RequiredComponentTags: []string{"has_software", "programmable"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"update_failure"},
SuggestedMeasureIDs: []string{"M138", "M141", "M146"},
SuggestedEvidenceIDs: []string{"E01", "E14"},
Priority: 65,
},
{
ID: "HP034", NameDE: "Verriegelungs-Umgehungsgefahr", NameEN: "Interlock bypass risk",
RequiredComponentTags: []string{"interlocked"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"safety_function_failure"},
SuggestedMeasureIDs: []string{"M051", "M104", "M107"},
SuggestedEvidenceIDs: []string{"E01", "E08"},
Priority: 85,
},
// ====================================================================
// Cyber / Network Patterns (HP035-HP039)
// ====================================================================
{
ID: "HP035", NameDE: "Unbefugter Netzwerkzugriff", NameEN: "Unauthorized network access",
RequiredComponentTags: []string{"networked"},
RequiredEnergyTags: []string{"cyber"},
GeneratedHazardCats: []string{"unauthorized_access"},
SuggestedMeasureIDs: []string{"M111", "M112", "M113", "M140"},
SuggestedEvidenceIDs: []string{"E01", "E16", "E17"},
Priority: 90,
},
{
ID: "HP036", NameDE: "Kommunikationsausfall", NameEN: "Communication failure",
RequiredComponentTags: []string{"networked", "it_component"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"communication_failure"},
SuggestedMeasureIDs: []string{"M114", "M115"},
SuggestedEvidenceIDs: []string{"E01", "E17"},
Priority: 80,
},
{
ID: "HP037", NameDE: "Firmware-Manipulation", NameEN: "Firmware manipulation",
RequiredComponentTags: []string{"has_software", "networked"},
RequiredEnergyTags: []string{"cyber"},
GeneratedHazardCats: []string{"firmware_corruption"},
SuggestedMeasureIDs: []string{"M116", "M138", "M146"},
SuggestedEvidenceIDs: []string{"E01", "E16", "E18"},
Priority: 85,
},
{
ID: "HP038", NameDE: "Drahtlos-Angriff (WiFi/Bluetooth)", NameEN: "Wireless attack (WiFi/Bluetooth)",
RequiredComponentTags: []string{"wireless"},
RequiredEnergyTags: []string{"cyber"},
GeneratedHazardCats: []string{"unauthorized_access"},
SuggestedMeasureIDs: []string{"M111", "M113", "M140"},
SuggestedEvidenceIDs: []string{"E01", "E16"},
Priority: 80,
},
{
ID: "HP039", NameDE: "Supply-Chain-Angriff auf IT-Komponenten", NameEN: "Supply chain attack on IT components",
RequiredComponentTags: []string{"it_component", "has_software"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"unauthorized_access", "firmware_corruption"},
SuggestedMeasureIDs: []string{"M116", "M118"},
SuggestedEvidenceIDs: []string{"E01", "E18", "E19"},
Priority: 75,
},
// ====================================================================
// AI-Specific Patterns (HP040-HP044)
// ====================================================================
{
ID: "HP040", NameDE: "KI-Fehlklassifikation", NameEN: "AI misclassification",
RequiredComponentTags: []string{"has_ai"},
RequiredEnergyTags: []string{"ai_model"},
GeneratedHazardCats: []string{"false_classification"},
SuggestedMeasureIDs: []string{"M101", "M102"},
SuggestedEvidenceIDs: []string{"E01", "E15"},
Priority: 90,
},
{
ID: "HP041", NameDE: "Model Drift / Concept Drift", NameEN: "Model drift / concept drift",
RequiredComponentTags: []string{"has_ai"},
RequiredEnergyTags: []string{"ai_model"},
GeneratedHazardCats: []string{"model_drift"},
SuggestedMeasureIDs: []string{"M103"},
SuggestedEvidenceIDs: []string{"E01", "E15"},
Priority: 85,
},
{
ID: "HP042", NameDE: "Data Poisoning / Adversarial Attack", NameEN: "Data poisoning / adversarial attack",
RequiredComponentTags: []string{"has_ai"},
RequiredEnergyTags: []string{"cyber", "ai_model"},
GeneratedHazardCats: []string{"data_poisoning"},
SuggestedMeasureIDs: []string{"M101", "M116"},
SuggestedEvidenceIDs: []string{"E01", "E15", "E16"},
Priority: 85,
},
{
ID: "HP043", NameDE: "Unbeabsichtigte KI-Diskriminierung", NameEN: "Unintended AI bias",
RequiredComponentTags: []string{"has_ai"},
RequiredEnergyTags: []string{"ai_model"},
GeneratedHazardCats: []string{"unintended_bias"},
SuggestedMeasureIDs: []string{"M101"},
SuggestedEvidenceIDs: []string{"E01", "E15"},
Priority: 75,
},
{
ID: "HP044", NameDE: "KI-Sensormanipulation", NameEN: "AI sensor spoofing",
RequiredComponentTags: []string{"has_ai", "sensor_part"},
RequiredEnergyTags: []string{},
GeneratedHazardCats: []string{"sensor_spoofing"},
SuggestedMeasureIDs: []string{"M101", "M102"},
SuggestedEvidenceIDs: []string{"E01", "E15"},
Priority: 80,
},
}
}