docs: 93 Architektur-Fehler (ARCH-001 bis ARCH-093) durch systematisches Code-Review dokumentiert
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user