{
"event": "PreToolUse",
"tool_name": "Edit",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/codequality\/ist-soll-analyse.md",
"old_string": "## Executive Summary\n\nDas bestehende Hook-System deckt **ca. 60%** der definierten Prinzipien durch automatisierte Kontrollen ab. Die verbleibenden 40% erfordern entweder erweiterte Hooks, externe Tools oder sind prinzipiell nicht automatisierbar (Design-Review erforderlich).",
"new_string": "## Executive Summary\n\nDas Hook-System deckt nach Phase 1 Implementation **ca. 66%** der definierten Prinzipien durch automatisierte Kontrollen ab. Die verbleibenden 34% erfordern entweder Phase 2 Erweiterungen, externe Tools oder sind prinzipiell nicht automatisierbar (Design-Review erforderlich).\n\n### Phase 1 Status: ABGESCHLOSSEN\n\n| Neue Regel | Typ | Prinzip | Status |\n|------------|-----|---------|--------|\n| P8.1-P8.5 | BLOCK | Deterministic (time, date, rand) | Aktiv |\n| P8.6-P8.9 | BLOCK | No Global State (global, GLOBALS, SESSION) | Aktiv |\n| W8.1-W8.5 | WARN | Fail Fast (empty catch, @-operator) | Aktiv |\n| W15.1-W15.6 | WARN | Least Surprise (getter sideeffects, naming) | Aktiv |\n\n**Neue Regeln:** +11 Pre-Hook, +11 Post-Hook = **26 → 37 PHP-Regeln, 16 → 31 Warn-Regeln**"
}
}
{
"tool_response": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/codequality\/ist-soll-analyse.md",
"oldString": "## Executive Summary\n\nDas bestehende Hook-System deckt **ca. 60%** der definierten Prinzipien durch automatisierte Kontrollen ab. Die verbleibenden 40% erfordern entweder erweiterte Hooks, externe Tools oder sind prinzipiell nicht automatisierbar (Design-Review erforderlich).",
"newString": "## Executive Summary\n\nDas Hook-System deckt nach Phase 1 Implementation **ca. 66%** der definierten Prinzipien durch automatisierte Kontrollen ab. Die verbleibenden 34% erfordern entweder Phase 2 Erweiterungen, externe Tools oder sind prinzipiell nicht automatisierbar (Design-Review erforderlich).\n\n### Phase 1 Status: ABGESCHLOSSEN\n\n| Neue Regel | Typ | Prinzip | Status |\n|------------|-----|---------|--------|\n| P8.1-P8.5 | BLOCK | Deterministic (time, date, rand) | Aktiv |\n| P8.6-P8.9 | BLOCK | No Global State (global, GLOBALS, SESSION) | Aktiv |\n| W8.1-W8.5 | WARN | Fail Fast (empty catch, @-operator) | Aktiv |\n| W15.1-W15.6 | WARN | Least Surprise (getter sideeffects, naming) | Aktiv |\n\n**Neue Regeln:** +11 Pre-Hook, +11 Post-Hook = **26 → 37 PHP-Regeln, 16 → 31 Warn-Regeln**",
"originalFile": "# IST-SOLL Analyse: Qualitätskontroll-System\n\n**Datum:** 2025-12-28\n**Aktualisiert:** 2025-12-28 (Phase 1 implementiert)\n**Basis:** `richtlinien.md` (15 Prinzipien) + Hook-System\n\n---\n\n## Executive Summary\n\nDas bestehende Hook-System deckt **ca. 60%** der definierten Prinzipien durch automatisierte Kontrollen ab. Die verbleibenden 40% erfordern entweder erweiterte Hooks, externe Tools oder sind prinzipiell nicht automatisierbar (Design-Review erforderlich).\n\n---\n\n## 1. IST-Zustand: Bestehendes Hook-System\n\n### 1.1 Architektur\n\n```\n\/var\/www\/tools\/ki-protokoll\/claude-hook\/\n├── hook_dispatcher.py ← Einstiegspunkt (settings.json)\n├── architecture_guard.py ← Legacy H-Regeln\n├── block_direct_db.py ← MCP-DB Enforcement\n├── task_completion_guard.py ← Task-Workflow Enforcement\n├── file_backup_hook.py ← Automatische Backups\n├── log_to_db.py ← Session-Protokollierung\n└── quality\/\n ├── pre_rules.py ← BLOCK-Regeln (Master)\n ├── pre_rules_guard.py ← P1.x SRP\/KISS\n ├── pre_rules_mvc.py ← P2.x MVC\/CRUD\n ├── pre_rules_validation.py ← P3.x PSR\/Types\n ├── pre_rules_layers.py ← P6.x SOLID\/DIP + H2-H5\n ├── pre_rules_htmx.py ← HTMX-Contract\n ├── pre_rules_constants.py ← Magic Numbers\n ├── pre_rules_python.py ← Python-Regeln\n ├── post_rules.py ← WARN-Regeln (Master)\n ├── rules_quality.py ← W1.x Metriken\n ├── rules_security.py ← W2.x Security\n ├── rules_style.py ← W4.x Style\n ├── rules_constants.py ← W7.x Constants\n ├── task_creator.py ← Violations → Tasks\n └── full_scan.py ← Codebase-Scan CLI\n```\n\n### 1.2 Aktive Regeln\n\n#### Pre-Hook (BLOCK) - 24 Regeln\n\n| ID | Regel | Scope | Prinzip |\n|----|-------|-------|---------|\n| H1 | strict_types erforderlich | *.php | Explicit |\n| H2 | Domain ohne Infrastructure | \/Domain\/ | Clean Architecture |\n| H3 | DatabaseFactory nur in Factory | !Factory\/ | Separation of Concerns |\n| H4 | Kein new Repository in Controller | \/Controller\/ | DIP |\n| H5 | Kein new Infrastructure in Controller | \/Controller\/ | DIP |\n| P1.1 | @responsibility Header | *.php | SRP |\n| P1.2 | Müllhalden-Namen blockiert | *.php | KISS |\n| P2.1 | Kein SQL in Controller | \/Controller\/ | Separation of Concerns |\n| P2.2 | Keine Transaktionen in Controller | \/Controller\/ | Separation of Concerns |\n| P2.3 | Kein echo\/print in Controller | \/Controller\/ | MVC |\n| P2.4 | Keine DB-Artefakte in UseCases | \/UseCases\/ | DIP |\n| P3.1 | strict_types in ersten Zeilen | *.php | Explicit |\n| P3.2 | Namespace = Pfad | *.php | Explicit |\n| P3.3 | Klassenname = Dateiname | *.php | Explicit |\n| P3.4 | Public Methods Return-Type | *.php | Explicit |\n| P4.1 | Keine public Properties in Domain | \/Domain\/ | OOP\/Encapsulation |\n| P6.1 | UseCases ohne Infrastructure-Import | \/UseCases\/ | DIP |\n| P6.2 | Domain ohne Application-Import | \/Domain\/ | Clean Architecture |\n| HTMX-C1 | hx-post mit CSRF | *.php | Security |\n| HTMX-C2 | hx-delete mit CSRF | *.php | Security |\n| HTMX-C3 | hx-patch mit CSRF | *.php | Security |\n| HTMX-C4 | hx-delete mit confirm | *.php | Fail Safe |\n| HTMX-C5 | hx-put mit CSRF | *.php | Security |\n| P7.x | Magic Numbers blockiert | *.php | DRY |\n\n#### Post-Hook (WARN) - 16 Regeln\n\n| ID | Regel | Schwelle | Prinzip |\n|----|-------|----------|---------|\n| W1.1 | Klassengröße (LOC) | > 300 | SRP |\n| W1.2 | Public Methods | > 10 | SRP |\n| W1.3 | Constructor Parameters | > 5 | Cohesion |\n| W1.4 | Dependencies (use) | > 10 | Stable Dependencies |\n| W1.5 | Verdächtige Namen | Manager, And | KISS |\n| W2.1 | Business-Keywords in Controller | - | Separation of Concerns |\n| W2.2 | Private Methods in Controller | > 5 | MVC |\n| W3.1 | Untypisierte Parameter | - | Explicit |\n| W3.3 | mixed Type | - | Explicit |\n| W4.1 | Anämisches Model | > 70% Accessors | OOP |\n| W4.2 | Klasse ohne Verhalten | 0 real methods | OOP |\n| W4.3 | Niedrige Kapselung | > 50% exposed | OOP |\n| W4.4 | Hohe Static-Ratio | > 50% | OOP |\n| W5.1 | Wiederholte Strings | > 20 chars, > 3x | DRY |\n| W5.2 | Magic Numbers (Warn) | nicht Common, > 2x | DRY |\n| W6.1 | Interface-Methoden | > 7 | Interface Segregation |\n\n#### Externe Checks (Bash-Scripts)\n\n| Script | Prüft | Prinzip |\n|--------|-------|---------|\n| php-check.sh | PHPStan, CS-Fixer, Semgrep, Audit | Deterministic, Fail Fast |\n| contract-check.sh | View-Structure, Layers, Docs | Separation of Concerns |\n| di-check.sh | UseCase Dependencies | DIP |\n| interface-check.sh | Interface-Implementierung | Clean Architecture |\n\n---\n\n## 2. Prinzipien-Abdeckung\n\n### 2.1 Mapping: Richtlinien → Kontrollen\n\n| # | Prinzip | Abdeckung | Kontrolle | Status |\n|---|---------|-----------|-----------|--------|\n| 1 | **Explicit is Better than Implicit** | **90%** | H1, P3.1-P3.4, W3.1, W3.3 | ✅ Gut |\n| 2 | **Deterministic Behavior** | **30%** | PHPStan (extern) | ⚠️ Lücke |\n| 3 | **DRY** | **50%** | P7.x, W5.1, W5.2, Constants | ⚠️ Teilweise |\n| 4 | **Separation of Concerns** | **80%** | H2-H5, P2.x, P6.x, MVC-Checks | ✅ Gut |\n| 5 | **Clean Architecture** | **70%** | H2, P6.1, P6.2, Layer-Checks | ✅ Gut |\n| 6 | **Stable Dependencies** | **60%** | W1.4, P6.x, DI-Check | ⚠️ Teilweise |\n| 7 | **Fail Fast** | **40%** | Teilweise durch strict_types | ⚠️ Lücke |\n| 8 | **Fail Safe** | **30%** | HTMX-C4 (confirm) | ⚠️ Lücke |\n| 9 | **KISS** | **70%** | P1.2, W1.x Metriken | ✅ Gut |\n| 10 | **Make Trade-offs Explicit** | **10%** | Nur via @responsibility | ❌ Lücke |\n| 11 | **SRP** | **80%** | P1.1, P1.2, W1.1-W1.5 | ✅ Gut |\n| 12 | **YAGNI** | **0%** | Nicht automatisierbar | ❌ Design-Review |\n| 13 | **Cohesion over Coupling** | **50%** | W1.3, W1.4, W6.2 | ⚠️ Teilweise |\n| 14 | **Test Isolation** | **0%** | Keine Kontrolle | ❌ Lücke |\n| 15 | **Least Surprise Principle** | **20%** | P3.2, P3.3 (Naming) | ⚠️ Lücke |\n\n### 2.2 Zusammenfassung\n\n| Kategorie | Anzahl | Anteil |\n|-----------|--------|--------|\n| ✅ Gut abgedeckt (≥70%) | 6 | 40% |\n| ⚠️ Teilweise abgedeckt (30-69%) | 6 | 40% |\n| ❌ Nicht abgedeckt (<30%) | 3 | 20% |\n\n---\n\n## 3. SOLL-Zustand: Lücken schließen\n\n### 3.1 Automatisierbare Lücken\n\n#### Deterministic Behavior (Priorität 2)\n\n**Problem:** Keine Prüfung auf versteckten globalen Zustand, nicht-deterministische Funktionen.\n\n**Lösung:**\n\n```python\n# Pre-Hook P8.1: Verbiete problematische Funktionen\nFORBIDDEN_FUNCTIONS = [\n r\"\\btime\\s*\\(\", # Verwende Clock-Interface\n r\"\\bdate\\s*\\(\", # Verwende Clock-Interface\n r\"\\brand\\s*\\(\", # Verwende RandomGenerator-Interface\n r\"\\bmt_rand\\s*\\(\", # Verwende RandomGenerator-Interface\n r\"\\bglobal\\s+\\$\", # Kein global keyword\n r\"\\$GLOBALS\\b\", # Keine GLOBALS\n]\n```\n\n**Aufwand:** Klein (1 Modul)\n\n---\n\n#### Fail Fast (Priorität 7)\n\n**Problem:** Keine Prüfung auf frühe Validierung, stille Fehler.\n\n**Lösung:**\n\n```python\n# Post-Hook W8.1: Warnung bei leerem catch\nSILENT_CATCH = r\"catch\\s*\\([^)]+\\)\\s*\\{\\s*\\}\"\n\n# Post-Hook W8.2: Warnung bei @ Error Suppression\nERROR_SUPPRESSION = r\"@\\$\\w+|@[a-z_]+\\s*\\(\"\n```\n\n**Aufwand:** Klein (1 Modul)\n\n---\n\n#### Fail Safe (Priorität 8)\n\n**Problem:** Keine Prüfung auf Eskalations-Schutz, Ressourcen-Cleanup.\n\n**Lösung:**\n\n```python\n# Post-Hook W9.1: Warnung bei fehlenden finally-Blöcken\n# (wenn try mit file\/db handles)\n\n# Pre-Hook P9.1: set_exception_handler muss vorhanden sein\n# (in Bootstrap-Dateien)\n```\n\n**Aufwand:** Mittel (Kontext-Analyse)\n\n---\n\n#### Cohesion over Coupling (Priorität 13)\n\n**Problem:** Coupling-Messung über Dateigrenzen fehlt.\n\n**Lösung:**\n\n```python\n# Post-Hook W13.1: Afferent\/Efferent Coupling\n# Erfordert Cross-File-Analyse\n\n# Alternative: PHPMetrics als externes Tool\n```\n\n**Aufwand:** Groß (neues Tool oder Cross-File-Hook)\n\n---\n\n#### Test Isolation (Priorität 14)\n\n**Problem:** Keine Prüfung auf Test-Seiteneffekte.\n\n**Lösung:**\n\n```python\n# Pre-Hook P14.1: Tests dürfen keine Produktions-DB nutzen\n# Pattern in \/tests\/: Verbiete ki_content, ki_dev ohne _test Suffix\n\n# Post-Hook W14.1: Warnung bei fehlenden tearDown-Methoden\n```\n\n**Aufwand:** Klein (1 Modul für Tests)\n\n---\n\n#### Least Surprise (Priorität 15)\n\n**Problem:** Keine Prüfung auf überraschende Seiteneffekte.\n\n**Lösung:**\n\n```python\n# Post-Hook W15.1: Getter mit Seiteneffekten\nGETTER_WITH_SIDEEFFECT = [\n r\"function\\s+get\\w+\\([^)]*\\)\\s*[^{]*\\{[^}]*(?:save|update|delete|insert|write)\",\n]\n\n# Post-Hook W15.2: Setter ohne set-Präfix\n```\n\n**Aufwand:** Klein (Pattern-Matching)\n\n---\n\n### 3.2 Nicht automatisierbare Prinzipien\n\n| Prinzip | Grund | Lösung |\n|---------|-------|--------|\n| **YAGNI** | Semantisch: \"Wird das gebraucht?\" | Code-Review-Checklist |\n| **Make Trade-offs Explicit** | Dokumentations-Problem | Review-Pflicht für PRs |\n| **Observable Failure** | Semantisch: \"Ist der Fehler verständlich?\" | Logging-Guidelines |\n\n---\n\n## 4. Implementierungsplan\n\n### Phase 1: Quick Wins (Woche 1-2)\n\n| Priorität | Regel | Aufwand | Prinzip-Abdeckung |\n|-----------|-------|---------|-------------------|\n| HOCH | P8.1 Deterministic Functions | 2h | Deterministic +40% |\n| HOCH | W8.1 Silent Catch | 1h | Fail Fast +20% |\n| HOCH | W8.2 Error Suppression | 1h | Fail Fast +20% |\n| MITTEL | W15.1 Getter Sideeffects | 2h | Least Surprise +30% |\n\n**Ergebnis:** Deterministic 70%, Fail Fast 80%, Least Surprise 50%\n\n---\n\n### Phase 2: Test-Quality (Woche 3-4)\n\n| Priorität | Regel | Aufwand | Prinzip-Abdeckung |\n|-----------|-------|---------|-------------------|\n| HOCH | P14.1 Test-DB-Isolation | 3h | Test Isolation +50% |\n| MITTEL | W14.1 TearDown-Check | 2h | Test Isolation +30% |\n\n**Ergebnis:** Test Isolation 80%\n\n---\n\n### Phase 3: Advanced (Monat 2)\n\n| Priorität | Aktion | Aufwand | Prinzip-Abdeckung |\n|-----------|--------|---------|-------------------|\n| MITTEL | PHPMetrics Integration | 4h | Cohesion +30% |\n| NIEDRIG | Trade-off Documentation | Review-Prozess | Explicit +50% |\n\n---\n\n## 5. Kontroll-Übersicht nach Implementierung\n\n### 5.1 Ziel-Zustand\n\n| # | Prinzip | I... [TRUNCATED-ac9761f29ec38cfb]",
"structuredPatch": [
{
"oldStart": 8,
"oldLines": 8,
"newStart": 8,
"newLines": 19,
"lines": [
" ",
" ## Executive Summary",
" ",
"-Das bestehende Hook-System deckt **ca. 60%** der definierten Prinzipien durch automatisierte Kontrollen ab. Die verbleibenden 40% erfordern entweder erweiterte Hooks, externe Tools oder sind prinzipiell nicht automatisierbar (Design-Review erforderlich).",
"+Das Hook-System deckt nach Phase 1 Implementation **ca. 66%** der definierten Prinzipien durch automatisierte Kontrollen ab. Die verbleibenden 34% erfordern entweder Phase 2 Erweiterungen, externe Tools oder sind prinzipiell nicht automatisierbar (Design-Review erforderlich).",
" ",
"+### Phase 1 Status: ABGESCHLOSSEN",
"+",
"+| Neue Regel | Typ | Prinzip | Status |",
"+|------------|-----|---------|--------|",
"+| P8.1-P8.5 | BLOCK | Deterministic (time, date, rand) | Aktiv |",
"+| P8.6-P8.9 | BLOCK | No Global State (global, GLOBALS, SESSION) | Aktiv |",
"+| W8.1-W8.5 | WARN | Fail Fast (empty catch, @-operator) | Aktiv |",
"+| W15.1-W15.6 | WARN | Least Surprise (getter sideeffects, naming) | Aktiv |",
"+",
"+**Neue Regeln:** +11 Pre-Hook, +11 Post-Hook = **26 → 37 PHP-Regeln, 16 → 31 Warn-Regeln**",
"+",
" ---",
" ",
" ## 1. IST-Zustand: Bestehendes Hook-System"
]
}
],
"userModified": false,
"replaceAll": false
}
}