# IACE CE-Compliance Engine - Entwickler-Dokumentation

## Uebersicht

Die IACE (Inherent-risk Adjusted Control Effectiveness) Engine ist das CE-Konformitaetsmodul fuer Maschinensicherheit. Sie automatisiert die Risikobeurteilung nach ISO 12100 durch deterministische Pattern-Matching-Logik ohne LLM-Abhaengigkeit.

## Architektur

```
Narrative Text → Parser → Tags → PatternEngine → Hazards + Measures + Evidence
                                        ↓
                              RiskEngine → RiskTrajectory
                                        ↓
                            CompletenessGates → Tech-File Export
```

### Kernkomponenten

| Datei | Funktion |
|-------|----------|
| `narrative_parser.go` | Deterministische Extraktion: Komponenten, Energiequellen, Lifecycle, States, Rollen |
| `pattern_engine.go` | PatternEngine mit 1.114 Patterns, State/Role/MachineType-Filtering |
| `engine.go` | RiskEngine: InherentRisk, ControlEffectiveness, ResidualRisk, RiskTrajectory |
| `completeness_gates.go` | 25 Compliance-Gates fuer CE-Export-Freigabe |
| `tag_resolver.go` | Tag-Aufloesung: ComponentID → Tags, EnergyID → Tags, Evidence-Bibliothek |
| `measures_library*.go` | 476 Schutzmassnahmen (8 Dateien) |
| `hazard_patterns*.go` | 1.114 Gefaehrdungsmuster (38+ Dateien) |

## Bibliotheken (Stand Phase 3+4)

| Bibliothek | Anzahl | Dateien |
|-----------|--------|---------|
| Hazard Patterns | 1.114 | `hazard_patterns*.go` (38 Dateien) |
| Schutzmassnahmen | 476 | `measures_library*.go` (8 Dateien) |
| Evidenztypen | 55 | `tag_resolver.go` (E01-E55) |
| Operationale Zustaende | 9 | `pattern_engine.go` |
| Menschliche Rollen | 6 | `hazard_pattern_types.go` |
| Maschinentypen (explizit) | 13+ | CNC, Dreh, Fraes, Schleifen, Schweissen, Holz, Oberfläche, Druck, Pumpe, ... |

## Datenmodell

### HazardPattern (hazard_pattern_types.go)

```go
type HazardPattern struct {
    ID                    string   // z.B. "HP1400"
    NameDE, NameEN        string
    RequiredComponentTags []string // AND-Logik
    RequiredEnergyTags    []string // AND-Logik
    RequiredLifecycles    []string // OR-Logik (mind. 1 muss matchen)
    ExcludedComponentTags []string // NOT-Logik
    GeneratedHazardCats   []string // Output-Kategorien
    SuggestedMeasureIDs   []string // Verweis auf ProtectiveMeasureEntry.ID
    SuggestedEvidenceIDs  []string // Verweis auf EvidenceTypeInfo.ID
    Priority              int
    MachineTypes          []string // nil = feuert fuer alle Typen
    OperationalStates     []string // nil = feuert in allen Zustaenden
    StateTransitions      []string // Format: "from→to"
    HumanRoles            []string // nil = feuert fuer alle Rollen
    // Detail-Felder fuer Hazard-Erzeugung
    ScenarioDE, TriggerDE, HarmDE, AffectedDE, ZoneDE string
    DefaultSeverity, DefaultExposure int
}
```

### ProtectiveMeasureEntry (models_api.go)

```go
type ProtectiveMeasureEntry struct {
    ID             string
    ReductionType  string          // "design", "protection", "protective", "information"
    SubType        string          // z.B. "geometry", "fixed_guard", "ppe"
    Name           string
    Description    string
    HazardCategory string
    NormReferences []string
    RiskReduction  *RiskReduction  // Suppression Engine Profil
    Mandatory      bool
    MandatoryNorm  string
}

type RiskReduction struct {
    SeverityDelta    int  // z.B. -2 (reduziert Schwere um 2 Stufen)
    ExposureDelta    int  // z.B. -2 (reduziert Exposition um 2 Stufen)
    ProbabilityDelta int  // z.B. -1 (reduziert Wahrscheinlichkeit um 1 Stufe)
}
```

### MatchInput / MatchOutput (pattern_engine.go)

```go
type MatchInput struct {
    ComponentLibraryIDs []string
    EnergySourceIDs     []string
    LifecyclePhases     []string
    CustomTags          []string
    OperationalStates   []string  // Filter: nur Patterns fuer diese Zustaende
    StateTransitions    []string  // Filter: nur Patterns fuer diese Uebergaenge
    HumanRoles          []string  // Filter: nur Patterns fuer diese Rollen
}
```

## Operational State Graph

9 Standard-Betriebszustaende mit 20 Transitions:

```
startup → homing → automatic_operation ↔ manual_operation
                          ↕                     ↕
                    teach_mode              maintenance
                          ↕                     ↕
                      cleaning          emergency_stop → recovery_mode
```

