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
@@ -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