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
+11 -1
View File
@@ -38,7 +38,17 @@
| ARCH-008 | Permission-Namensschema inkonsistent | ✅ Kanon modul:aktion festgelegt, Manifest-Validator erzwingt es | 7953077 | | ARCH-008 | Permission-Namensschema inkonsistent | ✅ Kanon modul:aktion festgelegt, Manifest-Validator erzwingt es | 7953077 |
| ARCH-009 | Tote 3-Segment-Rollen-Patterns (core:*:X) + 14 Route-Literals | ✅ Migration 0141 + Route-Fix, Roundtrip bewiesen | 7953077 | | ARCH-009 | Tote 3-Segment-Rollen-Patterns (core:*:X) + 14 Route-Literals | ✅ Migration 0141 + Route-Fix, Roundtrip bewiesen | 7953077 |
**Offen Block A:** A2-Deactivation-Cleanup (ARCH-012/013/015/033037/044) → dann Gate A. | ARCH-012 | wiki/knowledge on_deactivate unvollständig | ✅ Provider-Dereg + 2 latente Bugs (register_provider fehlte am Contract, kaputter Modul-Import) behoben | c21634b |
| ARCH-013 | self_improvement Fallback-Import; Benachrichtigung war tot | ✅ Contract-only; undefinierten KommunikationContract-Verweis behoben | c21634b |
| ARCH-015 | Notification-Sync fehlt in Deactivate-Sequenz | ✅ sync_notification_types nach Status-Update | c21634b |
| ARCH-033 | comm_websocket/comm_miniapps bleiben im Container | ✅ Container-Cleanup VOR super(); ServiceContainer.remove() ergänzt | c21634b |
| ARCH-034/035 | self_improvement/marketplace Contract-Unregister | ✅ verifizierte No-Ops: beide registrieren keinen Contract | c21634b |
| ARCH-036 | mail _auto_sync_task Klassenvariable | ✅ Instanzvariable via __init__ | c21634b |
| ARCH-037 | graph_rag Registrierung VOR super() | ✅ Reihenfolge umgestellt | c21634b |
| ARCH-044 | ai_ui_control remove() NACH super() | ✅ Reihenfolge umgestellt; fehlendes ServiceContainer.remove() ergänzt | c21634b |
| Gate A | Block-A-Abschlussprüfung | ✅ BESTANDEN (4/4): Imports, Lifecycle-Symmetrie, Activate-Once, Contract-Roundtrip | 32f63ad |
**Block A ABGESCHLOSSEN** — Gate A bestanden (32f63ad).
**Offen gesamt:** B (Contacts-Entkopplung als Kernstück), C (Frontend-Routen/Workspace/Settings/Dashboard), D (pytest-Massen + Security-Triage), E (Production-Härtung), F3 (Guide-Updates), G (DSGVO). **Offen gesamt:** B (Contacts-Entkopplung als Kernstück), C (Frontend-Routen/Workspace/Settings/Dashboard), D (pytest-Massen + Security-Triage), E (Production-Härtung), F3 (Guide-Updates), G (DSGVO).
**Bekannte Vorbestände:** BUG-099 (workstream.py gelöscht in 7d86592, Tests importieren es noch — 7 Failures). test_trigger_core besteht isoliert. **Bekannte Vorbestände:** BUG-099 (workstream.py gelöscht in 7d86592, Tests importieren es noch — 7 Failures). test_trigger_core besteht isoliert.
+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 - **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. - **Problem:** on_deactivate() deregistriert nur Handler aus _event_handlers. Wenn Plugin in Override zusätzliche Handler registriert, werden diese nicht deregistriert.
- **Schweregrad:** Medium - **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 ### ARCH-013: Self-Improvement → Kommunikation Fallback unsauber
- **Datei:** app/plugins/builtins/self_improvement/services.py:586-588 - **Datei:** app/plugins/builtins/self_improvement/services.py:586-588
- **Problem:** Contract-Lookup, dann Fallback-Import. Breite try/except verstecken Fehler. - **Problem:** Contract-Lookup, dann Fallback-Import. Breite try/except verstecken Fehler.
- **Schweregrad:** Medium - **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() ### ARCH-014: Contract Registry Lazy-Load nach unregister()
- **Datei:** app/plugins/builtins/contracts.py:88-89 - **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 - **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. - **Problem:** sync_notification_types() läuft bei Aktivierung. Bei Deaktivierung werden Types gelöscht, aber nur wenn on_deactivate() nicht fehlschlägt.
- **Schweregrad:** Medium - **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 ### ARCH-016: Entity-Permission-Liste statisch
- **Datei:** app/services/entity_permission_service.py:54, app/routes/entity_permissions.py:252 - **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 - **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. - **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 - **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 ### ARCH-034: self_improvement/plugin.py — on_deactivate macht kein contract unregister
- **Datei:** app/plugins/builtins/self_improvement/plugin.py:on_deactivate - **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. - **Problem:** `on_deactivate` ruft nicht `get_contract_registry().unregister(self.manifest.name)` auf. Contract bleibt nach Deaktivierung sichtbar.
- **Schweregrad:** Medium - **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 ### ARCH-035: marketplace/plugin.py — on_deactivate macht kein contract unregister
- **Datei:** app/plugins/builtins/marketplace/plugin.py:on_deactivate - **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. - **Problem:** `on_deactivate` ruft nicht `get_contract_registry().unregister(self.manifest.name)` auf. Contract bleibt nach Deaktivierung sichtbar.
- **Schweregrad:** Low - **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 ### ARCH-036: mail/plugin.py — _auto_sync_task ist Klassenvariable, nicht Instanzvariable
- **Datei:** app/plugins/builtins/mail/plugin.py - **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. - **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 - **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() ### 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 - **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. - **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 - **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 ### ARCH-038: worker.py — register_event_handlers() existiert nicht in BasePlugin
- **Datei:** app/core/worker.py:168, app/plugins/base.py - **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 - **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. - **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 - **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 ### 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 - **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