feat(ai-sdk): IACE warewashing hazard patterns + cross-domain gating
Add commercial-dishwasher hazard patterns (HP2200-HP2206): hot-water/steam scald on door opening, hot surfaces, hot ware, corrosive detergent/rinse-aid burn, respiratory irritation, door pinch and wet-floor slip — each gated by dom_warewashing so they never leak into other machine classes. Add the matching warewashing protective measures (M2200-M2208). Tighten capability-domain gating: emit dom_flame/dom_glue and add welding surface-form gate terms (schweissarbeitsplatz, schweissfunke, lichtbogenzone, ...) so the welding/flame/glue burn patterns stop leaking into thermal-capable machines such as a dishwasher. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,132 @@
|
|||||||
|
package iace
|
||||||
|
|
||||||
|
// GetWarewashingPatterns returns hazard patterns for commercial warewashing
|
||||||
|
// machines (gewerbliche Geschirrspuelmaschinen / Untertisch-, Hauben-, Korb-
|
||||||
|
// und Bandspuelmaschinen). These capture the machine-specific hazards a
|
||||||
|
// Fachmann immediately expects but that the generic library did not cover:
|
||||||
|
// hot-water/steam scalding on door opening, hot surfaces, hot ware, corrosive
|
||||||
|
// detergent/rinse-aid contact, door pinch and wet-floor slipping.
|
||||||
|
//
|
||||||
|
// Every pattern is gated by the capability tag "dom_warewashing" (emitted only
|
||||||
|
// by warewashing narrative keywords in keyword_dictionary.go), so none of these
|
||||||
|
// leak into unrelated machine classes.
|
||||||
|
//
|
||||||
|
// HP range: HP2200-HP2206. ISO 12100 Annex B section identifiers only (facts);
|
||||||
|
// product standard EN 60335-2-58 (commercial dishwashing machines).
|
||||||
|
func GetWarewashingPatterns() []HazardPattern {
|
||||||
|
return []HazardPattern{
|
||||||
|
{
|
||||||
|
ID: "HP2200", NameDE: "Verbruehung durch Heisswasser/Dampf beim Oeffnen der Tuer", NameEN: "Scalding by hot water/steam when opening the door",
|
||||||
|
RequiredComponentTags: []string{"dom_warewashing", "steam_emission"},
|
||||||
|
GeneratedHazardCats: []string{"thermal_hazard"},
|
||||||
|
SuggestedMeasureIDs: []string{"M2200", "M2201", "M2202", "M2208"},
|
||||||
|
Priority: 94,
|
||||||
|
ApplicableLifecycles: []string{"normal_operation", "cleaning"},
|
||||||
|
ScenarioDE: "Beim Oeffnen der Tuer waehrend oder unmittelbar nach dem Spuelgang tritt ein Schwall aus heissem Wasser und Wrasen (Dampf) aus der Spuelkammer aus und trifft Gesicht, Haende und Arme des Bedieners.",
|
||||||
|
TriggerDE: "Tuer wird vor Programmende oder bei noch vorhandenem Restdampf geoeffnet; Tuerverriegelung fehlt oder ist ueberbrueckt; Nachspueltemperatur ca. 85 Grad C.",
|
||||||
|
HarmDE: "Verbruehung 1.-2. Grades an Gesicht, Haenden und Unterarmen; Augenreizung durch heissen Dampf.",
|
||||||
|
AffectedDE: "Bedienpersonal (Spuelkraft)",
|
||||||
|
ZoneDE: "Tuer- und Beschickungsoeffnung der Spuelkammer",
|
||||||
|
ISO12100Section: "6.2.4",
|
||||||
|
DefaultSeverity: 3, DefaultExposure: 4,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "HP2201", NameDE: "Verbrennung an heissen Oberflaechen (Boiler/Tank/Spuelkammer)", NameEN: "Burn on hot surfaces (boiler/tank/wash chamber)",
|
||||||
|
RequiredComponentTags: []string{"dom_warewashing", "high_temperature"},
|
||||||
|
GeneratedHazardCats: []string{"thermal_hazard"},
|
||||||
|
SuggestedMeasureIDs: []string{"M2202", "M055", "M2208"},
|
||||||
|
Priority: 90,
|
||||||
|
ApplicableLifecycles: []string{"cleaning", "maintenance"},
|
||||||
|
ScenarioDE: "Beruehrung heisser Oberflaechen von Boiler, Tankheizkoerper oder Spuelkammerwaenden bei Reinigung, Entkalkung oder Wartung fuehrt zu Kontaktverbrennungen.",
|
||||||
|
TriggerDE: "Reinigung/Entkalkung ohne Abkuehlzeit; Eingriff in die Spuelkammer bei betriebswarmem Geraet.",
|
||||||
|
HarmDE: "Kontaktverbrennung an Haenden und Unterarmen.",
|
||||||
|
AffectedDE: "Reinigungspersonal, Wartungspersonal",
|
||||||
|
ZoneDE: "Boiler, Tankheizkoerper, Spuelkammerwaende",
|
||||||
|
ISO12100Section: "6.2.4",
|
||||||
|
DefaultSeverity: 2, DefaultExposure: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "HP2202", NameDE: "Verbrennung an heissem Spuelgut beim Entladen", NameEN: "Burn on hot ware when unloading",
|
||||||
|
RequiredComponentTags: []string{"dom_warewashing", "hot_water"},
|
||||||
|
GeneratedHazardCats: []string{"thermal_hazard"},
|
||||||
|
SuggestedMeasureIDs: []string{"M2202", "M055", "M2208"},
|
||||||
|
Priority: 86,
|
||||||
|
ApplicableLifecycles: []string{"normal_operation"},
|
||||||
|
ScenarioDE: "Geschirr, Glaeser und Bestecke sind nach dem Spuelgang durch die Heisswasser-Nachspuelung sehr heiss; beim Entladen kommt es zu Verbrennungen.",
|
||||||
|
TriggerDE: "Sofortiges Entnehmen des Spuelguts nach Programmende ohne Abkuehl-/Trocknungszeit.",
|
||||||
|
HarmDE: "Verbrennung an Haenden/Fingern beim Greifen heisser Teile.",
|
||||||
|
AffectedDE: "Bedienpersonal (Spuelkraft)",
|
||||||
|
ZoneDE: "Spuelkammer, Entnahmebereich/Korb",
|
||||||
|
ISO12100Section: "6.2.4",
|
||||||
|
DefaultSeverity: 2, DefaultExposure: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "HP2203", NameDE: "Chemische Veraetzung (Haut/Augen) durch Reiniger-/Klarspueler-Konzentrat", NameEN: "Chemical burn (skin/eyes) from detergent/rinse-aid concentrate",
|
||||||
|
RequiredComponentTags: []string{"dom_warewashing", "corrosive_chemical"},
|
||||||
|
GeneratedHazardCats: []string{"chemical_risk"},
|
||||||
|
SuggestedMeasureIDs: []string{"M2203", "M2204", "M2208"},
|
||||||
|
Priority: 92,
|
||||||
|
ApplicableLifecycles: []string{"normal_operation", "maintenance"},
|
||||||
|
ScenarioDE: "Direkter Kontakt mit dem aetzenden (alkalischen) Reiniger- bzw. Klarspueler-Konzentrat beim Nachfuellen, Sauglanzenwechsel oder bei Leckage fuehrt zu Veraetzungen von Haut und Augen.",
|
||||||
|
TriggerDE: "Gebinde-/Sauglanzenwechsel ohne Schutzausruestung; Umfuellen von Konzentrat; undichte Dosierleitung.",
|
||||||
|
HarmDE: "Veraetzung von Haut und Augen (alkalische Verletzung), bleibende Augenschaeden moeglich.",
|
||||||
|
AffectedDE: "Bedienpersonal, Reinigungspersonal beim Chemikalien-Handling",
|
||||||
|
ZoneDE: "Dosiergeraet, Reiniger-/Klarspueler-Gebinde, Sauglanzen",
|
||||||
|
ISO12100Section: "6.2.4",
|
||||||
|
DefaultSeverity: 3, DefaultExposure: 3,
|
||||||
|
ClarificationQuestionsDE: []string{
|
||||||
|
"Liegt fuer alle eingesetzten Reiniger/Klarspueler/Entkalker ein aktuelles Sicherheitsdatenblatt (SDB) am Geraet vor?",
|
||||||
|
"Ist ein geschlossenes Dosiersystem mit Sauglanzen vorhanden, sodass kein Umfuellen noetig ist?",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "HP2204", NameDE: "Reizung/Veraetzung der Atemwege durch Reinigungs-Aerosole/Daempfe", NameEN: "Respiratory irritation from cleaning aerosols/vapours",
|
||||||
|
RequiredComponentTags: []string{"dom_warewashing", "corrosive_chemical"},
|
||||||
|
GeneratedHazardCats: []string{"chemical_risk"},
|
||||||
|
SuggestedMeasureIDs: []string{"M2205", "M2203", "M2204"},
|
||||||
|
Priority: 82,
|
||||||
|
ApplicableLifecycles: []string{"normal_operation", "maintenance"},
|
||||||
|
ScenarioDE: "Aerosole und Daempfe der Reinigungschemie (insbesondere beim Oeffnen kurz nach dem Spuelgang oder bei der Entkalkung mit Saeure) gelangen in die Atemzone und reizen Atemwege und Schleimhaeute.",
|
||||||
|
TriggerDE: "Oeffnen bei laufender/heisser Chemie; Entkalkung mit Saeure; unzureichende Lueftung des Aufstellbereichs.",
|
||||||
|
HarmDE: "Reizung von Atemwegen, Augen und Schleimhaeuten; bei Saeure-/Laugen-Vermischung gefaehrliche Gase.",
|
||||||
|
AffectedDE: "Bedienpersonal, Reinigungspersonal",
|
||||||
|
ZoneDE: "Atemzone vor der Spuelkammer, Aufstellbereich",
|
||||||
|
ISO12100Section: "6.2.4",
|
||||||
|
DefaultSeverity: 2, DefaultExposure: 2,
|
||||||
|
ClarificationQuestionsDE: []string{
|
||||||
|
"Ist der Aufstellbereich ausreichend be-/entlueftet (Kuechenlueftung)?",
|
||||||
|
"Wird in der BA vor dem Vermischen von Reiniger und Entkalker/Saeure gewarnt?",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "HP2205", NameDE: "Quetschen der Finger an der Tuer/Haube", NameEN: "Finger crushing at the door/hood",
|
||||||
|
RequiredComponentTags: []string{"dom_warewashing", "access_door"},
|
||||||
|
GeneratedHazardCats: []string{"mechanical_hazard"},
|
||||||
|
SuggestedMeasureIDs: []string{"M2206", "M003", "M2208"},
|
||||||
|
Priority: 78,
|
||||||
|
ApplicableLifecycles: []string{"normal_operation"},
|
||||||
|
ScenarioDE: "Beim Schliessen der Tuer bzw. Absenken der Haube werden Finger zwischen Tuer/Haube und Gehaeuse gequetscht.",
|
||||||
|
TriggerDE: "Greifen in den Schliessbereich beim Schliessen; hohe Schliesskraft der Haube; scharfe Kanten.",
|
||||||
|
HarmDE: "Quetschung und Prellung der Finger.",
|
||||||
|
AffectedDE: "Bedienpersonal (Spuelkraft)",
|
||||||
|
ZoneDE: "Tuer-/Haubenkante, Schliessbereich",
|
||||||
|
ISO12100Section: "6.2.3",
|
||||||
|
DefaultSeverity: 1, DefaultExposure: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "HP2206", NameDE: "Ausrutschen auf nassem Boden (Wasseraustritt/Leckage)", NameEN: "Slipping on wet floor (water leakage)",
|
||||||
|
RequiredComponentTags: []string{"dom_warewashing"},
|
||||||
|
GeneratedHazardCats: []string{"mechanical_hazard"},
|
||||||
|
SuggestedMeasureIDs: []string{"M2207", "M538", "M2208"},
|
||||||
|
Priority: 76,
|
||||||
|
ApplicableLifecycles: []string{"normal_operation", "cleaning", "maintenance"},
|
||||||
|
ScenarioDE: "Aus der Spuelmaschine austretendes Wasser (Beschickung, Tuer oeffnen, Leckage, Tankwasserwechsel) macht den Boden im Aufstellbereich rutschig; der Bediener rutscht aus.",
|
||||||
|
TriggerDE: "Wasseraustritt beim Oeffnen/Beschicken; undichter Ablauf; fehlender Bodenablauf.",
|
||||||
|
HarmDE: "Sturz mit Prellungen, Knochenbruechen oder Kopfaufprall.",
|
||||||
|
AffectedDE: "Bedienpersonal, Reinigungspersonal",
|
||||||
|
ZoneDE: "Aufstell- und Bedienbereich der Spuelmaschine",
|
||||||
|
ISO12100Section: "6.3.5.6",
|
||||||
|
DefaultSeverity: 2, DefaultExposure: 3,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
package iace
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
// firedSet runs the engine for the given custom tags and returns the set of
|
||||||
|
// fired pattern IDs.
|
||||||
|
func firedSet(customTags []string) map[string]bool {
|
||||||
|
engine := NewPatternEngine()
|
||||||
|
out := engine.Match(MatchInput{CustomTags: customTags})
|
||||||
|
fired := make(map[string]bool, len(out.MatchedPatterns))
|
||||||
|
for _, m := range out.MatchedPatterns {
|
||||||
|
fired[m.PatternID] = true
|
||||||
|
}
|
||||||
|
return fired
|
||||||
|
}
|
||||||
|
|
||||||
|
// A warewashing narrative emits these capability + functional tags.
|
||||||
|
var warewashingTags = []string{
|
||||||
|
"dom_warewashing", "steam_emission", "hot_water", "high_temperature",
|
||||||
|
"corrosive_chemical", "access_door", "rotating_part",
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWarewashing_PatternsFireForDishwasher(t *testing.T) {
|
||||||
|
fired := firedSet(warewashingTags)
|
||||||
|
want := []string{"HP2200", "HP2201", "HP2202", "HP2203", "HP2204", "HP2205", "HP2206"}
|
||||||
|
for _, id := range want {
|
||||||
|
if !fired[id] {
|
||||||
|
t.Errorf("expected warewashing pattern %s to fire for a dishwasher, but it did not", id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWarewashing_PatternsDoNotLeakIntoOtherMachines(t *testing.T) {
|
||||||
|
// A machine with thermal + electrical + chemical capability but NOT a
|
||||||
|
// dishwasher must never produce warewashing hazards (dom_warewashing gate).
|
||||||
|
fired := firedSet([]string{"high_temperature", "electrical_part", "chemical_risk", "rotating_part", "moving_part"})
|
||||||
|
for _, id := range []string{"HP2200", "HP2201", "HP2202", "HP2203", "HP2204", "HP2205", "HP2206"} {
|
||||||
|
if fired[id] {
|
||||||
|
t.Errorf("warewashing pattern %s leaked into a non-dishwasher machine", id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWarewashing_WeldingAndGlueDoNotLeakIntoDishwasher(t *testing.T) {
|
||||||
|
// The gate-term additions must stop the welding/flame/glue burn patterns
|
||||||
|
// from firing for a dishwasher (they previously leaked via high_temperature
|
||||||
|
// / electrical_part). dom_welding/dom_flame/dom_glue are absent here.
|
||||||
|
fired := firedSet(warewashingTags)
|
||||||
|
leak := map[string]string{
|
||||||
|
"HP530": "Lichtbogen-Verbrennung (Schweissen)",
|
||||||
|
"HP532": "Schweissrauch",
|
||||||
|
"HP533": "Brand durch Schweissfunken (Schweissen)",
|
||||||
|
}
|
||||||
|
for id, name := range leak {
|
||||||
|
if fired[id] {
|
||||||
|
t.Errorf("cross-domain pattern %s (%s) leaked into a dishwasher", id, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWarewashing_MeasureIDsExist(t *testing.T) {
|
||||||
|
lib := GetProtectiveMeasureLibrary()
|
||||||
|
have := make(map[string]bool, len(lib))
|
||||||
|
for _, m := range lib {
|
||||||
|
have[m.ID] = true
|
||||||
|
}
|
||||||
|
for _, p := range GetWarewashingPatterns() {
|
||||||
|
for _, mid := range p.SuggestedMeasureIDs {
|
||||||
|
if !have[mid] {
|
||||||
|
t.Errorf("pattern %s references measure %s which is not in the library", p.ID, mid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWarewashing_NarrativeEmitsTags(t *testing.T) {
|
||||||
|
// Closes the loop: a realistic dishwasher description must emit the tags
|
||||||
|
// the warewashing patterns gate on (otherwise the patterns are dead).
|
||||||
|
narrative := "Gewerbliche Untertisch-Geschirrspuelmaschine mit Heisswasser-Boiler " +
|
||||||
|
"und Nachspuelung ca. 85 Grad C, Spuelpumpe mit rotierenden Spuelfeldern, " +
|
||||||
|
"Dampf-/Wrasenabgabe beim Oeffnen, Reiniger und Klarspueler ueber Dosiergeraet, " +
|
||||||
|
"Tuer mit Sicherheitsschalter, Eingreifen in die Spuelkammer."
|
||||||
|
res := ParseNarrative(narrative, "Gewerbliche Geschirrspuelmaschine")
|
||||||
|
got := make(map[string]bool, len(res.CustomTags))
|
||||||
|
for _, tag := range res.CustomTags {
|
||||||
|
got[tag] = true
|
||||||
|
}
|
||||||
|
for _, want := range []string{"dom_warewashing", "steam_emission", "hot_water", "corrosive_chemical", "access_door", "rotating_part"} {
|
||||||
|
if !got[want] {
|
||||||
|
t.Errorf("narrative did not emit expected tag %q (got %v)", want, res.CustomTags)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// And it must NOT emit any welding/flame/glue domain that would re-open leaks.
|
||||||
|
for _, bad := range []string{"dom_welding", "dom_flame", "dom_glue"} {
|
||||||
|
if got[bad] {
|
||||||
|
t.Errorf("dishwasher narrative unexpectedly emitted cross-domain tag %q", bad)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWarewashing_NewMeasuresPresent(t *testing.T) {
|
||||||
|
lib := GetProtectiveMeasureLibrary()
|
||||||
|
have := make(map[string]bool, len(lib))
|
||||||
|
for _, m := range lib {
|
||||||
|
have[m.ID] = true
|
||||||
|
}
|
||||||
|
for _, mid := range []string{"M2200", "M2201", "M2202", "M2203", "M2204", "M2205", "M2206", "M2207", "M2208"} {
|
||||||
|
if !have[mid] {
|
||||||
|
t.Errorf("expected warewashing measure %s to be registered in the library", mid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -88,6 +88,21 @@ func GetKeywordDictionary() []KeywordEntry {
|
|||||||
{Keywords: []string{"folienwickler", "wickelmaschine", "konfektioniermaschine", "folienverpackung", "wellpappe"}, ExtraTags: []string{"dom_converting"}},
|
{Keywords: []string{"folienwickler", "wickelmaschine", "konfektioniermaschine", "folienverpackung", "wellpappe"}, ExtraTags: []string{"dom_converting"}},
|
||||||
{Keywords: []string{"bergbau", "untertage", "tunnelbau", "off-grid"}, ExtraTags: []string{"dom_remote"}},
|
{Keywords: []string{"bergbau", "untertage", "tunnelbau", "off-grid"}, ExtraTags: []string{"dom_remote"}},
|
||||||
{Keywords: []string{"asbest", "asbestsanierung", "asbestexposition"}, ExtraTags: []string{"dom_asbestos"}},
|
{Keywords: []string{"asbest", "asbestsanierung", "asbestexposition"}, ExtraTags: []string{"dom_asbestos"}},
|
||||||
|
{Keywords: []string{"gasbrenner", "brennerbetrieb", "offene flamme", "flammhaert", "abflammen", "flammrichten"}, ExtraTags: []string{"dom_flame"}},
|
||||||
|
{Keywords: []string{"heissleim", "heissleimanlage", "schmelzkleber", "schmelzklebstoff", "klebstoffschmelzer", "leimwerk"}, ExtraTags: []string{"dom_glue"}},
|
||||||
|
|
||||||
|
// ── Gewerbliche Spuelmaschine / Warewashing ──────────────────────
|
||||||
|
// dom_warewashing gates the warewashing-specific patterns
|
||||||
|
// (hazard_patterns_warewashing.go) so they never leak into other
|
||||||
|
// machine classes. The functional tags (hot_water, steam_emission,
|
||||||
|
// corrosive_chemical, access_door) are the within-domain triggers.
|
||||||
|
{Keywords: []string{"spuelmaschine", "geschirrspuelmaschine", "geschirrspueler", "haubenspuelmaschine", "untertischspuelmaschine", "korbspuelmaschine", "bandspuelmaschine", "glaeserspuelmaschine", "bistrospuelmaschine", "warewashing", "dishwasher"}, ExtraTags: []string{"dom_warewashing"}},
|
||||||
|
{Keywords: []string{"heisswasser", "nachspuelung", "nachspueltemperatur", "spuelgang", "spuelzyklus", "thermostopp", "thermostop"}, ExtraTags: []string{"hot_water", "high_temperature"}},
|
||||||
|
{Keywords: []string{"dampf", "wrasen", "schwaden", "brueden"}, ExtraTags: []string{"steam_emission", "high_temperature"}},
|
||||||
|
{Keywords: []string{"boiler", "spuelboiler", "nachspuelboiler", "tankheiz", "boilerheiz"}, ComponentIDs: []string{"C094"}, ExtraTags: []string{"heating_element", "high_temperature"}},
|
||||||
|
{Keywords: []string{"reiniger", "klarspueler", "spuelmittel", "reinigungsmittel", "reinigerkonzentrat", "spuelchemie", "dosiergeraet", "dosierpumpe", "sauglanze", "entkalker"}, ExtraTags: []string{"corrosive_chemical"}},
|
||||||
|
{Keywords: []string{"spuelarm", "spuelfeld", "wascharm", "spruehfeld"}, ComponentIDs: []string{"C004"}, ExtraTags: []string{"rotating_part"}},
|
||||||
|
{Keywords: []string{"spuelkammer", "spueltuer", "geraetetuer", "haubentuer", "klapptuer"}, ExtraTags: []string{"access_door"}},
|
||||||
// Ghost-Closure (Emit-Seite): macht die 34 toten Required-Tags
|
// Ghost-Closure (Emit-Seite): macht die 34 toten Required-Tags
|
||||||
// emittierbar, jeweils NUR via domaenenspezifische Keywords -> die 120
|
// emittierbar, jeweils NUR via domaenenspezifische Keywords -> die 120
|
||||||
// Ghost-Patterns feuern wieder, aber nur fuer ihre echte Maschine (kein
|
// Ghost-Patterns feuern wieder, aber nur fuer ihre echte Maschine (kein
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ func GetProtectiveMeasureLibrary() []ProtectiveMeasureEntry {
|
|||||||
all = append(all, getGTBremseMeasures()...) // GT-Bremse-Coverage-Gaps (M483-M522)
|
all = append(all, getGTBremseMeasures()...) // GT-Bremse-Coverage-Gaps (M483-M522)
|
||||||
all = append(all, GetCRAMeasures()...) // CRA / DIN EN 40000-1-2 cyber-resilience (M540-M548)
|
all = append(all, GetCRAMeasures()...) // CRA / DIN EN 40000-1-2 cyber-resilience (M540-M548)
|
||||||
all = append(all, getLiftEndstopMeasures()...) // Lift/hoist endstop (M600-M604) — bridges OSHA MD library
|
all = append(all, getLiftEndstopMeasures()...) // Lift/hoist endstop (M600-M604) — bridges OSHA MD library
|
||||||
|
all = append(all, getWarewashingMeasures()...) // Commercial dishwasher (M2200-M2208) — scald/chemical/door/slip
|
||||||
return all
|
return all
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
package iace
|
||||||
|
|
||||||
|
// getWarewashingMeasures returns protective measures for commercial warewashing
|
||||||
|
// machines (gewerbliche Geschirrspuelmaschinen): hot-water/steam scalding,
|
||||||
|
// hot surfaces, corrosive cleaning chemicals, door pinch and wet-floor slip.
|
||||||
|
// They complement the generic thermal/mechanical/material measures with the
|
||||||
|
// machine-specific controls a Fachmann expects for this product class.
|
||||||
|
//
|
||||||
|
// M-ID range: M2200-M2208. Norm identifiers only (facts) — no norm text is
|
||||||
|
// reproduced (DIN/Beuth license). Lead standard: EN 60335-2-58 (safety of
|
||||||
|
// commercial electric dishwashing machines).
|
||||||
|
func getWarewashingMeasures() []ProtectiveMeasureEntry {
|
||||||
|
return []ProtectiveMeasureEntry{
|
||||||
|
{ID: "M2200", ReductionType: "design", SubType: "interlock",
|
||||||
|
Name: "Tuer-/Haubenverriegelung beendet Spuelgang vor dem Oeffnen",
|
||||||
|
Description: "Die Tuer bzw. Haube ist so mit der Steuerung verriegelt, dass beim Oeffnen Spuelpumpe und Nachspuelung sofort abschalten und ein Oeffnen erst nach Programmende (bzw. nach Abbau des Restdampfs) freigegeben wird. Verhindert den Schwall aus Heisswasser/Wrasen und den Kontakt mit noch rotierenden Spuelfeldern.",
|
||||||
|
HazardCategory: "thermal",
|
||||||
|
Examples: []string{"Tuerkontaktschalter schaltet Pumpe + Heizung beim Oeffnen ab", "Rastposition mit Restdampf-Verzoegerung vor Freigabe"},
|
||||||
|
NormReferences: []string{"EN 60335-2-58", "EN ISO 12100 — Inhaerent sichere Konstruktion"}},
|
||||||
|
{ID: "M2201", ReductionType: "design", SubType: "thermal",
|
||||||
|
Name: "Wrasen-/Dampfreduzierung (Kondensations- / Waermerueckgewinnungssystem)",
|
||||||
|
Description: "Der beim Oeffnen austretende Wrasen wird durch ein Kondensations- bzw. Waermerueckgewinnungssystem reduziert, sodass beim Entnehmen kein gefaehrlicher Dampfschwall entsteht. Senkt zugleich die Restwaerme- und Feuchtebelastung am Arbeitsplatz.",
|
||||||
|
HazardCategory: "thermal",
|
||||||
|
Examples: []string{"Umluft-Waermerueckgewinnung reduziert austretenden Wrasen", "Kondensationshaube ueber der Spuelkammer"},
|
||||||
|
NormReferences: []string{"EN 60335-2-58"}},
|
||||||
|
{ID: "M2202", ReductionType: "protection", SubType: "monitoring",
|
||||||
|
Name: "Thermostop / Temperaturueberwachung von Boiler und Tank",
|
||||||
|
Description: "Boiler- und Tanktemperatur werden ueberwacht; ein Thermostop gibt den naechsten Schritt erst frei, wenn die Solltemperatur erreicht ist, und begrenzt die maximale Nachspueltemperatur. Schuetzt vor Verbruehung durch unkontrolliert heisses Nachspuelwasser.",
|
||||||
|
HazardCategory: "thermal",
|
||||||
|
Examples: []string{"Temperatursensor in Boiler und Tank mit Abschaltgrenze", "Thermostop-Funktion im Spuelprogramm"},
|
||||||
|
NormReferences: []string{"EN 60335-2-58", "EN ISO 13732-1"}},
|
||||||
|
{ID: "M2203", ReductionType: "design", SubType: "containment",
|
||||||
|
Name: "Geschlossenes Dosiersystem mit Sauglanzen und Niveauueberwachung",
|
||||||
|
Description: "Reiniger und Klarspueler werden ausschliesslich ueber ein geschlossenes Dosiersystem mit Sauglanzen aus dem Originalgebinde gefoerdert (Niveau-Ueberwachung statt Umfuellen). Direkter Haut-/Augenkontakt mit dem aetzenden Konzentrat beim Nachfuellen wird konstruktiv vermieden.",
|
||||||
|
HazardCategory: "material_environmental",
|
||||||
|
Examples: []string{"Sauglanze mit Leermeldung im Reiniger-Kanister", "Kein Umfuellen — Gebindewechsel ohne offenen Chemiekontakt"},
|
||||||
|
NormReferences: []string{"EN 60335-2-58", "Verordnung (EG) Nr. 1272/2008 (CLP/GHS)"}},
|
||||||
|
{ID: "M2204", ReductionType: "information", SubType: "ppe",
|
||||||
|
Name: "PSA (Augen-/Hautschutz) + GHS-Kennzeichnung und Sicherheitsdatenblatt",
|
||||||
|
Description: "Fuer Handhabung, Gebindewechsel und Entkalkung werden Augen- und Handschutz vorgeschrieben; Reiniger/Klarspueler/Entkalker sind GHS-gekennzeichnet und das Sicherheitsdatenblatt liegt am Geraet vor. Stellt die sichere Handhabung der aetzenden Konzentrate sicher.",
|
||||||
|
HazardCategory: "material_environmental",
|
||||||
|
Examples: []string{"Schutzbrille + chemikalienbestaendige Handschuhe bei Gebindewechsel", "GHS-Etikett und SDB im Chemikalienschrank am Geraet"},
|
||||||
|
NormReferences: []string{"Verordnung (EG) Nr. 1272/2008 (CLP/GHS)", "TRGS 500"}},
|
||||||
|
{ID: "M2205", ReductionType: "protection", SubType: "ventilation",
|
||||||
|
Name: "Be-/Entlueftung bzw. geschlossene Haube gegen Chemie-Aerosole und Wrasen",
|
||||||
|
Description: "Der Aufstellbereich ist ausreichend be- und entlueftet bzw. die Spuelkammer bleibt waehrend des Programms geschlossen, sodass Reinigungs-Aerosole und heisser Wrasen nicht in die Atemzone des Bedieners gelangen.",
|
||||||
|
HazardCategory: "material_environmental",
|
||||||
|
Examples: []string{"Kuechenlueftung ueber dem Spuelbereich", "Programmstart nur bei geschlossener Haube"},
|
||||||
|
NormReferences: []string{"EN 60335-2-58", "TRGS 500"}},
|
||||||
|
{ID: "M2206", ReductionType: "design", SubType: "geometry",
|
||||||
|
Name: "Tuerkanten mit geringer Schliesskraft / Einklemmschutz",
|
||||||
|
Description: "Die Tuer-/Haubenmechanik ist so gestaltet (gefuehrte Bewegung, begrenzte Schliesskraft, abgerundete Kanten), dass beim Schliessen keine Finger gequetscht werden.",
|
||||||
|
HazardCategory: "mechanical",
|
||||||
|
Examples: []string{"Gefuehrte Haube mit gedaempfter Schliessbewegung", "Abgerundete Tuerkanten ohne Quetschspalt"},
|
||||||
|
NormReferences: []string{"EN 60335-2-58", "EN ISO 12100 — Geometrie und Anordnung"}},
|
||||||
|
{ID: "M2207", ReductionType: "design", SubType: "environment",
|
||||||
|
Name: "Rutschhemmender Bodenbelag + Ablauf/Leckagewanne im Aufstellbereich",
|
||||||
|
Description: "Im Aufstell- und Bedienbereich der Spuelmaschine sorgen rutschhemmender Bodenbelag und ein definierter Ablauf bzw. eine Leckagewanne dafuer, dass austretendes Wasser nicht zur Sturzgefahr wird.",
|
||||||
|
HazardCategory: "mechanical",
|
||||||
|
Examples: []string{"Rutschhemmender Industrieboden (Bewertungsgruppe R11/R12)", "Bodenablauf bzw. Leckagewanne unter dem Geraet"},
|
||||||
|
NormReferences: []string{"ASR A1.5/1,2", "DGUV Regel 108-003"}},
|
||||||
|
{ID: "M2208", ReductionType: "information", SubType: "signage",
|
||||||
|
Name: "Warnhinweis heisser Dampf/Heisswasser — Tuer erst nach Programmende oeffnen",
|
||||||
|
Description: "Am Geraet und in der Betriebsanleitung wird vor heissem Dampf und Heisswasser gewarnt und das Oeffnen der Tuer erst nach Programmende mit vorsichtigem Anheben vorgeschrieben. Sprachneutrale Piktogramme ergaenzen den Hinweis.",
|
||||||
|
HazardCategory: "general",
|
||||||
|
Examples: []string{"Warnpiktogramm 'Heisser Dampf' an der Tuer", "BA-Hinweis 'Tuer nach Programmende langsam oeffnen'"},
|
||||||
|
NormReferences: []string{"ISO 7010", "EN 60335-2-58"}},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -46,6 +46,20 @@ var domainGateTerms = map[string]string{
|
|||||||
"widerstandsschweiss": "dom_welding", "lichtbogenschweiss": "dom_welding",
|
"widerstandsschweiss": "dom_welding", "lichtbogenschweiss": "dom_welding",
|
||||||
"schutzgasschweiss": "dom_welding", "punktschweiss": "dom_welding",
|
"schutzgasschweiss": "dom_welding", "punktschweiss": "dom_welding",
|
||||||
"schweisselektrod": "dom_welding", "elektrodenspalt": "dom_welding",
|
"schweisselektrod": "dom_welding", "elektrodenspalt": "dom_welding",
|
||||||
|
// Schweissen — Oberflaechenformen die bisher ungegatet leakten (z.B. in
|
||||||
|
// thermische Hazards einer Spuelmaschine ueber high_temperature/electrical_part)
|
||||||
|
"schweissarbeitsplatz": "dom_welding", "schweissfunke": "dom_welding",
|
||||||
|
"schweisshelm": "dom_welding", "schweisserschutz": "dom_welding",
|
||||||
|
"lichtbogenzone": "dom_welding", "lichtbogen-verbrennung": "dom_welding",
|
||||||
|
"schweissrauch": "dom_welding", "schweissgeraet": "dom_welding",
|
||||||
|
"schweisszone": "dom_welding", "schweissbrenner": "dom_welding",
|
||||||
|
"schweissspritzer": "dom_welding", "schweissstrom": "dom_welding",
|
||||||
|
// Offene Flamme / Brenner (Gasbrenner, Flammhaerten, Abflammen)
|
||||||
|
"offene flamme": "dom_flame", "brennerbereich": "dom_flame",
|
||||||
|
"flammenzone": "dom_flame", "gasbrenner": "dom_flame",
|
||||||
|
// Heissleim / Schmelzkleber
|
||||||
|
"heissleimanlage": "dom_glue", "klebstoffschmelzer": "dom_glue",
|
||||||
|
"heisskleber": "dom_glue", "schmelzkleber": "dom_glue",
|
||||||
// Solar / PV
|
// Solar / PV
|
||||||
"pv-modul": "dom_solar", "photovoltaik": "dom_solar", "pv-anlage": "dom_solar",
|
"pv-modul": "dom_solar", "photovoltaik": "dom_solar", "pv-anlage": "dom_solar",
|
||||||
"dc-steckverbindung": "dom_solar", "solarmodul": "dom_solar",
|
"dc-steckverbindung": "dom_solar", "solarmodul": "dom_solar",
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ func collectAllPatterns() []HazardPattern {
|
|||||||
patterns = append(patterns, GetCRAPatterns()...) // HP1910-HP1918 CRA / DIN EN 40000-1-2 cyber-resilience spur
|
patterns = append(patterns, GetCRAPatterns()...) // HP1910-HP1918 CRA / DIN EN 40000-1-2 cyber-resilience spur
|
||||||
patterns = append(patterns, GetSecondaryHarmDemoPatterns()...) // HP2000-HP2001 secondary harm chain demos (Cola splitter, Pharma)
|
patterns = append(patterns, GetSecondaryHarmDemoPatterns()...) // HP2000-HP2001 secondary harm chain demos (Cola splitter, Pharma)
|
||||||
patterns = append(patterns, GetLiftEndstopPatterns()...) // HP2100-HP2102 lift body-part crush at endstops
|
patterns = append(patterns, GetLiftEndstopPatterns()...) // HP2100-HP2102 lift body-part crush at endstops
|
||||||
|
patterns = append(patterns, GetWarewashingPatterns()...) // HP2200-HP2206 commercial dishwasher (scald/chemical/door/slip)
|
||||||
patterns = applyMachineTypeOverrides(patterns) // Fill MachineTypes on legacy patterns to prevent drift
|
patterns = applyMachineTypeOverrides(patterns) // Fill MachineTypes on legacy patterns to prevent drift
|
||||||
patterns = applyDomainGates(patterns) // Capability-domain gate: stop domain-specific patterns leaking cross-machine
|
patterns = applyDomainGates(patterns) // Capability-domain gate: stop domain-specific patterns leaking cross-machine
|
||||||
return patterns
|
return patterns
|
||||||
|
|||||||
Reference in New Issue
Block a user