Protokoll #7050

ID7050
Zeitstempel2025-12-23 07:45:07.571414
Clientroot
IP145.224.96.190
Modellclaude-sonnet-4-20250514
Statuscompleted
Tokens5,918 (Input: 1,138, Output: 4,780)
Dauer91 ms
Request-Zeit2025-12-23 07:45:07.571414
Response-Zeit2025-12-23 07:45:07.662612

Request

{
    "event": "PreToolUse",
    "tool_name": "Edit",
    "tool_input": {
        "file_path": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/plan-code-quality-gates.md",
        "old_string": "# Implementierungs-Übersicht\n\n## Alle Prüfungen\n\n| # | Prüfung | Pre-Hook (BLOCK) | Post-Hook (WARN) |\n|---|---------|------------------|------------------|\n| 1 | SRP + KISS | P1.1 (Header), P1.2 (Müllhalden) | W1.1-W1.5 (Metriken) |\n| 2 | MVC + CRUD | P2.1-P2.4 (SQL, Trans, echo, DB) | W2.1-W2.2 (Keywords, Private) |\n| 3 | PSR + Types | P3.1-P3.4 (strict, NS, Class, Return) | W3.1, W3.3 (Params, mixed) |\n| 4 | OOP | P4.1 (Public Property) | W4.1-W4.4 (Anämie, Kapselung) |\n| 5 | DRY | - | W5.1-W5.2 (Strings, Numbers) |\n| 6 | SOLID + DIP | P6.1-P6.2 (Layer-Imports) | W6.1-W6.2 (Interface-Größe) |\n\n## Hook-Dateien (geplant)\n\n| Prüfung | Pre-Hook | Post-Hook |\n|---------|----------|-----------|\n| 1 | srp_kiss_guard.py | srp_kiss_metrics.py |\n| 2 | mvc_crud_guard.py | mvc_crud_metrics.py |\n| 3 | psr_types_guard.py | psr_types_metrics.py |\n| 4 | oop_guard.py | oop_metrics.py |\n| 5 | - | dry_metrics.py |\n| 6 | solid_dip_guard.py | solid_dip_metrics.py |\n\n## Nächste Schritte\n\n1. Supervision-Abnahme aller 6 Prüfungen\n2. Implementierung der Hook-Dateien\n3. Registrierung in settings.json\n4. Testphase mit echtem Code",
        "new_string": "# Implementierung\n\n**Status: ABGESCHLOSSEN (2025-12-23)**\n\n## Architektur\n\n```\n\/var\/www\/tools\/ki-protokoll\/claude-hook\/\n├── hook_dispatcher.py          ← Stabiler Einstiegspunkt (settings.json)\n├── .env                        ← DB-Credentials\n└── quality\/\n    ├── __init__.py\n    ├── pre_rules.py            ← Alle BLOCK-Regeln (P1-P6, H2-H5)\n    ├── post_rules.py           ← Alle WARN-Regeln (W1-W6)\n    └── task_creator.py         ← Violations → ki_dev.tasks\n```\n\n**Vorteile dieser Architektur:**\n- Regeländerungen in `quality\/*.py` → sofort wirksam, kein Claude-Neustart\n- Konsolidierte Regeln statt 12 separate Dateien\n- Automatische Task-Erstellung bei Violations\n\n## Alle Prüfungen\n\n| # | Prüfung | Pre-Hook (BLOCK) | Post-Hook (WARN) |\n|---|---------|------------------|------------------|\n| 1 | SRP + KISS | P1.1 (Header), P1.2 (Müllhalden) | W1.1-W1.5 (Metriken) |\n| 2 | MVC + CRUD | P2.1-P2.4 (SQL, Trans, echo, DB) | W2.1-W2.2 (Keywords, Private) |\n| 3 | PSR + Types | P3.1-P3.4 (strict, NS, Class, Return) | W3.1, W3.3 (Params, mixed) |\n| 4 | OOP | P4.1 (Public Property) | W4.1-W4.4 (Anämie, Kapselung) |\n| 5 | DRY | - | W5.1-W5.2 (Strings, Numbers) |\n| 6 | SOLID + DIP | P6.1-P6.2 (Layer-Imports) | W6.1-W6.2 (Interface-Größe) |\n\n**Zusätzlich:** Legacy H-Regeln (H2-H5) aus architecture_guard.py integriert.\n\n## settings.json\n\n```json\n{\n  \"PreToolUse\": [{\n    \"matcher\": \"Write\",\n    \"hooks\": [{\n      \"command\": \"\/var\/www\/tools\/ki-protokoll\/claude-hook\/hook_dispatcher.py pre\",\n      \"timeout\": 5\n    }]\n  }],\n  \"PostToolUse\": [{\n    \"matcher\": \"Write|Edit\",\n    \"hooks\": [{\n      \"command\": \"\/var\/www\/tools\/ki-protokoll\/claude-hook\/hook_dispatcher.py post\",\n      \"timeout\": 5\n    }]\n  }]\n}\n```\n\n## Task-Integration\n\nBei jeder Violation wird automatisch ein Task in `ki_dev.tasks` erstellt:\n\n```\nViolation erkannt\n    ↓\nTask erstellt (status: pending, type: ai_task)\n    ↓\nTask enthält:\n    - Violation: Datei, Regel, Meldung\n    - Analyse: Was ist die Ursache?\n    - Plan: Checkliste zur Behebung\n    - Umsetzung: Dokumentation nach Abschluss\n```\n\n**Duplikat-Schutz:** Existiert bereits ein offener Task für dieselbe Datei+Regel, wird kein neuer erstellt.\n\n## Workflow\n\n```\n1. Claude schreibt PHP-Datei\n2. Pre-Hook prüft Regeln\n3. Violation?\n   → BLOCK + Task erstellen\n   → Claude sieht Fehlermeldung\n   → Claude korrigiert Code\n4. Code okay?\n   → Datei wird geschrieben\n   → Post-Hook prüft Warnungen\n   → Tasks für Warnungen erstellt\n   → Warnungen in stderr ausgegeben\n```\n\n## Regeländerungen\n\n**Ohne Claude-Neustart:**\n- Regeln in `quality\/pre_rules.py` oder `quality\/post_rules.py` editieren\n- Nächster Write\/Edit nutzt automatisch neue Regeln\n\n**Mit Claude-Neustart:**\n- Änderungen an `settings.json`\n- Änderungen an `hook_dispatcher.py`\n\n## Getestet\n\n| Test | Ergebnis |\n|------|----------|\n| P1.1 (fehlender @responsibility) | BLOCK ✓ |\n| P3.1 (fehlendes strict_types) | BLOCK ✓ |\n| W1.1 (Klasse > 300 LOC) | WARN ✓ |\n| W1.2 (> 10 public methods) | WARN ✓ |\n| Task-Erstellung bei Violation | ✓ |\n| Duplikat-Schutz | ✓ |\n| Sauberer Code passiert | ✓ |"
    }
}

