diff --git a/PROGRESS.md b/PROGRESS.md index a6f72de..bda5c03 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -38,7 +38,17 @@ | 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 | -**Offen Block A:** A2-Deactivation-Cleanup (ARCH-012/013/015/033–037/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). **Bekannte Vorbestände:** BUG-099 (workstream.py gelöscht in 7d86592, Tests importieren es noch — 7 Failures). test_trigger_core besteht isoliert. diff --git a/docs/test-bugs.md b/docs/test-bugs.md index 7905c36..355eafb 100644 --- a/docs/test-bugs.md +++ b/docs/test-bugs.md @@ -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