test(ai-sdk): GT #3 completeness — 8 shared white-goods hazards + CNC gate
CI / detect-changes (push) Successful in 7s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / build-sha-integrity (push) Successful in 6s
CI / validate-canonical-controls (push) Successful in 4s
CI / loc-budget (push) Successful in 17s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / test-go (push) Successful in 58s
CI / iace-gt-coverage (push) Successful in 15s
CI / test-python-backend (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / detect-changes (push) Successful in 7s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / build-sha-integrity (push) Successful in 6s
CI / validate-canonical-controls (push) Successful in 4s
CI / loc-budget (push) Successful in 17s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / test-go (push) Successful in 58s
CI / iace-gt-coverage (push) Successful in 15s
CI / test-python-backend (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
Phase 1 of the commercial white-goods expansion (EN ISO 10472 family). Extend GT #3 with 8 completeness hazards a Fachmann expects but that were neither in the GT nor previously questioned: dry-run boiler overheating, residual/stored electrical energy, sharp-edge cut, tipping, interlock-failure, unexpected restart, backflow (EN 1717), microbial/legionella. Enrich the UC-M narrative with the real features so existing library patterns can fire. Result: 4/8 auto-covered by existing patterns (dry-run, residual voltage, tipping, interlock-failure) — recall 84% (21/25). Remaining gaps documented: spray-arm contact (4.3), sharp-edge cut (4.6), backflow (2.3), restart (6.4). Gate the re-surfaced CNC leak ("spanende Bearbeitung", high_temperature-only) via dom_cnc. Kistenhub 97.1% and Bremse pinned mappings unchanged. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -27,7 +27,12 @@ const warewashingNarrative = `Gewerbliche Untertisch-Geschirrspuelmaschine fuer
|
||||
`PIN-geschuetzter Servicetechniker-Fernzugriff. Cool-Ausfuehrung mit kalter Nachspuelung. ` +
|
||||
`Untertischmontage. Eingreifen in die Spuelkammer moeglich. Aerosole und Daempfe der ` +
|
||||
`Reinigungschemie gelangen in die Atemzone. Manuelles Be- und Entladen der Spuelkoerbe von Hand. ` +
|
||||
`Reinigung und Wartung durch Servicetechniker. Branche Lebensmittel und Getraenke.`
|
||||
`Reinigung und Wartung durch Servicetechniker. Branche Lebensmittel und Getraenke. ` +
|
||||
`Siebe und scharfe Blechkanten in der Spuelkammer. Boiler kann bei Wassermangel trockenlaufen. ` +
|
||||
`Frequenzumrichter und Elektronik mit Restspannung nach dem Abschalten. Wartung nur im ` +
|
||||
`freigeschalteten Zustand; Gefahr des unerwarteten Wiederanlaufs. Frischwasseranschluss mit ` +
|
||||
`Rueckflussverhinderer gegen Ruecksaugen in das Trinkwassernetz. Stehwasser im Boiler ` +
|
||||
`(Hygiene/Legionellen). Standsicherheit bei Untertischmontage.`
|
||||
|
||||
// warewashingCyberCategories mirrors handlers.nativeCyberSecurityCategories —
|
||||
// native cyber/AI hazards are routed to the CRA module, not the CE hazard log.
|
||||
@@ -134,6 +139,26 @@ func TestWarewashing_GTCoverage(t *testing.T) {
|
||||
t.Logf(" MISS %s: %s", m.Nr, abbrev(m.HazardType, 60))
|
||||
}
|
||||
}
|
||||
|
||||
// Measure completeness: which generated hazards have NO protective measure?
|
||||
t.Logf("--- Measure completeness ---")
|
||||
t.Logf("Measure coverage (GT-matched): %.0f%%", result.MeasureCoverage*100)
|
||||
withMeas := make(map[string]bool)
|
||||
for _, m := range mitigations {
|
||||
withMeas[m.HazardID.String()] = true
|
||||
}
|
||||
noMeasure := 0
|
||||
for _, h := range hazards {
|
||||
if !withMeas[h.ID.String()] {
|
||||
noMeasure++
|
||||
n := h.Name
|
||||
if n == "" {
|
||||
n = h.Scenario
|
||||
}
|
||||
t.Logf(" NO-MEASURE: [%s] %s", h.Category, abbrev(n, 60))
|
||||
}
|
||||
}
|
||||
t.Logf("Hazards without any measure: %d/%d", noMeasure, len(hazards))
|
||||
if len(result.ExtraInEngine) > 0 {
|
||||
t.Logf("--- EXTRA (false positives / precision loss) ---")
|
||||
names := make([]string, 0, len(result.ExtraInEngine))
|
||||
|
||||
Reference in New Issue
Block a user