Protokoll #6737

ID6737
Zeitstempel2025-12-23 06:57:09.327811
Clientroot
IP145.224.96.190
Modellclaude-sonnet-4-20250514
Statuscompleted
Tokens8,308 (Input: 1,925, Output: 6,383)
Dauer101 ms
Request-Zeit2025-12-23 06:57:09.327811
Response-Zeit2025-12-23 06:57:09.428504

Request

{
    "event": "PreToolUse",
    "tool_name": "Write",
    "tool_input": {
        "file_path": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/plan-code-quality-gates.md",
        "content": "# 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-6\n\n*Werden nach Abnahme von Prüfung 1 definiert.*\n"
    }
}

Response

{
    "tool_response": {
        "type": "update",
        "filePath": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/plan-code-quality-gates.md",
        "content": "# 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-6\n\n*Werden nach Abnahme von Prüfung 1 definiert.*\n",
        "structuredPatch": [
            {
                "oldStart": 1,
                "oldLines": 207,
                "newStart": 1,
                "newLines": 286,
                "lines": [
                    "-# Plan: Code Quality Gates",
                    "+# Code Quality Gates",
                    " ",
                    "-## Prüfungsreihenfolge (nicht verhandelbar)",
                    "+## Prüfungsreihenfolge",
                    " ",
                    "-| # | Prinzip | Prüfzeitpunkt |",
                    "-|---|---------|---------------|",
                    "-| 1 | SRP + KISS | Pre + Post |",
                    "-| 2 | MVC + CRUD | Pre + Post |",
                    "-| 3 | OOP | Post |",
                    "-| 4 | DRY | Post |",
                    "-| 5 | SOLID + DIP | Pre |",
                    "-| 6 | PSR + Types | Pre |",
                    "+| # | Prinzip | Begründung der Reihenfolge |",
                    "+|---|---------|---------------------------|",
                    "+| 1 | SRP + KISS | Grundlage für alles. Ohne klare Verantwortung ist nichts anderes prüfbar. |",
                    "+| 2 | MVC + CRUD | Strukturelle Trennung. Setzt SRP voraus. |",
                    "+| 3 | PSR + Types | Typdisziplin. Muss VOR DIP kommen, weil Interfaces ohne Typen wirkungslos sind. |",
                    "+| 4 | OOP | Verhalten + Zustand. Setzt Typen voraus. |",
                    "+| 5 | DRY | Duplikationserkennung. Setzt funktionierende Struktur voraus. |",
                    "+| 6 | SOLID + DIP | Abhängigkeitsrichtung. Setzt Typen und Interfaces voraus. Kommt zuletzt. |",
                    " ",
                    " ---",
                    " ",
                    "-## Logik: Pre vs. Post",
                    "+# Prüfung 1: SRP + KISS",
                    " ",
                    "-**Pre-Hook (blockiert):**",
                    "-- Strukturelle Fehler, die sofort erkennbar sind",
                    "-- Verletzungen, die nie entstehen dürfen",
                    "+## Ziel",
                    " ",
                    "-**Post-Hook (warnt):**",
                    "-- Qualitätsindikatoren, die Kontext brauchen",
                    "-- Metriken, die über Zeit gemessen werden",
                    "+**SRP:** Eine Klasse hat genau einen Grund sich zu ändern.",
                    " ",
                    "----",
                    "+**KISS:** Einfachste Lösung die funktioniert. Keine vorzeitigen Abstraktionen.",
                    " ",
                    "-# 1. SRP + KISS",
                    "+## Grundsatz",
                    " ",
                    "-## Definition",
                    "+SRP ist semantisch. Maschinen können \"Verantwortung\" nicht verstehen.",
                    " ",
                    "-**SRP (Single Responsibility Principle):**",
                    "-Eine Klasse hat genau einen Grund sich zu ändern.",
                    "+Daher:",
                    "+- **Pre-Hook:** Erzwingt explizite Deklaration + blockiert eindeutige Symptome",
                    "+- **Post-Hook:** Warnt bei statistischen Indikatoren",
                    " ",
                    "-**KISS (Keep It Simple Stupid):**",
                    "-Keine unnötige Komplexität. Keine vorzeitigen Abstraktionen.",
                    "-",
                    " ---",
                    " ",
                    "-## Pre-Hook Prüfungen (blockierend)",
                    "+## Pre-Hook (BLOCK)",
                    " ",
                    "-### P1.1: Verantwortungs-Header erforderlich",
                    "+### P1.1: Verantwortungs-Header",
                    " ",
                    "-**Regel:** Jede neue PHP-Datei braucht einen `@responsibility` Header.",
                    "+**Regel:** Jede PHP-Datei muss ihre Verantwortung explizit deklarieren.",
                    " ",
                    " **Format:**",
                    " ```php",
                    " <?php",
                    " declare(strict_types=1);",
                    " ",
                    "-\/\/ @responsibility: <ein-satz-beschreibung>",
                    "+\/\/ @responsibility: <genau-eine-verantwortung>",
                    " ```",
                    " ",
                    "-**Prüfung:**",
                    "+**Validierung:**",
                    "+",
                    "+| Check | Begründung |",
                    "+|-------|------------|",
                    "+| Header vorhanden | Ohne Deklaration entsteht Scope Creep |",
                    "+| Nicht leer | Leerer Header ist wertlos |",
                    "+| Keine Multi-Responsibility-Wörter | \"und\", \"sowie\", \"außerdem\", \"zusätzlich\" im Header = mehrere Verantwortungen |",
                    "+",
                    "+**Pattern:**",
                    " ```python",
                    "-pattern = r\"\/\/\\s*@responsibility:\\s*.+\"",
                    "-if not re.search(pattern, content):",
                    "+header_pattern = r\"\/\/\\s*@responsibility:\\s*(.+)\"",
                    "+multi_words = r\"\\b(und|sowie|außerdem|also|zusätzlich)\\b\"",
                    "+",
                    "+match = re.search(header_pattern, content)",
                    "+if not match:",
                    "     block(\"Missing @responsibility header\")",
                    "+",
                    "+responsibility_text = match.group(1)",
                    "+if re.search(multi_words, responsibility_text, re.IGNORECASE):",
                    "+    block(\"@responsibility contains multi-responsibility indicator\")",
                    " ```",
                    " ",
                    "-**Warum Pre:** Ohne explizite Verantwortung entsteht Scope Creep.",
                    "+**Warum diese Wörter:**",
                    "+- \"Validiert Benutzer und erstellt Sessions\" = 2 Verantwortungen",
                    "+- \"Lädt Daten sowie formatiert Ausgabe\" = 2 Verantwortungen",
                    "+- Erzwingt Nachdenken über Singular-Verantwortung",
                    " ",
                    "+**Allowlist:** `\/vendor\/`, `\/tests\/`, `\/Test\/`",
                    "+",
                    " ---",
                    " ",
                    "-### P1.2: Keine Multi-Responsibility Keywords",
                    "+### P1.2: Müllhalden-Namen",
                    " ",
                    "-**Regel:** Dateiname und Inhalt dürfen keine Multi-Responsibility signalisieren.",
                    "+**Regel:** Bestimmte Begriffe im Dateinamen sind immer Symptome für fehlende klare Verantwortung.",
                    " ",
                    "-**Verbotene Patterns:**",
                    "-```",
                    "-*AndService.php      → \"User AND Auth\" = 2 Verantwortungen",
                    "-*ManagerController   → \"Manager\" = unklar",
                    "-*HelperService       → \"Helper\" = Müllhalde",
                    "-*UtilsRepository     → \"Utils\" = Müllhalde",
                    "-```",
                    "+**Blockiert (case-insensitive):**",
                    " ",
                    "-**Prüfung:**",
                    "+| Begriff | Begründung |",
                    "+|---------|------------|",
                    "+| Helper | \"Hilft bei allem\" = keine klare Verantwortung |",
                    "+| Utils | Sammelbecken für Funktionen ohne Heimat |",
                    "+| Common | \"Wird überall gebraucht\" = gehört nirgends hin |",
                    "+| Misc | Explizit: \"Verschiedenes\" |",
                    "+| Base | Oft Gott-Klasse mit Shared-State |",
                    "+",
                    "+**Nicht blockiert:**",
                    "+- \"Manager\" → Kann legitim sein (TransactionManager, EntityManager)",
                    "+- \"And\" im Namen → Sprachlich, nicht strukturell",
                    "+",
                    "+**Pattern:**",
                    " ```python",
                    "-forbidden_names = [\"And\", \"Manager\", \"Helper\", \"Utils\", \"Misc\", \"Common\", \"Base\"]",
                    "-for word in forbidden_names:",
                    "-    if word in filename:",
                    "-        block(f\"Forbidden name pattern: {word} suggests multiple responsibilities\")",
                    "+forbidden = [\"helper\", \"utils\", \"common\", \"misc\", \"base\"]",
                    "+filename_lower = filename.lower()",
                    "+for term in forbidden:",
                    "+    if term in filename_lower:",
                    "+        block(f\"Forbidden name: '{term}' indicates unclear responsibility\")",
                    " ```",
                    " ",
                    "-**Warum Pre:** Diese Namen sind Symptome für SRP-Verletzung.",
                    "+**Keine Ausnahmen.** Diese Begriffe sind niemals architektonisch sauber.",
                    " ",
                    " ---",
                    " ",
                    "-## Post-Hook Prüfungen (warnend)",
                    "+## Post-Hook (WARN)",
                    " ",
                    "-### W1.1: Klassengröße",
                    "+### W1.1: Klassengröße (LOC)",
                    " ",
                    "-**Regel:** Klasse > 200 LOC = Warnung, > 300 LOC = starke Warnung.",
                    "+**Regel:** Große Klassen haben oft mehrere Verantwortungen.",
                    " ",
                    "-**Prüfung:**",
                    "-```python",
                    "-loc = count_non_empty_lines(content)",
                    "-if loc > 300:",
                    "-    warn(f\"Class has {loc} LOC (max 300). Consider splitting.\")",
                    "-elif loc > 200:",
                    "-    warn(f\"Class approaching limit: {loc}\/300 LOC\")",
                    "-```",
                    "+| LOC | Aktion |",
                    "+|-----|--------|",
                    "+| > 200 | Hinweis |",
                    "+| > 300 | Warnung |",
                    " ",
                    "-**Warum Post:** Größe allein ist kein harter Fehler, aber ein Indikator.",
                    "+**Warum zwei Schwellen:**",
                    "+- 200: \"Du näherst dich dem Limit\"",
                    "+- 300: \"Hier stimmt strukturell etwas nicht\"",
                    " ",
                    "+**Messung:** Nicht-leere Zeilen.",
                    "+",
                    " ---",
                    " ",
                    "-### W1.2: Methoden-Anzahl",
                    "+### W1.2: Public-Method-Count",
                    " ",
                    "-**Regel:** Klasse > 10 public methods = Warnung.",
                    "+**Regel:** Viele öffentliche Methoden = viele Interaktionspunkte = breite Verantwortung.",
                    " ",
                    "-**Prüfung:**",
                    "-```python",
                    "-public_methods = re.findall(r\"public\\s+function\\s+\\w+\", content)",
                    "-if len(public_methods) > 10:",
                    "-    warn(f\"Class has {len(public_methods)} public methods. Consider splitting.\")",
                    "-```",
                    "+| Count | Aktion |",
                    "+|-------|--------|",
                    "+| > 10 | Warnung |",
                    " ",
                    "-**Warum Post:** Viele Methoden = viele Gründe sich zu ändern.",
                    "+**Warum 10:**",
                    "+- Ein fokussiertes Interface hat 3-7 Methoden",
                    "+- 10+ deutet auf Feature Creep",
                    " ",
                    " ---",
                    " ",
                    " ### W1.3: Constructor-Parameter",
                    " ",
                    "-**Regel:** Constructor > 5 Parameter = Warnung.",
                    "+**Regel:** Viele Dependencies = viele Gründe sich zu ändern.",
                    " ",
                    "-**Prüfung:**",
                    "-```python",
                    "-constructor = re.search(r\"__construct\\s*\\([^)]*\\)\", content)",
                    "-if constructor:",
                    "-    params = constructor.group().count(\"$\")",
                    "-    if params > 5:",
                    "-        warn(f\"Constructor has {params} parameters (max 5). Consider refactoring.\")",
                    "-```",
                    "+| Count | Aktion |",
                    "+|-------|--------|",
                    "+| > 5 | Warnung |",
                    " ",
                    "-**Warum Post:** Viele Dependencies = zu viel Verantwortung.",
                    "+**Warum 5:**",
                    "+- 1-3: Normal",
                    "+- 4-5: Grenzwertig",
                    "+- 6+: Fast immer strukturelles Problem",
                    " ",
                    " ---",
                    " ",
                    "-### W1.4: KISS - Verschachtelungstiefe",
                    "+### W1.4: Dependency-Count (use-Statements)",
                    " ",
                    "-**Regel:** > 3 Ebenen Verschachtelung = Warnung.",
                    "+**Regel:** Viele Imports = Kopplung an viele Module = viele Änderungsgründe.",
                    " ",
                    "-**Prüfung:**",
                    "-```python",
                    "-max_indent = 0",
                    "-for line in content.split(\"\\n\"):",
                    "-    indent = len(line) - len(line.lstrip())",
                    "-    spaces = indent \/\/ 4  # oder tabs",
                    "-    max_indent = max(max_indent, spaces)",
                    "-if max_indent > 4:",
                    "-    warn(f\"Nesting depth {max_indent} (max 4). Simplify logic.\")",
                    "-```",
                    "+| Count | Aktion |",
                    "+|-------|--------|",
                    "+| > 10 | Warnung |",
                    " ",
                    "-**Warum Post:** Tiefe Verschachtelung = komplexe Logik.",
                    "+**Warum 10:**",
                    "+- PHP-interne Classes zählen mit",
                    "+- Framework-Imports zählen mit",
                    "+- 10+ externe Abhängigkeiten ist ein Warnsignal",
                    " ",
                    " ---",
                    " ",
                    "-## Zusammenfassung Prüfung 1",
                    "+### W1.5: Verdächtige Namen",
                    " ",
                    "-| ID | Typ | Prüfung | Aktion |",
                    "-|----|-----|---------|--------|",
                    "-| P1.1 | Pre | @responsibility Header fehlt | BLOCK |",
                    "-| P1.2 | Pre | Verbotene Namenspattern | BLOCK |",
                    "-| W1.1 | Post | > 300 LOC | WARN |",
                    "-| W1.2 | Post | > 10 public methods | WARN |",
                    "-| W1.3 | Post | > 5 constructor params | WARN |",
                    "-| W1.4 | Post | > 4 nesting levels | WARN |",
                    "+**Regel:** Manche Begriffe sind nicht eindeutig Müll, aber verdächtig.",
                    " ",
                    "+| Begriff | Aktion |",
                    "+|---------|--------|",
                    "+| Manager | Hinweis |",
                    "+| And (als Wort) | Hinweis |",
                    "+",
                    "+**Warum Hinweis statt Block:**",
                    "+- \"UserManager\" kann legitim sein",
                    "+- \"ReadAndWrite\" kann legitim sein (obwohl fragwürdig)",
                    "+- Menschliche Entscheidung erforderlich",
                    "+",
                    " ---",
                    " ",
                    "-## Nächste Schritte",
                    "+## Gestrichen",
                    " ",
                    "-1. [ ] P1.1 + P1.2 in Pre-Hook implementieren",
                    "-2. [ ] W1.1 - W1.4 in Post-Hook implementieren",
                    "-3. [ ] Tests für alle Prüfungen",
                    "-4. [ ] Weiter mit Prüfung 2 (MVC + CRUD)",
                    "+### Verschachtelungstiefe",
                    " ",
                    "----",
                    "+**Ursprüngliche Idee:** > 4 Ebenen = Warnung",
                    " ",
                    "-# 2. MVC + CRUD",
                    "+**Warum gestrichen:**",
                    "+- Indent-basierte Messung ist nicht zuverlässig",
                    "+- PHP erlaubt verschiedene Styles (2, 4, Tabs)",
                    "+- Fluent Interfaces erzeugen tiefe Indents ohne Kontrollfluss",
                    "+- Array-Definitionen erzeugen tiefe Indents",
                    "+- False Positives zu hoch",
                    " ",
                    "-*Wird nach Abschluss von Prüfung 1 definiert.*",
                    "+**Alternative:** Erst implementieren wenn AST-Parsing verfügbar.",
                    " ",
                    " ---",
                    " ",
                    "-# 3. OOP",
                    "+## Zusammenfassung",
                    " ",
                    "-*Wird nach Abschluss von Prüfung 2 definiert.*",
                    "+### Pre-Hook",
                    " ",
                    "+| ID | Prüfung | Aktion |",
                    "+|----|---------|--------|",
                    "+| P1.1 | @responsibility fehlt oder Multi-Responsibility | BLOCK |",
                    "+| P1.2 | Müllhalden-Name (Helper, Utils, Common, Misc, Base) | BLOCK |",
                    "+",
                    "+### Post-Hook",
                    "+",
                    "+| ID | Prüfung | Schwelle | Aktion |",
                    "+|----|---------|----------|--------|",
                    "+| W1.1 | LOC | > 300 | WARN |",
                    "+| W1.2 | Public Methods | > 10 | WARN |",
                    "+| W1.3 | Constructor Params | > 5 | WARN |",
                    "+| W1.4 | Dependencies (use) | > 10 | WARN |",
                    "+| W1.5 | Verdächtige Namen | Manager, And | HINT |",
                    "+",
                    "+### Allowlist",
                    "+",
                    "+| Pfad | Grund |",
                    "+|------|-------|",
                    "+| \/vendor\/ | Third-party Code |",
                    "+| \/tests\/ | Test-Konventionen anders |",
                    "+| \/Test\/ | PHPUnit |",
                    "+",
                    " ---",
                    " ",
                    "-# 4. DRY",
                    "+## Selbstkritik und Entscheidungen",
                    " ",
                    "-*Wird nach Abschluss von Prüfung 3 definiert.*",
                    "+| Frage | Entscheidung | Begründung |",
                    "+|-------|--------------|------------|",
                    "+| Ist Multi-Word-Check im Header Over-Engineering? | Nein | Ein Regex. Verhindert \"Macht A und B\". Minimaler Aufwand, hoher Nutzen. |",
                    "+| Ist Dependency-Count SRP? | Ja | Viele Dependencies = viele Änderungsgründe = SRP-Verletzung per Definition. |",
                    "+| Sollen Factories in Allowlist? | Nein | Auch Factories sollten nicht 50 Methoden haben. Wenn zu groß, aufteilen. |",
                    "+| Warum keine Kontext-Schwellen für Repositories? | YAGNI | Komplexität ohne klaren Nutzen. Wer > 10 Methoden braucht, soll bewusst entscheiden. |",
                    " ",
                    " ---",
                    " ",
                    "-# 5. SOLID + DIP",
                    "+## Implementierung",
                    " ",
                    "-*Wird nach Abschluss von Prüfung 4 definiert.*",
                    "+**Dateien:**",
                    "+- `\/var\/www\/tools\/ki-protokoll\/claude-hook\/srp_kiss_guard.py` (Pre-Hook)",
                    "+- `\/var\/www\/tools\/ki-protokoll\/claude-hook\/srp_kiss_metrics.py` (Post-Hook)",
                    " ",
                    "+**Hooks in settings.json:**",
                    "+```json",
                    "+{",
                    "+  \"PreToolUse\": [",
                    "+    {",
                    "+      \"matcher\": \"Write\",",
                    "+      \"hooks\": [",
                    "+        {",
                    "+          \"type\": \"command\",",
                    "+          \"command\": \"\/var\/www\/tools\/ki-protokoll\/claude-hook\/srp_kiss_guard.py\",",
                    "+          \"timeout\": 5",
                    "+        }",
                    "+      ]",
                    "+    }",
                    "+  ],",
                    "+  \"PostToolUse\": [",
                    "+    {",
                    "+      \"matcher\": \"Write|Edit\",",
                    "+      \"hooks\": [",
                    "+        {",
                    "+          \"type\": \"command\",",
                    "+          \"command\": \"\/var\/www\/tools\/ki-protokoll\/claude-hook\/srp_kiss_metrics.py\",",
                    "+          \"timeout\": 5",
                    "+        }",
                    "+      ]",
                    "+    }",
                    "+  ]",
                    "+}",
                    "+```",
                    "+",
                    " ---",
                    " ",
                    "-# 6. PSR + Types",
                    "+# Prüfung 2-6",
                    " ",
                    "-*Wird nach Abschluss von Prüfung 5 definiert.*",
                    "+*Werden nach Abnahme von Prüfung 1 definiert.*"
                ]
            }
        ],
        "originalFile": "# Plan: Code Quality Gates\n\n## Prüfungsreihenfolge (nicht verhandelbar)\n\n| # | Prinzip | Prüfzeitpunkt |\n|---|---------|---------------|\n| 1 | SRP + KISS | Pre + Post |\n| 2 | MVC + CRUD | Pre + Post |\n| 3 | OOP | Post |\n| 4 | DRY | Post |\n| 5 | SOLID + DIP | Pre |\n| 6 | PSR + Types | Pre |\n\n---\n\n## Logik: Pre vs. Post\n\n**Pre-Hook (blockiert):**\n- Strukturelle Fehler, die sofort erkennbar sind\n- Verletzungen, die nie entstehen dürfen\n\n**Post-Hook (warnt):**\n- Qualitätsindikatoren, die Kontext brauchen\n- Metriken, die über Zeit gemessen werden\n\n---\n\n# 1. SRP + KISS\n\n## Definition\n\n**SRP (Single Responsibility Principle):**\nEine Klasse hat genau einen Grund sich zu ändern.\n\n**KISS (Keep It Simple Stupid):**\nKeine unnötige Komplexität. Keine vorzeitigen Abstraktionen.\n\n---\n\n## Pre-Hook Prüfungen (blockierend)\n\n### P1.1: Verantwortungs-Header erforderlich\n\n**Regel:** Jede neue PHP-Datei braucht einen `@responsibility` Header.\n\n**Format:**\n```php\n<?php\ndeclare(strict_types=1);\n\n\/\/ @responsibility: <ein-satz-beschreibung>\n```\n\n**Prüfung:**\n```python\npattern = r\"\/\/\\s*@responsibility:\\s*.+\"\nif not re.search(pattern, content):\n    block(\"Missing @responsibility header\")\n```\n\n**Warum Pre:** Ohne explizite Verantwortung entsteht Scope Creep.\n\n---\n\n### P1.2: Keine Multi-Responsibility Keywords\n\n**Regel:** Dateiname und Inhalt dürfen keine Multi-Responsibility signalisieren.\n\n**Verbotene Patterns:**\n```\n*AndService.php      → \"User AND Auth\" = 2 Verantwortungen\n*ManagerController   → \"Manager\" = unklar\n*HelperService       → \"Helper\" = Müllhalde\n*UtilsRepository     → \"Utils\" = Müllhalde\n```\n\n**Prüfung:**\n```python\nforbidden_names = [\"And\", \"Manager\", \"Helper\", \"Utils\", \"Misc\", \"Common\", \"Base\"]\nfor word in forbidden_names:\n    if word in filename:\n        block(f\"Forbidden name pattern: {word} suggests multiple responsibilities\")\n```\n\n**Warum Pre:** Diese Namen sind Symptome für SRP-Verletzung.\n\n---\n\n## Post-Hook Prüfungen (warnend)\n\n### W1.1: Klassengröße\n\n**Regel:** Klasse > 200 LOC = Warnung, > 300 LOC = starke Warnung.\n\n**Prüfung:**\n```python\nloc = count_non_empty_lines(content)\nif loc > 300:\n    warn(f\"Class has {loc} LOC (max 300). Consider splitting.\")\nelif loc > 200:\n    warn(f\"Class approaching limit: {loc}\/300 LOC\")\n```\n\n**Warum Post:** Größe allein ist kein harter Fehler, aber ein Indikator.\n\n---\n\n### W1.2: Methoden-Anzahl\n\n**Regel:** Klasse > 10 public methods = Warnung.\n\n**Prüfung:**\n```python\npublic_methods = re.findall(r\"public\\s+function\\s+\\w+\", content)\nif len(public_methods) > 10:\n    warn(f\"Class has {len(public_methods)} public methods. Consider splitting.\")\n```\n\n**Warum Post:** Viele Methoden = viele Gründe sich zu ändern.\n\n---\n\n### W1.3: Constructor-Parameter\n\n**Regel:** Constructor > 5 Parameter = Warnung.\n\n**Prüfung:**\n```python\nconstructor = re.search(r\"__construct\\s*\\([^)]*\\)\", content)\nif constructor:\n    params = constructor.group().count(\"$\")\n    if params > 5:\n        warn(f\"Constructor has {params} parameters (max 5). Consider refactoring.\")\n```\n\n**Warum Post:** Viele Dependencies = zu viel Verantwortung.\n\n---\n\n### W1.4: KISS - Verschachtelungstiefe\n\n**Regel:** > 3 Ebenen Verschachtelung = Warnung.\n\n**Prüfung:**\n```python\nmax_indent = 0\nfor line in content.split(\"\\n\"):\n    indent = len(line) - len(line.lstrip())\n    spaces = indent \/\/ 4  # oder tabs\n    max_indent = max(max_indent, spaces)\nif max_indent > 4:\n    warn(f\"Nesting depth {max_indent} (max 4). Simplify logic.\")\n```\n\n**Warum Post:** Tiefe Verschachtelung = komplexe Logik.\n\n---\n\n## Zusammenfassung Prüfung 1\n\n| ID | Typ | Prüfung | Aktion |\n|----|-----|---------|--------|\n| P1.1 | Pre | @responsibility Header fehlt | BLOCK |\n| P1.2 | Pre | Verbotene Namenspattern | BLOCK |\n| W1.1 | Post | > 300 LOC | WARN |\n| W1.2 | Post | > 10 public methods | WARN |\n| W1.3 | Post | > 5 constructor params | WARN |\n| W1.4 | Post | > 4 nesting levels | WARN |\n\n---\n\n## Nächste Schritte\n\n1. [ ] P1.1 + P1.2 in Pre-Hook implementieren\n2. [ ] W1.1 - W1.4 in Post-Hook implementieren\n3. [ ] Tests für alle Prüfungen\n4. [ ] Weiter mit Prüfung 2 (MVC + CRUD)\n\n---\n\n# 2. MVC + CRUD\n\n*Wird nach Abschluss von Prüfung 1 definiert.*\n\n---\n\n# 3. OOP\n\n*Wird nach Abschluss von Prüfung 2 definiert.*\n\n---\n\n# 4. DRY\n\n*Wird nach Abschluss von Prüfung 3 definiert.*\n\n---\n\n# 5. SOLID + DIP\n\n*Wird nach Abschluss von Prüfung 4 definiert.*\n\n---\n\n# 6. PSR + Types\n\n*Wird nach Abschluss von Prüfung 5 definiert.*\n"
    }
}
← Vorheriger Zur Liste Nächster →