Patterns mit `OperationalStates` feuern nur im passenden Zustand. Beispiel:
- HP073 "Wartung ohne LOTO" → nur in `maintenance`
- HP068 "Unerwarteter Wiederanlauf" → nur in `recovery_mode`/`emergency_stop` + StateTransition `maintenance→automatic_operation`

## Human Interaction Model

6 Rollen: `operator`, `maintenance_tech`, `programmer`, `cleaning_staff`, `bystander`, `supervisor`

Patterns mit `HumanRoles` feuern nur wenn die Rolle im Projekt vorhanden ist. Beispiel:
- HP062 "Fehlprogrammierung" → nur fuer `programmer`
- HP073 "LOTO-Fehler" → nur fuer `maintenance_tech`

## Suppression Engine (Risk Trajectory)

Die `RiskTrajectory` berechnet schrittweise Risikoreduktion entlang der ISO 12100 Hierarchie:

```
Inharent: S=4, E=4, P=3 → 48 (high)
→ Nach Design:      S=3, E=3, P=3 → 27 (medium)   // M001 S-1,E-1 + M012 S-2
→ Nach Schutz:      S=3, E=1, P=2 → 6 (low)       // M067 E-2,P-1
→ Nach Information:  S=3, E=1, P=1 → 3 (negligible) // M161 P-1
```

Jede Massnahme hat ein `RiskReduction`-Profil. Deltas werden pro Stufe kumuliert, jeder Parameter auf Minimum 1 geclampt.

## API-Endpoints (IACE)

| Methode | Pfad | Funktion |
|---------|------|----------|
| POST | `/projects/:id/initialize` | Narrative parsen → Patterns matchen → Hazards/Measures erzeugen |
| POST | `/projects/:id/parse-narrative` | Nur parsen (ohne DB-Schreiben) |
| GET | `/projects/:id/hazards` | Alle Gefaehrdungen listen |
| POST | `/projects/:id/hazards/:hid/mitigations` | Massnahme einer Gefaehrdung zuordnen |
| GET | `/projects/:id/completeness` | 25 Compliance-Gates pruefen |
| POST | `/projects/:id/tech-file/sections/:type` | Tech-File-Abschnitt generieren |
| GET | `/projects/:id/tech-file/export/:format` | CE-Akte exportieren (PDF/DOCX/MD/XLSX) |

## Tests ausfuehren

```bash
# Go Unit + Integration Tests
cd ai-compliance-sdk
go test ./internal/iace/... -v

# Playwright E2E (gegen Live Mac Mini)
cd admin-compliance
npx playwright test e2e/specs/iace-module.spec.ts --config e2e/playwright-live.config.ts

# Alle IACE E2E Tests
npx playwright test e2e/specs/iace-*.spec.ts --config e2e/playwright-live.config.ts
```

## Dateien nach Funktion

### Massnahmen-Bibliothek (476 Massnahmen)
| Datei | IDs | Inhalt |
|-------|-----|--------|
| `measures_library.go` | M001-M060 | Design (Geometrie, Kraft, Material, Ergonomie, Steuerung, Fluid, Laerm) |
| `measures_library_ext.go` | M061-M216 | Schutz + Information + Phase-1B |
| `measures_library_mandatory.go` | MN001-MN025 | Norm-Pflichtmassnahmen |
| `measures_library_trbs.go` | M217-M301 | TRBS 1111/1201/2111/2121/2131/2141/2152 |
| `measures_library_osha.go` | M302-M371 | OSHA Machine Guarding, LOTO, Electrical, Robots, Noise, Ergo, Pressure |
| `measures_library_trgs.go` | M372-M382 | TRGS Gefahrstoffe (Substitution, Absaugung, Hautschutz, Lagerung) |
| `measures_library_supplementary.go` | M383-M403 | RAG-Gap: Brandschutz, Laser, MSR-Cyber, Instandhaltung, ASR |
| `measures_library_metalworking.go` | M404-M421 | CNC/Metalworking (KSS, Schleifen, Schweissen) |
| `measures_library_vdma.go` | M422-M451 | VDMA: Holz, Oberfläche, Druck, Pumpen |

### Pattern-Dateien (1.114 Patterns)
| Datei-Gruppe | IDs | Inhalt |
|-------------|-----|--------|
| `hazard_patterns.go` | HP001-HP044 | Basis-Patterns |
| `hazard_patterns_extended*.go` | HP045-HP173 | Erweiterte Patterns |
| `hazard_patterns_cobot.go` | HP059-HP065 | Cobot-spezifisch |
| `hazard_patterns_operational.go` | HP066-HP093 | Stoerung, Wartung, LOTO |
| `hazard_patterns_cnc*.go` | HP1400-HP1434 | CNC/Metalworking/Schweissen |
| `hazard_patterns_vdma.go` | HP1500-HP1549 | Holz, Oberfläche, Druck, Pumpen |
| ... (30+ weitere Dateien) | | Branchen, Cyber, AI, Final-Patterns |
