Protokoll #6629
| ID | 6629 |
|---|---|
| Zeitstempel | 2025-12-23 06:40:44.192521 |
| Client | root |
| IP | Warning: Undefined array key "request_ip" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 |
| Modell | claude-sonnet-4-20250514 |
| Status | completed |
| Tokens | 8,202 (Input: 0, Output: 0) |
| Dauer | 97 ms |
| Request-Zeit | Warning: Undefined array key "request_timestamp" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 18 |
| Response-Zeit | - |
Warning: Undefined array key "error_message" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 22
Request
{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/plan-5-ebenen-architektur-sicherung.md",
"content": "# Plan: 5-Ebenen Architektur-Sicherung\n\n**Version:** 1.1 (nach Supervision-Korrektur)\n\n## Ziele (nicht verhandelbar)\n\n1. Konsistenz\n2. Kohärenz\n3. Modularität\n4. Wartbarkeit\n5. Stabilität\n6. Sicherheit\n7. Erweiterbarkeit\n\n---\n\n## Supervision-Korrekturen eingearbeitet\n\n| Problem | Korrektur |\n|---------|-----------|\n| Doppelte Regelreferenzen (H1, H3, Namespace) | Eine Wahrheit: Alle Regeln nur in Ebene 1 |\n| Ebene 3 mischt Deklaration + Enforcement | Trennung: 3a = Deklaration, 3b = Enforcement |\n| Allowlist als Erosionskanal | Technische Kontrolle: Hook prüft Allowlist-Größe |\n| Governance nur beschrieben | Technisch erzwungen: Contract-Änderung braucht Hook-Freigabe |\n| Infrastructure undifferenziert | Akzeptiert für v1, Differenzierung in v2 |\n\n---\n\n## Die 5 Ebenen (korrigiert)\n\n| Ebene | Zweck | Status |\n|-------|-------|--------|\n| 1 | Architecture Gate (ALLE Block-Regeln) | ✓ H1-H5 aktiv, H6-H15 offen |\n| 2 | Layer Invariants (nur Scope-Definition) | Offen |\n| 3a | Verantwortungs-Deklaration | Offen |\n| 3b | Verantwortungs-Enforcement | Offen |\n| 4 | Erosions-Detektion | Offen |\n| 5 | Change-Governance (technisch erzwungen) | Offen |\n\n---\n\n## Ebene 1: Architecture Gate (EINZIGE Regel-Quelle)\n\n**Prinzip:** Alle Block-Regeln leben hier. Keine Ausnahme.\n\n### Bestehende Regeln (v1.1)\n\n| ID | Regel | Scope |\n|----|-------|-------|\n| H1 | strict_types erforderlich | Alle PHP |\n| H2 | Domain ohne Infrastructure-Import | \/Domain\/ |\n| H3 | DatabaseFactory nur in Factory | Außerhalb \/Factory\/ |\n| H4 | Kein new Repository in Controller | \/Controller\/ |\n| H5 | Kein new Infrastructure in Controller | \/Controller\/ |\n\n### Neue Regeln (v1.2)\n\n| ID | Regel | Scope |\n|----|-------|-------|\n| H6 | Kein IO\/HTTP\/Globals in Domain | \/Domain\/ |\n| H7 | Keine DB-Artefakte in Domain | \/Domain\/ |\n| H8 | Keine direkte Persistenz in Controller | \/Controller\/ |\n| H9 | Keine Transaktionssteuerung in Controller | \/Controller\/ |\n| H10 | Kein new Infrastructure in UseCase | \/UseCases\/, \/Application\/ |\n| H11 | Keine Presentation-Imports in UseCase | \/UseCases\/, \/Application\/ |\n\n**Keine Regel existiert zweimal. Ebene 1 ist die einzige Wahrheit.**\n\n---\n\n## Ebene 2: Layer Invariants (nur Scope-Definition)\n\n**Prinzip:** Definiert NUR welche Pfade zu welchem Layer gehören.\n\n```yaml\nlayers:\n domain:\n paths: [\"\/Domain\/\", \"\/domain\/\"]\n invariant: \"Keine Außenabhängigkeiten\"\n\n application:\n paths: [\"\/UseCases\/\", \"\/Application\/\"]\n invariant: \"Nur Domain-Abhängigkeiten + Interfaces\"\n\n infrastructure:\n paths: [\"\/Infrastructure\/\"]\n invariant: \"Implementiert Interfaces, kennt alles\"\n\n presentation:\n paths: [\"\/Controller\/\", \"\/View\/\"]\n invariant: \"Nur Orchestrierung, keine Logik\"\n\n factory:\n paths: [\"\/Factory\/\"]\n invariant: \"Einziger Ort für Objekt-Erzeugung\"\n```\n\n**Ebene 2 enthält KEINE Regeln. Regeln sind in Ebene 1.**\n\n---\n\n## Ebene 3a: Verantwortungs-Deklaration (nur Header)\n\n**Prinzip:** Jede Datei deklariert ihre Verantwortung. Keine Prüfung hier.\n\n**Format:**\n```php\n<?php\ndeclare(strict_types=1);\n\n\/\/ @responsibility: <ein-satz-beschreibung>\n\/\/ @layer: domain|application|infrastructure|presentation\n\/\/ @forbidden: <komma-separierte-liste>\n```\n\n**Beispiel:**\n```php\n\/\/ @responsibility: Validiert Chat-Nachrichten-Inhalt\n\/\/ @layer: domain\n\/\/ @forbidden: persistence, http, io\n```\n\n**Ebene 3a prüft nur Existenz des Headers, nicht Inhalt.**\n\n---\n\n## Ebene 3b: Verantwortungs-Enforcement (separate Prüfung)\n\n**Prinzip:** Prüft ob @forbidden im Code verletzt wird.\n\n**Mapping forbidden → Pattern:**\n\n| forbidden | Pattern |\n|-----------|---------|\n| persistence | PDO, Repository, DatabaseFactory, SELECT, INSERT |\n| http | $_GET, $_POST, header(, Response |\n| io | file_get_contents, fopen, echo, print |\n| infrastructure | use Infrastructure\\ |\n\n**Technisch:** Separater Hook, nicht in architecture_guard.py gemischt.\n\n---\n\n## Ebene 4: Erosions-Detektion\n\n**Metriken (Post-Hook, nicht blockierend):**\n\n| Metrik | Schwellwert | Speicherung |\n|--------|-------------|-------------|\n| LOC pro Datei | > 300 | ki_dev.file_metrics |\n| Constructor-Parameter | > 5 | ki_dev.file_metrics |\n| use-Statements | > 10 | ki_dev.file_metrics |\n| Allowlist-Größe | Zunahme | ki_dev.allowlist_log |\n\n**Erosions-Warnung wenn:**\n- Datei 3x hintereinander wächst\n- Allowlist mehr als 10 Einträge hat\n- Neue Allowlist-Einträge ohne Begründung\n\n---\n\n## Ebene 5: Change-Governance (TECHNISCH ERZWUNGEN)\n\n**Prinzip:** Governance ist kein Dokument, sondern ein Gate.\n\n### 5a: Contract-Änderung\n\n**Hook:** `contract_change_guard.py`\n\n**Prüft bei Contract-Update:**\n- [ ] `change_reason` vorhanden\n- [ ] `change_risk` dokumentiert\n- [ ] `change_compensation` angegeben\n\n**Blockiert wenn fehlt.**\n\n### 5b: Allowlist-Änderung\n\n**Hook:** `allowlist_guard.py`\n\n**Prüft bei Allowlist-Erweiterung:**\n- [ ] `reason` vorhanden\n- [ ] `scope` definiert (welche Regeln betroffen)\n- [ ] `expires` oder `review_date` gesetzt\n\n**Blockiert wenn fehlt.**\n\n### 5c: H-Regel-Änderung\n\n**Invariante:** H-Regeln sind architektonische Invarianten.\n\n- Änderung nur per Contract-Version\n- Nicht projektlokal verhandelbar\n- Jede Änderung braucht Supervision-Review\n\n---\n\n## Kritische Risiken adressiert\n\n| Risiko | Maßnahme |\n|--------|----------|\n| Allowlist als Erosionskanal | Technischer Hook blockiert unbegründete Einträge |\n| Doppelte Regelreferenzen | Alle Regeln nur in Ebene 1 |\n| Ebene 3 Vermischung | Getrennt in 3a (Deklaration) und 3b (Enforcement) |\n| Governance nur Papier | Hooks erzwingen Dokumentation |\n| Infrastructure undifferenziert | Akzeptiert für v1, Ticket für v2 |\n\n---\n\n## Umsetzungs-Reihenfolge (korrigiert)\n\n| Phase | Was | Aufwand |\n|-------|-----|---------|\n| 1 | Ebene 1 erweitern (H6-H11) | 1 Tag |\n| 2 | Ebene 5a+5b: Governance-Hooks | 0.5 Tag |\n| 3 | Ebene 2: Layer-Definition in Contract | 0.5 Tag |\n| 4 | Ebene 3a: Header-Existenz-Prüfung | 0.5 Tag |\n| 5 | Ebene 4: Erosions-Metriken | 1 Tag |\n| 6 | Ebene 3b: Forbidden-Enforcement | 1 Tag |\n\n---\n\n## Dateien nach Implementierung\n\n| Datei | Ebene | Zweck |\n|-------|-------|-------|\n| architecture_guard.py | 1 | Alle Block-Regeln (H1-H11) |\n| contract_change_guard.py | 5a | Contract-Änderung prüfen |\n| allowlist_guard.py | 5b | Allowlist-Erweiterung prüfen |\n| responsibility_header_check.py | 3a | Header-Existenz prüfen |\n| responsibility_enforcement.py | 3b | Forbidden-Verletzung prüfen |\n| erosion_metrics.py | 4 | Metriken sammeln |\n\n---\n\n## Zusammenfassung\n\n**Eine Wahrheit:** Alle Regeln in Ebene 1.\n**Keine Vermischung:** Deklaration ≠ Enforcement.\n**Technische Erzwingung:** Governance per Hook, nicht per Dokument.\n**Allowlist unter Kontrolle:** Begründung + Ablaufdatum erzwungen.\n\n**Aktuell:** 1 von 5 Ebenen implementiert.\n**Nächster Schritt:** Ebene 1 erweitern (H6-H11), dann Ebene 5 (Governance-Hooks).\n"
}
}
Response
{
"tool_response": {
"type": "update",
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/docs\/plan-5-ebenen-architektur-sicherung.md",
"content": "# Plan: 5-Ebenen Architektur-Sicherung\n\n**Version:** 1.1 (nach Supervision-Korrektur)\n\n## Ziele (nicht verhandelbar)\n\n1. Konsistenz\n2. Kohärenz\n3. Modularität\n4. Wartbarkeit\n5. Stabilität\n6. Sicherheit\n7. Erweiterbarkeit\n\n---\n\n## Supervision-Korrekturen eingearbeitet\n\n| Problem | Korrektur |\n|---------|-----------|\n| Doppelte Regelreferenzen (H1, H3, Namespace) | Eine Wahrheit: Alle Regeln nur in Ebene 1 |\n| Ebene 3 mischt Deklaration + Enforcement | Trennung: 3a = Deklaration, 3b = Enforcement |\n| Allowlist als Erosionskanal | Technische Kontrolle: Hook prüft Allowlist-Größe |\n| Governance nur beschrieben | Technisch erzwungen: Contract-Änderung braucht Hook-Freigabe |\n| Infrastructure undifferenziert | Akzeptiert für v1, Differenzierung in v2 |\n\n---\n\n## Die 5 Ebenen (korrigiert)\n\n| Ebene | Zweck | Status |\n|-------|-------|--------|\n| 1 | Architecture Gate (ALLE Block-Regeln) | ✓ H1-H5 aktiv, H6-H15 offen |\n| 2 | Layer Invariants (nur Scope-Definition) | Offen |\n| 3a | Verantwortungs-Deklaration | Offen |\n| 3b | Verantwortungs-Enforcement | Offen |\n| 4 | Erosions-Detektion | Offen |\n| 5 | Change-Governance (technisch erzwungen) | Offen |\n\n---\n\n## Ebene 1: Architecture Gate (EINZIGE Regel-Quelle)\n\n**Prinzip:** Alle Block-Regeln leben hier. Keine Ausnahme.\n\n### Bestehende Regeln (v1.1)\n\n| ID | Regel | Scope |\n|----|-------|-------|\n| H1 | strict_types erforderlich | Alle PHP |\n| H2 | Domain ohne Infrastructure-Import | \/Domain\/ |\n| H3 | DatabaseFactory nur in Factory | Außerhalb \/Factory\/ |\n| H4 | Kein new Repository in Controller | \/Controller\/ |\n| H5 | Kein new Infrastructure in Controller | \/Controller\/ |\n\n### Neue Regeln (v1.2)\n\n| ID | Regel | Scope |\n|----|-------|-------|\n| H6 | Kein IO\/HTTP\/Globals in Domain | \/Domain\/ |\n| H7 | Keine DB-Artefakte in Domain | \/Domain\/ |\n| H8 | Keine direkte Persistenz in Controller | \/Controller\/ |\n| H9 | Keine Transaktionssteuerung in Controller | \/Controller\/ |\n| H10 | Kein new Infrastructure in UseCase | \/UseCases\/, \/Application\/ |\n| H11 | Keine Presentation-Imports in UseCase | \/UseCases\/, \/Application\/ |\n\n**Keine Regel existiert zweimal. Ebene 1 ist die einzige Wahrheit.**\n\n---\n\n## Ebene 2: Layer Invariants (nur Scope-Definition)\n\n**Prinzip:** Definiert NUR welche Pfade zu welchem Layer gehören.\n\n```yaml\nlayers:\n domain:\n paths: [\"\/Domain\/\", \"\/domain\/\"]\n invariant: \"Keine Außenabhängigkeiten\"\n\n application:\n paths: [\"\/UseCases\/\", \"\/Application\/\"]\n invariant: \"Nur Domain-Abhängigkeiten + Interfaces\"\n\n infrastructure:\n paths: [\"\/Infrastructure\/\"]\n invariant: \"Implementiert Interfaces, kennt alles\"\n\n presentation:\n paths: [\"\/Controller\/\", \"\/View\/\"]\n invariant: \"Nur Orchestrierung, keine Logik\"\n\n factory:\n paths: [\"\/Factory\/\"]\n invariant: \"Einziger Ort für Objekt-Erzeugung\"\n```\n\n**Ebene 2 enthält KEINE Regeln. Regeln sind in Ebene 1.**\n\n---\n\n## Ebene 3a: Verantwortungs-Deklaration (nur Header)\n\n**Prinzip:** Jede Datei deklariert ihre Verantwortung. Keine Prüfung hier.\n\n**Format:**\n```php\n<?php\ndeclare(strict_types=1);\n\n\/\/ @responsibility: <ein-satz-beschreibung>\n\/\/ @layer: domain|application|infrastructure|presentation\n\/\/ @forbidden: <komma-separierte-liste>\n```\n\n**Beispiel:**\n```php\n\/\/ @responsibility: Validiert Chat-Nachrichten-Inhalt\n\/\/ @layer: domain\n\/\/ @forbidden: persistence, http, io\n```\n\n**Ebene 3a prüft nur Existenz des Headers, nicht Inhalt.**\n\n---\n\n## Ebene 3b: Verantwortungs-Enforcement (separate Prüfung)\n\n**Prinzip:** Prüft ob @forbidden im Code verletzt wird.\n\n**Mapping forbidden → Pattern:**\n\n| forbidden | Pattern |\n|-----------|---------|\n| persistence | PDO, Repository, DatabaseFactory, SELECT, INSERT |\n| http | $_GET, $_POST, header(, Response |\n| io | file_get_contents, fopen, echo, print |\n| infrastructure | use Infrastructure\\ |\n\n**Technisch:** Separater Hook, nicht in architecture_guard.py gemischt.\n\n---\n\n## Ebene 4: Erosions-Detektion\n\n**Metriken (Post-Hook, nicht blockierend):**\n\n| Metrik | Schwellwert | Speicherung |\n|--------|-------------|-------------|\n| LOC pro Datei | > 300 | ki_dev.file_metrics |\n| Constructor-Parameter | > 5 | ki_dev.file_metrics |\n| use-Statements | > 10 | ki_dev.file_metrics |\n| Allowlist-Größe | Zunahme | ki_dev.allowlist_log |\n\n**Erosions-Warnung wenn:**\n- Datei 3x hintereinander wächst\n- Allowlist mehr als 10 Einträge hat\n- Neue Allowlist-Einträge ohne Begründung\n\n---\n\n## Ebene 5: Change-Governance (TECHNISCH ERZWUNGEN)\n\n**Prinzip:** Governance ist kein Dokument, sondern ein Gate.\n\n### 5a: Contract-Änderung\n\n**Hook:** `contract_change_guard.py`\n\n**Prüft bei Contract-Update:**\n- [ ] `change_reason` vorhanden\n- [ ] `change_risk` dokumentiert\n- [ ] `change_compensation` angegeben\n\n**Blockiert wenn fehlt.**\n\n### 5b: Allowlist-Änderung\n\n**Hook:** `allowlist_guard.py`\n\n**Prüft bei Allowlist-Erweiterung:**\n- [ ] `reason` vorhanden\n- [ ] `scope` definiert (welche Regeln betroffen)\n- [ ] `expires` oder `review_date` gesetzt\n\n**Blockiert wenn fehlt.**\n\n### 5c: H-Regel-Änderung\n\n**Invariante:** H-Regeln sind architektonische Invarianten.\n\n- Änderung nur per Contract-Version\n- Nicht projektlokal verhandelbar\n- Jede Änderung braucht Supervision-Review\n\n---\n\n## Kritische Risiken adressiert\n\n| Risiko | Maßnahme |\n|--------|----------|\n| Allowlist als Erosionskanal | Technischer Hook blockiert unbegründete Einträge |\n| Doppelte Regelreferenzen | Alle Regeln nur in Ebene 1 |\n| Ebene 3 Vermischung | Getrennt in 3a (Deklaration) und 3b (Enforcement) |\n| Governance nur Papier | Hooks erzwingen Dokumentation |\n| Infrastructure undifferenziert | Akzeptiert für v1, Ticket für v2 |\n\n---\n\n## Umsetzungs-Reihenfolge (korrigiert)\n\n| Phase | Was | Aufwand |\n|-------|-----|---------|\n| 1 | Ebene 1 erweitern (H6-H11) | 1 Tag |\n| 2 | Ebene 5a+5b: Governance-Hooks | 0.5 Tag |\n| 3 | Ebene 2: Layer-Definition in Contract | 0.5 Tag |\n| 4 | Ebene 3a: Header-Existenz-Prüfung | 0.5 Tag |\n| 5 | Ebene 4: Erosions-Metriken | 1 Tag |\n| 6 | Ebene 3b: Forbidden-Enforcement | 1 Tag |\n\n---\n\n## Dateien nach Implementierung\n\n| Datei | Ebene | Zweck |\n|-------|-------|-------|\n| architecture_guard.py | 1 | Alle Block-Regeln (H1-H11) |\n| contract_change_guard.py | 5a | Contract-Änderung prüfen |\n| allowlist_guard.py | 5b | Allowlist-Erweiterung prüfen |\n| responsibility_header_check.py | 3a | Header-Existenz prüfen |\n| responsibility_enforcement.py | 3b | Forbidden-Verletzung prüfen |\n| erosion_metrics.py | 4 | Metriken sammeln |\n\n---\n\n## Zusammenfassung\n\n**Eine Wahrheit:** Alle Regeln in Ebene 1.\n**Keine Vermischung:** Deklaration ≠ Enforcement.\n**Technische Erzwingung:** Governance per Hook, nicht per Dokument.\n**Allowlist unter Kontrolle:** Begründung + Ablaufdatum erzwungen.\n\n**Aktuell:** 1 von 5 Ebenen implementiert.\n**Nächster Schritt:** Ebene 1 erweitern (H6-H11), dann Ebene 5 (Governance-Hooks).\n",
"structuredPatch": [
{
"oldStart": 1,
"oldLines": 5,
"newStart": 1,
"newLines": 7,
"lines": [
" # Plan: 5-Ebenen Architektur-Sicherung",
" ",
"+**Version:** 1.1 (nach Supervision-Korrektur)",
"+",
" ## Ziele (nicht verhandelbar)",
" ",
" 1. Konsistenz"
]
},
{
"oldStart": 12,
"oldLines": 221,
"newStart": 14,
"newLines": 231,
"lines": [
" ",
" ---",
" ",
"-## Die 5 Ebenen",
"+## Supervision-Korrekturen eingearbeitet",
" ",
"+| Problem | Korrektur |",
"+|---------|-----------|",
"+| Doppelte Regelreferenzen (H1, H3, Namespace) | Eine Wahrheit: Alle Regeln nur in Ebene 1 |",
"+| Ebene 3 mischt Deklaration + Enforcement | Trennung: 3a = Deklaration, 3b = Enforcement |",
"+| Allowlist als Erosionskanal | Technische Kontrolle: Hook prüft Allowlist-Größe |",
"+| Governance nur beschrieben | Technisch erzwungen: Contract-Änderung braucht Hook-Freigabe |",
"+| Infrastructure undifferenziert | Akzeptiert für v1, Differenzierung in v2 |",
"+",
"+---",
"+",
"+## Die 5 Ebenen (korrigiert)",
"+",
" | Ebene | Zweck | Status |",
" |-------|-------|--------|",
"-| 1 | Architecture Gate | ✓ Aktiv (H1-H5) |",
"-| 2 | Layer Invariants | Offen |",
"-| 3 | Verantwortungs-Grenzen pro Datei | Offen |",
"+| 1 | Architecture Gate (ALLE Block-Regeln) | ✓ H1-H5 aktiv, H6-H15 offen |",
"+| 2 | Layer Invariants (nur Scope-Definition) | Offen |",
"+| 3a | Verantwortungs-Deklaration | Offen |",
"+| 3b | Verantwortungs-Enforcement | Offen |",
" | 4 | Erosions-Detektion | Offen |",
"-| 5 | Change-Governance | Offen |",
"+| 5 | Change-Governance (technisch erzwungen) | Offen |",
" ",
" ---",
" ",
"-## Ebene 1: Architecture Gate",
"+## Ebene 1: Architecture Gate (EINZIGE Regel-Quelle)",
" ",
"-**Status:** Implementiert",
"+**Prinzip:** Alle Block-Regeln leben hier. Keine Ausnahme.",
" ",
"-**Was es tut:**",
"-- Blockiert strukturellen Müll vor Entstehung",
"-- 5 harte Regeln (H1-H5)",
"-- Pre-Hook, deterministisch",
"+### Bestehende Regeln (v1.1)",
" ",
"-**Was es sichert:**",
"-- Konsistenz ✓",
"-- Kohärenz ✓",
"-- Grundstabilität ✓",
"+| ID | Regel | Scope |",
"+|----|-------|-------|",
"+| H1 | strict_types erforderlich | Alle PHP |",
"+| H2 | Domain ohne Infrastructure-Import | \/Domain\/ |",
"+| H3 | DatabaseFactory nur in Factory | Außerhalb \/Factory\/ |",
"+| H4 | Kein new Repository in Controller | \/Controller\/ |",
"+| H5 | Kein new Infrastructure in Controller | \/Controller\/ |",
" ",
"-**Was es NICHT sichert:**",
"-- Inhalt der Dateien",
"-- Layer-Grenzen vollständig",
"-- Langzeit-Erosion",
"+### Neue Regeln (v1.2)",
" ",
"+| ID | Regel | Scope |",
"+|----|-------|-------|",
"+| H6 | Kein IO\/HTTP\/Globals in Domain | \/Domain\/ |",
"+| H7 | Keine DB-Artefakte in Domain | \/Domain\/ |",
"+| H8 | Keine direkte Persistenz in Controller | \/Controller\/ |",
"+| H9 | Keine Transaktionssteuerung in Controller | \/Controller\/ |",
"+| H10 | Kein new Infrastructure in UseCase | \/UseCases\/, \/Application\/ |",
"+| H11 | Keine Presentation-Imports in UseCase | \/UseCases\/, \/Application\/ |",
"+",
"+**Keine Regel existiert zweimal. Ebene 1 ist die einzige Wahrheit.**",
"+",
" ---",
" ",
"-## Ebene 2: Layer Invariants",
"+## Ebene 2: Layer Invariants (nur Scope-Definition)",
" ",
"-**Status:** Offen",
"+**Prinzip:** Definiert NUR welche Pfade zu welchem Layer gehören.",
" ",
"-**Was es tut:**",
"-- Erzwingt Verbote pro Layer",
"-- Pfadbasiert, Regex, blockierend",
"+```yaml",
"+layers:",
"+ domain:",
"+ paths: [\"\/Domain\/\", \"\/domain\/\"]",
"+ invariant: \"Keine Außenabhängigkeiten\"",
" ",
"-**Neue Regeln (H6-H15):**",
"+ application:",
"+ paths: [\"\/UseCases\/\", \"\/Application\/\"]",
"+ invariant: \"Nur Domain-Abhängigkeiten + Interfaces\"",
" ",
"-| ID | Layer | Verbot |",
"-|----|-------|--------|",
"-| H6 | Domain | Kein IO, HTTP, Infrastructure, Globals |",
"-| H7 | Domain | Keine DB-Artefakte (SELECT, PDO, etc.) |",
"-| H8 | Controller | Keine direkte Persistenz |",
"-| H9 | Controller | Keine Transaktionssteuerung |",
"-| H10 | Controller | Kein new Infrastructure\\*Repository\/Client\/Gateway |",
"-| H11 | Alle | strict_types (existiert als H1) |",
"-| H12 | Alle | Namespace = Pfad (existiert) |",
"-| H13 | Nur Factory | DatabaseFactory erlaubt (existiert als H3) |",
"-| H14 | UseCase | Kein new Infrastructure, kein DatabaseFactory |",
"-| H15 | UseCase | Keine Presentation-Imports |",
"+ infrastructure:",
"+ paths: [\"\/Infrastructure\/\"]",
"+ invariant: \"Implementiert Interfaces, kennt alles\"",
" ",
"-**Layer-Pfade:**",
"+ presentation:",
"+ paths: [\"\/Controller\/\", \"\/View\/\"]",
"+ invariant: \"Nur Orchestrierung, keine Logik\"",
" ",
"+ factory:",
"+ paths: [\"\/Factory\/\"]",
"+ invariant: \"Einziger Ort für Objekt-Erzeugung\"",
" ```",
"-Domain: \/Domain\/, \/domain\/",
"-Application: \/UseCases\/, \/Application\/",
"-Infrastructure: \/Infrastructure\/",
"-Presentation: \/Controller\/, \/View\/",
"-Factory: \/Factory\/",
"-Test: \/tests\/, \/Test\/",
"-```",
" ",
"-**Umsetzung:**",
"-- Erweiterung architecture_guard.py",
"-- Scope-Funktion pro Layer",
"-- Pattern-Liste pro Regel",
"+**Ebene 2 enthält KEINE Regeln. Regeln sind in Ebene 1.**",
" ",
" ---",
" ",
"-## Ebene 3: Verantwortungs-Grenzen pro Datei",
"+## Ebene 3a: Verantwortungs-Deklaration (nur Header)",
" ",
"-**Status:** Offen",
"+**Prinzip:** Jede Datei deklariert ihre Verantwortung. Keine Prüfung hier.",
" ",
"-**Was es tut:**",
"-- Jede Datei deklariert ihre Verantwortung",
"-- Maschinenlesbar, prüfbar",
"-",
"-**Format (am Dateianfang):**",
"-",
"+**Format:**",
" ```php",
" <?php",
" declare(strict_types=1);",
" ",
"-\/\/ @responsibility: chat-message-orchestration",
"-\/\/ @forbidden: persistence, io, infrastructure",
"+\/\/ @responsibility: <ein-satz-beschreibung>",
"+\/\/ @layer: domain|application|infrastructure|presentation",
"+\/\/ @forbidden: <komma-separierte-liste>",
" ```",
" ",
"-**Prüfung:**",
"-- `@responsibility` genau einmal vorhanden",
"-- `@forbidden` Begriffe nicht im Code",
"+**Beispiel:**",
"+```php",
"+\/\/ @responsibility: Validiert Chat-Nachrichten-Inhalt",
"+\/\/ @layer: domain",
"+\/\/ @forbidden: persistence, http, io",
"+```",
" ",
"-**Umsetzung:**",
"-- Neuer Hook oder Erweiterung architecture_guard.py",
"-- Regex auf Kommentar-Header",
"-- Abgleich forbidden vs. Code-Inhalt",
"+**Ebene 3a prüft nur Existenz des Headers, nicht Inhalt.**",
" ",
" ---",
" ",
"-## Ebene 4: Erosions-Detektion",
"+## Ebene 3b: Verantwortungs-Enforcement (separate Prüfung)",
" ",
"-**Status:** Offen",
"+**Prinzip:** Prüft ob @forbidden im Code verletzt wird.",
" ",
"-**Was es tut:**",
"-- Misst Trends über Zeit",
"-- Warnt bei schleichender Verschlechterung",
"+**Mapping forbidden → Pattern:**",
" ",
"-**Metriken:**",
"+| forbidden | Pattern |",
"+|-----------|---------|",
"+| persistence | PDO, Repository, DatabaseFactory, SELECT, INSERT |",
"+| http | $_GET, $_POST, header(, Response |",
"+| io | file_get_contents, fopen, echo, print |",
"+| infrastructure | use Infrastructure\\ |",
" ",
"-| Metrik | Schwellwert | Aktion |",
"-|--------|-------------|--------|",
"-| Dateigröße | > 300 LOC | Warn |",
"-| Constructor-Parameter | > 5 | Warn |",
"-| Abhängigkeiten (use) | > 10 | Warn |",
"-| Allowlist-Einträge | Zunahme | Review |",
"+**Technisch:** Separater Hook, nicht in architecture_guard.py gemischt.",
" ",
"-**Umsetzung:**",
"-- Post-Hook (nicht blockierend)",
"-- Zählwerte in DB speichern",
"-- Zeitreihe für Trend-Analyse",
"+---",
" ",
"+## Ebene 4: Erosions-Detektion",
"+",
"+**Metriken (Post-Hook, nicht blockierend):**",
"+",
"+| Metrik | Schwellwert | Speicherung |",
"+|--------|-------------|-------------|",
"+| LOC pro Datei | > 300 | ki_dev.file_metrics |",
"+| Constructor-Parameter | > 5 | ki_dev.file_metrics |",
"+| use-Statements | > 10 | ki_dev.file_metrics |",
"+| Allowlist-Größe | Zunahme | ki_dev.allowlist_log |",
"+",
"+**Erosions-Warnung wenn:**",
"+- Datei 3x hintereinander wächst",
"+- Allowlist mehr als 10 Einträge hat",
"+- Neue Allowlist-Einträge ohne Begründung",
"+",
" ---",
" ",
"-## Ebene 5: Change-Governance",
"+## Ebene 5: Change-Governance (TECHNISCH ERZWUNGEN)",
" ",
"-**Status:** Offen",
"+**Prinzip:** Governance ist kein Dokument, sondern ein Gate.",
" ",
"-**Was es tut:**",
"-- Regelt wer Contract ändern darf",
"-- Dokumentiert jede Änderung",
"+### 5a: Contract-Änderung",
" ",
"-**Regeln:**",
"+**Hook:** `contract_change_guard.py`",
" ",
"-1. Contract-Änderung braucht:",
"- - Grund",
"- - Risiko",
"- - Kompensation",
"+**Prüft bei Contract-Update:**",
"+- [ ] `change_reason` vorhanden",
"+- [ ] `change_risk` dokumentiert",
"+- [ ] `change_compensation` angegeben",
" ",
"-2. Allowlist-Eintrag braucht:",
"- - Begründung",
"- - Scope",
"- - Ablaufdatum oder Review-Punkt",
"+**Blockiert wenn fehlt.**",
" ",
"-3. H-Regeln sind Invarianten:",
"- - Nur per Contract-Version änderbar",
"- - Nicht projektlokal verhandelbar",
"+### 5b: Allowlist-Änderung",
" ",
"-**Umsetzung:**",
"-- Contract-History in DB (existiert)",
"-- Änderungs-Template (neu)",
"-- Review-Pflicht dokumentieren",
"+**Hook:** `allowlist_guard.py`",
" ",
"----",
"+**Prüft bei Allowlist-Erweiterung:**",
"+- [ ] `reason` vorhanden",
"+- [ ] `scope` definiert (welche Regeln betroffen)",
"+- [ ] `expires` oder `review_date` gesetzt",
" ",
"-## Umsetzungs-Reihenfolge",
"+**Blockiert wenn fehlt.**",
" ",
"-| Phase | Ebene | Aufwand | Priorität |",
"-|-------|-------|---------|-----------|",
"-| 1 | Ebene 2: Layer Invariants | 1 Tag | HOCH |",
"-| 2 | Ebene 5: Change-Governance | 0.5 Tag | HOCH |",
"-| 3 | Ebene 3: Verantwortungs-Grenzen | 1 Tag | MITTEL |",
"-| 4 | Ebene 4: Erosions-Detektion | 1 Tag | MITTEL |",
"+### 5c: H-Regel-Änderung",
" ",
"+**Invariante:** H-Regeln sind architektonische Invarianten.",
"+",
"+- Änderung nur per Contract-Version",
"+- Nicht projektlokal verhandelbar",
"+- Jede Änderung braucht Supervision-Review",
"+",
" ---",
" ",
"-## Konkrete nächste Schritte",
"+## Kritische Risiken adressiert",
" ",
"-### Schritt 1: Layer Invariants (H6-H15)",
"-- [ ] architecture_guard.py erweitern",
"-- [ ] Scope-Funktionen für alle Layer",
"-- [ ] 10 neue Regeln implementieren",
"-- [ ] Tests für alle Regeln",
"-- [ ] Contract auf v1.2 updaten",
"+| Risiko | Maßnahme |",
"+|--------|----------|",
"+| Allowlist als Erosionskanal | Technischer Hook blockiert unbegründete Einträge |",
"+| Doppelte Regelreferenzen | Alle Regeln nur in Ebene 1 |",
"+| Ebene 3 Vermischung | Getrennt in 3a (Deklaration) und 3b (Enforcement) |",
"+| Governance nur Papier | Hooks erzwingen Dokumentation |",
"+| Infrastructure undifferenziert | Akzeptiert für v1, Ticket für v2 |",
" ",
"-### Schritt 2: Change-Governance",
"-- [ ] Änderungs-Template erstellen",
"-- [ ] Contract um Governance-Abschnitt erweitern",
"-- [ ] Allowlist-Dokumentation erzwingen",
"+---",
" ",
"-### Schritt 3: Verantwortungs-Grenzen",
"-- [ ] Header-Format definieren",
"-- [ ] Prüf-Hook implementieren",
"-- [ ] Bestehende Dateien migrieren",
"+## Umsetzungs-Reihenfolge (korrigiert)",
" ",
"-### Schritt 4: Erosions-Detektion",
"-- [ ] Metriken-Tabelle in DB",
"-- [ ] Post-Hook für Messung",
"-- [ ] Dashboard oder Report",
"+| Phase | Was | Aufwand |",
"+|-------|-----|---------|",
"+| 1 | Ebene 1 erweitern (H6-H11) | 1 Tag |",
"+| 2 | Ebene 5a+5b: Governance-Hooks | 0.5 Tag |",
"+| 3 | Ebene 2: Layer-Definition in Contract | 0.5 Tag |",
"+| 4 | Ebene 3a: Header-Existenz-Prüfung | 0.5 Tag |",
"+| 5 | Ebene 4: Erosions-Metriken | 1 Tag |",
"+| 6 | Ebene 3b: Forbidden-Enforcement | 1 Tag |",
" ",
" ---",
" ",
"-## Was jede Ebene sichert",
"+## Dateien nach Implementierung",
" ",
"-| Ziel | E1 | E2 | E3 | E4 | E5 |",
"-|------|----|----|----|----|-----|",
"-| Konsistenz | ✓ | ✓ | ✓ | | ✓ |",
"-| Kohärenz | ✓ | ✓ | ✓ | | |",
"-| Modularität | | ✓ | ✓ | | |",
"-| Wartbarkeit | | ✓ | ✓ | ✓ | |",
"-| Stabilität | ✓ | ✓ | | ✓ | ✓ |",
"-| Sicherheit | | ✓ | | | ✓ |",
"-| Erweiterbarkeit | | ✓ | ✓ | | |",
"+| Datei | Ebene | Zweck |",
"+|-------|-------|-------|",
"+| architecture_guard.py | 1 | Alle Block-Regeln (H1-H11) |",
"+| contract_change_guard.py | 5a | Contract-Änderung prüfen |",
"+| allowlist_guard.py | 5b | Allowlist-Erweiterung prüfen |",
"+| responsibility_header_check.py | 3a | Header-Existenz prüfen |",
"+| responsibility_enforcement.py | 3b | Forbidden-Verletzung prüfen |",
"+| erosion_metrics.py | 4 | Metriken sammeln |",
" ",
" ---",
" ",
" ## Zusammenfassung",
" ",
"-**Aktuell:** 1 von 5 Ebenen implementiert.",
"+**Eine Wahrheit:** Alle Regeln in Ebene 1.",
"+**Keine Vermischung:** Deklaration ≠ Enforcement.",
"+**Technische Erzwingung:** Governance per Hook, nicht per Dokument.",
"+**Allowlist unter Kontrolle:** Begründung + Ablaufdatum erzwungen.",
" ",
"-**Risiko:** Ohne Ebene 2-5 erodiert Ebene 1 innerhalb von 6 Monaten.",
"-",
"-**Lösung:** Ebene 2 und 5 sofort, Ebene 3 und 4 innerhalb 2 Wochen.",
"-",
"-**Keine Theorie. Nur Zwang zur Ordnung.**",
"+**Aktuell:** 1 von 5 Ebenen implementiert.",
"+**Nächster Schritt:** Ebene 1 erweitern (H6-H11), dann Ebene 5 (Governance-Hooks)."
]
}
],
"originalFile": "# Plan: 5-Ebenen Architektur-Sicherung\n\n## Ziele (nicht verhandelbar)\n\n1. Konsistenz\n2. Kohärenz\n3. Modularität\n4. Wartbarkeit\n5. Stabilität\n6. Sicherheit\n7. Erweiterbarkeit\n\n---\n\n## Die 5 Ebenen\n\n| Ebene | Zweck | Status |\n|-------|-------|--------|\n| 1 | Architecture Gate | ✓ Aktiv (H1-H5) |\n| 2 | Layer Invariants | Offen |\n| 3 | Verantwortungs-Grenzen pro Datei | Offen |\n| 4 | Erosions-Detektion | Offen |\n| 5 | Change-Governance | Offen |\n\n---\n\n## Ebene 1: Architecture Gate\n\n**Status:** Implementiert\n\n**Was es tut:**\n- Blockiert strukturellen Müll vor Entstehung\n- 5 harte Regeln (H1-H5)\n- Pre-Hook, deterministisch\n\n**Was es sichert:**\n- Konsistenz ✓\n- Kohärenz ✓\n- Grundstabilität ✓\n\n**Was es NICHT sichert:**\n- Inhalt der Dateien\n- Layer-Grenzen vollständig\n- Langzeit-Erosion\n\n---\n\n## Ebene 2: Layer Invariants\n\n**Status:** Offen\n\n**Was es tut:**\n- Erzwingt Verbote pro Layer\n- Pfadbasiert, Regex, blockierend\n\n**Neue Regeln (H6-H15):**\n\n| ID | Layer | Verbot |\n|----|-------|--------|\n| H6 | Domain | Kein IO, HTTP, Infrastructure, Globals |\n| H7 | Domain | Keine DB-Artefakte (SELECT, PDO, etc.) |\n| H8 | Controller | Keine direkte Persistenz |\n| H9 | Controller | Keine Transaktionssteuerung |\n| H10 | Controller | Kein new Infrastructure\\*Repository\/Client\/Gateway |\n| H11 | Alle | strict_types (existiert als H1) |\n| H12 | Alle | Namespace = Pfad (existiert) |\n| H13 | Nur Factory | DatabaseFactory erlaubt (existiert als H3) |\n| H14 | UseCase | Kein new Infrastructure, kein DatabaseFactory |\n| H15 | UseCase | Keine Presentation-Imports |\n\n**Layer-Pfade:**\n\n```\nDomain: \/Domain\/, \/domain\/\nApplication: \/UseCases\/, \/Application\/\nInfrastructure: \/Infrastructure\/\nPresentation: \/Controller\/, \/View\/\nFactory: \/Factory\/\nTest: \/tests\/, \/Test\/\n```\n\n**Umsetzung:**\n- Erweiterung architecture_guard.py\n- Scope-Funktion pro Layer\n- Pattern-Liste pro Regel\n\n---\n\n## Ebene 3: Verantwortungs-Grenzen pro Datei\n\n**Status:** Offen\n\n**Was es tut:**\n- Jede Datei deklariert ihre Verantwortung\n- Maschinenlesbar, prüfbar\n\n**Format (am Dateianfang):**\n\n```php\n<?php\ndeclare(strict_types=1);\n\n\/\/ @responsibility: chat-message-orchestration\n\/\/ @forbidden: persistence, io, infrastructure\n```\n\n**Prüfung:**\n- `@responsibility` genau einmal vorhanden\n- `@forbidden` Begriffe nicht im Code\n\n**Umsetzung:**\n- Neuer Hook oder Erweiterung architecture_guard.py\n- Regex auf Kommentar-Header\n- Abgleich forbidden vs. Code-Inhalt\n\n---\n\n## Ebene 4: Erosions-Detektion\n\n**Status:** Offen\n\n**Was es tut:**\n- Misst Trends über Zeit\n- Warnt bei schleichender Verschlechterung\n\n**Metriken:**\n\n| Metrik | Schwellwert | Aktion |\n|--------|-------------|--------|\n| Dateigröße | > 300 LOC | Warn |\n| Constructor-Parameter | > 5 | Warn |\n| Abhängigkeiten (use) | > 10 | Warn |\n| Allowlist-Einträge | Zunahme | Review |\n\n**Umsetzung:**\n- Post-Hook (nicht blockierend)\n- Zählwerte in DB speichern\n- Zeitreihe für Trend-Analyse\n\n---\n\n## Ebene 5: Change-Governance\n\n**Status:** Offen\n\n**Was es tut:**\n- Regelt wer Contract ändern darf\n- Dokumentiert jede Änderung\n\n**Regeln:**\n\n1. Contract-Änderung braucht:\n - Grund\n - Risiko\n - Kompensation\n\n2. Allowlist-Eintrag braucht:\n - Begründung\n - Scope\n - Ablaufdatum oder Review-Punkt\n\n3. H-Regeln sind Invarianten:\n - Nur per Contract-Version änderbar\n - Nicht projektlokal verhandelbar\n\n**Umsetzung:**\n- Contract-History in DB (existiert)\n- Änderungs-Template (neu)\n- Review-Pflicht dokumentieren\n\n---\n\n## Umsetzungs-Reihenfolge\n\n| Phase | Ebene | Aufwand | Priorität |\n|-------|-------|---------|-----------|\n| 1 | Ebene 2: Layer Invariants | 1 Tag | HOCH |\n| 2 | Ebene 5: Change-Governance | 0.5 Tag | HOCH |\n| 3 | Ebene 3: Verantwortungs-Grenzen | 1 Tag | MITTEL |\n| 4 | Ebene 4: Erosions-Detektion | 1 Tag | MITTEL |\n\n---\n\n## Konkrete nächste Schritte\n\n### Schritt 1: Layer Invariants (H6-H15)\n- [ ] architecture_guard.py erweitern\n- [ ] Scope-Funktionen für alle Layer\n- [ ] 10 neue Regeln implementieren\n- [ ] Tests für alle Regeln\n- [ ] Contract auf v1.2 updaten\n\n### Schritt 2: Change-Governance\n- [ ] Änderungs-Template erstellen\n- [ ] Contract um Governance-Abschnitt erweitern\n- [ ] Allowlist-Dokumentation erzwingen\n\n### Schritt 3: Verantwortungs-Grenzen\n- [ ] Header-Format definieren\n- [ ] Prüf-Hook implementieren\n- [ ] Bestehende Dateien migrieren\n\n### Schritt 4: Erosions-Detektion\n- [ ] Metriken-Tabelle in DB\n- [ ] Post-Hook für Messung\n- [ ] Dashboard oder Report\n\n---\n\n## Was jede Ebene sichert\n\n| Ziel | E1 | E2 | E3 | E4 | E5 |\n|------|----|----|----|----|-----|\n| Konsistenz | ✓ | ✓ | ✓ | | ✓ |\n| Kohärenz | ✓ | ✓ | ✓ | | |\n| Modularität | | ✓ | ✓ | | |\n| Wartbarkeit | | ✓ | ✓ | ✓ | |\n| Stabilität | ✓ | ✓ | | ✓ | ✓ |\n| Sicherheit | | ✓ | | | ✓ |\n| Erweiterbarkeit | | ✓ | ✓ | | |\n\n---\n\n## Zusammenfassung\n\n**Aktuell:** 1 von 5 Ebenen implementiert.\n\n**Risiko:** Ohne Ebene 2-5 erodiert Ebene 1 innerhalb von 6 Monaten.\n\n**Lösung:** Ebene 2 und 5 sofort, Ebene 3 und 4 innerhalb 2 Wochen.\n\n**Keine Theorie. Nur Zwang zur Ordnung.**\n"
}
}