feat(iace): manufacturer safety feature library (Stufe A — 50+ entries)

Adds a curated database of safety-relevant features for the major
manufacturers across mechanical/plant engineering, written entirely in
own words with norm anchors. No verbatim manufacturer texts — therefore
no copyright issue:

- Markennennung (§ 23 MarkenG nominative use) is permitted.
- Fakten ueber Produkt-Sicherheitsfunktionen are not protected by § 2
  UrhG (only Werke, not facts).
- NormReferences contain only the identifiers (e.g. "EN ISO 13849-1
  PLd Kat.3"), never the norm text itself.

Coverage (52 entries across 12 categories):
  Industrieroboter (10): FANUC DCS, KUKA SafeOperation, ABB SafeMove,
    Yaskawa FSU, Staeubli CS9, Kawasaki Cubic-S, Mitsubishi MELFA,
    Universal Robots PolyScope, Doosan PRS, Comau SafeNet
  CNC/WZM (8): DMG MORI, Mazak, TRUMPF, Okuma, Hermle, Heidenhain
    SPLC, GROB, Heller
  Pneumatik (4): Festo, SMC, AVENTICS, Parker
  Hydraulik (3): Bosch Rexroth, HAWE, HYDAC
  Safety-PLC / Sicherheitstechnik (8): PILZ, SICK, Schmersal, Euchner,
    Leuze, Phoenix Contact, Banner, Wieland
  Standard-PLC (5): Siemens, Beckhoff, Rockwell, Schneider, B&R
  Pressen (3): Schuler, Bruderer, AIDA
  Spritzguss (3): Arburg, KraussMaffei, ENGEL
  Verpackung (2): Krones, Bosch Packaging/Syntegon
  Laser/Schweissen (3): Bystronic, Amada, Fronius
  Foerdertechnik (2): Interroll, SEW EURODRIVE

Engine integration:
- LookupManufacturerFeaturesInText() scans the project narrative for
  any of the manufacturer aliases (case-insensitive, umlaut-tolerant).
- Init-Handler appends matched feature clarifications to the relevant
  hazard's "Mit Anlagenbauer zu klaeren:" block — for the right
  HazardCategory only (e.g. FANUC DCS only on mechanical_hazard).
- For a Bremse project narrative mentioning "Fanuc Robodrill", the
  engine now adds clarification questions like "Ist DCS am Roboter
  konfiguriert?" to relevant mechanical hazards automatically.

Tests: 7 new pin tests — manufacturer count, norm prefixes, FANUC/KUKA
detection in narrative, umlaut robustness (Staeubli vs Staubli).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-16 23:04:56 +02:00
parent 7e426c31f1
commit e9002175ac
3 changed files with 754 additions and 2 deletions
@@ -219,9 +219,32 @@ func (h *IACEHandler) InitializeProject(c *gin.Context) {
// onto the hazard so the operator knows what to verify
// with the Anlagenbauer.
desc := mp.ScenarioDE
if len(mp.ClarificationQuestionsDE) > 0 {
clarBuckets := mp.ClarificationQuestionsDE
// Manufacturer-specific clarifications: if the narrative
// mentions a known manufacturer (FANUC/KUKA/Siemens/...),
// append its feature-specific questions to the matching
// hazard categories. Markennennung ist nominative use
// (§ 23 MarkenG), Fakten ueber Safety-Features sind nicht
// urheberrechtlich geschuetzt.
for _, mf := range iace.LookupManufacturerFeaturesInText(narrativeText) {
applies := len(mf.AppliesToHazardCats) == 0
for _, hc := range mf.AppliesToHazardCats {
if hc == cat {
applies = true
break
}
}
if !applies {
continue
}
prefix := mf.Manufacturer + " (" + mf.FeatureName + "): "
for _, q := range mf.Clarifications {
clarBuckets = append(clarBuckets, prefix+q)
}
}
if len(clarBuckets) > 0 {
desc += "\n\nMit Anlagenbauer zu klaeren:"
for _, q := range mp.ClarificationQuestionsDE {
for _, q := range clarBuckets {
desc += "\n- " + q
}
}