Response

{
    "tool_response": {
        "filePath": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/plan-code-quality-gates.md",
        "oldString": "# Implementierungs-Übersicht\n\n## Alle Prüfungen\n\n| # | Prüfung | Pre-Hook (BLOCK) | Post-Hook (WARN) |\n|---|---------|------------------|------------------|\n| 1 | SRP + KISS | P1.1 (Header), P1.2 (Müllhalden) | W1.1-W1.5 (Metriken) |\n| 2 | MVC + CRUD | P2.1-P2.4 (SQL, Trans, echo, DB) | W2.1-W2.2 (Keywords, Private) |\n| 3 | PSR + Types | P3.1-P3.4 (strict, NS, Class, Return) | W3.1, W3.3 (Params, mixed) |\n| 4 | OOP | P4.1 (Public Property) | W4.1-W4.4 (Anämie, Kapselung) |\n| 5 | DRY | - | W5.1-W5.2 (Strings, Numbers) |\n| 6 | SOLID + DIP | P6.1-P6.2 (Layer-Imports) | W6.1-W6.2 (Interface-Größe) |\n\n## Hook-Dateien (geplant)\n\n| Prüfung | Pre-Hook | Post-Hook |\n|---------|----------|-----------|\n| 1 | srp_kiss_guard.py | srp_kiss_metrics.py |\n| 2 | mvc_crud_guard.py | mvc_crud_metrics.py |\n| 3 | psr_types_guard.py | psr_types_metrics.py |\n| 4 | oop_guard.py | oop_metrics.py |\n| 5 | - | dry_metrics.py |\n| 6 | solid_dip_guard.py | solid_dip_metrics.py |\n\n## Nächste Schritte\n\n1. Supervision-Abnahme aller 6 Prüfungen\n2. Implementierung der Hook-Dateien\n3. Registrierung in settings.json\n4. Testphase mit echtem Code",
        "newString": "# Implementierung\n\n**Status: ABGESCHLOSSEN (2025-12-23)**\n\n## Architektur\n\n```\n\/var\/www\/tools\/ki-protokoll\/claude-hook\/\n├── hook_dispatcher.py          ← Stabiler Einstiegspunkt (settings.json)\n├── .env                        ← DB-Credentials\n└── quality\/\n    ├── __init__.py\n    ├── pre_rules.py            ← Alle BLOCK-Regeln (P1-P6, H2-H5)\n    ├── post_rules.py           ← Alle WARN-Regeln (W1-W6)\n    └── task_creator.py         ← Violations → ki_dev.tasks\n```\n\n**Vorteile dieser Architektur:**\n- Regeländerungen in `quality\/*.py` → sofort wirksam, kein Claude-Neustart\n- Konsolidierte Regeln statt 12 separate Dateien\n- Automatische Task-Erstellung bei Violations\n\n## Alle Prüfungen\n\n| # | Prüfung | Pre-Hook (BLOCK) | Post-Hook (WARN) |\n|---|---------|------------------|------------------|\n| 1 | SRP + KISS | P1.1 (Header), P1.2 (Müllhalden) | W1.1-W1.5 (Metriken) |\n| 2 | MVC + CRUD | P2.1-P2.4 (SQL, Trans, echo, DB) | W2.1-W2.2 (Keywords, Private) |\n| 3 | PSR + Types | P3.1-P3.4 (strict, NS, Class, Return) | W3.1, W3.3 (Params, mixed) |\n| 4 | OOP | P4.1 (Public Property) | W4.1-W4.4 (Anämie, Kapselung) |\n| 5 | DRY | - | W5.1-W5.2 (Strings, Numbers) |\n| 6 | SOLID + DIP | P6.1-P6.2 (Layer-Imports) | W6.1-W6.2 (Interface-Größe) |\n\n**Zusätzlich:** Legacy H-Regeln (H2-H5) aus architecture_guard.py integriert.\n\n## settings.json\n\n```json\n{\n  \"PreToolUse\": [{\n    \"matcher\": \"Write\",\n    \"hooks\": [{\n      \"command\": \"\/var\/www\/tools\/ki-protokoll\/claude-hook\/hook_dispatcher.py pre\",\n      \"timeout\": 5\n    }]\n  }],\n  \"PostToolUse\": [{\n    \"matcher\": \"Write|Edit\",\n    \"hooks\": [{\n      \"command\": \"\/var\/www\/tools\/ki-protokoll\/claude-hook\/hook_dispatcher.py post\",\n      \"timeout\": 5\n    }]\n  }]\n}\n```\n\n## Task-Integration\n\nBei jeder Violation wird automatisch ein Task in `ki_dev.tasks` erstellt:\n\n```\nViolation erkannt\n    ↓\nTask erstellt (status: pending, type: ai_task)\n    ↓\nTask enthält:\n    - Violation: Datei, Regel, Meldung\n    - Analyse: Was ist die Ursache?\n    - Plan: Checkliste zur Behebung\n    - Umsetzung: Dokumentation nach Abschluss\n```\n\n**Duplikat-Schutz:** Existiert bereits ein offener Task für dieselbe Datei+Regel, wird kein neuer erstellt.\n\n## Workflow\n\n```\n1. Claude schreibt PHP-Datei\n2. Pre-Hook prüft Regeln\n3. Violation?\n   → BLOCK + Task erstellen\n   → Claude sieht Fehlermeldung\n   → Claude korrigiert Code\n4. Code okay?\n   → Datei wird geschrieben\n   → Post-Hook prüft Warnungen\n   → Tasks für Warnungen erstellt\n   → Warnungen in stderr ausgegeben\n```\n\n## Regeländerungen\n\n**Ohne Claude-Neustart:**\n- Regeln in `quality\/pre_rules.py` oder `quality\/post_rules.py` editieren\n- Nächster Write\/Edit nutzt automatisch neue Regeln\n\n**Mit Claude-Neustart:**\n- Änderungen an `settings.json`\n- Änderungen an `hook_dispatcher.py`\n\n## Getestet\n\n| Test | Ergebnis |\n|------|----------|\n| P1.1 (fehlender @responsibility) | BLOCK ✓ |\n| P3.1 (fehlendes strict_types) | BLOCK ✓ |\n| W1.1 (Klasse > 300 LOC) | WARN ✓ |\n| W1.2 (> 10 public methods) | WARN ✓ |\n| Task-Erstellung bei Violation | ✓ |\n| Duplikat-Schutz | ✓ |\n| Sauberer Code passiert | ✓ |",
        "originalFile": "# Code Quality Gates\n\n## Prüfungsreihenfolge\n\n| # | Prinzip | Begründung der Reihenfolge |\n|---|---------|---------------------------|\n| 1 | SRP + KISS | Grundlage für alles. Ohne klare Verantwortung ist nichts anderes prüfbar. |\n| 2 | MVC + CRUD | Strukturelle Trennung. Setzt SRP voraus. |\n| 3 | PSR + Types | Typdisziplin. Muss VOR DIP kommen, weil Interfaces ohne Typen wirkungslos sind. |\n| 4 | OOP | Verhalten + Zustand. Setzt Typen voraus. |\n| 5 | DRY | Duplikationserkennung. Setzt funktionierende Struktur voraus. |\n| 6 | SOLID + DIP | Abhängigkeitsrichtung. Setzt Typen und Interfaces voraus. Kommt zuletzt. |\n\n---\n\n# Prüfung 1: SRP + KISS\n\n## Ziel\n\n**SRP:** Eine Klasse hat genau einen Grund sich zu ändern.\n\n**KISS:** Einfachste Lösung die funktioniert. Keine vorzeitigen Abstraktionen.\n\n## Grundsatz\n\nSRP ist semantisch. Maschinen können \"Verantwortung\" nicht verstehen.\n\nDaher:\n- **Pre-Hook:** Erzwingt explizite Deklaration + blockiert eindeutige Symptome\n- **Post-Hook:** Warnt bei statistischen Indikatoren\n\n---\n\n## Pre-Hook (BLOCK)\n\n### P1.1: Verantwortungs-Header\n\n**Regel:** Jede PHP-Datei muss ihre Verantwortung explizit deklarieren.\n\n**Format:**\n```php\n<?php\ndeclare(strict_types=1);\n\n\/\/ @responsibility: <genau-eine-verantwortung>\n```\n\n**Validierung:**\n\n| Check | Begründung |\n|-------|------------|\n| Header vorhanden | Ohne Deklaration entsteht Scope Creep |\n| Nicht leer | Leerer Header ist wertlos |\n| Keine Multi-Responsibility-Wörter | \"und\", \"sowie\", \"außerdem\", \"zusätzlich\" im Header = mehrere Verantwortungen |\n\n**Pattern:**\n```python\nheader_pattern = r\"\/\/\\s*@responsibility:\\s*(.+)\"\nmulti_words = r\"\\b(und|sowie|außerdem|also|zusätzlich)\\b\"\n\nmatch = re.search(header_pattern, content)\nif not match:\n    block(\"Missing @responsibility header\")\n\nresponsibility_text = match.group(1)\nif re.search(multi_words, responsibility_text, re.IGNORECASE):\n    block(\"@responsibility contains multi-responsibility indicator\")\n```\n\n**Warum diese Wörter:**\n- \"Validiert Benutzer und erstellt Sessions\" = 2 Verantwortungen\n- \"Lädt Daten sowie formatiert Ausgabe\" = 2 Verantwortungen\n- Erzwingt Nachdenken über Singular-Verantwortung\n\n**Allowlist:** `\/vendor\/`, `\/tests\/`, `\/Test\/`\n\n---\n\n### P1.2: Müllhalden-Namen\n\n**Regel:** Bestimmte Begriffe im Dateinamen sind immer Symptome für fehlende klare Verantwortung.\n\n**Blockiert (case-insensitive):**\n\n| Begriff | Begründung |\n|---------|------------|\n| Helper | \"Hilft bei allem\" = keine klare Verantwortung |\n| Utils | Sammelbecken für Funktionen ohne Heimat |\n| Common | \"Wird überall gebraucht\" = gehört nirgends hin |\n| Misc | Explizit: \"Verschiedenes\" |\n| Base | Oft Gott-Klasse mit Shared-State |\n\n**Nicht blockiert:**\n- \"Manager\" → Kann legitim sein (TransactionManager, EntityManager)\n- \"And\" im Namen → Sprachlich, nicht strukturell\n\n**Pattern:**\n```python\nforbidden = [\"helper\", \"utils\", \"common\", \"misc\", \"base\"]\nfilename_lower = filename.lower()\nfor term in forbidden:\n    if term in filename_lower:\n        block(f\"Forbidden name: '{term}' indicates unclear responsibility\")\n```\n\n**Keine Ausnahmen.** Diese Begriffe sind niemals architektonisch sauber.\n\n---\n\n## Post-Hook (WARN)\n\n### W1.1: Klassengröße (LOC)\n\n**Regel:** Große Klassen haben oft mehrere Verantwortungen.\n\n| LOC | Aktion |\n|-----|--------|\n| > 200 | Hinweis |\n| > 300 | Warnung |\n\n**Warum zwei Schwellen:**\n- 200: \"Du näherst dich dem Limit\"\n- 300: \"Hier stimmt strukturell etwas nicht\"\n\n**Messung:** Nicht-leere Zeilen.\n\n---\n\n### W1.2: Public-Method-Count\n\n**Regel:** Viele öffentliche Methoden = viele Interaktionspunkte = breite Verantwortung.\n\n| Count | Aktion |\n|-------|--------|\n| > 10 | Warnung |\n\n**Warum 10:**\n- Ein fokussiertes Interface hat 3-7 Methoden\n- 10+ deutet auf Feature Creep\n\n---\n\n### W1.3: Constructor-Parameter\n\n**Regel:** Viele Dependencies = viele Gründe sich zu ändern.\n\n| Count | Aktion |\n|-------|--------|\n| > 5 | Warnung |\n\n**Warum 5:**\n- 1-3: Normal\n- 4-5: Grenzwertig\n- 6+: Fast immer strukturelles Problem\n\n---\n\n### W1.4: Dependency-Count (use-Statements)\n\n**Regel:** Viele Imports = Kopplung an viele Module = viele Änderungsgründe.\n\n| Count | Aktion |\n|-------|--------|\n| > 10 | Warnung |\n\n**Warum 10:**\n- PHP-interne Classes zählen mit\n- Framework-Imports zählen mit\n- 10+ externe Abhängigkeiten ist ein Warnsignal\n\n---\n\n### W1.5: Verdächtige Namen\n\n**Regel:** Manche Begriffe sind nicht eindeutig Müll, aber verdächtig.\n\n| Begriff | Aktion |\n|---------|--------|\n| Manager | Hinweis |\n| And (als Wort) | Hinweis |\n\n**Warum Hinweis statt Block:**\n- \"UserManager\" kann legitim sein\n- \"ReadAndWrite\" kann legitim sein (obwohl fragwürdig)\n- Menschliche Entscheidung erforderlich\n\n---\n\n## Gestrichen\n\n### Verschachtelungstiefe\n\n**Ursprüngliche Idee:** > 4 Ebenen = Warnung\n\n**Warum gestrichen:**\n- Indent-basierte Messung ist nicht zuverlässig\n- PHP erlaubt verschiedene Styles (2, 4, Tabs)\n- Fluent Interfaces erzeugen tiefe Indents ohne Kontrollfluss\n- Array-Definitionen erzeugen tiefe Indents\n- False Positives zu hoch\n\n**Alternative:** Erst implementieren wenn AST-Parsing verfügbar.\n\n---\n\n## Zusammenfassung\n\n### Pre-Hook\n\n| ID | Prüfung | Aktion |\n|----|---------|--------|\n| P1.1 | @responsibility fehlt oder Multi-Responsibility | BLOCK |\n| P1.2 | Müllhalden-Name (Helper, Utils, Common, Misc, Base) | BLOCK |\n\n### Post-Hook\n\n| ID | Prüfung | Schwelle | Aktion |\n|----|---------|----------|--------|\n| W1.1 | LOC | > 300 | WARN |\n| W1.2 | Public Methods | > 10 | WARN |\n| W1.3 | Constructor Params | > 5 | WARN |\n| W1.4 | Dependencies (use) | > 10 | WARN |\n| W1.5 | Verdächtige Namen | Manager, And | HINT |\n\n### Allowlist\n\n| Pfad | Grund |\n|------|-------|\n| \/vendor\/ | Third-party Code |\n| \/tests\/ | Test-Konventionen anders |\n| \/Test\/ | PHPUnit |\n\n---\n\n## Selbstkritik und Entscheidungen\n\n| Frage | Entscheidung | Begründung |\n|-------|--------------|------------|\n| Ist Multi-Word-Check im Header Over-Engineering? | Nein | Ein Regex. Verhindert \"Macht A und B\". Minimaler Aufwand, hoher Nutzen. |\n| Ist Dependency-Count SRP? | Ja | Viele Dependencies = viele Änderungsgründe = SRP-Verletzung per Definition. |\n| Sollen Factories in Allowlist? | Nein | Auch Factories sollten nicht 50 Methoden haben. Wenn zu groß, aufteilen. |\n| Warum keine Kontext-Schwellen für Repositories? | YAGNI | Komplexität ohne klaren Nutzen. Wer > 10 Methoden braucht, soll bewusst entscheiden. |\n\n---\n\n## Implementierung\n\n**Dateien:**\n- `\/var\/www\/tools\/ki-protokoll\/claude-hook\/srp_kiss_guard.py` (Pre-Hook)\n- `\/var\/www\/tools\/ki-protokoll\/claude-hook\/srp_kiss_metrics.py` (Post-Hook)\n\n**Hooks in settings.json:**\n```json\n{\n  \"PreToolUse\": [\n    {\n      \"matcher\": \"Write\",\n      \"hooks\": [\n        {\n          \"type\": \"command\",\n          \"command\": \"\/var\/www\/tools\/ki-protokoll\/claude-hook\/srp_kiss_guard.py\",\n          \"timeout\": 5\n        }\n      ]\n    }\n  ],\n  \"PostToolUse\": [\n    {\n      \"matcher\": \"Write|Edit\",\n      \"hooks\": [\n        {\n          \"type\": \"command\",\n          \"command\": \"\/var\/www\/tools\/ki-protokoll\/claude-hook\/srp_kiss_metrics.py\",\n          \"timeout\": 5\n        }\n      ]\n    }\n  ]\n}\n```\n\n---\n\n# Prüfung 2: MVC + CRUD\n\n## Ziel\n\n**MVC:** Klare Rollentrennung.\n- Controller: Orchestrierung (nimmt Request, ruft UseCase, gibt Response)\n- View: Darstellung (keine Logik)\n- Model: Geschäftslogik (Domain + UseCases)\n\n**CRUD:** Persistenz-Disziplin.\n- Create\/Read\/Update\/Delete gehören in Repository\n- Transaktionen gehören in UseCase oder Repository, nicht Controller\n- Controller orchestriert, persistiert nicht\n\n## Grundsatz\n\nMVC ist strukturell. Die Rollen sind durch Pfade definiert:\n- `\/Controller\/` = Presentation Layer\n- `\/View\/`, `\/templates\/` = Templates\n- `\/Domain\/` = Business Logic\n- `\/UseCases\/`, `\/Application\/` = Application Logic\n- `\/Infrastructure\/Persistence\/` = Repositories\n\n## Abgrenzung zu anderen Prüfungen\n\n| Aspekt | Prüfung | Begründung |\n|--------|---------|------------|\n| Klassen-Größe | 1 (SRP) | Strukturelle Metrik |\n| Methoden-Anzahl | 1 (SRP) | Strukturelle Metrik |\n| Abhängigkeits-Richtung | 6 (DIP) | Dependency Inversion |\n| **Rollen-Einhaltung** | **2 (MVC)** | Controller\/View\/Model Trennung |\n| **Persistenz-Ort** | **2 (CRUD)** | Wer darf DB anfassen |\n\n---\n\n## Pre-Hook (BLOCK)\n\n### P2.1: Keine SQL-Statements in Controller\n\n**Regel:** Controller dürfen keine direkten SQL-Queries enthalten.\n\n**Scope:** `\/Controller\/`\n\n**Pattern:**\n```python\nsql_patterns = [\n    r\"\\bSELECT\\s+.+\\s+FROM\\b\",\n    r\"\\bINSERT\\s+INTO\\b\",\n    r\"\\bUPDATE\\s+\\w+\\s+SET\\b\",\n    r\"\\bDELETE\\s+FROM\\b\",\n]\n```\n\n**Warum diese Pattern:**\n- Spezifisch genug um False Positives zu vermeiden\n- `SELECT your country` matcht nicht (kein FROM)\n- `INSERT INTO users` matcht (eindeutig SQL)\n\n**Unterschied zu Prüfung 1\/6:**\n- H-Regeln prüfen Objekte (new Repository, DatabaseFactory)\n- P2.1 prüft String-Literale (SQL-Statements)\n\n---\n\n### P2.2: Keine Transaktionen in Controller\n\n**Regel:** Transaktions-Kontrolle gehört nicht in Controller.\n\n**Scope:** `\/Controller\/`\n\n**Pattern:**\n```python\ntransaction_patterns = [\n    r\"\\bbeginTransaction\\s*\\(\",\n    r\"\\bcommit\\s*\\(\",\n    r\"\\brollBack\\s*\\(\",\n    r\"\\brollback\\s*\\(\",\n]\n```\n\n**Begründung:**\n- Transaktionen sind Infrastruktur-Concern\n- Controller soll Request→Response orchestrieren, nicht DB-Konsistenz managen\n- Transaktionen gehören in UseCase oder Repository\n\n---\n\n### P2.3: Kein direktes Rendering in Controller\n\n**Regel:** Controller erzeugen keine direkte Ausgabe.\n\n**Scope:** `\/Controller\/`\n\n**Pattern:**\n```python\noutput_patterns = [\n    r\"\\becho\\s\",\n    r\"\\becho\\(\",\n    r\"\\bprint\\s\",\n    r\"\\bprint\\(\",\n]\n```\n\n**Nicht blockiert:**\n- `print_r` (Debug)\n- `printf` (Formatierung, selten)\n- `return json_encode()` (Response-Objekt)\n\n**Begründung:**\n- Output gehört in View oder Response-Objekt\n- echo\/print in Controller = MVC-Verletzung\n- CLI-Code gehört in `\/Console\/` oder `\/Command\/`, nicht `\/Controller\/`\n\n---\n\n### P2.4: Keine DB-Artefakte in UseCases\n\n**Regel:** UseCases nutzen Repository-Interfaces, nicht direkte DB.\n\n**Scope:** `\/UseC... [TRUNCATED-e4720915da80c067]",
        "structuredPatch": [
            {
                "oldStart": 1657,
                "oldLines": 8,
                "newStart": 1657,
                "newLines": 28,
                "lines": [
                    " ",
                    " ---",
                    " ",
                    "-# Implementierungs-Übersicht",
                    "+# Implementierung",
                    " ",
                    "+**Status: ABGESCHLOSSEN (2025-12-23)**",
                    "+",
                    "+## Architektur",
                    "+",
                    "+```",
                    "+\/var\/www\/tools\/ki-protokoll\/claude-hook\/",
                    "+├── hook_dispatcher.py          ← Stabiler Einstiegspunkt (settings.json)",
                    "+├── .env                        ← DB-Credentials",
                    "+└── quality\/",
                    "+    ├── __init__.py",
                    "+    ├── pre_rules.py            ← Alle BLOCK-Regeln (P1-P6, H2-H5)",
                    "+    ├── post_rules.py           ← Alle WARN-Regeln (W1-W6)",
                    "+    └── task_creator.py         ← Violations → ki_dev.tasks",
                    "+```",
                    "+",
                    "+**Vorteile dieser Architektur:**",
                    "+- Regeländerungen in `quality\/*.py` → sofort wirksam, kein Claude-Neustart",
                    "+- Konsolidierte Regeln statt 12 separate Dateien",
                    "+- Automatische Task-Erstellung bei Violations",
                    "+",
                    " ## Alle Prüfungen",
                    " ",
                    " | # | Prüfung | Pre-Hook (BLOCK) | Post-Hook (WARN) |"
                ]
            },
            {
                "oldStart": 1670,
                "oldLines": 20,
                "newStart": 1690,
                "newLines": 81,
                "lines": [
                    " | 5 | DRY | - | W5.1-W5.2 (Strings, Numbers) |",
                    " | 6 | SOLID + DIP | P6.1-P6.2 (Layer-Imports) | W6.1-W6.2 (Interface-Größe) |",
                    " ",
                    "-## Hook-Dateien (geplant)",
                    "+**Zusätzlich:** Legacy H-Regeln (H2-H5) aus architecture_guard.py integriert.",
                    " ",
                    "-| Prüfung | Pre-Hook | Post-Hook |",
                    "-|---------|----------|-----------|",
                    "-| 1 | srp_kiss_guard.py | srp_kiss_metrics.py |",
                    "-| 2 | mvc_crud_guard.py | mvc_crud_metrics.py |",
                    "-| 3 | psr_types_guard.py | psr_types_metrics.py |",
                    "-| 4 | oop_guard.py | oop_metrics.py |",
                    "-| 5 | - | dry_metrics.py |",
                    "-| 6 | solid_dip_guard.py | solid_dip_metrics.py |",
                    "+## settings.json",
                    " ",
                    "-## Nächste Schritte",
                    "+```json",
                    "+{",
                    "+  \"PreToolUse\": [{",
                    "+    \"matcher\": \"Write\",",
                    "+    \"hooks\": [{",
                    "+      \"command\": \"\/var\/www\/tools\/ki-protokoll\/claude-hook\/hook_dispatcher.py pre\",",
                    "+      \"timeout\": 5",
                    "+    }]",
                    "+  }],",
                    "+  \"PostToolUse\": [{",
                    "+    \"matcher\": \"Write|Edit\",",
                    "+    \"hooks\": [{",
                    "+      \"command\": \"\/var\/www\/tools\/ki-protokoll\/claude-hook\/hook_dispatcher.py post\",",
                    "+      \"timeout\": 5",
                    "+    }]",
                    "+  }]",
                    "+}",
                    "+```",
                    " ",
                    "-1. Supervision-Abnahme aller 6 Prüfungen",
                    "-2. Implementierung der Hook-Dateien",
                    "-3. Registrierung in settings.json",
                    "-4. Testphase mit echtem Code",
                    "+## Task-Integration",
                    "+",
                    "+Bei jeder Violation wird automatisch ein Task in `ki_dev.tasks` erstellt:",
                    "+",
                    "+```",
                    "+Violation erkannt",
                    "+    ↓",
                    "+Task erstellt (status: pending, type: ai_task)",
                    "+    ↓",
                    "+Task enthält:",
                    "+    - Violation: Datei, Regel, Meldung",
                    "+    - Analyse: Was ist die Ursache?",
                    "+    - Plan: Checkliste zur Behebung",
                    "+    - Umsetzung: Dokumentation nach Abschluss",
                    "+```",
                    "+",
                    "+**Duplikat-Schutz:** Existiert bereits ein offener Task für dieselbe Datei+Regel, wird kein neuer erstellt.",
                    "+",
                    "+## Workflow",
                    "+",
                    "+```",
                    "+1. Claude schreibt PHP-Datei",
                    "+2. Pre-Hook prüft Regeln",
                    "+3. Violation?",
                    "+   → BLOCK + Task erstellen",
                    "+   → Claude sieht Fehlermeldung",
                    "+   → Claude korrigiert Code",
                    "+4. Code okay?",
                    "+   → Datei wird geschrieben",
                    "+   → Post-Hook prüft Warnungen",
                    "+   → Tasks für Warnungen erstellt",
                    "+   → Warnungen in stderr ausgegeben",
                    "+```",
                    "+",
                    "+## Regeländerungen",
                    "+",
                    "+**Ohne Claude-Neustart:**",
                    "+- Regeln in `quality\/pre_rules.py` oder `quality\/post_rules.py` editieren",
                    "+- Nächster Write\/Edit nutzt automatisch neue Regeln",
                    "+",
                    "+**Mit Claude-Neustart:**",
                    "+- Änderungen an `settings.json`",
                    "+- Änderungen an `hook_dispatcher.py`",
                    "+",
                    "+## Getestet",
                    "+",
                    "+| Test | Ergebnis |",
                    "+|------|----------|",
                    "+| P1.1 (fehlender @responsibility) | BLOCK ✓ |",
                    "+| P3.1 (fehlendes strict_types) | BLOCK ✓ |",
                    "+| W1.1 (Klasse > 300 LOC) | WARN ✓ |",
                    "+| W1.2 (> 10 public methods) | WARN ✓ |",
                    "+| Task-Erstellung bei Violation | ✓ |",
                    "+| Duplikat-Schutz | ✓ |",
                    "+| Sauberer Code passiert | ✓ |"
                ]
            }
        ],
        "userModified": false,
        "replaceAll": false
    }
}
← Vorheriger Zur Liste Nächster →