From 0f443b6a9c35a0655ce373ab30d7eb2ba3b99e10 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Thu, 11 Jun 2026 15:21:25 +0200 Subject: [PATCH] =?UTF-8?q?fix(iace):=20roadmap=20group=20B=20=E2=80=94=20?= =?UTF-8?q?citation/license/tier=20cleanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit C1: drop the misleading OSHA §1910.212(a)(5) fan-guard citation from M602 (overhead lift clearance) — EN 349 + EN ISO 13854 already cover it. C2: frame M237's 25/500 mm as Richtwerte to be determined per EN ISO 13854 (single factual values in prose are facts, not table reproduction — but keep the conservative caveat). C3: keep ergonomic W=2 deliberately and document why — ESAW ranks it the most frequent non-fatal mode (24.7%) but that population doesn't transfer to an acute machine point-hazard; the machine GT governs. Co-Authored-By: Claude Opus 4.7 --- .../iace/measures_library_lift_endstop.go | 1 - .../internal/iace/measures_library_trbs.go | 2 +- .../internal/iace/risk_estimation.go | 39 +++++++++++-------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/ai-compliance-sdk/internal/iace/measures_library_lift_endstop.go b/ai-compliance-sdk/internal/iace/measures_library_lift_endstop.go index 166baec0..3314ea99 100644 --- a/ai-compliance-sdk/internal/iace/measures_library_lift_endstop.go +++ b/ai-compliance-sdk/internal/iace/measures_library_lift_endstop.go @@ -78,7 +78,6 @@ func getLiftEndstopMeasures() []ProtectiveMeasureEntry { NormReferences: []string{ "EN 349 (Mindestabstaende gegen Quetschen von Koerperteilen)", "EN ISO 13854 (Mindestabstaende gegen Quetschen)", - "OSHA 29 CFR 1910.212(a)(5) (Lueftergitter ≤ 1/2 in als Anker)", }, RiskReduction: &RiskReduction{SeverityDelta: -2, ExposureDelta: -1}, Tags: []string{"crush_point", "gravity_risk"}, diff --git a/ai-compliance-sdk/internal/iace/measures_library_trbs.go b/ai-compliance-sdk/internal/iace/measures_library_trbs.go index 61a0a6e5..9516d9b4 100644 --- a/ai-compliance-sdk/internal/iace/measures_library_trbs.go +++ b/ai-compliance-sdk/internal/iace/measures_library_trbs.go @@ -37,7 +37,7 @@ func getTRBSMeasures() []ProtectiveMeasureEntry { // ══════════════════════════════════════════════════════════════ // TRBS 2111 — Mechanische Gefaehrdungen (20 Massnahmen) // ══════════════════════════════════════════════════════════════ - {ID: "M237", ReductionType: "design", SubType: "geometry", Name: "Quetschstellen durch Mindestabstaende vermeiden", Description: "Mindestabstaende zwischen beweglichen und feststehenden Teilen werden so bemessen, dass kein Koerperteil eingequetscht werden kann.", HazardCategory: "mechanical", Examples: []string{"Mindestabstand 25 mm fuer Finger", "500 mm Abstand fuer Koerper"}, NormReferences: []string{"TRBS 2111 — Mechanische Gefaehrdungen", "ISO 13854"}}, + {ID: "M237", ReductionType: "design", SubType: "geometry", Name: "Quetschstellen durch Mindestabstaende vermeiden", Description: "Mindestabstaende zwischen beweglichen und feststehenden Teilen werden so bemessen, dass kein Koerperteil eingequetscht werden kann. Konkrete Werte sind Richtwerte und nach EN ISO 13854 eigenstaendig zu ermitteln.", HazardCategory: "mechanical", Examples: []string{"Mindestabstand 25 mm fuer Finger (Richtwert)", "500 mm Abstand fuer Koerper (Richtwert)"}, NormReferences: []string{"TRBS 2111 — Mechanische Gefaehrdungen", "ISO 13854"}}, {ID: "M238", ReductionType: "design", SubType: "geometry", Name: "Scherstellen durch konstruktive Aenderung beseitigen", Description: "Scherstellen zwischen gegenlaeufig bewegten Teilen werden durch Geometrieaenderung oder Wegfall der Relativbewegung eliminiert.", HazardCategory: "mechanical", Examples: []string{"Messerkanten mit Abdeckung versehen", "Gegenlaeufige Walzen entkoppeln"}, NormReferences: []string{"TRBS 2111 — Mechanische Gefaehrdungen", "ISO 12100 — Geometrie und Anordnung"}}, {ID: "M239", ReductionType: "design", SubType: "geometry", Name: "Einzugsstellen an Walzen sichern", Description: "Walzenpaare und Walze-Flaeche-Kombinationen erhalten Schutzeinrichtungen die das Einziehen von Koerperteilen verhindern.", HazardCategory: "mechanical", Examples: []string{"Zugangsschutz am Walzenspalt", "Einlauftrichter mit Sicherheitsabstand"}, NormReferences: []string{"TRBS 2111 — Mechanische Gefaehrdungen", "ISO 13857"}}, {ID: "M240", ReductionType: "design", SubType: "geometry", Name: "Fangstellen an rotierenden Teilen verhindern", Description: "Hervorstehende Teile an rotierenden Wellen Kupplungen und Schwungraedern werden bündig gestaltet oder eingekapselt.", HazardCategory: "mechanical", Examples: []string{"Wellenenden bündig abdrehen", "Kupplungsschutz montieren"}, NormReferences: []string{"TRBS 2111 — Mechanische Gefaehrdungen", "ISO 14120"}}, diff --git a/ai-compliance-sdk/internal/iace/risk_estimation.go b/ai-compliance-sdk/internal/iace/risk_estimation.go index b8633d89..0d7b1ecd 100644 --- a/ai-compliance-sdk/internal/iace/risk_estimation.go +++ b/ai-compliance-sdk/internal/iace/risk_estimation.go @@ -52,18 +52,23 @@ type contactMode struct { var contactModeTable = map[string]contactMode{ // name W P S (S = GT-calibrated typical severity) "impact_stationary": {"impact_stationary", 3, 1, 2}, - "struck_by": {"struck_by", 2, 3, 3}, // GT n=14 (S̄ 2.5) - "crushing": {"crushing", 2, 3, 2}, // GT n=40 (S̄ 2.2) + "struck_by": {"struck_by", 2, 3, 3}, // GT n=14 (S̄ 2.5) + "crushing": {"crushing", 2, 3, 2}, // GT n=40 (S̄ 2.2) "cutting": {"cutting", 2, 3, 3}, "entanglement": {"entanglement", 3, 3, 3}, - "shearing": {"shearing", 2, 3, 3}, // GT n=4 (S̄ 3.2) + "shearing": {"shearing", 2, 3, 3}, // GT n=4 (S̄ 3.2) "fall": {"fall", 3, 4, 3}, - "electrical": {"electrical", 2, 3, 4}, // GT n=20 (S̄ 3.6) + "electrical": {"electrical", 2, 3, 4}, // GT n=20 (S̄ 3.6) "thermal": {"thermal", 2, 2, 2}, - "ergonomic": {"ergonomic", 2, 3, 2}, - "chemical": {"chemical", 2, 3, 2}, - "pressure_burst": {"pressure_burst", 2, 3, 2}, - "radiation": {"radiation", 2, 3, 3}, + // W stays 2 deliberately: ESAW 2023 ranks ergonomic/stress the most frequent + // NON-FATAL contact mode (24.7%), but that population mixes overexertion across + // all workplaces and does not transfer to an ACUTE machine point-hazard. The + // machine-specific GT governs; bumping W to 3 would import a non-representative + // signal. See risk_data_sources.go / project_iace_risk_stats_and_distances. + "ergonomic": {"ergonomic", 2, 3, 2}, + "chemical": {"chemical", 2, 3, 2}, + "pressure_burst": {"pressure_burst", 2, 3, 2}, + "radiation": {"radiation", 2, 3, 3}, } // contactModeKeywords maps umlaut-normalised scenario keywords to a contact @@ -89,16 +94,16 @@ var contactModeKeywords = []struct { // categoryDefaultMode is the fallback contact mode per hazard category when the // scenario text carries no specific kinematic keyword. var categoryDefaultMode = map[string]string{ - "mechanical_hazard": "crushing", - "electrical_hazard": "electrical", - "thermal_hazard": "thermal", - "chemical_hazard": "chemical", + "mechanical_hazard": "crushing", + "electrical_hazard": "electrical", + "thermal_hazard": "thermal", + "chemical_hazard": "chemical", "material_environmental": "chemical", - "ergonomic": "ergonomic", - "noise_vibration": "ergonomic", - "radiation_hazard": "radiation", - "fire_explosion": "thermal", - "pneumatic_hydraulic": "pressure_burst", + "ergonomic": "ergonomic", + "noise_vibration": "ergonomic", + "radiation_hazard": "radiation", + "fire_explosion": "thermal", + "pneumatic_hydraulic": "pressure_burst", } // DetectContactMode classifies a hazard's injury mechanism from its scenario