# Umsetzungskonzept RBAC Access (separat, schrittweise) ## Ziel Das RBAC-Konzept aus `concept_rbac_access_pending.md` technisch umsetzen, inkl.: - Feature-Containerisierung (plug&play) - Bootstrap auf System-RBAC reduzieren - Feature-Services in Container integrieren - aicore in aichat integrieren - dynamisches Laden von Routes und Services - striktes Import-Regelwerk ohne Abhaengigkeiten zwischen Feature-Containern ## Import-Regelwerk (Zielzustand) - **Kein Import zwischen Feature-Containern.** - **Feature-Container duerfen zentrale Module importieren (`modules/interfaces`, `modules/datamodels`, `modules/services`, `modules/aicore`, `modules/shared`, `modules/connectors`, `modules/security`, `modules/auth`).** - **Umgekehrt darf zentraler Code keine Feature-Container importieren.** ## Wichtige konzeptionelle und architektonische Hinweise - Jeder Feature-Container ist vollstaendig eigenstaendig (Code, Datamodelle, Interfaces, Routes, Services), darf aber zentrale Module nutzen. - Zentrale Pfade bleiben Plattform-Schnittstellen und duerfen von Features genutzt werden; umgekehrt keine Feature-Imports aus zentralem Code. - System-RBAC und Feature-RBAC sind strikt getrennt: Bootstrap initialisiert nur System-RBAC, Feature-RBAC entsteht durch Feature-Container. - Der RBAC-Katalog fuer UI/RESOURCE liegt in `gateway/modules/security/rbacCatalog/` und ist persistent; Feature-Container muessen nur registrieren, nicht speichern. - UI/RESOURCE-Objekte werden rein im Backend definiert und persistiert, keine UI-Abhaengigkeit. - Datenobjekte werden dynamisch abgeleitet, sind aber nicht auf Features beschraenkt (System- und Feature-Tabellen sind sichtbar). - Strikte Importregel erzeugt harte Grenzen: Shared-Module muessen in den Feature-Container verschoben oder repliziert werden. - Zentraler Workflow (geplant unter `gateway/modules/workflows/automation/`) darf aus Features nicht direkt importiert werden; Zugriff nur ueber feature-interne Adapter/Entry-Points oder durch Verlagerung der benoetigten Teile in die Feature-Container. ## Schrittfolge mit Dateiaenderungen und Referenz-Checkliste ### Schritt 1: Bootstrap auf System-RBAC reduzieren **Datei:** `gateway/modules/interfaces/interfaceBootstrap.py` - Entfernen in `initBootstrap()`: - `initFeatures(db)` - `_initFeatureTemplateRoleAccessRules(db)` - Entfernen: - `_initFeatureTemplateRoles(db)` (Funktion + Call-Sites) - `_initFeatureTemplateRoleAccessRules(db)` (Funktion + Call-Sites) - **Beibehalten:** `initRoles(db)`, `initRbacRules(db)` - **Checkliste Referenzen:** - Keine Feature-Initialisierung in Bootstrap - Keine Feature-Template-Rollen - Keine Feature-Template-AccessRules ### Schritt 2: Feature-Container-Struktur anlegen **Neue Ordner:** - `gateway/modules/features/trustee/` - `gateway/modules/features/chatbot/` (existiert) - `gateway/modules/features/aichat/` (neu) - `gateway/modules/features/neutralizer/` (rename) - `gateway/modules/features/realestate/` (neu) - `gateway/modules/features/automation/` (neu) **Pflichtdateien je Feature:** - `datamodelFeatureXxx.py` - `interfaceFeatureXxx.py` - `routeFeatureXxx.py` - `mainXxx.py` (RBAC UI/RESOURCE Registry) **Struktur-Vorgaben (Soll):** - Jeder Container enthaelt alle benoetigten Submodule, inkl. Services und Helfer. - Zentrale Module duerfen genutzt werden; keine Feature-zu-Feature-Imports. - Service-Subfolder bleiben erhalten, liegen aber direkt im Container (`serviceXxx/`). **Calling-Referenzen (allgemein):** - `gateway/app.py` registriert alle Feature-Router dynamisch. - Feature-Container registrieren ihre RBAC-Objekte im Katalog (z.B. via `mainXxx.py` als Entry-Point). - Systemcode greift nicht auf Feature-Implementierung zu, sondern nur auf deren registrierte Router/Services. ### Schritt 3: Trustee verschieben **Move:** - `gateway/modules/routes/routeFeatureTrustee.py` -> `gateway/modules/features/trustee/routeFeatureTrustee.py` - `gateway/modules/interfaces/interfaceDbTrustee.py` -> `gateway/modules/features/trustee/interfaceFeatureTrustee.py` - `gateway/modules/datamodels/datamodelTrustee.py` -> `gateway/modules/features/trustee/datamodelFeatureTrustee.py` **Add:** - `gateway/modules/features/trustee/mainTrustee.py` (RBAC Katalog) **Referenzen anpassen (Checkliste):** - Alle Imports auf `routeFeatureTrustee.py` neu - Alle Imports auf `interfaceDbTrustee.py` neu - Alle Imports auf `datamodelTrustee.py` neu - `app.py` Router-Registrierung auf neuen Pfad **Calling-Referenzen (Suche):** - `rg -n "routeFeatureTrustee|interfaceDbTrustee|datamodelTrustee" gateway/` ### Schritt 4: Chatbot verschieben **Move:** - `gateway/modules/routes/routeFeatureChatbot.py` -> `gateway/modules/features/chatbot/routeFeatureChatbot.py` - `gateway/modules/interfaces/interfaceDbChatbot.py` -> `gateway/modules/features/chatbot/interfaceFeatureChatbot.py` - `gateway/modules/datamodels/datamodelChatbot.py` -> `gateway/modules/features/chatbot/datamodelFeatureChatbot.py` **Keep:** - `gateway/modules/features/chatbot/mainChatbot.py` + Helpers **Add:** - `gateway/modules/features/chatbot/mainChatbotCatalog.py` (oder in mainChatbot) **Referenzen anpassen:** - Imports fuer `interfaceDbChatbot`/`datamodelChatbot`/`routeFeatureChatbot` - `app.py` Router-Registrierung **Calling-Referenzen (Suche):** - `rg -n "routeFeatureChatbot|interfaceDbChatbot|datamodelChatbot" gateway/` ### Schritt 5: AIChat (chatworkflow) verschieben **Move:** - `gateway/modules/routes/routeFeatureChatDynamic.py` -> `gateway/modules/features/aichat/routeFeatureAiChat.py` - `gateway/modules/interfaces/interfaceDbChat.py` -> `gateway/modules/features/aichat/interfaceFeatureAiChat.py` - `gateway/modules/datamodels/datamodelChat.py` -> `gateway/modules/features/aichat/datamodelFeatureAiChat.py` **Add:** - `gateway/modules/features/aichat/mainAiChat.py` (RBAC Katalog) **Keep:** - `gateway/modules/features/workflow/mainWorkflow.py` (falls reine Workflow-Logik) **Referenzen anpassen:** - Alle Imports auf `routeFeatureChatDynamic.py` - Alle Imports auf `interfaceDbChat.py` - Alle Imports auf `datamodelChat.py` - `app.py` Router-Registrierung **Calling-Referenzen (Suche):** - `rg -n "routeFeatureChatDynamic|interfaceDbChat|datamodelChat" gateway/` ### Schritt 6: Neutralizer verschieben und Ordner umbenennen **Rename:** - `gateway/modules/features/neutralizePlayground/` -> `gateway/modules/features/neutralizer/` **Move:** - `gateway/modules/routes/routeFeatureNeutralization.py` -> `gateway/modules/features/neutralizer/routeFeatureNeutralizer.py` - `gateway/modules/datamodels/datamodelNeutralizer.py` -> `gateway/modules/features/neutralizer/datamodelFeatureNeutralizer.py` **Add:** - `gateway/modules/features/neutralizer/mainNeutralizer.py` (RBAC Katalog) **Referenzen anpassen:** - Alle Imports auf `neutralizePlayground` - Alle Imports auf `routeFeatureNeutralization.py` - `app.py` Router-Registrierung **Calling-Referenzen (Suche):** - `rg -n "neutralizePlayground|routeFeatureNeutralization|datamodelNeutralizer" gateway/` ### Schritt 7: RealEstate verschieben **Move:** - `gateway/modules/routes/routeFeatureRealEstate.py` -> `gateway/modules/features/realestate/routeFeatureRealEstate.py` - `gateway/modules/interfaces/interfaceDbRealestate.py` -> `gateway/modules/features/realestate/interfaceFeatureRealEstate.py` - `gateway/modules/datamodels/datamodelRealEstate.py` -> `gateway/modules/features/realestate/datamodelFeatureRealEstate.py` **Keep:** - `gateway/modules/features/realEstate/mainRealEstate.py` **Add:** - `gateway/modules/features/realestate/mainRealEstateCatalog.py` (oder in mainRealEstate) **Referenzen anpassen:** - Imports auf `interfaceDbRealestate`, `datamodelRealEstate`, `routeFeatureRealEstate` - `app.py` Router-Registrierung **Calling-Referenzen (Suche):** - `rg -n "routeFeatureRealEstate|interfaceDbRealestate|datamodelRealEstate" gateway/` ### Schritt 8: Automation Feature-Container **Move:** - `gateway/modules/routes/routeDataAutomation.py` -> `gateway/modules/features/automation/routeFeatureAutomation.py` **Add:** - `gateway/modules/features/automation/interfaceFeatureAutomation.py` - `gateway/modules/features/automation/datamodelFeatureAutomation.py` - enthaelt `AutomationDefinition` - `gateway/modules/features/automation/mainAutomation.py` (RBAC Katalog) **Referenzen anpassen:** - Alle Imports von `routeDataAutomation.py` - Alle `AutomationDefinition`-Imports auf neuen Pfad - `app.py` Router-Registrierung **Calling-Referenzen (Suche):** - `rg -n "routeDataAutomation|AutomationDefinition" gateway/` ### Schritt 9: Services in Feature-Container **aichat:** - Move: - `gateway/modules/aicore/` -> `gateway/modules/features/aichat/aicore/` - `gateway/modules/services/serviceAi/` -> `gateway/modules/features/aichat/serviceAi/` - `gateway/modules/services/serviceExtraction/` -> `gateway/modules/features/aichat/serviceExtraction/` - `gateway/modules/services/serviceGeneration/` -> `gateway/modules/features/aichat/serviceGeneration/` - `gateway/modules/services/serviceWeb/` -> `gateway/modules/features/aichat/serviceWeb/` **neutralizer:** - Move: - `gateway/modules/services/serviceNeutralization/` -> `gateway/modules/features/neutralizer/serviceNeutralization/` **Shared Services:** - bleiben in `gateway/modules/services` **Referenzen anpassen:** - Alle Imports der o.g. Services auf neue Pfade - AI-Services duerfen keine Imports ausserhalb des aichat-Containers haben - In Feature-Folders kein Subfolder `services`; Services liegen direkt als `serviceXxx/` **Calling-Referenzen (Suche):** - `rg -n "modules\\.services\\.service(Ai|Extraction|Generation|Web)|modules\\.aicore" gateway/` - `rg -n "serviceNeutralization" gateway/` **Code-Struktur (Soll):** - Feature-Services importieren nur Feature-Datamodelle innerhalb des Containers. - `aicore` wird komplett unter `features/aichat/` verschoben und ist nur dort nutzbar. ### Schritt 10: Plug&Play Router Loading **Datei:** `gateway/app.py` - Ersetze statische Imports aus `modules/routes` durch dynamische Feature-Discovery. - Nur existierende Feature-Folder werden registriert. **Referenzen anpassen:** - Alle Router-Registrierungen neu - Keine Route-Imports aus `modules/routes` **Konzept Router-Discovery (Soll):** - Scanne `gateway/modules/features/*/` nach `routeFeature*.py`. - Pro Datei wird ein `router`-Objekt erwartet und registriert. - Fehlende Router in einem Feature duerfen den Start nicht abbrechen (log + skip). - Feature-Status markieren: `active`, `degraded` (z.B. Router ok, Service-Load fehlschlaegt). ### Schritt 11: Plug&Play Service Loading **Zentraler Loader (shared):** - Ein Service-Registry-Modul laedt pro Feature-Container definierte Services. - Nur existierende Feature-Folder werden registriert. **Referenzen anpassen:** - Alle Service-Center-Aufrufe auf neuen Loader - Kein direkter Import aus `modules/services/serviceAi` etc. **Konzept Service-Discovery (Soll):** - Pro Feature-Container werden vorhandene `service*`-Ordner als Services erkannt. - Der Loader scannt `gateway/modules/features//service*/` und registriert diese Services zentral. - Services werden nur geladen, wenn der Feature-Container vorhanden ist. - Registrierungs-Contract analog `modules/services/__init__.py`: - In jedem `service*`-Ordner existiert `mainService*.py` mit Service-Klasse. - Loader instanziert Service und exponiert ihn via `PublicService(...)`. ### Schritt 12: featuresLifecycle anpassen **Datei:** `gateway/modules/features/featuresLifecycle.py` - Import der Workflow-Logik aus neuem zentralen Pfad (`gateway/modules/workflows/automation/`) - Keine Imports von Feature-Containern **Bemerkung:** - Kein Feature-Discovery notwendig: Modul ist zentraler Scheduler fuer Workflow/Automation. - Update der Imports: `modules.features.workflow` -> `modules.workflows.automation` (nach Auslagerung). - Workflow-API ist zentral und stabil: Features duerfen nur explizite Entry-Points nutzen (z.B. `syncAutomationEvents`), keine direkten Imports in interne Workflow-Module. ### Schritt 13: Globale Referenzen bereinigen **Checkliste:** - Keine Imports von `modules/routes/routeFeature*.py` mehr - `interfaceDb*.py` und `datamodel*.py` bleiben fuer System-Module bestehen - `modules/services/service*` bleiben fuer System-Services bestehen - `modules/aicore` wird verschoben (Feature `aichat`), keine zentralen Imports mehr **Calling-Referenzen (Suche):** - `rg -n "modules\\.routes\\.routeFeature" gateway/` ### Schritt 14: Tests - Gateway starten, Router-Registrierung pruefen - Feature-Folder umbenennen mit z.b. prefix: Route/Service nicht mehr vorhanden - RBAC Katalog liefert Feature-Objekte - Bootstrap erzeugt nur System-RBAC - RBAC Regeln bleiben erhalten, wenn Feature-Ordner entfernt/umbenannt ist (Persistenztest). - Service-Discovery registriert Services korrekt und markiert `degraded` bei Teilfehlern. ## Referenz-Checkliste (gesamt) - `gateway/app.py` Router - `gateway/modules/features/featuresLifecycle.py` - alle `routeFeature*.py` - alle `interfaceDb*.py` - alle `datamodel*.py` - alle `main*.py` in Feature-Containern - Service-Center/Service-Loader - Tests/Fixtures - RBAC-Katalog Modul in `gateway/modules/security/rbacCatalog/` - `gateway/modules/interfaces/interfaceBootstrap.py` ## Import-Analyse (Istzustand, zu verschiebende Module) ### Routes (aktueller Stand) - `routeFeatureRealEstate.py`: - imports: `modules.auth`, `modules.datamodels.*`, `modules.interfaces.interfaceDbRealestate`, `modules.features.realEstate.mainRealEstate`, `modules.connectors`, `modules.shared` - `routeFeatureTrustee.py`: - imports: `modules.auth`, `modules.interfaces.interfaceDbTrustee`, `modules.interfaces.interfaceDbApp`, `modules.interfaces.interfaceFeatures`, `modules.datamodels.*` - `routeFeatureChatDynamic.py`: - imports: `modules.auth`, `modules.interfaces.interfaceDbChat`, `modules.datamodels.datamodelChat`, `modules.features.workflow` - `routeFeatureChatbot.py`: - imports: `modules.auth`, `modules.interfaces.interfaceDbChat`, `modules.interfaces.interfaceRbac`, `modules.datamodels.*`, `modules.features.chatbot`, `modules.features.workflow`, `modules.shared` - `routeFeatureNeutralization.py`: - imports: `modules.auth`, `modules.datamodels.datamodelNeutralizer`, `modules.features.neutralizePlayground` - `routeDataAutomation.py`: - imports: `modules.interfaces.interfaceDbChat`, `modules.auth`, `modules.datamodels.datamodelChat`, `modules.features.workflow`, `modules.shared` ### Interfaces (aktueller Stand) - `interfaceDbTrustee.py`: - imports: `modules.connectors`, `modules.shared`, `modules.interfaces.interfaceRbac`, `modules.security`, `modules.datamodels.*` - `interfaceDbRealestate.py`: - imports: `modules.datamodels.*`, `modules.connectors`, `modules.shared`, `modules.security`, `modules.interfaces.interfaceRbac` - `interfaceDbChat.py` / `interfaceDbChatbot.py`: - imports: `modules.security`, `modules.datamodels.*`, `modules.connectors`, `modules.shared`, `modules.interfaces.interfaceRbac`, `modules.interfaces.interfaceDbManagement` ### Feature-Logik (aktueller Stand) - `modules/features/chatbot/mainChatbot.py`: - imports: `modules.datamodels.*`, `modules.shared`, `modules.services`, `modules.workflows`, `modules.connectors` - `modules/features/workflow/mainWorkflow.py`: - imports: `modules.datamodels.*`, `modules.shared`, `modules.services`, `modules.workflows` - `modules/features/realEstate/mainRealEstate.py`: - imports: `modules.datamodels.*`, `modules.services`, `modules.interfaces.interfaceDbRealestate`, `modules.connectors`, externe libs - `modules/features/neutralizePlayground/mainNeutralizePlayground.py`: - imports: `modules.datamodels.*`, `modules.services` ### Services / aicore (aktueller Stand) - `modules/services/serviceAi/mainServiceAi.py`: - imports: `modules.datamodels.*`, `modules.services.serviceExtraction`, `modules.interfaces.interfaceAiObjects`, `modules.shared` - `modules/services/serviceNeutralization/mainServiceNeutralization.py`: - imports: `modules.datamodels.datamodelNeutralizer`, eigene subProcess-* Module - `modules/aicore/*`: - imports: `modules.datamodels.*`, `modules.security`, `modules.connectors` ### Services Submodule-Analyse (Detail) **serviceAi/** - `mainServiceAi.py` - imports: `modules.datamodels.datamodelChat`, `modules.datamodels.datamodelAi`, `modules.datamodels.datamodelExtraction`, `modules.datamodels.datamodelWorkflow`, `modules.datamodels.datamodelDocument`, `modules.interfaces.interfaceAiObjects`, `modules.services.serviceExtraction`, `modules.shared` - `subStructureGeneration.py` - imports: `modules.datamodels.datamodelExtraction`, `modules.datamodels.datamodelAi`, `modules.workflows.processing.shared.stateTools` - `subStructureFilling.py` - imports: `modules.datamodels.datamodelExtraction`, `modules.datamodels.datamodelAi`, `modules.workflows.processing.shared.stateTools` - `subResponseParsing.py` - imports: `modules.shared.jsonUtils`, `modules.services.serviceAi.subJsonResponseHandling`, `modules.datamodels.datamodelAi` - `subJsonResponseHandling.py` - imports: `modules.shared.jsonUtils`, `modules.datamodels.datamodelAi` - `subJsonMerger.py` - imports: `modules.shared.jsonUtils` - `subDocumentIntents.py` - imports: `modules.datamodels.datamodelChat`, `modules.datamodels.datamodelExtraction`, `modules.workflows.processing.shared.stateTools` - `subContentExtraction.py` - imports: `modules.datamodels.datamodelChat`, `modules.datamodels.datamodelExtraction`, `modules.workflows.processing.shared.stateTools` - `subAiCallLooping.py` - imports: `modules.datamodels.datamodelAi`, `modules.datamodels.datamodelExtraction`, `modules.services.serviceAi.subJsonResponseHandling`, `modules.services.serviceAi.subLoopingUseCases`, `modules.workflows.processing.shared.stateTools`, `modules.shared.jsonContinuation`, `modules.shared.jsonUtils` - `subLoopingUseCases.py`, `subJsonResponseHandling.py`, `subJsonMerger.py` (shared utils) - imports: `modules.shared.*` (je nach Datei) **serviceExtraction/** - `mainServiceExtraction.py` - imports: `modules.datamodels.datamodelExtraction`, `modules.datamodels.datamodelChat`, `modules.datamodels.datamodelAi`, `modules.aicore.aicoreModelRegistry`, `modules.aicore.aicoreModelSelector`, `modules.shared.jsonUtils` - `merging/*` (mergerText/mergerTable/mergerDefault) - imports: `modules.datamodels.datamodelExtraction` - `extractors/*` (Xml/Xlsx/Text/Sql/Pptx/Html/Image/Json/Pdf/Csv/Docx/Binary) - imports: `modules.datamodels.datamodelExtraction` (teilweise ContentExtracted) - `chunking/*` (chunkerText/ChunkerTable/ChunkerStructure/ChunkerImage) - imports: `modules.datamodels.datamodelExtraction` - `subRegistry.py` - imports: `modules.datamodels.datamodelExtraction` - `subPromptBuilderExtraction.py` - imports: `modules.datamodels.datamodelAi` - `subPipeline.py` - imports: `modules.datamodels.datamodelExtraction` - `subMerger.py` - imports: `modules.datamodels.datamodelExtraction` **serviceGeneration/** - `mainServiceGeneration.py` - imports: `modules.datamodels.datamodelDocument`, `modules.datamodels.datamodelChat`, `modules.services.serviceGeneration.subDocumentUtility` - `renderers/*` - imports: `modules.datamodels.datamodelDocument` (alle Renderer) - `documentRendererBaseTemplate.py` imports zusaetzlich: `modules.datamodels.datamodelJson`, `modules.datamodels.datamodelAi` - `paths/*` - `imagePath.py`: `modules.datamodels.datamodelWorkflow`, `modules.datamodels.datamodelAi` - `documentPath.py`: `modules.datamodels.datamodelWorkflow`, `modules.datamodels.datamodelExtraction`, `modules.datamodels.datamodelAi`, `modules.datamodels.datamodelDocument`, `modules.workflows.processing.shared.stateTools` - `codePath.py`: `modules.datamodels.datamodelWorkflow`, `modules.datamodels.datamodelExtraction`, `modules.datamodels.datamodelAi`, `modules.shared.jsonUtils` - `subStructureGenerator.py` / `subPromptBuilderGeneration.py` - imports: `modules.datamodels.datamodelJson` - `subContentGenerator.py` - imports: `modules.services.serviceGeneration.subContentIntegrator`, `modules.workflows.processing.shared.stateTools` **serviceWeb/** - `mainServiceWeb.py` - imports: `modules.datamodels.datamodelAi` (AiCallOptions, OperationTypeEnum, AiCallPrompt*) **serviceNeutralization/** - `mainServiceNeutralization.py` - imports: `modules.datamodels.datamodelNeutralizer`, `modules.services.serviceNeutralization.subProcess*` - `subProcessText.py` - imports: `modules.services.serviceNeutralization.subParseString` - `subProcessList.py` - imports: `modules.services.serviceNeutralization.subParseString`, `modules.services.serviceNeutralization.subPatterns` - `subParseString.py` - imports: `modules.services.serviceNeutralization.subPatterns` ## Compliance-Check gegen Import-Regelwerk (Zielzustand) **Zielkriterium:** - Keine Imports zwischen Feature-Containern. - Feature-Container duerfen zentrale Module importieren. - Zentrale Module duerfen keine Feature-Container importieren. **Erwarteter Zustand nach Migration:** - Alle `interfaceFeatureXxx.py`, `routeFeatureXxx.py`, `datamodelFeatureXxx.py`, `mainXxx.py` liegen im jeweiligen Feature-Container. - Interne Feature-Imports (z.B. `chatbot` -> `chatbot.eventManager`) sind erlaubt. - Keine Feature-zu-Feature-Imports mehr (z.B. `chatbot` -> `workflow` entfaellt durch Auslagerung). **Hinweis zur Validierung:** - Compliance-Check erfolgt nach Abschluss der Verschiebungen und Import-Anpassungen. - Der Istzustand dient nur als Analysegrundlage und ist nicht compliance-faehig. ## Import-Check (Zielzustand, Soll) **Erlaubte Imports innerhalb eines Feature-Containers:** - Relative Imports innerhalb des Containers (z.B. `.eventManager`, `.subModule`). - Absolute Imports innerhalb des eigenen Containers (z.B. `modules.features.chatbot.*` im Container `chatbot`). - Standardbibliothek und externe Libraries. **Nicht erlaubt (muss im Zielzustand eliminiert werden):** - Imports aus anderen Feature-Containern (`modules.features..*`). - Zentrale Module importieren Feature-Container (`modules.features.*`). **Soll-Checkliste je Feature-Container:** - Keine `modules.features..*` Imports. - Keine Feature-zu-Feature-Abhaengigkeiten. **Pruefroutine (rg-Patterns, Zielzustand):** - Finde direkte Cross-Feature-Imports: - `rg -n "modules\\.features\\.(?!\\.)" gateway/modules/features//` - Finde verbotene Feature-Imports aus zentralem Code: - `rg -n "modules\\.features\\." gateway/modules/(routes|interfaces|datamodels|services|aicore|shared|connectors|security|auth)/` ## Istzustand (nur Analyse, vor Migration) **Konflikte (heute):** - Alle Routen, Interfaces, Feature-Logiken und Services importieren Module ausserhalb eines Feature-Containers. - Es bestehen Imports zwischen Features (z.B. `routeFeatureChatbot` -> `modules.features.workflow`, im Zielzustand entfaellt da `workflow` kein Feature mehr ist). **Liste der Imports zwischen Features (Istzustand, Analyse):** - `gateway/modules/interfaces/interfaceDbChatbot.py` -> `modules.features.chatbot.eventManager` ## Offene Punkte fuer Umsetzung - Dynamische Feature-Discovery in `app.py` und Service-Loader designen - Schrittweise Migration je Feature mit Tests