feat: IACE CE-Compliance Module — Normen, Risikobewertung, Production Lines

Major features:
- 215 norms library with section references + Beuth URLs (A/B1/B2/C norms)
- 173 hazard patterns with detail fields (scenario, trigger, harm, zone)
- Deterministic pattern matching: Component × Lifecycle × Pattern cross-product
- SIL/PL auto-calculation from S×E×P risk graph
- Risk assessment table with editable S/E/P dropdowns
- Production Line Dashboard with animated station flow (Running Dots)
- IACE process flow + norms coverage on start page
- Non-blocking cookie banner, ProcessFlow SSR fix
- 104 Playwright E2E tests passing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-07 10:53:26 +02:00
parent 3853a0838a
commit e7f2f98da3
59 changed files with 8326 additions and 525 deletions
@@ -25,6 +25,17 @@ type PatternMatch struct {
PatternName string `json:"pattern_name"`
Priority int `json:"priority"`
MatchedTags []string `json:"matched_tags"`
// Detail fields from the pattern definition
ScenarioDE string `json:"scenario_de,omitempty"`
TriggerDE string `json:"trigger_de,omitempty"`
HarmDE string `json:"harm_de,omitempty"`
AffectedDE string `json:"affected_de,omitempty"`
ZoneDE string `json:"zone_de,omitempty"`
DefaultSeverity int `json:"default_severity,omitempty"`
DefaultExposure int `json:"default_exposure,omitempty"`
HazardCats []string `json:"hazard_categories,omitempty"`
ExpertHintDE string `json:"expert_hint_de,omitempty"`
RequiresExpert bool `json:"requires_expert,omitempty"`
}
// HazardSuggestion is a suggested hazard from pattern matching.
@@ -61,6 +72,7 @@ func NewPatternEngine() *PatternEngine {
patterns = append(patterns, GetCobotHazardPatterns()...) // HP059-HP065 cobot-specific
patterns = append(patterns, GetOperationalHazardPatterns()...) // HP066-HP093 operational states
patterns = append(patterns, GetDGUVExtendedPatterns()...) // HP094-HP133 DGUV themes
patterns = append(patterns, GetExtendedHazardPatterns2()...) // HP134-HP173 additional hazards
return &PatternEngine{
resolver: NewTagResolver(),
patterns: patterns,
@@ -116,10 +128,20 @@ func (e *PatternEngine) Match(input MatchInput) *MatchOutput {
}
matchedPatterns = append(matchedPatterns, PatternMatch{
PatternID: p.ID,
PatternName: p.NameDE,
Priority: p.Priority,
MatchedTags: matchedTags,
PatternID: p.ID,
PatternName: p.NameDE,
Priority: p.Priority,
MatchedTags: matchedTags,
ScenarioDE: p.ScenarioDE,
TriggerDE: p.TriggerDE,
HarmDE: p.HarmDE,
AffectedDE: p.AffectedDE,
ZoneDE: p.ZoneDE,
DefaultSeverity: p.DefaultSeverity,
DefaultExposure: p.DefaultExposure,
HazardCats: p.GeneratedHazardCats,
ExpertHintDE: p.ExpertHintDE,
RequiresExpert: p.RequiresExpertCalculation,
})
for _, cat := range p.GeneratedHazardCats {