docs: 16 neue Architektur-Fehler (ARCH-031 bis ARCH-046) — manuelle Code-Analyse
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user