docs: 59 Architektur-Fehler (ARCH-001 bis ARCH-059) durch systematisches Code-Review dokumentiert

This commit is contained in:
Agent Zero
2026-08-22 22:34:11 +02:00
parent 7d80e09226
commit 624699bf8d
+186
View File
@@ -980,3 +980,189 @@ Playwright E2E: 10 passed, 24 failed (BUG-011/012/013 — Mock-Daten und data-te
- **Problem:** 'Page Not Found' und 'The page ... was not found' — hardcoded englisch ohne i18n.
- **Schweregrad:** Low
- **Status:** ⏳ Nicht gefixt
### ARCH-029: trigger_dispatcher.py — None-Check nach Verwendung
- **Datei:** app/core/trigger_dispatcher.py:123-127
- **Problem:** `AutomationDefinition = automation_contract.Automation` (Zeile 123) wird ausgeführt BEVOR `if automation_contract is None` (Zeile 127). Wenn Contract None ist → AttributeError.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-030: step_handlers.py — Contract.get_function() existiert nicht
- **Datei:** app/workflows/step_handlers.py:221,261,306,351,394
- **Problem:** `MailContract.get_function("send_email")` — MailContract ist eine Klasse ohne get_function() Methode. Alle 5 Step-Handler Contracts haben dieses Problem.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-031: pluginStore.ts — getAllMenuItems ohne Permission-Filter
- **Datei:** frontend/src/store/pluginStore.ts:127-131
- **Problem:** getAllMenuItems() gibt alle Menüs zurück ohne Permission-Filter. Sidebar.tsx filtert zwar, aber der Store selbst nicht.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-032: usePermission.ts — gleiche Segmentanzahl wie Backend
- **Datei:** frontend/src/hooks/usePermission.ts:12-18
- **Problem:** `if (pParts.length === rParts.length)` — gleiche Segmentanzahl-Bedingung wie Backend. `core:*:read` (3 Segmente) matcht nicht `contacts:read` (2 Segmente).
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-033: PluginLoader.tsx — hardcoded deutsche Strings ohne i18n
- **Datei:** frontend/src/components/plugins/PluginLoader.tsx:55,59,62,82,88
- **Problem:** 'Plugin konnte nicht geladen werden', 'Erneut versuchen', 'Neu laden', 'Fehlerdetails' — ohne t().
- **Schweregrad:** Low
- **Status:** ⏳ Nicht gefixt
### ARCH-034: routes/index.tsx — multiple catch-all routes
- **Datei:** frontend/src/routes/index.tsx:167,179,192,200,231,268
- **Problem:** 6 verschiedene `path: '*'` catch-all Routes. React Router kann nur einen catch-all pro Route-Level haben. Die letzten überschreiben die ersten.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-035: wiki/plugin.py — unified_search nicht in dependencies
- **Datei:** app/plugins/builtins/wiki/plugin.py:25
- **Problem:** `dependencies=["permissions"]` aber on_activate importiert von unified_search. unified_search nicht deklariert.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-036: knowledge/plugin.py — uuid import fehlt
- **Datei:** app/plugins/builtins/knowledge/plugin.py
- **Problem:** Verwendet `uuid.UUID()` in on_activate aber `import uuid` fehlt in plugin.py.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-037: wiki/plugin.py on_deactivate — unregister_actions_by_owner falsch aufgerufen
- **Datei:** app/plugins/builtins/wiki/plugin.py:40
- **Problem:** `unregister_actions_by_owner("wiki")` — Funktion erwartet (hook_name, owner_tag), nicht nur owner_tag. Sollte `unregister_actions_by_owner("wiki.article.created", "wiki")` etc. sein.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-038: knowledge/plugin.py on_deactivate — unregister_actions_by_owner falsch aufgerufen
- **Datei:** app/plugins/builtins/knowledge/plugin.py:65
- **Problem:** `unregister_actions_by_owner("knowledge")` — gleicher Fehler wie ARCH-037.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-039: contacts/plugin.py — routes=[] aber Routes in main.py
- **Datei:** app/plugins/builtins/contacts/plugin.py:29
- **Problem:** `routes=[]` — Routes sind in main.py als Core-Routes registriert. Doppelarchitektur: Contacts ist Core UND Plugin.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-040: tasks/plugin.py — ai_assistant nicht in dependencies
- **Datei:** app/plugins/builtins/tasks/plugin.py:on_activate
- **Problem:** Importiert von ai_assistant.contracts aber ai_assistant nicht in dependencies.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-041: self_improvement — kommunikation nicht in dependencies
- **Datei:** app/plugins/builtins/self_improvement/plugin.py
- **Problem:** `dependencies=["permissions", "automation", "ai_proactive"]` aber services.py importiert von kommunikation. Nicht deklariert.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-042: wiki/plugin.py — unified_search nicht in dependencies (Bestätigung ARCH-035)
- **Datei:** app/plugins/builtins/wiki/plugin.py:25
- **Problem:** on_activate importiert von unified_search.contracts aber dependencies=["permissions"]. unified_search fehlt.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-043: PluginRouteRenderer.tsx — KEINE Permission-Prüfung (bestätigt)
- **Datei:** frontend/src/components/plugins/PluginRouteRenderer.tsx
- **Problem:** grep nach 'permission|Permission|canAccess|hasPermission' = 0 Ergebnisse. Jeder eingeloggte User kann jede Plugin-Seite sehen.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-044: routes/index.tsx — 6 catch-all path:'*' Routes
- **Datei:** frontend/src/routes/index.tsx:167,179,192,200,231,268
- **Problem:** 6 verschiedene catch-all Routes. React Router kann nur einen catch-all pro Route-Level haben.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-045: AppShell.tsx — hardcoded '/ai-assistant' Pfad
- **Datei:** frontend/src/components/layout/AppShell.tsx:42
- **Problem:** `showMessageSidebar = !location.pathname.startsWith('/ai-assistant')` — AI Assistant wurde in Kommunikation integriert, Pfad existiert nicht mehr.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-046: commStore.ts und api/comm.ts — doppelte Type-Definitionen
- **Datei:** frontend/src/store/commStore.ts, frontend/src/api/comm.ts
- **Problem:** Participant, Conversation, MessageBlock werden in beiden Dateien definiert. Sollten in einer shared types-Datei stehen.
- **Schweregrad:** Low
- **Status:** ⏳ Nicht gefixt
### ARCH-047: api/client.ts — activeWorkspaceId ohne Validierung
- **Datei:** frontend/src/api/client.ts:28
- **Problem:** `activeWorkspaceId` wird als X-Workspace-ID Header gesendet ohne Validierung dass der User tatsächlich zum Workspace gehört.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-048: roles.py — SYSTEM_PERMISSIONS dupliziert permission_registry.py
- **Datei:** app/routes/roles.py:18-40, app/core/permission_registry.py:21-60
- **Problem:** SYSTEM_PERMISSIONS in roles.py ist eine statische Liste die CORE_PERMISSIONS in permission_registry.py dupliziert. Zwei Quellen für dieselben Permissions.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-049: dashboard.py — Core→Plugin Import
- **Datei:** app/routes/dashboard.py:15
- **Problem:** `from app.plugins.registry import get_registry` — Core importiert von Plugin Registry.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-050: notifications.py — deprecated aber aktiv (Doppelarchitektur)
- **Datei:** app/routes/notifications.py:1-3
- **Problem:** 'deprecated — delegates to Communication system channel' aber Routes sind immer noch aktiv und registriert in main.py:546. Doppelarchitektur.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-051: workspaces.py — X-Workspace-ID nicht validiert
- **Datei:** app/routes/workspaces.py:7
- **Problem:** X-Workspace-ID Header wird akzeptiert aber nicht validiert ob User zum Workspace gehört.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-052: models/contact.py — indexed_at Spalte an falscher Stelle
- **Datei:** app/models/contact.py:30
- **Problem:** `indexed_at` Spalte wird vor `__table_args__` definiert, was unüblich ist und zu Verwirrung führt.
- **Schweregrad:** Low
- **Status:** ⏳ Nicht gefixt
### ARCH-053: models/session.py — Session hat TenantMixin aber nicht tenant-scoped
- **Datei:** app/models/session.py:23
- **Problem:** Session erbt TenantMixin aber Sessions sind nicht tenant-scoped (User kann mehrere Tenants haben). tenant_id wird gesetzt aber nicht für RLS verwendet.
- **Schweregrad:** Low
- **Status:** ⏳ Nicht gefixt
### ARCH-054: workflow_service.py — importiert post_system_message (Core→Plugin Kette)
- **Datei:** app/services/workflow_service.py:10
- **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-055: Settings.tsx — hardcoded deutsche Strings ohne i18n
- **Datei:** frontend/src/pages/Settings.tsx:30-40
- **Problem:** hardcodedNavItems hat 'Stammdaten', 'Nutzerverwaltung', 'System', 'KI Einstellungen', 'Custom Fields', 'Webhooks', 'Workspaces', 'Backup & Restore' — ohne t().
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
### ARCH-056: Settings.tsx — statische UND dynamische Settings-Seiten (Doppelarchitektur)
- **Datei:** frontend/src/pages/Settings.tsx:30-40, 42-50
- **Problem:** hardcodedNavItems (statisch) UND pluginSettingsPages (dynamisch via PluginStore). Doppelarchitektur.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-057: Communication.tsx — doppelte Type-Definitionen (3. Kopie)
- **Datei:** frontend/src/pages/Communication.tsx:15-50
- **Problem:** Definiert eigene Conversation/Participant/Message/MessageBlock Types — dupliziert commStore.ts und api/comm.ts (3. Kopie).
- **Schweregrad:** Low
- **Status:** ⏳ Nicht gefixt
### ARCH-058: PluginRegistry.tsx — fetcht active-manifests die plugins:read erfordert
- **Datei:** frontend/src/components/plugins/PluginRegistry.tsx:10
- **Problem:** useActivePluginManifests() fetcht /plugins/active-manifests die plugins:read erfordert. Normaler User bekommt keine Plugin-Manifests → keine Plugin-Menüs/Routes.
- **Schweregrad:** High
- **Status:** ⏳ Nicht gefixt
### ARCH-059: useWorkspace.ts — visibleModuleKeys wird bei jedem Render neu berechnet
- **Datei:** frontend/src/hooks/useWorkspace.ts:62
- **Problem:** `const visibleModuleKeys = useWorkspaceStore(s => s.visibleModuleKeys())` — bei jedem Render wird ein neues Set erstellt. Sollte useMemo verwenden.
- **Schweregrad:** Low
- **Status:** ⏳ Nicht gefixt