From daaa88a53dbc9f784ca04a1bcd33935595b90e19 Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Sat, 22 Aug 2026 22:40:59 +0200 Subject: [PATCH] docs: 137 Architektur-Fehler (ARCH-001 bis ARCH-137) durch systematisches Code-Review dokumentiert --- docs/test-bugs.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/docs/test-bugs.md b/docs/test-bugs.md index a5a9405..e307889 100644 --- a/docs/test-bugs.md +++ b/docs/test-bugs.md @@ -1574,3 +1574,63 @@ Playwright E2E: 10 passed, 24 failed (BUG-011/012/013 — Mock-Daten und data-te - **Problem:** AI_PARTICIPANT_TYPES ist statisch. Neue AI-Participant-Types können nicht dynamisch hinzugefügt werden. - **Schweregrad:** Low - **Status:** ⏳ Nicht gefixt + +### ARCH-128: services/dedup_service.py — DUPLICATE_FIELDS statisch +- **Datei:** app/services/dedup_service.py:18 +- **Problem:** DUPLICATE_FIELDS ist statisch. Neue Felder können nicht dynamisch hinzugefügt werden. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-129: services/import_export_service.py — COMPANY_COLUMNS/CONTACT_COLUMNS statisch +- **Datei:** app/services/import_export_service.py:24-26 +- **Problem:** COMPANY_COLUMNS und CONTACT_COLUMNS sind statisch. Neue Felder (z.B. Custom Fields) werden nicht berücksichtigt. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-130: models/webhook.py — Webhook.secret als Plaintext +- **Datei:** app/models/webhook.py:28 +- **Problem:** `secret: Mapped[str | None] = mapped_column(String(255), nullable=True, default=None)` — HMAC Secret als Plaintext in DB. Sollte verschlüsselt sein. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-131: services/webhook_service.py — _validate_webhook_url macht DNS-Auflösung +- **Datei:** app/services/webhook_service.py:30 +- **Problem:** _validate_webhook_url macht socket.getaddrinfo() für DNS-Auflösung. Das ist ein synchroner Call in einer async Service-Funktion — kann den Event Loop blockieren. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-132: services/user_service.py — _UNSET Sentinel nicht serialisierbar +- **Datei:** app/services/user_service.py:15 +- **Problem:** `_UNSET: Any = object()` — Sentinel-Objekt. Nicht serialisierbar, kann bei Logging/Debugging Probleme verursachen. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-133: models/workspace.py — 4 Tabellen überdimensioniert +- **Datei:** app/models/workspace.py:7 +- **Problem:** Kommentar: '4 Workspace-Tabellen sind überdimensioniert für ein Mini-CRM'. Workspace, WorkspaceModule, WorkspaceUser, WorkspaceWidget — 4 Tabellen für UI-Navigation. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-134: services/bulk_permission_service.py — _rank() dupliziert +- **Datei:** app/services/bulk_permission_service.py:18, app/core/visibility.py:30, app/services/permission_resolver.py:14 +- **Problem:** _rank() Funktion ist in 3 Dateien definiert. Sollte zentralisiert werden. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-135: services/entity_permission_service.py — post_system_message (Core→Plugin Kette) +- **Datei:** app/services/entity_permission_service.py:25 +- **Problem:** `from app.core.notifications import post_system_message` — notifications.py importiert wiederum von plugins.builtins.contracts. Indirekte Core→Plugin Abhängigkeit. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-136: models/entity_history.py — keine deleted_at Spalte +- **Datei:** app/models/entity_history.py +- **Problem:** EntityHistory hat keine deleted_at Spalte. History-Einträge können nicht soft-deleted werden. Bei GDPR-Requests müssen sie manuell gelöscht werden. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-137: models/audit.py — search_tsv vor __table_args__ +- **Datei:** app/models/audit.py:25 +- **Problem:** search_tsv Spalte wird vor __table_args__ definiert. Gleicher Anti-Pattern wie ARCH-078. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt