fix(iace): roadmap group B — citation/license/tier cleanup

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 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-11 15:21:25 +02:00
parent 86c0ea6f63
commit 0f443b6a9c
3 changed files with 23 additions and 19 deletions
@@ -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"},
@@ -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"}},
@@ -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