diff --git a/ai-compliance-sdk/internal/iace/pattern_domain_gates.go b/ai-compliance-sdk/internal/iace/pattern_domain_gates.go index d5492088..fca4a123 100644 --- a/ai-compliance-sdk/internal/iace/pattern_domain_gates.go +++ b/ai-compliance-sdk/internal/iace/pattern_domain_gates.go @@ -65,7 +65,7 @@ var domainGateTerms = map[string]string{ func applyDomainGates(patterns []HazardPattern) []HazardPattern { for i := range patterns { text := normalizeGateText(patterns[i].NameDE + " " + patterns[i].ScenarioDE + " " + - patterns[i].TriggerDE + " " + patterns[i].HarmDE) + patterns[i].TriggerDE + " " + patterns[i].HarmDE + " " + patterns[i].ZoneDE) present := make(map[string]bool, len(patterns[i].RequiredComponentTags)) for _, t := range patterns[i].RequiredComponentTags { diff --git a/ai-compliance-sdk/internal/iace/pattern_domain_gates_test.go b/ai-compliance-sdk/internal/iace/pattern_domain_gates_test.go index 63800a17..65448462 100644 --- a/ai-compliance-sdk/internal/iace/pattern_domain_gates_test.go +++ b/ai-compliance-sdk/internal/iace/pattern_domain_gates_test.go @@ -11,22 +11,23 @@ import ( // type and only generic tags. After applyDomainGates they MUST require a dom_* // tag, so they no longer fire for unrelated machines. func TestDomainGate_NamedLeakersGated(t *testing.T) { - leakers := []string{ - "Quetschen Arm zwischen Pressenteilen", - "Quetschen durch Punktschweisselektroden", - "Laerm bei Glasschneidemaschine", - "Laerm bei Blechbearbeitung (Stanzen)", + // Confirmed cross-domain leakers observed firing for a lift project. (Note: + // "Splitterflug bei Werkzeugbruch" has two patterns sharing the name; the + // one that leaked carries a "Pressraum" zone and is gated via the zone + // scan — verified empirically by the project re-seed, not pinned here to + // avoid catching the unrelated high-pressure plastics variant HP514.) + leakers := map[string]bool{ + "Quetschen Arm zwischen Pressenteilen": true, + "Quetschen durch Punktschweisselektroden": true, + "Laerm bei Glasschneidemaschine": true, + "Laerm bei Blechbearbeitung (Stanzen)": true, } - byName := map[string]HazardPattern{} + seen := map[string]bool{} for _, p := range collectAllPatterns() { - byName[p.NameDE] = p - } - for _, n := range leakers { - p, ok := byName[n] - if !ok { - t.Errorf("leaker pattern %q not found in library", n) + if !leakers[p.NameDE] { continue } + seen[p.NameDE] = true hasDom := false for _, tag := range p.RequiredComponentTags { if strings.HasPrefix(tag, "dom_") { @@ -35,7 +36,12 @@ func TestDomainGate_NamedLeakersGated(t *testing.T) { } } if !hasDom { - t.Errorf("%s (%q) not domain-gated; RequiredComponentTags=%v", p.ID, n, p.RequiredComponentTags) + t.Errorf("%s (%q) not domain-gated; RequiredComponentTags=%v", p.ID, p.NameDE, p.RequiredComponentTags) + } + } + for n := range leakers { + if !seen[n] { + t.Errorf("leaker pattern %q not found in library", n) } } }