docs: block A complete - A2 deactivation cleanup results, Gate A passed

This commit is contained in:
Agent Zero
2026-08-23 19:34:49 +02:00
parent 32f63adc09
commit 5cee78c54c
2 changed files with 20 additions and 10 deletions
+9 -9
View File
@@ -883,13 +883,13 @@ Playwright E2E: 10 passed, 24 failed (BUG-011/012/013 — Mock-Daten und data-te
- **Datei:** app/plugins/base.py:65-81, app/plugins/builtins/knowledge/plugin.py
- **Problem:** on_deactivate() deregistriert nur Handler aus _event_handlers. Wenn Plugin in Override zusätzliche Handler registriert, werden diese nicht deregistriert.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
- **Status:** ✅ Gefixt 2026-08-23 (Block A/A2): wiki deregistriert WikiSearchProvider via Contract (entity_type wiki_article); dabei 2 latente Bugs entdeckt und behoben — on_activate nutzte nicht existierende register_provider-Methode am unified_search-Contract, und beide Plugins importierten unregister_actions_by_owner als Modulfunktion (ImportError bei jeder Deaktivierung); jetzt get_hook_registry().unregister_all_for_plugin; Lifecycle-Symmetrie per Funktionstest bewiesen
### ARCH-013: Self-Improvement → Kommunikation Fallback unsauber
- **Datei:** app/plugins/builtins/self_improvement/services.py:586-588
- **Problem:** Contract-Lookup, dann Fallback-Import. Breite try/except verstecken Fehler.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
- **Status:** ✅ Gefixt 2026-08-23 (Block A/A2): Contract-only ohne direkten Plugin-Import; dabei latenter Bug entdeckt — KommunikationContract wurde nie importiert, die Proposal-Benachrichtigung lief in den stillen except-Zweig und war komplett tot; jetzt saubere Contract-Nutzung mit logger.warning wenn Contract fehlt
### ARCH-014: Contract Registry Lazy-Load nach unregister()
- **Datei:** app/plugins/builtins/contracts.py:88-89
@@ -901,7 +901,7 @@ Playwright E2E: 10 passed, 24 failed (BUG-011/012/013 — Mock-Daten und data-te
- **Datei:** app/plugins/registry.py:181-244,622-623
- **Problem:** sync_notification_types() läuft bei Aktivierung. Bei Deaktivierung werden Types gelöscht, aber nur wenn on_deactivate() nicht fehlschlägt.
- **Schweregrad:** Medium
- **Status:** ⏳ Nicht gefixt
- **Status:** ✅ Gefixt 2026-08-23 (Block A/A2): registry.deactivate ruft sync_notification_types() jetzt NACH dem DB-Status-Update auf — der Sync sieht den Plugin als inaktiv und entfernt seine Types; Fehler werden geloggt statt die Deaktivierung zu blockieren
### ARCH-016: Entity-Permission-Liste statisch
- **Datei:** app/services/entity_permission_service.py:54, app/routes/entity_permissions.py:252
@@ -1009,31 +1009,31 @@ Playwright E2E: 10 passed, 24 failed (BUG-011/012/013 — Mock-Daten und data-te
- **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
- **Status:** ✅ Gefixt 2026-08-23 (Block A/A2): on_deactivate entfernt comm_websocket + comm_miniapps VOR super().on_deactivate(); dafür ServiceContainer.remove() ergänzt (fehlte komplett); Lifecycle-Symmetrie per Funktionstest bewiesen (Activate→da, Deactivate→weg, Re-Activate→ohne Dupes)
### 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
- **Status:** ✅ Verifiziert 2026-08-23 (Block A/A2): Kein Fix nötig — Plugin definiert und registriert KEINEN Contract (grep-Beweis), es gibt nichts zu deregistrieren; Finding war gegen eine Annahme geschrieben die im Code nicht zutrifft
### 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
- **Status:** ✅ Verifiziert 2026-08-23 (Block A/A2): Kein Fix nötig — Plugin definiert und registriert KEINEN Contract (grep-Beweis), es gibt nichts zu deregistrieren; Finding war gegen eine Annahme geschrieben die im Code nicht zutrifft
### 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
- **Status:** ✅ Gefixt 2026-08-23 (Block A/A2): __init__ ergänzt, _auto_sync_task ist jetzt Instanzvariable — mehrere MailPlugin-Instanzen teilen sich den Task-State nicht mehr
### 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
- **Status:** ✅ Gefixt 2026-08-23 (Block A/A2): super().on_activate() läuft jetzt zuerst, eigene Registrierungen danach — ein Fehler im Plugin-Code kann die Basisklasse nicht mehr halb-initialisiert zurücklassen
### ARCH-038: worker.py — register_event_handlers() existiert nicht in BasePlugin
- **Datei:** app/core/worker.py:168, app/plugins/base.py
@@ -1075,7 +1075,7 @@ Playwright E2E: 10 passed, 24 failed (BUG-011/012/013 — Mock-Daten und data-te
- **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
- **Status:** ✅ Gefixt 2026-08-23 (Block A/A2): remove() läuft jetzt VOR super().on_deactivate(); dabei latenter Bug entdeckt — ServiceContainer hatte gar kein remove() (der guarded Aufruf hätte AttributeError geworfen); Methode ergänzt
### 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