From a0477ddac0b893d9137ce2a87524633a5fa963a5 Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Sat, 22 Aug 2026 22:38:41 +0200 Subject: [PATCH] docs: 93 Architektur-Fehler (ARCH-001 bis ARCH-093) durch systematisches Code-Review dokumentiert --- docs/test-bugs.md | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/docs/test-bugs.md b/docs/test-bugs.md index 41d5b02..b94ea1e 100644 --- a/docs/test-bugs.md +++ b/docs/test-bugs.md @@ -1316,3 +1316,57 @@ Playwright E2E: 10 passed, 24 failed (BUG-011/012/013 — Mock-Daten und data-te - **Problem:** `llm_model: Mapped[str] = mapped_column(String(100), nullable=False, default="ollama/deepseek-v4-flash")` — hardcoded Model-Name. Sollte aus Settings kommen. - **Schweregrad:** Low - **Status:** ⏳ Nicht gefixt + +### ARCH-085: errorTypes.ts — hardcoded deutsche Strings ohne i18n +- **Datei:** frontend/src/utils/errorTypes.ts:40-45 +- **Problem:** 'Netzwerkfehler', 'Nicht authentifiziert', 'Keine Berechtigung', 'Validierungsfehler', 'Serverfehler', 'Unbekannter Fehler' — ohne t(). +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-086: errorLogger.ts — POST /api/v1/errors ohne CSRF-Token +- **Datei:** frontend/src/utils/errorLogger.ts:62 +- **Problem:** `fetch('/api/v1/errors', { method: 'POST' })` ohne X-CSRF-Token. CSRF-Middleware wird den Request blocken (403). +- **Schweregrad:** High +- **Status:** ⏳ Nicht gefixt + +### ARCH-087: date.ts — hardcoded German locale +- **Datei:** frontend/src/utils/date.ts:2 +- **Problem:** `import { de } from 'date-fns/locale'` — hardcoded German locale. Sollte dynamisch basierend auf User-Preference sein. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-088: hooks.py — do_action/apply_filters verschlucken Exceptions +- **Datei:** app/core/hooks.py:140,150 +- **Problem:** `except Exception: logger.exception(...)` — alle Exceptions werden nur geloggt, nicht weitergeworfen. Fehler in Hooks sind unsichtbar. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-089: storage.py — _DEFAULT_ALLOWED_MIMES hardcoded +- **Datei:** app/core/storage.py:38-55 +- **Problem:** MIME-Allowlist ist hardcoded. Sollte über Settings konfigurierbar sein. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-090: core/tenant.py — apply_tenant_filter verwendet Klassen-Attribut +- **Datei:** app/core/tenant.py:12 +- **Problem:** `TenantMixin.tenant_id == tenant_id` — verwendet Klassen-Attribut statt Instanz-Attribut. Kann zu falschen Queries führen. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-091: main.py — Plugin-Aktivierung pro Tenant: break bei Fehler verhindert alle Tenants +- **Datei:** app/main.py:298 +- **Problem:** Wenn Plugin-Aktivierung für einen Tenant fehlschlägt, wird `break` ausgeführt. Plugin wird für KEINEN Tenant aktiviert, auch nicht für die die schon funktioniert haben. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-092: base.py — on_activate() überschreibt Event-Handler ohne unsubscribe (Handler-Leak) +- **Datei:** app/plugins/base.py:59-62 +- **Problem:** `self._event_handlers[event_name] = handler` — wenn on_activate() mehrfach aufgerufen wird (pro Tenant), wird der alte Handler im Dict überschrieben. Aber der alte Handler wurde nicht bei event_bus.unsubscribe() abgemeldet. Event-Handler-Leak. +- **Schweregrad:** High +- **Status:** ⏳ Nicht gefixt + +### ARCH-093: contracts.py — unregister() entfernt _loaded was _try_lazy_load() erneut triggert +- **Datei:** app/plugins/builtins/contracts.py:72-74 +- **Problem:** `unregister()` entfernt Contract und _loaded. get_contract() sieht plugin_name nicht in _loaded → ruft _try_lazy_load() auf → Contract wird neu geladen. Deaktivierte Plugins werden wieder sichtbar. (Bestätigung von ARCH-014) +- **Schweregrad:** High +- **Status:** ⏳ Nicht gefixt