diff --git a/ai-compliance-sdk/internal/iace/measures_library_supplementary.go b/ai-compliance-sdk/internal/iace/measures_library_supplementary.go index 6488ae7..dd30626 100644 --- a/ai-compliance-sdk/internal/iace/measures_library_supplementary.go +++ b/ai-compliance-sdk/internal/iace/measures_library_supplementary.go @@ -66,5 +66,26 @@ func getSupplementaryMeasures() []ProtectiveMeasureEntry { // ══════════════════════════════════════════════════════════════ {ID: "M402", ReductionType: "protection", SubType: "monitoring", Name: "Sicherheitsbeleuchtung an Fluchtwegen und Arbeitsplaetzen", Description: "Fluchtwege und sicherheitsrelevante Arbeitsplaetze erhalten eine Sicherheitsbeleuchtung die bei Ausfall der allgemeinen Beleuchtung automatisch aktiviert wird.", HazardCategory: "general", Examples: []string{"Notbeleuchtung mit Batteriepufferung", "Nachleuchtende Leitmarkierung am Boden"}, NormReferences: []string{"ASR A3.4 — Beleuchtung", "ASR A2.3 — Fluchtwege"}}, {ID: "M403", ReductionType: "protection", SubType: "safety_control", Name: "Quetschschutz an kraftbetaetigten Tueren und Toren", Description: "Kraftbetaetigte Tueren und Tore erhalten Schutzeinrichtungen gegen Quetschen, Scheren und Einziehen an allen Schliesskanten.", HazardCategory: "mechanical", Examples: []string{"Schaltleiste an Schiebetorunterkante", "Lichtschranke an Rolltoroeffnung"}, NormReferences: []string{"ASR A1.7 — Tueren und Tore", "EN 12453"}}, + + // ══════════════════════════════════════════════════════════════ + // Elektrische Sicherheit — Potentialausgleich & Ableitstroeme + // Gap: GT-Benchmark 2.12 (Potentialausgleich), 2.4 (Ableitstroeme) + // ══════════════════════════════════════════════════════════════ + {ID: "M410", ReductionType: "design", SubType: "electrical_safety", Name: "Potentialausgleich zwischen Anlagenteilen", Description: "Alle leitfaehigen Anlagenteile mit unterschiedlicher Energieversorgung werden ueber einen Potentialausgleichsleiter verbunden um gefaehrliche Beruehrungsspannungen zu vermeiden.", HazardCategory: "electrical", Examples: []string{"Potentialausgleich zwischen Roboterzelle und Werkzeugmaschine", "Potentialausgleichsschiene im Schaltschrank"}, NormReferences: []string{"IEC 60204-1 Ziff. 8.2", "IEC 61439-1"}}, + {ID: "M411", ReductionType: "design", SubType: "electrical_safety", Name: "Schutz bei erhoehten Ableitstroemen", Description: "Bei Ableitstroemen ueber 10 mA wird der Schutzleiter mechanisch geschuetzt oder ein zusaetzlicher Schutzleiter verlegt und die Verbindung ueberwacht.", HazardCategory: "electrical", Examples: []string{"Schutzrohr fuer Schutzleiter an Frequenzumrichter", "Doppelter Schutzleiter mit Ueberwachung"}, NormReferences: []string{"IEC 60204-1 Ziff. 8.2.6"}}, + {ID: "M412", ReductionType: "design", SubType: "electrical_safety", Name: "Dimensionierung von Luft- und Kriechstrecken", Description: "Luft- und Kriechstrecken werden entsprechend der elektrischen Beanspruchung und Verschmutzungsgrad dimensioniert um Kurzschluesse und gefaehrliche Beruehrungsspannungen zu vermeiden.", HazardCategory: "electrical", Examples: []string{"Mindestabstaende in Schaltgeraetekombinationen einhalten", "Isolationsueberwachung installieren"}, NormReferences: []string{"IEC 60204-1 Ziff. 6.2", "IEC 61439-1"}}, + + // ══════════════════════════════════════════════════════════════ + // EMV-Sicherheit + // Gap: GT-Benchmark 6.1 (EMV-Stoereinfluss auf Sicherheitsfunktionen) + // ══════════════════════════════════════════════════════════════ + {ID: "M415", ReductionType: "design", SubType: "emc_safety", Name: "EMV-konforme Installation und Verkabelung", Description: "Alle sicherheitsrelevanten Komponenten und Sub-Systeme werden nach EMV-Richtlinien installiert und verkabelt um Stoereinfluss auf Sicherheitsfunktionen zu verhindern.", HazardCategory: "electrical", Examples: []string{"Geschirmte Steuerleitungen verwenden", "Getrennte Kabelkanaele fuer Leistungs- und Signalleitungen"}, NormReferences: []string{"IEC 61000-6-2", "EN 16090-1 Ziff. 5.8.7"}}, + {ID: "M416", ReductionType: "design", SubType: "emc_safety", Name: "EMV-Pruefung sicherheitsrelevanter Systeme", Description: "Sicherheitsrelevante Steuerungen und Antriebe werden auf Stoerfestigkeit gegenueber elektromagnetischen Einflussgroessen geprueft.", HazardCategory: "electrical", Examples: []string{"Burst/Surge-Pruefung nach IEC 61000-4", "Stoerfestigkeitspruefung der Sicherheits-SPS"}, NormReferences: []string{"IEC 61000-4-4", "IEC 61000-4-5", "IEC 62061"}}, + + // ══════════════════════════════════════════════════════════════ + // Kuehlschmierstoff-Leitungssicherheit + // Gap: GT-Benchmark 2.10 (KSS-Leckage fuehrt zu Brand) + // ══════════════════════════════════════════════════════════════ + {ID: "M420", ReductionType: "design", SubType: "fluid_safety", Name: "Druckfeste Auslegung von KSS-Leitungen", Description: "Schlaeuche, Dichtungen, Verbindungsstuecke und Befestigungen des Kuehlschmierstoffsystems werden auf den Nenndruck der jeweiligen Komponente ausgelegt und gegen Abspringen gesichert.", HazardCategory: "mechanical", Examples: []string{"Druckschlaeuche auf maximalen Betriebsdruck dimensionieren", "Schlauchbruchsicherungen an kritischen Verbindungen"}, NormReferences: []string{"IEC 60204-1 Ziff. 11.3", "EN ISO 4414"}}, } } diff --git a/ai-compliance-sdk/internal/iace/norms_engine.go b/ai-compliance-sdk/internal/iace/norms_engine.go index e9ba4fa..4c3a4ef 100644 --- a/ai-compliance-sdk/internal/iace/norms_engine.go +++ b/ai-compliance-sdk/internal/iace/norms_engine.go @@ -142,7 +142,17 @@ func matchNorm(norm NormReference, machineType string, hazardSet, tagSet map[str } } -// groupByType sorts suggestions by confidence and groups them by norm type. +// Per-type caps for norm suggestions to avoid overwhelming the user. +// A professional typically references 3-5 A-norms, 5-10 B-norms, and 3-8 C-norms. +const ( + maxANorms = 5 + maxB1Norms = 8 + maxB2Norms = 10 + maxCNorms = 10 +) + +// groupByType sorts suggestions by confidence, groups them by norm type, +// and applies per-type caps to keep the list manageable. func groupByType(suggestions []NormSuggestion) *NormSuggestionResult { sort.Slice(suggestions, func(i, j int) bool { return suggestions[i].Confidence > suggestions[j].Confidence @@ -158,17 +168,25 @@ func groupByType(suggestions []NormSuggestion) *NormSuggestionResult { for _, s := range suggestions { switch s.Norm.NormType { case "A": - result.ANorms = append(result.ANorms, s) + if len(result.ANorms) < maxANorms { + result.ANorms = append(result.ANorms, s) + } case "B1": - result.B1Norms = append(result.B1Norms, s) + if len(result.B1Norms) < maxB1Norms { + result.B1Norms = append(result.B1Norms, s) + } case "B2": - result.B2Norms = append(result.B2Norms, s) + if len(result.B2Norms) < maxB2Norms { + result.B2Norms = append(result.B2Norms, s) + } case "C": - result.CNorms = append(result.CNorms, s) + if len(result.CNorms) < maxCNorms { + result.CNorms = append(result.CNorms, s) + } } } - result.Total = len(suggestions) + result.Total = len(result.ANorms) + len(result.B1Norms) + len(result.B2Norms) + len(result.CNorms) return result }