diff --git a/docs/test-bugs.md b/docs/test-bugs.md index 6ae4b7d..989eca8 100644 --- a/docs/test-bugs.md +++ b/docs/test-bugs.md @@ -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