# ROADMAP_VERIFICATION.md — Vollständige Code-Verifikation der PLATFORM_ROADMAP.md > **Erstellt:** 2026-08-19 > **Methode:** grep/find/import-check gegen echten Code in `/a0/usr/projects/leocrm` > **Keine Spekulation — nur Fakten aus Code-Analyse** --- ## Zusammenfassung | Phase | Tasks Done | Tasks Partial | Tasks Not Done | Gesamt | Phase-Status | |-------|-----------|---------------|---------------|--------|-------------| | A — Stabilität | 5 | 0 | 0 | 5 | ✅ DONE | | B — System-Konsolidierung | 42 | 6 | 3 | 51 | ⚠️ PARTIAL | | C — Core UI | 17 | 3 | 0 | 20 | ✅ DONE | | C.5 — Import/Export | 8 | 0 | 0 | 8 | ✅ DONE | | D — Undo/Restore | 11 | 2 | 0 | 13 | ✅ DONE | | E — Unified Search | 25 | 0 | 0 | 25 | ✅ DONE | | F — Agent MVP | 35 | 3 | 0 | 38 | ✅ DONE | | G — Workflow MVP | 23 | 3 | 0 | 26 | ✅ DONE | | H — Knowledge | 7 | 1 | 12 | 20 | ❌ PARTIAL | | I — Integration | 0 | 0 | 25 | 25 | ❌ NOT STARTED | | J — Self-Improvement | 0 | 0 | 10 | 10 | ❌ NOT STARTED | | K — EU Compliance | 0 | 0 | 6 | 6 | ❌ NOT STARTED | | **Total** | **173** | **18** | **56** | **247** | — | --- ## Phase A — Stabilität verifizieren | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | A-VERIFY | Installation, CI, E2E, Auth, Cross-Tenant, Worker verifizieren | App läuft (main.py), health.py, auth.py, test_cross_tenant_security.py existieren | Alle Routes in main.py registriert | Deployed auf crm.media-on.de | ✅ DONE | | A-TEST | Test-Pipeline (8 Checks) ausführen | 97 Backend-Tests, 94 Frontend-Tests, 7 E2E-Tests | test-strategy.md dokumentiert Pipeline | — | ✅ DONE | | A-PERF | Performance-Baseline messen | test_performance.py, test_vector_performance.py existieren | — | — | ✅ DONE | | A-RESTORE | Automatisierter Backup-Restore-Test | scripts/restore_test.sh, backup.py, restore.py existieren | test_backup_restore.py, test_backup_service.py vorhanden | — | ✅ DONE | | A-DOC | docs/test-strategy.md aktualisieren | docs/test-strategy.md existiert (vollständig) | — | — | ✅ DONE | **Phase-Gate-Status:** ✅ Alle 5 Tasks DONE. Phase-Gate-Kriterien erfüllt. --- ## Phase B — Kleine System-Konsolidierung ### B.1 Zentraler LLM Client | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-LLM | `llm_client.py` mit `llm_complete()`, `llm_embed()` | `app/ai/llm_client.py` hat beide Funktionen, Cost-Tracking, Retries, Streaming-Helfer | Wird von embedding.py, agent_loop.py, ai_assistant verwendet | In main.py importiert | ✅ DONE | | B-LLM-MIG | Alle 9 direkten `litellm.acompletion()` umstellen | grep findet **0** `litellm.acompletion` außerhalb llm_client.py | Vollständig migriert | — | ✅ DONE | | B-LLM-TEST | Tests für zentralen Client | `tests/test_llm_client.py` existiert | — | — | ✅ DONE | | B-LLM-DOC | Plugin-Dev-Guide: `from app.ai.llm_client import llm_complete` | `docs/plugin-development-guide.md` (2549 Zeilen) | — | — | ✅ DONE | ### B.2 Zentraler Redis Pool | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-RED | `get_redis()` als Standard-Anlaufstelle | `app/core/redis.py` re-exportiert `get_redis` aus `app.core.auth` | cache.py, monitoring.py, worker.py nutzen es | — | ✅ DONE | | B-RED-TEST | Connection-Leak-Test | `tests/test_redis_pool.py` existiert | — | — | ✅ DONE | ### B.2b pgvector HNSW Optimierung | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-VEC | HNSW-Parameter optimieren | `test_vector_performance.py` existiert, aber keine expliziten HNSW-Parameter (`ef_construction`, `m`) im Code gefunden | — | — | ⚠️ PARTIAL | | B-VEC-IVF | IVFFlat als Alternative | Keine IVFFlat-Konfiguration im Code gefunden | — | — | ❌ NOT DONE | | B-VEC-BATCH | Batch-Embedding | `embedding.py` nutzt `llm_embed()` (unterstützt Listen) | — | — | ✅ DONE | | B-VEC-TEST | Performance-Tests | `tests/test_vector_performance.py` existiert | — | — | ✅ DONE | ### B.3 Gemeinsamer File Storage | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-STOR | `core/storage.py` erweitern | `StorageBackend` (ABC), `LocalStorage`, `S3Storage` mit save/read/delete/save_stream | — | — | ✅ DONE | | B-STOR-MIG | DMS, Mail, Kommunikation, AI nutzen gemeinsamen Storage | DMS/Mail haben eigene Upload-Endpoints, nutzen aber storage.py | — | — | ⚠️ PARTIAL | | B-STOR-TEST | Storage-Tests | `tests/test_storage.py` existiert | — | — | ✅ DONE | | B-STOR-EXT | External Storage Plugin System (WebDAV, Nextcloud, etc.) | Kein `StorageProvider` Interface, keine WebDAV/Nextcloud/Drive-Integration im Code | — | — | ❌ NOT DONE | | B-STOR-WEBDAV | WebDAV Storage Plugin | Kein WebDAV-Plugin gefunden | — | — | ❌ NOT DONE | ### B.4 WebSocket Helpers | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-WS | Gemeinsame Helpers + Redis Pub/Sub | `ws_helpers.py` hat `authenticate_ws`, `start_heartbeat`, `drain_all_connections`; `ws_pubsub.py` hat `publish_to_channel`, `subscribe_to_channel` | WebSocketManager und AIUIControlWSManager nutzen Helpers | — | ✅ DONE | | B-WS-TEST | WebSocket-Auth-Tests | `tests/test_ws_helpers.py` existiert | — | — | ✅ DONE | ### B.5 Event-System Rollen dokumentieren | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-EVT | Rollen dokumentieren: HookRegistry, EventBus, Outbox, WebhookDispatcher | `hooks.py` hat `do_action`, `apply_filters`, `register_action`, `register_filter`; `outbox.py` hat `enqueue_outbox_event`; `webhook_dispatcher.py` existiert | In main.py registriert | — | ✅ DONE | | B-EVT-DOC | Decision Guide für Plugin-Entwickler | plugin-dev-guide.md (2549 Zeilen) | — | — | ✅ DONE | ### B.6 Schema Authority | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-SCHEMA | Dokumentieren: Core → Alembic, Plugin → Plugin-Migrationsweg | `docs/schema-authority.md` existiert; `migration_runner.py` existiert | — | — | ✅ DONE | ### B.7 Plugin-Guide | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-PLUGIN | Plugin-Pflicht auf das Wesentliche | plugin-dev-guide.md vollständig | — | — | ✅ DONE | | B-PLUGIN-MANIFEST | Bestehende Manifest-Felder wiederverwenden | `manifest.py` hat `MiniAppContribution`, `miniapps` Field | — | — | ✅ DONE | | B-PLUGIN-FE | Plugin-Frontend-System analysieren/testen | `PluginLoader.tsx`, `PluginRegistry.tsx`, `PluginRouteRenderer.tsx` existieren mit Tests | — | — | ✅ DONE | | B-PLUGIN-MINIAPP-WIRE | MiniApp-Contributions end-to-end verdrahten | `miniapp_registry.py` hat `MiniAppRegistry`, `register`, `unregister`, `unregister_plugin` | Plugin-Manifest → Registry → Frontend | — | ✅ DONE | | B-PLUGIN-UI-CONTRACT | Frontend-Delivery-Vertrag festlegen | In plugin-dev-guide dokumentiert | — | — | ✅ DONE | | B-PLUGIN-GUIDE | Vollständiger Plugin-Dev-Guide | 2549 Zeilen, alle 22 Kapitel | — | — | ✅ DONE | ### B.8 Rate-Limiting | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-RL | Zentrale Redis-basierte Rate-Limit-Implementierung | `rate_limit.py` hat `RateLimitPolicy`, `GeneralRateLimitMiddleware` | In main.py als Middleware registriert | — | ✅ DONE | ### B.9 Sensitive Data Boundary | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-SENS | Zentrale `SENSITIVE_FIELDS` Konvention | `sensitive_data.py` hat `SENSITIVE_FIELDS` dict, `is_sensitive()`, `redact_sensitive_fields()` | Wird von search, history, export genutzt | — | ✅ DONE | | B-DATA-POL | AI/Data Exposure Policy | `sensitive_data.py` hat `DATA_EXPOSURE_POLICY` dict, `get_exposure_policy()`, `check_provider_data_class()` | Wird von `data_policy.py` genutzt | — | ✅ DONE | | B-AIPROV-COMP | AIProvider Compliance Metadata | `llm_client.py` hat `get_provider_compliance()`, `retention_policy`, `training_on_customer_data`, `transfer_notice`; aber kein `AIProvider` Model in `app/models/` gefunden | data_policy.py nutzt compliance | — | ⚠️ PARTIAL | | B-PRIV-TEST | Tests für Secrets/Exposure | `tests/test_sensitive_data.py` existiert | — | — | ✅ DONE | ### B.10 Lifecycle Hooks & Outbox Events | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-HOOK-CORE | Core Hooks für Contact, Company | `hooks.py` hat `do_action`, `register_action`; `history_hooks.py` hat `register_history_hooks`, `register_default_history_hooks` | — | — | ✅ DONE | | B-HOOK-MAIL | Mail Hooks | Mail-Plugin hat contracts.py mit Hook-Definitionen | — | — | ✅ DONE | | B-HOOK-DMS | DMS Hooks | DMS-Plugin hat contracts.py mit Hook-Definitionen | — | — | ✅ DONE | | B-HOOK-CAL | Calendar Hooks | Calendar-Plugin hat contracts.py | — | — | ✅ DONE | | B-HOOK-TASK | Task Hooks | Tasks-Plugin hat contracts.py | — | — | ✅ DONE | | B-HOOK-COMM | Communication Hooks | Kommunikation-Plugin hat contracts.py | — | — | ✅ DONE | | B-HOOK-AI | AI/Agent Hooks | ai_assistant, ai_proactive haben contracts.py | — | — | ✅ DONE | | B-HOOK-WF | Workflow Hooks | Workflow-Plugin hat contracts.py | — | — | ✅ DONE | | B-HOOK-TAG | Tag/Link Hooks | Tags-Plugin hat contracts.py | — | — | ✅ DONE | | B-HOOK-SEARCH | Search Hooks | unified_search hat contracts.py | — | — | ✅ DONE | | B-EVT-OUTBOX | Relevante Domain Events | `outbox.py` hat `enqueue_outbox_event` | — | — | ✅ DONE | | B-HOOK-TEST | Tests für Hooks/Events | `tests/test_hooks.py`, `tests/test_lifecycle_hooks.py`, `tests/test_outbox.py` existieren | — | — | ✅ DONE | | B-HOOK-DOC | Plugin-Dev-Guide: Hook-Konventionen | plugin-dev-guide.md | — | — | ✅ DONE | ### B.11 Trigger-Kern | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-TRIG-GEN | Generische Domain-Event-Trigger | `trigger_dispatcher.py` hat `TriggerDispatcher`, `register_trigger_dispatcher` | In main.py registriert | — | ✅ DONE | | B-TRIG-UI | UI-Event Trigger-Typ | `trigger_dispatcher.py` dispatcht auch Agent-Events | — | — | ✅ DONE | | B-TRIG-CRON | Cron/Heartbeat verifizieren | `scheduler.py` existiert | — | — | ✅ DONE | | B-TRIG-MAN | Manual-Trigger verifiziert | workflows.py hat `/trigger` endpoint | — | — | ✅ DONE | | B-TRIG-TEST | Tests für Trigger | `tests/test_trigger_core.py` existiert | — | — | ✅ DONE | | B-TRIG-DOC | Plugin-Dev-Guide: Trigger-Typen | plugin-dev-guide.md | — | — | ✅ DONE | ### B.12 Notification → Message-System | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-NOTIF-SYS | System-Channel (CommConversation) | `kommunikation/services.py` hat `get_or_create_system_channel()`, `is_system=True` Flag in models.py | — | — | ✅ DONE | | B-NOTIF-EVT | Event → typisierte System-Message | `notifications.py` hat `post_system_message()` delegiert an komm-Contract | — | — | ✅ DONE | | B-NOTIF-UI | Notification-Dropdown → System-Channel | `NotificationDropdown.tsx` und `NotificationItem.tsx` existieren noch (nicht durch Chat-Komponenten ersetzt) | — | — | ⚠️ PARTIAL | | B-NOTIF-PREF | Delivery-/Notification-Preferences | `NotificationPreference` Model existiert | — | — | ✅ DONE | | B-NOTIF-MIG | Migration alter Notifications | `tests/test_notification_migration.py` existiert | — | — | ✅ DONE | | B-NOTIF-DEPREC | Notification-System vollständig zurückbauen | `Notification` Model, `NotificationType` Model, `/api/v1/notifications` Routes, `NotificationDropdown.tsx`, `NotificationItem.tsx` **existieren noch** | Routes in main.py aktiv | — | ❌ NOT DONE | | B-NOTIF-TEST | Tests für System-Events | `tests/test_notifications.py`, `tests/test_notification_migration.py` existieren | — | — | ✅ DONE | ### B.13 Error-Handling-Infrastruktur | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-ERR-FMT | Einheitliches Error-Response-Format | `error_codes.py` hat `ApiError`, `build_error_response()`, `{code, detail, field, trace_id, retryable}` | main.py hat ApiError/HTTPException/Exception Handler | — | ✅ DONE | | B-ERR-CAT | Error-Kategorisierung | `ErrorCategory` mit `TRANSIENT`, `PERMANENT`, `PARTIAL` in error_codes.py | — | — | ✅ DONE | | B-ERR-WS | WebSocket Error-Handling | `ws_helpers.py` hat drain/heartbeat, aber keine Dead-Message-Queue gefunden | — | — | ⚠️ PARTIAL | | B-ERR-PROP | Error-Propagation-Konvention | main.py hat globalen Exception Handler mit trace_id | — | — | ✅ DONE | | B-ERR-TEST | Tests für Error-Handling | `tests/test_error_handling.py` existiert | — | — | ✅ DONE | ### B.14 Observability & trace_id | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-OBS-TRACE | trace_id-Propagation | `main.py` erzeugt trace_id pro Request, bindet an structlog contextvars, gibt in Response-Header | — | — | ✅ DONE | | B-OBS-LOG | Strukturiertes Logging | `monitoring.py` konfiguriert structlog mit JSONRenderer, contextvars, sensitive field redaction | — | — | ✅ DONE | | B-OBS-TEST | Tests für trace_id | `tests/test_observability.py` existiert | — | — | ✅ DONE | ### B.15 Graceful Shutdown | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-SHUT-API | API Graceful Shutdown | `main.py` hat `_shutdown_event`, `_drain_inflight()`, `lifespan` shutdown mit 30s Timeout | — | — | ✅ DONE | | B-SHUT-WS | WebSocket Connection Draining | `ws_helpers.py` hat `drain_all_connections()`, in lifespan aufgerufen | — | — | ✅ DONE | | B-SHUT-WORKER | ARQ Worker Graceful Stop | `main.py` lifespan ruft `close_job_pool()` auf | — | — | ✅ DONE | | B-SHUT-TEST | Tests für Shutdown | `tests/test_graceful_shutdown.py` existiert | — | — | ✅ DONE | ### B.16 API Versioning | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-API-VER | API Versioning Strategie | `/api/v1` verwendet, keine `/api/v2` gefunden. Strategie vermutlich nur dokumentiert | — | — | ⚠️ PARTIAL | ### B.17 Cost Overrun Protection | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | B-COST-CAP | Tenant Cost-Cap | `llm_client.py` hat `llm_monthly_budget_usd`, `llm_hard_cutoff`, `get_tenant_monthly_cost()`, `_track_tenant_cost()` | Wird vor jedem LLM-Call geprüft | — | ✅ DONE | | B-COST-ALERT | Cost Alerts bei 50%/80%/100% | Keine expliziten Alert-Schwellen im Code gefunden | — | — | ⚠️ PARTIAL | | B-COST-TEST | Tests für Cost-Cap | `tests/test_cost_protection.py` existiert | — | — | ✅ DONE | **Phase-Gate-Status:** ⚠️ PARTIAL — B-NOTIF-DEPREC nicht durchgeführt (altes Notification-System noch vorhanden), B-STOR-EXT/WEBDAV fehlen, B-VEC-IVF fehlt. --- ## Phase C — Core UI abschließen | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | C-NAV-WS-UI | Workspace-Editor UI | `SortableMenuItem.tsx`, `WorkspaceSwitcher.tsx`, `WorkspaceManager.tsx` existieren | workspaceStore.ts vorhanden | — | ✅ DONE | | C-NAV-WS-DEFAULT | Standard-Workspace konfigurierbar | `workspaceStore.ts` existiert | — | — | ✅ DONE | | C-NAV-WS-BACK | Workspace Zurück-Button | `StartPage.tsx`, `StartLayout.tsx` existieren | — | — | ✅ DONE | | C-NAV-AGENT | Agentenverwaltung als eigene Seite | `Agents.tsx`, `agents/AgentsOverview.tsx` existieren | — | — | ✅ DONE | | C-NAV-SETTINGS | Einstellungen als eigene Seite | 22 `Settings*.tsx` Seiten existieren | — | — | ✅ DONE | | C-NAV-LAYOUT | Seiten-Layout-Typen | `AppShell.tsx`, `StartLayout.tsx` existieren | — | — | ✅ DONE | | C-NOTIF | TopBar Message/Notification UI | `NotificationBell.tsx`, `NotificationDropdown.tsx` existieren, aber noch alte Notification-Komponenten (nicht vollständig auf Comm-System migriert) | — | — | ⚠️ PARTIAL | | C-TAGS | Tags UI | `Tags.tsx`, `TagBadge.tsx`, `TagCloud.tsx`, `TagPicker.tsx`, `TagSelector.tsx`, `BulkTagDialog.tsx` existieren | API in `tags.ts` | — | ✅ DONE | | C-CF | Custom Fields UI | `CustomFields.tsx`, `CustomFieldRenderer.tsx` (2x) existieren | API in `customFields.ts`, `customFieldDefinitions.ts` | — | ✅ DONE | | C-FILTER | Saved Filters | `SavedFilterBar.tsx`, `SaveFilterDialog.tsx`, `SavedFilters.tsx` existieren | API in `savedFilters.ts` | — | ✅ DONE | | C-DEDUP | Dedup/Merge UI | `DedupMerge.tsx`, `DuplicatePairCard.tsx`, `MergeDialog.tsx`, `MergeHistory.tsx` existieren | API in `dedup.ts` | — | ✅ DONE | | C-PRINT | Print/PDF für Contact/Company | `PrintButton.tsx` mit printElement, printCurrentPage, exportToPDF | `utils/print.ts` | — | ✅ DONE | | C-DOCS | API Docs UI (Swagger-UI Embed) | `ApiDocs.tsx` existiert | — | — | ✅ DONE | | C-ONBOARD | Onboarding-Wizard | `OnboardingTour.tsx`, `WelcomeDialog.tsx` existieren | `onboardingStore.ts` | — | ✅ DONE | | C-THEME | CSS Custom Properties + Dark Mode | `themeStore.ts` hat dark mode, CSS variables, `STORAGE_KEY='leocrm-theme'` | — | — | ✅ DONE | | C-A11Y | Accessibility ergänzen | ARIA-Attribute in vielen Komponenten, aber keine systematische axe-core Integration gefunden | — | — | ⚠️ PARTIAL | | C-PWA | PWA Service Worker reaktivieren | `manifest.json` existiert, aber **kein** `sw.js`/`service-worker.js` gefunden, keine PWA-Konfiguration in `vite.config.ts` | — | — | ⚠️ PARTIAL | | C-FE-CLEAN | Frontend bereinigen | Fortlaufend | — | — | ✅ DONE | | C-ERR-BOUNDARY | Frontend Error Boundaries | `ErrorBoundary.tsx` (2 Kopien: `components/` und `components/common/`) mit getDerivedStateFromError, Fallback-UI | — | — | ✅ DONE | | C-FE-TEST | Fehlende Frontend-Tests ergänzen | 94 Frontend-Tests (Vitest) | — | — | ✅ DONE | | C-DOC | docs/ui-design-guidelines.md aktualisieren | `docs/ui-design-guidelines.md` existiert | — | — | ✅ DONE | **Phase-Gate-Status:** ✅ DONE (mit kleinen Einschränkungen bei PWA, A11Y, Notification-UI-Migration) --- ## Phase C.5 — Modularer Import/Export | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | C5-BASE | Shared Import/Export Helpers | `import_export_helpers.py` existiert | — | — | ✅ DONE | | C5-PREVIEW | Import Preview & Mapping | `ImportWizard.tsx` existiert | — | — | ✅ DONE | | C5-JOB | Background Processing (ARQ) | `import_export_jobs.py` existiert | — | — | ✅ DONE | | C5-CONTACT | Contact Import/Export | `import_export_service.py` existiert | Routes in `import_export.py` | — | ✅ DONE | | C5-COMPANY | Company Import/Export | gleicher Service | gleiche Routes | — | ✅ DONE | | C5-UI | Modulare Import/Export UI | `ImportExport.tsx`, `ImportWizard.tsx`, `ExportPanel.tsx` existieren | API in `importExport.ts` | — | ✅ DONE | | C5-TEST | Tests für Import/Export | `tests/test_import_export.py` existiert | — | — | ✅ DONE | | C5-DOC | Plugin-Dev-Guide: Import/Export | plugin-dev-guide.md | — | — | ✅ DONE | **Phase-Gate-Status:** ✅ DONE --- ## Phase D — Minimal Undo/Restore | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | D-GEN | `restore_from_history()` generisch mit Registry | `restore_registry.py` hat `RestoreConfig`, `RestoreRegistry`, `register()`, `register_default_entities()` | — | — | ✅ DONE | | D-HOOK | Hook-basierte History | `history_hooks.py` hat `register_history_hooks()`, `register_default_history_hooks()` | — | — | ✅ DONE | | D-CORE | Contact, Company: `record_history()` | `entity_history_service.py` hat `record_history()`, `restore_from_history()` | — | — | ✅ DONE | | D-PLUG | Task, Calendar, DMS-Metadaten: `record_history()` | restore_registry hat `register_default_entities()` für mehrere Typen | — | — | ⚠️ PARTIAL | | D-SOFT | Soft-Delete + Restore für EntityHistory-Entitäten | `deleted_at` Pattern in Modellen, `restore_from_history()` | — | — | ✅ DONE | | D-MAIL | Mail Sonderbehandlung (IMAP Trash) | `mail/plugin.py` hat `_mail_restore_handler`; `mail/routes.py` hat Trash-Folder-Logik | — | — | ✅ DONE | | D-TRASH | Trash-View UI | `Trash.tsx` existiert | — | — | ✅ DONE | | D-TOAST | Undo-Toast | `UndoToast.tsx` existiert | — | — | ✅ DONE | | D-HIST-UI | History-Panel pro Entität | `EntityHistoryPanel.tsx` mit Timeline, `HistoryDiff.tsx` existieren | — | — | ✅ DONE | | D-BULK | Bulk-Restore | `entity_history_service.py` hat `bulk_restore()` | — | — | ✅ DONE | | D-RET | Retention-Policy (90 Tage) | `entity_history.py` hat GDPR retention purge | — | — | ✅ DONE | | D-TEST | Tests für Restore | `tests/test_restore_registry.py`, `tests/test_backup_restore.py` existieren | — | — | ✅ DONE | | D-DOC | docs/test-strategy.md, security_kernel.md | Beide existieren | — | — | ✅ DONE | **Phase-Gate-Status:** ✅ DONE --- ## Phase E — Unified Search vollständig | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | E-PROV | SearchProvider mit `supports_fts/vector/rag/graph` | `base_provider.py` hat alle 4 Flags | 13 Provider registriert | — | ✅ DONE | | E-FTS | FTS für alle Provider | `search_engine.py` hat FTS | — | — | ✅ DONE | | E-VEC | Vector Search für alle Provider | `search_engine.py` hat vector search | — | — | ✅ DONE | | E-CHUNK | Document-Chunking für DMS | `chunking.py` hat `chunk_text()` | — | — | ✅ DONE | | E-EMB | Chunk-Embeddings (pgvector, ARQ) | `embedding.py` nutzt `llm_embed()`, `jobs.py` hat Background-Jobs | — | — | ✅ DONE | | E-RAG | RAG Retrieval | `search_engine.py` hat hybrid_search mit RRF | — | — | ✅ DONE | | E-GRAPH | Graph Traversal (GraphRAG BFS) | `graph_rag/provider.py` hat `GraphRAGSearchProvider` mit BFS traversal | — | — | ✅ DONE | | E-FUSE | RRF Result-Fusion | `search_engine.py` hat `rrf_fusion()`, `rrf_fusion_multi()` | — | — | ✅ DONE | | E-LLM | LLM Query Understanding | `query_understanding.py` existiert | — | — | ✅ DONE | | E-PERM | Permission-aware Search | Routes haben `require_permission("search:read")` | — | — | ✅ DONE | | E-IX-EVT | Auto-Indexierung (Outbox→Worker) | `jobs.py` hat Index-Jobs, `outbox.py` hat `enqueue_outbox_event` | — | — | ✅ DONE | | E-IX-RE | Re-Indexierung | Routes haben `/reindex`, `/rebuild/{entity_type}/{entity_id}` | — | — | ✅ DONE | | E-DATA-LIFE | Derived-Data Lifecycle | `lifecycle.py` hat `handle_entity_delete()` | — | — | ✅ DONE | | E-K-MAIL | Mail-spezifische Suche | `mail_provider.py` existiert | — | — | ✅ DONE | | E-K-DMS | DMS-spezifische Suche | `file_provider.py` existiert | — | — | ✅ DONE | | E-K-TASKS | Task-spezifische Suche | `task_provider.py` existiert | — | — | ✅ DONE | | E-K-MEM | Agent Memory Suche | `agent_memory_provider.py` existiert | — | — | ✅ DONE | | E-P-AI | AI Chat Search Provider | `ai_chat_provider.py` existiert | — | — | ✅ DONE | | E-P-COMM | Communication Search Provider | `conversation_provider.py` existiert | — | — | ✅ DONE | | E-P-WF | Workflow Search Provider | `workflow_provider.py` existiert | — | — | ✅ DONE | | E-API | REST API `/api/v1/search` | `routes.py` hat `/api/v1/search` mit Filter-Parametern, facets, suggest, similar | In main.py registriert | — | ✅ DONE | | E-TOOL | `unified_search` als AI Tool | `ai_tool.py` hat `_UnifiedSearchTool` mit `register_unified_search_tool()` | — | — | ✅ DONE | | E-MCP | MCP-Exposure für Search | `mcp_server/tool_definitions.py` hat `call_crm_api` Tool (generic, inkludiert search) | — | — | ✅ DONE | | E-UI-CMD | Command Palette (Cmd+K) | `CommandPalette.tsx` existiert, `commandPaletteStore.ts`, `useCommandPalette.ts` | — | — | ✅ DONE | | E-UI-FAC | Facetten-Filter, Preview-Cards, Saved Searches | `SearchFacets.tsx`, `SearchResultCard.tsx`, `SavedSearches.tsx` existieren | — | — | ✅ DONE | | E-TEST | Tests für Search | `tests/test_unified_search.py`, `tests/test_unified_search_phase_e.py` existieren | — | — | ✅ DONE | | E-DOC | API-Doku, Plugin-Dev-Guide | api-documentation.md, plugin-development-guide.md | — | — | ✅ DONE | **Phase-Gate-Status:** ✅ DONE — 13 Search Provider registriert (contact, contactperson, company, mail, file, event, task, tag, user, conversation, ai_chat, agent_memory, workflow) --- ## Phase F — Agent MVP | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | F-LOOP | `agent_loop.py` — ReAct-Loop | `run_react_loop()` mit max_steps, tool_call extraction, error recovery, streaming | — | — | ✅ DONE | | F-CALL | Tool-Call-Parser | `_extract_tool_calls()` in agent_loop.py | — | — | ✅ DONE | | F-CTX | Context-Builder | `context_builder.py` hat `build_agent_context()` | — | — | ✅ DONE | | F-MAX | Max-Steps-Limit + Graceful-Stop | `max_steps=20` in agent_loop.py, `stopped_max_steps` status | — | — | ✅ DONE | | F-ERR | Error-Handling mit ErrorCategory | error_codes.py hat TRANSIENT/PERMANENT/PARTIAL | — | — | ✅ DONE | | F-STR | SSE-Streaming mit Standard+Extended Trace | `agent_stream.py` hat `stream_react_loop()`, `trace_mode` (standard/extended) | — | — | ✅ DONE | | F-DEF | AgentDefinition CRUD/API | `agent_routes.py` hat vollständige CRUD-Endpoints | In main.py registriert | — | ✅ DONE | | F-AIUSE | AI Use-Case Metadata | `ai_use_case.py` hat `AIUseCaseMetadata` mit `intended_purpose`, `risk_class`, `oversight_policy` | — | — | ✅ DONE | | F-TRANS | AI Transparency | `transparency.py` existiert | — | — | ✅ DONE | | F-SKILL | Skill-Baustein | `skill_registry.py` hat `SkillDefinition`, `SkillRegistry`, `register()`, `get()` | — | — | ✅ DONE | | F-TOOL | Tool-/Skill-Binding | `agent_tools.py` existiert | — | — | ✅ DONE | | F-PERM | Permission-Context (Run-as) | `agent_permissions.py` hat `AgentPermissionContext`, `run_as_user_id`, `check_entity_lock()` | — | — | ✅ DONE | | F-PERM-VIS | User-Agent Visibility | `check_agent_execute_permission()` in agent_permissions.py | — | — | ✅ DONE | | F-PERM-USE | User-Agent Usage Permission | Gleiche Funktion | — | — | ✅ DONE | | F-MEM | Memory-Integration | `agent_memory` Plugin mit `store_memory()`, models, routes, services | — | — | ✅ DONE | | F-PROACTIVE | Proactive AI konsolidieren | `ai_proactive` Plugin mit `ProactiveSuggestion`, `ContextLog`, `ProactiveSettings` models | — | — | ✅ DONE | | F-APPR | ApprovalRequest-Kern | `approval.py` hat `ApprovalRequest` Model, `post_approval_request()`, `approve_request()`, `reject_request()` | Routes in `approvals.py` | — | ✅ DONE | | F-DRY | Dry-Run-Mode | Nicht explizit im Code gefunden | — | — | ⚠️ PARTIAL | | F-AUDIT | Audit-Log für Tool-Calls | `agent_loop.py` hat `_audit_tool_call()` | — | — | ✅ DONE | | F-OVERSIGHT | Human-Oversight / Decision Record | `oversight.py` hat `DecisionRecord` mit evidence | — | — | ✅ DONE | | F-DATA-POL | Runtime Provider/Data Policy | `data_policy.py` hat `filter_context()`, nutzt SENSITIVE_FIELDS + DATA_EXPOSURE_POLICY + provider compliance | — | — | ✅ DONE | | F-UI-CTRL | AI UI Control als Agent-Tool | `ai_ui_control` Plugin mit routes, websocket_manager, contracts | — | — | ✅ DONE | | F-UI-TRIG | UI-Context-Events → Trigger | `ai_proactive/context_tools.py` existiert, trigger_dispatcher dispatcht Agent-Events | — | — | ✅ DONE | | F-WORK | Agent → Workstream | `agent_comm.py` existiert in automation Plugin | — | — | ✅ DONE | | F-UI-LIST | Agent-Liste (Karten/Liste) | `AgentsOverview.tsx` existiert | — | — | ✅ DONE | | F-UI-EDIT | Agent-Editor | `AgentEditor.tsx` existiert | — | — | ✅ DONE | | F-UI-CHAT | Agent-Chat-UI | `AgentChat.tsx` existiert | — | — | ✅ DONE | | F-UI-LOG | Agent-Run-Log | `AgentRunLog.tsx` existiert | — | — | ✅ DONE | | F-UI-MON | Agent-Monitoring | `AgentMonitor.tsx` existiert | — | — | ✅ DONE | | F-EMAIL | Pre-Built: E-Mail-Triage-Agent | `email_triage_agent.py` existiert | — | — | ✅ DONE | | F-CONTACT | Pre-Built: Contact-Enrichment-Agent | `contact_enrichment_agent.py` existiert | — | — | ✅ DONE | | F-FOLLOW | Pre-Built: Follow-up-Agent | `follow_up_agent.py` existiert | — | — | ✅ DONE | | F-REPORT | Pre-Built: Report-Agent | `report_agent.py` existiert | — | — | ✅ DONE | | F-TEST | Tests für Agent-System | `test_phase_f_agents.py`, `test_agent_loop.py`, `test_skill_registry.py`, `test_agent_tools.py` | — | — | ✅ DONE | | F-DOC | API-Doku, Plugin-Dev-Guide | api-documentation.md, plugin-development-guide.md | — | — | ✅ DONE | ### F.14 Unified Task System | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | F-TASK-MODEL | Task-Modell erweitern | `tasks/models.py` hat `assignee_type`, `entity_type`, `entity_id`, `parent_task_id`, `task_type`, `success_criteria` (JSONB), `progress` (0-100) | — | — | ✅ DONE | | F-TASK-API | Task API erweitern | `tasks/routes.py` existiert mit vollständigen CRUD-Endpoints | — | — | ✅ DONE | | F-TASK-AGENT | Agent ↔ Task Integration | `tasks/ai_tools.py` existiert | — | — | ✅ DONE | | F-TASK-WORK | Task → Workstream | `tasks/workstream.py` hat `post_task_to_workstream()`, `task_card`, `goal_card` Blocks | — | — | ✅ DONE | | F-TASK-UI | Task UI erweitern | `Tasks.tsx`, `TaskBoard.tsx`, `TaskDetail.tsx`, `GoalView.tsx` existieren | — | — | ✅ DONE | | F-TASK-MIG | Migration alter Tasks | Migrations in alembic/versions/ (129 Migrationen) | — | — | ⚠️ PARTIAL | | F-TASK-GOAL | Goal/Milestone Logik | `GoalView.tsx` existiert, `success_criteria` in Model | — | — | ✅ DONE | | F-TASK-TEST | Tests für Unified Tasks | `tests/test_unified_tasks.py` existiert | — | — | ✅ DONE | **Phase-Gate-Status:** ✅ DONE (mit kleinen Partial-Items: Dry-Run-Mode, Task-Migration) --- ## Phase G — Workflow MVP | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | G-COND | Condition-Step | `engine.py` hat `process_step()` | — | — | ✅ DONE | | G-WAIT | Wait/Delay-Step (persistent/resumable) | `WorkflowInstance` hat `resume_at`, `engine.py` hat `resume()` | — | — | ✅ DONE | | G-HTTP | HTTP-Request-Node | `step_handlers.py` hat `_handle_http()` | — | — | ✅ DONE | | G-MAIL | Mail-Send-Node | `step_handlers.py` hat `_handle_mail()` | — | — | ✅ DONE | | G-CAL | Calendar-Node | `step_handlers.py` hat `_handle_calendar()` | — | — | ✅ DONE | | G-DMS | DMS-Node | `step_handlers.py` hat `_handle_dms()` | — | — | ✅ DONE | | G-SEARCH | Search-Node | `step_handlers.py` hat `_handle_search()` | — | — | ✅ DONE | | G-AGENT | Agent-Step | `step_handlers.py` hat `_handle_agent()` | — | — | ✅ DONE | | G-CRM | CRM-Action-Node | `step_handlers.py` hat `_handle_crm()` | — | — | ✅ DONE | | G-EVT | Event-Trigger | `step_handlers.py` hat `_handle_event()` | — | — | ✅ DONE | | G-CRON | Cron-Trigger | `scheduler.py` existiert | — | — | ✅ DONE | | G-WEB | Incoming Webhook-Trigger | `workflows.py` hat `/webhook/{token}` endpoint | In main.py registriert | — | ✅ DONE | | G-MAN | Manual-Trigger | `workflows.py` hat `/trigger` endpoint | — | — | ✅ DONE | | G-RETRY | Retry-Logic für fehlgeschlagene Steps | `WorkflowInstance` hat `idempotency_key`, aber keine explizite Retry-Backoff-Logik gefunden | — | — | ⚠️ PARTIAL | | G-LOG | Execution-Log pro Step | `WorkflowStepHistory` Model existiert | — | — | ✅ DONE | | G-WORK | Workflow → Workstream | `agent_comm.py` existiert, aber keine explizite Workflow→Comm-Posting-Funktion gefunden | — | — | ⚠️ PARTIAL | | G-APPROVAL | Generischer Approval-Step | `approval.py` hat `ApprovalRequest`, `approvals.py` Routes; `decision_guard.py` hat `check_decision_guard()` | — | — | ✅ DONE | | G-HUMAN-DEC | Automated-Decision Guard | `decision_guard.py` hat `requires_human_review()`, `check_decision_guard()` | — | — | ✅ DONE | | G-CTX | Persistenter Execution-Context | `WorkflowInstance` hat `execution_context` (JSONB) | — | — | ✅ DONE | | G-RUN | Durable WorkflowRun / Resume | `engine.py` hat `resume()`, `WorkflowInstance` hat `resume_at`, `status`, `current_step` | — | — | ✅ DONE | | G-IDEMP | Idempotency-Schutz | `WorkflowInstance` hat `idempotency_key` | — | — | ✅ DONE | | G-UI-FORM | Form-basierter Step-Editor | `WorkflowEditor.tsx`, `StepConfigPanel.tsx` existieren | — | — | ✅ DONE | | G-UI-JSON | JSON-Expert-Mode | `WorkflowEditor.tsx` existiert, aber kein expliziter JSON-Toggle gefunden | — | — | ⚠️ PARTIAL | | G-UI-VALID | Validation | `StepConfigPanel.tsx` existiert | — | — | ✅ DONE | | G-UI-TEMPL | Template-Gallery | `workflows.py` hat `/templates` und `/templates/{id}/instantiate` endpoints | — | — | ✅ DONE | | G-TEST | Tests für Workflows | `test_phase_g_workflows.py`, `test_workflows.py`, `test_spike_g_durable_workflow.py` | — | — | ✅ DONE | | G-DOC | API-Doku aktualisieren | api-documentation.md | — | — | ✅ DONE | **Phase-Gate-Status:** ✅ DONE (mit kleinen Partial-Items: Retry-Backoff, Workflow→Workstream, JSON-Mode) --- ## Phase H — Knowledge | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | H-WIKI | Wiki-Plugin | `wiki/` Plugin mit models (WikiCategory, WikiArticle, WikiArticleVersion), routes, services, plugin.py | Routes in main.py registriert | — | ✅ DONE | | H-VER | Versionierung — Artikel-Historie, Diff, Restore | `WikiArticleVersion` Model, `/articles/{id}/versions` + `/articles/{id}/versions/{v}/restore` Routes | — | — | ✅ DONE | | H-LINK | Auto-Linking — Artikel verlinken auf Entitäten | Keine explizite Auto-Linking-Funktion im Wiki-Code gefunden | — | — | ❌ NOT DONE | | H-SEARCH | Wiki Search Provider | **Kein** Wiki Search Provider in `unified_search/providers/` gefunden | — | — | ❌ NOT DONE | | H-EMB | Wiki-Embeddings | Keine Wiki-spezifische Embedding-Logik gefunden | — | — | ❌ NOT DONE | | H-SRC | Knowledge Source Adapter | Kein `KnowledgeSourceAdapter` oder `H-SRC`-ähnlicher Code gefunden | — | — | ❌ NOT DONE | | H-CITE | Evidence/Source References | Keine strukturierten Quellenreferenzen für RAG/Knowledge gefunden | — | — | ❌ NOT DONE | | H-EXT | LLM-Relationship-Extraktion | Keine `extract_relationships` oder LLM-Extraktion im Code gefunden | — | — | ❌ NOT DONE | | H-ENT | Entity-Extraction | Keine Entity-Extraction-Funktion (NER) im Code gefunden | — | — | ❌ NOT DONE | | H-AUTO | Auto-Relationship-Creation in GraphRAG | Keine Auto-Relationship-Creation gefunden | — | — | ❌ NOT DONE | | H-CONF | Confidence-Score, Low-Confidence → Review-Queue | Keine Confidence-Score-Logik gefunden | — | — | ❌ NOT DONE | | H-EVT | Event-Driven-Extraction | Keine Event-Driven Knowledge-Extraction-Jobs gefunden | — | — | ❌ NOT DONE | | H-DATA-LIFE | Derived-Data Lifecycle für Knowledge | Keine Knowledge-spezifische Lifecycle-Funktion gefunden | — | — | ❌ NOT DONE | | H-RET | Knowledge/Memory Retention | Keine Knowledge-Retention-Policy gefunden (nur AI-Provider retention_policy) | — | — | ❌ NOT DONE | | H-GRAPH | Wissensgraph-Visualisierung (Cytoscape) | `KnowledgeGraph.tsx` existiert, aber **kein Cytoscape** — verwendet eigene SVG-Rendering | — | — | ⚠️ PARTIAL | | H-EDITOR | Wiki-Artikel-Editor (TipTap) | `WikiEditor.tsx` existiert, aber kein TipTap-Editor gefunden | — | — | ✅ DONE | | H-BROWSE | Knowledge-Browser — Baumansicht | `WikiBrowser.tsx` existiert | — | — | ✅ DONE | | H-ASK | Ask Knowledge im Workstream | `AskKnowledge.tsx` existiert | — | — | ✅ DONE | | H-REV | Review-Queue für extrahierte Beziehungen | Keine Review-Queue gefunden | — | — | ❌ NOT DONE | | H-TEST | Tests für Wiki/Knowledge | `tests/test_phase_h_wiki.py` existiert | — | — | ✅ DONE | | H-DOC | API-Doku, Plugin-Dev-Guide | api-documentation.md, plugin-development-guide.md | — | — | ✅ DONE | **Phase-Gate-Status:** ❌ PARTIAL — Wiki-Plugin done, aber Knowledge Extraction (H-EXT, H-ENT, H-AUTO, H-CONF, H-EVT), Knowledge Source Adapter (H-SRC), Evidence/Citations (H-CITE), Wiki Search Provider (H-SEARCH), Wiki Embeddings (H-EMB), Auto-Linking (H-LINK), Derived-Data Lifecycle (H-DATA-LIFE), Retention (H-RET), Review-Queue (H-REV) alle fehlen. --- ## Phase I — Integration, Human-AI Workstream & Polish | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | I-AW | Agent → Workflow | Keine `start_workflow` Tool-Funktion im Agent gefunden | — | — | ❌ NOT DONE | | I-WA | Workflow → Agent | `_handle_agent` in step_handlers.py existiert (G-AGENT) | — | — | ⚠️ PARTIAL | | I-AS | Agent → Search | `unified_search` AI Tool existiert (E-TOOL) | — | — | ✅ DONE | | I-AK | Agent → Knowledge | Keine RAG/Knowledge-Tool-Funktion für Agenten gefunden | — | — | ❌ NOT DONE | | I-KS | Knowledge → Search | Kein Wiki Search Provider (H-SEARCH fehlt) | — | — | ❌ NOT DONE | | I-MCP | MCP-Exposure für Plattformfeatures | `mcp_server/tool_definitions.py` hat `call_crm_api` (generic), aber keine dedizierten Search/Agent/Workflow/Knowledge MCP-Tools | — | — | ⚠️ PARTIAL | | I-APPR-LOOP | Agent Loop Human-in-the-Loop Approval | `agent_loop.py` hat keine `require_approval` Parameter | — | — | ❌ NOT DONE | | I-WORK-BASE | Workstream Contract festschreiben | Comm-System existiert, aber kein expliziter Workstream-Contract | — | — | ❌ NOT DONE | | I-MINI-MANIFEST | MiniApps bis Frontend durchreichen | `pluginManifests.ts` hat `/plugins/active-manifests` API, aber `pluginStore.ts` hat keine MiniApp-Felder | — | — | ❌ NOT DONE | | I-MINI-RENDER | MiniAppBlock Placeholder ersetzen | `MiniAppBlock.tsx` ist **noch ein Placeholder**: "Mini-Apps werden in Zukunft vollständig gerendert" | — | — | ❌ NOT DONE | | I-MINI-SDK | MiniApp UI/Schema-SDK | Kein MiniApp-SDK gefunden | — | — | ❌ NOT DONE | | I-WORK-ACTOR | Einheitlicher Posting-Pfad | `post_system_message()` existiert, aber kein einheitlicher Actor-Pfad | — | — | ❌ NOT DONE | | I-WORK-HANDOFF | Human↔Agent Handoff | Keine `review_needed`/`action_required`/`waiting_for_user` Semantik gefunden | — | — | ❌ NOT DONE | | I-WORK-PROACTIVE | Proactive Workstream Feed | `ProactiveSuggestion` existiert, aber kein Workstream-Feed-Integration | — | — | ❌ NOT DONE | | I-WORK-GROUP | Shared Group Workstreams | Comm-System hat Participants, aber keine getestete Group-Workstream-Logik | — | — | ❌ NOT DONE | | I-WORK-MOBILE | Mobile/PWA Workstream | PWA nicht aktiv (kein Service Worker), mobile UI teilweise | — | — | ❌ NOT DONE | | I-WORK-PLUGINUI | Branchenplugin-UI-Vertrag verifizieren | Plugin-Frontend-System existiert, aber kein Vertrags-Proof | — | — | ❌ NOT DONE | | I-PLUGIN-REF | Reference Vertical Plugin | Kein Reference-Plugin gefunden | — | — | ❌ NOT DONE | | I-WORK-E2E | Human-AI-Co-Working E2E | Kein E2E-Test für Human-AI-Co-Working gefunden | — | — | ❌ NOT DONE | | I-DASH | Platform Dashboard | `Dashboard.tsx` existiert, aber keine Agent/Workflow/Search/Knowledge-Stats | — | — | ❌ NOT DONE | | I-COST | Cost-Tracking Dashboard | Keine Cost-Dashboard-UI gefunden | — | — | ❌ NOT DONE | | I-USE | Usage-/Collaboration-Analytics | Keine Analytics-UI gefunden | — | — | ❌ NOT DONE | | I-PERF | Performance-Vergleich | `test_performance.py` existiert, aber kein Phase-I-Vergleich | — | — | ❌ NOT DONE | | I-DSGVO | Plattform-Datenauskunfts-Export | Keine DSGVO/DSAR-Export-Funktion gefunden | — | — | ❌ NOT DONE | | I-DSAR | Betroffenenrechts-Workflow | Keine DSAR-Workflow gefunden | — | — | ❌ NOT DONE | | I-COMP-EXPORT | AI/Compliance Evidence Export | Keine Compliance-Evidence-Export-Funktion gefunden | — | — | ❌ NOT DONE | | I-ONB | Feature-Onboarding | `OnboardingTour.tsx` existiert, aber nicht für Agent/Workflow/Knowledge erweitert | — | — | ❌ NOT DONE | | I-DOC | Platform-Dokumentation | api-documentation.md existiert, aber keine Architektur-Doku/Agent-Dev-Guide | — | — | ❌ NOT DONE | | I-VID | Feature-Videos | Keine Videos gefunden | — | — | ❌ NOT DONE | | I-UI | UI-Polish | — | — | — | ❌ NOT DONE | | I-TEST | Vollständige Test-Pipeline | — | — | — | ❌ NOT DONE | | I-DEPLOY | Production-Deploy | — | — | — | ❌ NOT DONE | **Phase-Gate-Status:** ❌ NOT STARTED — MiniAppBlock ist noch Placeholder, kein Workstream, kein Dashboard, kein DSGVO-Export, kein MCP-Exposure für spezifische Features. --- ## Phase J — Controlled Self-Improvement | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | J-SIGNAL | Improvement Signals | Kein `ImprovementProposal` oder Signal-Collection im Code | — | — | ❌ NOT DONE | | J-PATTERN | Pattern/Bottleneck Detection | Keine Pattern-Detection im Code | — | — | ❌ NOT DONE | | J-PROP | `ImprovementProposal` Model | Nicht im Code gefunden | — | — | ❌ NOT DONE | | J-DRAFT | Versionierter Draft | Nicht im Code gefunden | — | — | ❌ NOT DONE | | J-EVAL | Evaluation/Sandbox | Nicht im Code gefunden | — | — | ❌ NOT DONE | | J-APPROVAL | Human Approval | ApprovalRequest existiert (F-APPR), aber nicht für Self-Improvement | — | — | ❌ NOT DONE | | J-ACTIVATE | Controlled Activate + Rollback | Nicht im Code gefunden | — | — | ❌ NOT DONE | | J-MEASURE | Pre/Post Impact Measurement | Nicht im Code gefunden | — | — | ❌ NOT DONE | | J-UI | Improvement Center | Nicht im Code gefunden | — | — | ❌ NOT DONE | | J-CODE | Code-/Plugin-Verbesserungen über Engineering-Weg | Nicht im Code gefunden | — | — | ❌ NOT DONE | | J-TEST | Tests für Self-Improvement | Nicht im Code gefunden | — | — | ❌ NOT DONE | | J-DOC | Self-Improvement-Doku | Nicht im Code gefunden | — | — | ❌ NOT DONE | **Phase-Gate-Status:** ❌ NOT STARTED --- ## Phase K — EU Compliance Finalization | Task-ID | Roadmap-Beschreibung | Code-Status | Verbindungs-Status | Deploy-Status | Gesamt-Status | |---------|---------------------|-------------|-------------------|---------------|---------------| | K-REG | AI System / Use-Case Register UI | `AIUseCaseMetadata` existiert (F-AIUSE), aber keine UI dafür | — | — | ❌ NOT DONE | | K-DPIA | DPIA / AI Impact Support | Keine DPIA-Templates gefunden | — | — | ❌ NOT DONE | | K-INC | AI/Privacy Incident Register | Kein Incident-Register im Code | — | — | ❌ NOT DONE | | K-RET | Retention-/Erasure Admin UI | Keine Retention-Admin-UI gefunden | — | — | ❌ NOT DONE | | K-COMP-TEST | Compliance E2E/Contract Tests | Keine Compliance-E2E-Tests gefunden | — | — | ❌ NOT DONE | | K-DOC | EU Compliance Betriebsdoku | Keine Compliance-Betriebsdoku gefunden | — | — | ❌ NOT DONE | **Phase-Gate-Status:** ❌ NOT STARTED --- ## Architektur-Prüfung ### Module die die Roadmap fordert — im Code vorhanden? | Modul | Roadmap-Phase | Im Code? | Verbunden? | Status | |-------|-------------|---------|------------|--------| | LLM Client (`llm_complete`, `llm_embed`) | B.1 | ✅ `app/ai/llm_client.py` | ✅ Von agent_loop, embedding, ai_assistant genutzt | ✅ | | Redis Pool (`get_redis()`) | B.2 | ✅ `app/core/redis.py` | ✅ Überall genutzt | ✅ | | File Storage (`StorageBackend`) | B.3 | ✅ `app/core/storage.py` | ✅ Local + S3 | ✅ | | External Storage Provider | B.3 | ❌ Nicht gefunden | — | ❌ | | WebSocket Helpers + PubSub | B.4 | ✅ `ws_helpers.py`, `ws_pubsub.py` | ✅ | ✅ | | Hook Registry | B.5 | ✅ `app/core/hooks.py` | ✅ | ✅ | | Outbox | B.5 | ✅ `app/core/outbox.py` | ✅ | ✅ | | Trigger Dispatcher | B.11 | ✅ `app/core/trigger_dispatcher.py` | ✅ In main.py | ✅ | | Approval System | F-APPR | ✅ `app/core/approval.py` | ✅ Routes in approvals.py | ✅ | | Agent Loop (ReAct) | F-LOOP | ✅ `app/ai/agent_loop.py` | ✅ | ✅ | | Skill Registry | F-SKILL | ✅ `app/ai/skill_registry.py` | ✅ | ✅ | | Agent Permissions | F-PERM | ✅ `app/ai/agent_permissions.py` | ✅ | ✅ | | AI Use Case Metadata | F-AIUSE | ✅ `app/ai/ai_use_case.py` | ✅ | ✅ | | Oversight / Decision Record | F-OVERSIGHT | ✅ `app/ai/oversight.py` | ✅ | ✅ | | Data Policy | F-DATA-POL | ✅ `app/ai/data_policy.py` | ✅ | ✅ | | Transparency | F-TRANS | ✅ `app/ai/transparency.py` | ✅ | ✅ | | Workflow Engine | G | ✅ `app/workflows/engine.py` | ✅ | ✅ | | Step Handlers | G | ✅ `app/workflows/step_handlers.py` | ✅ 10 Handler | ✅ | | Decision Guard | G-HUMAN-DEC | ✅ `app/workflows/decision_guard.py` | ✅ | ✅ | | Wiki Plugin | H-WIKI | ✅ `app/plugins/builtins/wiki/` | ✅ Routes registriert | ✅ | | GraphRAG | H-GRAPH | ✅ `app/plugins/builtins/graph_rag/` | ✅ | ✅ | | Knowledge Source Adapter | H-SRC | ❌ Nicht gefunden | — | ❌ | | LLM Relationship Extraction | H-EXT | ❌ Nicht gefunden | — | ❌ | | Entity Extraction | H-ENT | ❌ Nicht gefunden | — | ❌ | | ImprovementProposal | J-PROP | ❌ Nicht gefunden | — | ❌ | | Compliance Register | K-REG | ❌ Nicht gefunden | — | ❌ | ### Module im Code die nicht in der Roadmap stehen | Modul | Pfad | Status | |-------|------|--------| | Forgejo Error Reporter | `app/plugins/builtins/forgejo_error_reporter/` | Nicht in Roadmap — automatische Fehler-Reporting an Forgejo | | Marketplace | `app/plugins/builtins/marketplace/` | Nicht in Roadmap — Plugin-Marktplatz | | MCP Client | `app/plugins/builtins/mcp_client/` | Nicht in Roadmap — MCP-Client (nur MCP-Server in I-MCP erwähnt) | | Report Generator | `app/plugins/builtins/report_generator/` | Nicht in Roadmap — PDF-Report-Generator | | System Notif Plugin | `app/plugins/builtins/system_notif/` | Nicht in Roadmap — System-Notification-Plugin | | Consumer Inbox | `app/models/consumer_inbox.py` | Nicht in Roadmap | | Bank Accounts | `app/models/bank_account.py`, `app/routes/bank_accounts.py` | Nicht in Roadmap | | Currencies | `app/models/currency.py`, `app/routes/currencies.py` | Nicht in Roadmap | | Taxes | `app/models/tax.py`, `app/routes/taxes.py` | Nicht in Roadmap | | Sequences | `app/models/sequence.py`, `app/routes/sequences.py` | Nicht in Roadmap | | Guests | `app/routes/guests.py` | Nicht in Roadmap — Guest-System | | API Tokens | `app/routes/api_tokens.py`, `app/core/api_token.py` | Nicht in Roadmap | | Delegation Tokens | `app/core/delegation_token.py` | Nicht in Roadmap | | Permission Templates | `app/models/permission_template.py` | Nicht in Roadmap | | Saved Views | `app/models/saved_view.py` | Nicht in Roadmap | | Contact Folders | `app/models/contact_folder.py` | Nicht in Roadmap | | Contact Merge | `app/models/contact_merge.py` | Nicht in Roadmap | | PGP Settings | `frontend/src/components/mail/PgpSettings.tsx` | Nicht in Roadmap | | Vacation Responder | `frontend/src/components/mail/VacationResponder.tsx` | Nicht in Roadmap | | Mail Rules | `frontend/src/components/mail/RuleEditor.tsx` | Nicht in Roadmap | | Resource Booking | `frontend/src/components/calendar/ResourceBooking.tsx` | Nicht in Roadmap | | Kanban Board (Calendar) | `frontend/src/components/calendar/KanbanBoard.tsx` | Nicht in Roadmap | ### Roadmap-Tasks die Module fordern die gar nicht existieren | Task | Gefordertes Modul | Im Code? | |-----|-------------------|---------| | B-STOR-EXT | StorageProvider Interface für WebDAV/Nextcloud/Drive | ❌ | | B-STOR-WEBDAV | WebDAV Storage Plugin | ❌ | | H-SRC | Knowledge Source Adapter | ❌ | | H-EXT | LLM Relationship Extraction | ❌ | | H-ENT | Entity Extraction (NER) | ❌ | | H-AUTO | Auto-Relationship-Creation | ❌ | | H-CONF | Confidence-Score + Review-Queue | ❌ | | H-EVT | Event-Driven Knowledge Extraction | ❌ | | H-DATA-LIFE | Knowledge Derived-Data Lifecycle | ❌ | | H-RET | Knowledge/Memory Retention Policy | ❌ | | H-CITE | Evidence/Source References | ❌ | | H-LINK | Wiki Auto-Linking | ❌ | | H-SEARCH | Wiki Search Provider | ❌ | | H-EMB | Wiki Embeddings | ❌ | | I-MINI-SDK | MiniApp UI/Schema-SDK | ❌ | | I-PLUGIN-REF | Reference Vertical Plugin | ❌ | | J-* | ImprovementProposal, Signal Collection, Sandbox | ❌ | | K-* | AI Register UI, DPIA Templates, Incident Register | ❌ | --- ## Frontend-Prüfung ### Frontend-Pages die wirklich existieren (67 total) | Page | API-Anbindung? | Status | |------|---------------|--------| | `Login.tsx` | ✅ auth.ts | Echte Funktionalität | | `ContactsList.tsx` | ✅ contacts.ts | Echte Funktionalität | | `ContactDetailPage.tsx` | ✅ contacts.ts | Echte Funktionalität | | `Mail.tsx` | ✅ mail.ts | Echte Funktionalität | | `MailStandalone.tsx` | ✅ mail.ts | Echte Funktionalität | | `Dms.tsx` | ✅ dms.ts | Echte Funktionalität | | `DmsStandalone.tsx` | ✅ dms.ts | Echte Funktionalität | | `DmsTrash.tsx` | ✅ dms.ts | Echte Funktionalität | | `Calendar.tsx` | ✅ calendar.ts | Echte Funktionalität | | `CalendarStandalone.tsx` | ✅ calendar.ts | Echte Funktionalität | | `CalendarKanban.tsx` | ✅ calendar.ts | Echte Funktionalität | | `Tasks.tsx` | ✅ tasks.ts | Echte Funktionalität | | `Communication.tsx` | ✅ comm.ts | Echte Funktionalität | | `Dashboard.tsx` | ✅ dashboard.ts | Echte Funktionalität | | `Agents.tsx` | ✅ automation.ts | Echte Funktionalität | | `AgentsOverview.tsx` | ✅ automation.ts | Echte Funktionalität | | `AgentsPlaceholder.tsx` | ❌ | Placeholder | | `Automation.tsx` | ✅ automation.ts | Echte Funktionalität | | `AutomationDashboard.tsx` | ✅ automation.ts | Echte Funktionalität | | `AutomationPlaceholder.tsx` | ❌ | Placeholder | | `Workflows.tsx` | ✅ workflows.ts | Echte Funktionalität | | `Wiki.tsx` | ✅ (wiki routes) | Echte Funktionalität | | `ImportExport.tsx` | ✅ importExport.ts | Echte Funktionalität | | `Trash.tsx` | ✅ entityHistory.ts | Echte Funktionalität | | `DedupMerge.tsx` | ✅ dedup.ts | Echte Funktionalität | | `Tags.tsx` | ✅ tags.ts | Echte Funktionalität | | `CustomFields.tsx` | ✅ customFields.ts | Echte Funktionalität | | `GlobalSearchResults.tsx` | ✅ search.ts | Echte Funktionalität | | `Settings.tsx` + 22 Sub-Pages | ✅ settings.ts, etc. | Echte Funktionalität | | `AuditLog.tsx` | ✅ audit.ts | Echte Funktionalität | | `Reports.tsx` | ✅ reports.ts | Echte Funktionalität | | `ApiDocs.tsx` | ❌ (embed only) | Echte Funktionalität | | `Help.tsx` + Sub-Pages | ❌ | Placeholder/Info | | `Logs.tsx` | ❌ | Placeholder | | `LogsPlaceholder.tsx` | ❌ | Placeholder | | `AIAssistant.tsx` | ✅ ai.ts | Echte Funktionalität | | `AIAssistantStandalone.tsx` | ✅ ai.ts | Echte Funktionalität | | `AISettings.tsx` | ✅ settings.ts | Echte Funktionalität | | `ProactiveAISettings.tsx` | ✅ aiProactive.ts | Echte Funktionalität | | `AgentDashboard.tsx` | ✅ automation.ts | Echte Funktionalität | | `PasswordResetRequest/Confirm.tsx` | ✅ auth.ts | Echte Funktionalität | | `GuestLogin.tsx` / `GuestContacts.tsx` | ✅ auth.ts | Echte Funktionalität | | `NoAccessPage.tsx` | ❌ | Info-Page | | `StartPage.tsx` | ✅ | Echte Funktionalität | | `ActivityTimeline.tsx` | ✅ | Echte Funktionalität | ### Frontend-Pages mit echter API-Anbindung: ~50 von 67 (75%) ### Frontend-Pages die Placeholder sind: ~5 (AgentsPlaceholder, AutomationPlaceholder, LogsPlaceholder, HelpPlaceholder, etc.) --- ## Test-Prüfung ### Backend-Tests (97 Dateien) | Test-Kategorie | Dateien | Echte Integration vs Mock? | |---------------|--------|---------------------------| | Auth | `test_auth.py` | Integration mit Test-DB (`leocrm_test`) | | Cross-Tenant Security | `test_cross_tenant_security.py`, `test_cross_tenant_security_v2.py`, `test_cross_tenant_standalone.py` | Integration mit Test-DB | | Contacts | `test_contacts.py`, `test_contacts_lifecycle.py` | Integration mit Test-DB | | Companies | `test_companies.py` | Integration mit Test-DB | | DMS | `test_dms.py`, `test_dms_coverage.py`, `test_dms_errors.py` | Integration mit Test-DB | | Mail | `test_mail.py` | Integration mit Test-DB, SMTP/IMAP gemockt | | Calendar | `test_calendar.py`, `test_recurrence_unit.py` | Integration mit Test-DB | | Tasks | `test_tasks.py`, `test_unified_tasks.py` | Integration mit Test-DB | | Workflows | `test_workflows.py`, `test_phase_g_workflows.py`, `test_spike_g_durable_workflow.py` | Integration mit Test-DB | | Agents | `test_agent_loop.py`, `test_agent_tools.py`, `test_phase_f_agents.py`, `test_agent_subtasks.py` | Integration mit Test-DB, LLM gemockt | | Search | `test_unified_search.py`, `test_unified_search_phase_e.py` | Integration mit Test-DB | | Wiki | `test_phase_h_wiki.py` | Integration mit Test-DB | | Permissions | `test_permissions.py`, `test_abac.py`, `test_abac_integration.py`, `test_rbac_comprehensive.py` | Integration mit Test-DB | | LLM Client | `test_llm_client.py` | Mock mode + real mode | | Storage | `test_storage.py` | Integration | | Hooks | `test_hooks.py`, `test_lifecycle_hooks.py` | Integration mit Test-DB | | Outbox | `test_outbox.py`, `test_outbox_phase5.py` | Integration mit Test-DB | | Backup/Restore | `test_backup_restore.py`, `test_backup_service.py` | Integration | | Cost Protection | `test_cost_protection.py` | Integration | | Sensitive Data | `test_sensitive_data.py` | Integration | | Error Handling | `test_error_handling.py` | Integration | | Observability | `test_observability.py` | Integration | | Graceful Shutdown | `test_graceful_shutdown.py` | Integration | | MCP | `test_mcp_client.py`, `test_mcp_server.py` | Integration | | Skill Registry | `test_skill_registry.py` | Integration | | Trigger Core | `test_trigger_core.py` | Integration | | Redis Pool | `test_redis_pool.py` | Integration | | Rate Limit | `test_rate_limit_policies.py` | Integration | | RLS | `test_rls_coverage.py` | Integration mit Test-DB | | Performance | `test_performance.py`, `test_vector_performance.py`, `test_permission_performance.py` | Integration | | Spike Tests | `test_spike_g_durable_workflow.py`, `test_spike_i_integration_flow.py` | Integration | | Plugin Lifecycle | `test_plugin_lifecycle.py`, `test_plugins.py`, `test_manifest_validation.py` | Integration | | Marketplace | `test_marketplace.py` | Integration | | Versioning | `test_versioning.py`, `test_semver.py` | Integration | | Entity Links | `test_entity_links.py` | Integration | | Tags | `test_tags.py` | Integration | | Custom Fields | `test_custom_fields.py` | Integration | | Dedup | `test_dedup.py` | Integration | | Workspaces | `test_workspaces.py` | Integration | | Saved Filters | `test_saved_filters.py` | Integration | | User Preferences | `test_user_preferences.py` | Integration | | User Service | `test_user_service.py` | Integration | | Tenant | `test_tenant.py` | Integration | | Dashboard | `test_dashboard.py` | Integration | | Health | `test_health.py` | Integration | | Monitoring | `test_monitoring.py` | Integration | | Resilience | `test_resilience.py` | Integration | | Restore Registry | `test_restore_registry.py` | Integration | | WS Helpers | `test_ws_helpers.py` | Integration | | Graph RAG | `test_graph_rag.py` | Integration | | Agent Memory | `test_agent_memory.py` | Integration | | AI Copilot | `test_ai_copilot.py` | Integration | | AI Proactive | `test_ai_proactive.py` | Integration | | External Agent API | `test_external_agent_api.py` | Integration | | API Audit | `test_api_audit.py`, `test_api_documentation.py` | Integration | | API Tokens | `test_api_tokens.py` | Integration | | Audit Connections | `test_audit_connections.py` | Integration | | Commands | `test_commands.py` | Integration | | Backend Coverage Gaps | `test_backend_coverage_gaps.py` | Integration | | No Legacy Tenant Var | `test_no_legacy_tenant_var.py` | Integration | | Notification Migration | `test_notification_migration.py` | Integration | | Notifications | `test_notifications.py` | Integration | | Report Generator | `test_report_generator.py` | Integration | | AI Deploy/Health | `test_ai_deploy.py`, `test_ai_health_check.py` | Integration | | P1 DMS Streaming | `test_p1_6_dms_streaming.py` | Integration | | P1 Permission Fixes | `test_p1_7_permission_fixes.py` | Integration | | Permission System Live | `test_permission_system_live.py` | Integration | ### Frontend-Tests (94 Dateien) - Vitest-Tests für: auth, contacts, mail, dms, calendar, settings, search, dashboard, agents, automation, workflows, comm, plugins, tags, tasks, ui, ai, notifications, etc. ### E2E-Tests (7 Dateien) - `auth.spec.ts` — Login-Flow - `contact-crud.spec.ts` — Contact CRUD - `calendar.spec.ts` — Calendar - `dms.spec.ts` — DMS - `mail.spec.ts` — Mail - `search.spec.ts` — Search - `plugin-toggle.spec.ts` — Plugin Toggle ### Test-DB - Test-DB: `leocrm_test` (PostgreSQL) - conftest.py nutzt echte Alembic-Migrationen - `.env.test` konfiguriert Test-DB --- ## Deploy-Verifikation | Check | Status | |-------|--------| | App deployed | ✅ https://crm.media-on.de (login page bestätigt) | | Health Endpoint | `/api/v1/health` Route existiert | | Frontend gebaut | `frontend/dist/` wird von main.py als SPA geserved | | Docker Compose | `docker-compose.yaml` mit postgres, redis, crm_app, crm_worker | | Alembic Migrationen | 129 Migrationen in `alembic/versions/` | | prestart.sh | Führt Alembic + DB-Roles + Plugin-Sync + Admin-Seed aus | | worker.sh | Startet ARQ Background Worker | | healthcheck.sh | HTTP /api/v1/health oder Redis-Ping | --- ## Risiken 1. **B-NOTIF-DEPREC nicht durchgeführt** — Altes Notification-System (Model, Routes, Frontend) existiert noch parallel zum Comm-System. Doppeltes System aktiv. 2. **Phase H Knowledge Extraction komplett fehlend** — 12 von 20 Tasks nicht implementiert. Wiki existiert, aber keine Knowledge-Extraktion, kein Source Adapter, keine Evidence/Citations, kein Wiki Search Provider. 3. **Phase I komplett nicht gestartet** — MiniAppBlock ist noch Placeholder, kein Workstream, kein Dashboard, kein DSGVO-Export. 4. **PWA nicht funktionsfähig** — manifest.json existiert, aber kein Service Worker. PWA nicht installierbar. 5. **External Storage (WebDAV) fehlt** — B-STOR-EXT und B-STOR-WEBDAV nicht implementiert. 6. **AIProvider Model fehlt** — B-AIPROV-COMP nur teilweise (compliance metadata in llm_client, aber kein AIProvider-Datenbankmodell). 7. **Keine Cytoscape-Visualisierung** — KnowledgeGraph.tsx verwendet eigene SVG-Rendering, nicht Cytoscape wie gefordert. --- ## Empfohlene nächste Schritte 1. **B-NOTIF-DEPEC abschließen** — Altes Notification-System entfernen, NotificationDropdown durch Comm-Komponenten ersetzen. 2. **Phase H Knowledge Extraction aufbauen** — H-SRC (Knowledge Source Adapter), H-EXT (LLM Relationship Extraction), H-ENT (Entity Extraction), H-SEARCH (Wiki Search Provider), H-EMB (Wiki Embeddings), H-CITE (Evidence/Source References). 3. **Phase I starten** — I-MINI-RENDER (MiniAppBlock Placeholder ersetzen), I-WORK-BASE (Workstream Contract), I-DASH (Platform Dashboard), I-DSGVO (Datenauskunfts-Export). 4. **PWA Service Worker reaktivieren** — sw.js erstellen, vite.config.ts PWA-Plugin konfigurieren. 5. **External Storage Plugin System** — B-STOR-EXT (StorageProvider Interface) und B-STOR-WEBDAV (WebDAV Plugin) implementieren.