From 29b3e1acb980817562e136517513079745aaff5f Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Sun, 23 Aug 2026 00:41:41 +0200 Subject: [PATCH] =?UTF-8?q?docs:=2016=20neue=20Architektur-Fehler=20(ARCH-?= =?UTF-8?q?031=20bis=20ARCH-046)=20=E2=80=94=20manuelle=20Code-Analyse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/test-bugs.md | 96 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/docs/test-bugs.md b/docs/test-bugs.md index edc57bb..70729a4 100644 --- a/docs/test-bugs.md +++ b/docs/test-bugs.md @@ -992,3 +992,99 @@ Playwright E2E: 10 passed, 24 failed (BUG-011/012/013 — Mock-Daten und data-te - **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: knowledge/plugin.py — uuid nicht importiert (NameError zur Laufzeit) +- **Datei:** app/plugins/builtins/knowledge/plugin.py:28,30 +- **Problem:** `uuid.UUID(str(tenant_id))` und `uuid.UUID(str(article_id))` werden in `on_wiki_create` und `on_wiki_update` verwendet, aber `uuid` wird nie importiert. NameError bei erstem Wiki-Artikel-Ereignis. +- **Schweregrad:** High +- **Status:** ⏳ Nicht gefixt + +### ARCH-032: knowledge/plugin.py + wiki/plugin.py — unregister_actions_by_owner mit falscher Signatur +- **Dateien:** app/plugins/builtins/knowledge/plugin.py:66, app/plugins/builtins/wiki/plugin.py:41 +- **Problem:** `unregister_actions_by_owner("knowledge")` und `unregister_actions_by_owner("wiki")` rufen die Funktion mit nur 1 Argument auf. Die Signatur ist `unregister_actions_by_owner(hook_name: str, owner_tag: str)` — 2 Argumente. TypeError bei Deaktivierung. +- **Schweregrad:** High +- **Status:** ⏳ Nicht gefixt + +### ARCH-033: kommunikation/plugin.py — on_deactivate entfernt nicht Services aus service_container +- **Datei:** app/plugins/builtins/kommunikation/plugin.py:on_deactivate +- **Problem:** `on_activate` registriert `comm_websocket` und `comm_miniapps` im service_container. `on_deactivate` entfernt diese nicht. Andere Plugins die auf diese Services zugreifen bekommen stale Referenzen. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-034: self_improvement/plugin.py — on_deactivate macht kein contract unregister +- **Datei:** app/plugins/builtins/self_improvement/plugin.py:on_deactivate +- **Problem:** `on_deactivate` ruft nicht `get_contract_registry().unregister(self.manifest.name)` auf. Contract bleibt nach Deaktivierung sichtbar. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-035: marketplace/plugin.py — on_deactivate macht kein contract unregister +- **Datei:** app/plugins/builtins/marketplace/plugin.py:on_deactivate +- **Problem:** `on_deactivate` ruft nicht `get_contract_registry().unregister(self.manifest.name)` auf. Contract bleibt nach Deaktivierung sichtbar. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-036: mail/plugin.py — _auto_sync_task ist Klassenvariable, nicht Instanzvariable +- **Datei:** app/plugins/builtins/mail/plugin.py +- **Problem:** `_auto_sync_task: asyncio.Task | None = None` ist eine Klassenvariable. Bei mehreren MailPlugin-Instanzen (z.B. Reload) teilen sie sich denselben Task-Referenz. Kann zu doppelten Background-Tasks oder falschem Cleanup führen. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-037: graph_rag/plugin.py — on_activate ruft registry.register() VOR super().on_activate() +- **Datei:** app/plugins/builtins/graph_rag/plugin.py:on_activate +- **Problem:** `registry.register(GraphRAGSearchProvider())` wird vor `super().on_activate()` aufgerufen. Wenn super().on_activate() fehlschlägt, bleibt der Search Provider registriert ohne dass Event-Handler aktiv sind. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-038: worker.py — register_event_handlers() existiert nicht in BasePlugin +- **Datei:** app/core/worker.py:168, app/plugins/base.py +- **Problem:** Worker ruft `plugin.register_event_handlers(event_bus)` auf, aber BasePlugin hat keine solche Methode. `hasattr(plugin, 'register_event_handlers')` ist immer False. Im Worker werden Event-Handler NIE registriert — alle Events die über den Worker laufen (outbox events) werden nicht von Plugins verarbeitet. +- **Schweregrad:** High +- **Status:** ⏳ Nicht gefixt + +### ARCH-039: worker.py — cleanup jobs verwenden datetime.utcnow() (naive datetime) +- **Datei:** app/core/worker.py:cleanup_audit_log_job, cleanup_trash_job, cleanup_knowledge_job +- **Problem:** `datetime.utcnow() - timedelta(days=...)` verwendet naive datetime. AGENTS.md verbietet naive datetime — TIMESTAMPTZ only. Sollte `datetime.now(UTC)` sein. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-040: worker.py — cleanup_knowledge_job importiert direkt von Plugin (Core→Plugin) +- **Datei:** app/core/worker.py:cleanup_knowledge_job +- **Problem:** `from app.plugins.builtins.knowledge.models import KnowledgeExtraction` — Core importiert direkt von Plugin. Sollte über Contract laufen. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-041: trigger_dispatcher.py — _dispatch_matching_agents hat None-Check nach Verwendung +- **Datei:** app/core/trigger_dispatcher.py:172-173 +- **Problem:** `AgentDefinition = automation_contract.AgentDefinition` (Zeile 172) wird ausgeführt BEVOR `if automation_contract is None` (Zeile 173). Wenn Contract None ist → AttributeError. Gleicher Bug wie ARCH-029. +- **Schweregrad:** High +- **Status:** ⏳ Nicht gefixt + +### ARCH-042: calendar/contracts.py + dms/contracts.py — get_contract() erzeugt neue Instanz statt registrierte zu nutzen +- **Dateien:** app/plugins/builtins/calendar/contracts.py:get_contract, app/plugins/builtins/dms/contracts.py:get_contract +- **Problem:** `get_contract()` erzeugt eine NEUE Contract-Instanz statt die registrierte aus der Registry zu nutzen. Das bedeutet es gibt zwei Instanzen — die registrierte und die lokal erzeugte. Änderungen an der registrierten Instanz sind nicht sichtbar. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt + +### ARCH-043: automation/plugin.py — register_plugin_contributions nutzt Tenant.limit(1) statt current tenant +- **Datei:** app/plugins/builtins/automation/plugin.py:register_plugin_contributions +- **Problem:** `select(Tenant).limit(1)` nimmt den ersten Tenant in der DB, nicht den aktuellen Tenant. In Multi-Tenant-Setups werden Contributed Agents/Automations im falschen Tenant erstellt. +- **Schweregrad:** High +- **Status:** ⏳ Nicht gefixt + +### ARCH-044: ai_ui_control/plugin.py — on_deactivate ruft super().on_deactivate() VOR service_container.remove() +- **Datei:** app/plugins/builtins/ai_ui_control/plugin.py:on_deactivate +- **Problem:** `super().on_deactivate()` wird vor `service_container.remove("ai_ui_control_ws")` aufgerufen. Wenn super().on_deactivate() Event-Handler entfernt, kann ein Event noch den WebSocket-Manager versuchen zu nutzen der bereits durch super() als deaktiviert markiert wurde. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-045: Frontend — hardcoded deutsche Strings ohne i18n in mehreren Komponenten +- **Dateien:** frontend/src/components/contacts/FolderPermissionDialog.tsx:24-25, frontend/src/components/common/ShareDialog.tsx:39-40, frontend/src/components/layout/PluginToolbar.tsx:49,67, frontend/src/pages/SettingsStammdaten.tsx:173, frontend/src/pages/SettingsRechte.tsx:50, frontend/src/pages/Workflows.tsx:219, frontend/src/pages/AutomationSettings.tsx:24, frontend/src/components/workflows/WorkflowEditor.tsx:553, frontend/src/components/settings/WorkspaceManager.tsx:256,263 +- **Problem:** Mehrere Frontend-Komponenten haben hardcoded deutsche Strings ('Löschen', 'Bearbeiten', 'Speichern', 'Kein Zugriff', 'Suchen', 'Error') ohne `t()` i18n-Aufruf. Verletzt AGENTS.md Frontend-Konvention. +- **Schweregrad:** Low +- **Status:** ⏳ Nicht gefixt + +### ARCH-046: compliance.py — Core Route importiert direkt von Plugin Model +- **Datei:** app/routes/compliance.py:22 +- **Problem:** `from app.plugins.builtins.automation.models import AgentDefinition` — Core Route importiert direkt von Plugin Model. Sollte über Contract laufen. +- **Schweregrad:** Medium +- **Status:** ⏳ Nicht gefixt