diff --git a/b-reference/platform/workflowAutomation.md b/b-reference/platform/workflowAutomation.md index 6d460a5..02b167c 100644 --- a/b-reference/platform/workflowAutomation.md +++ b/b-reference/platform/workflowAutomation.md @@ -1,5 +1,5 @@ - + # WorkflowAutomation (System-Komponente) @@ -13,20 +13,26 @@ - **System-Lifespan Boot:** Scheduler- und Email-Poller-Start in `app.py` (nicht mehr Feature-`onStart`). - **Mandatsweite API:** `/api/workflow-automation/{workflows,versions,runs,tasks,steps}` — kein `{instanceId}` als RBAC-Anker. -- **RBAC-Modell:** Mandats-Mitgliedschaft (read), Mandats-Admin (write/execute/delete), `isPlatformAdmin`-Bypass. Keine Feature-Instanz-Rollen; `instantiable=False`. +- **RBAC-Modell:** Mandats-Mitgliedschaft (read), Mandats-Admin (write/execute/delete), `isPlatformAdmin`-Bypass. Keine Feature-Instanz-Rollen; `instantiable=False`. `TABLE_NAMESPACE` = `system.workflowAutomation`. - **DB-Scoping:** `AutoWorkflow.mandateId` + `runAsPrincipal` (Owner). `targetFeatureInstanceId` + per-Node `FeatureInstanceRef` bleiben als Daten-Scope. +- **RBAC-Boot-Migration:** `_migrateRbacNamespace()` in `onBootstrap()` migriert bei jedem Start idempotent AccessRule-Einträge von `feature.graphicalEditor` auf `system.workflowAutomation`. ## Code-Pfade | Schicht | Pfad | |---------|------| +| Komponente (Entry) | `platform-core/modules/workflowAutomation/mainWorkflowAutomation.py` | +| Editor | `platform-core/modules/workflowAutomation/editor/` | +| Engine | `platform-core/modules/workflowAutomation/engine/` | +| Scheduler | `platform-core/modules/workflowAutomation/scheduler/` | | Routen (mandatsweit) | `platform-core/modules/routes/routeWorkflowAutomation.py` | +| Interface (DB-Ops) | `platform-core/modules/interfaces/interfaceWorkflowAutomation.py` | +| Shared Helpers | `platform-core/modules/shared/workflowAutomationHelpers.py` | | Models (kanonisch, L1) | `platform-core/modules/datamodels/datamodelWorkflowAutomation.py` | | Navigation-Sektion | `platform-core/modules/datamodels/datamodelNavigation.py` (Block `workflowAutomation`) | -| Feature-Mantel (deprecated) | `platform-core/modules/features/graphicalEditor/` | -| Graph-Engine | `platform-core/modules/workflows/automation2/` | -| Scheduler | `platform-core/modules/workflows/scheduler/` | -| Frontend | `ui-nyla/src/pages/WorkflowAutomationPage.tsx` | +| Frontend Hub | `ui-nyla/src/pages/workflowAutomation/WorkflowAutomationHubPage.tsx` | +| Frontend Tabs | `ui-nyla/src/pages/workflowAutomation/tabs/{WorkflowsTab,RunsTab,RunDetailTab,EditorTab,TemplatesTab}.tsx` | +| Frontend API Client | `ui-nyla/src/api/workflowAutomationApi.ts` | ## API @@ -36,14 +42,24 @@ |---------|------|--------------| | GET | `/workflows` | Workflows mandatsweit (RBAC-gefiltert) | | GET | `/workflows/{id}` | Einzelner Workflow | +| POST | `/workflows/{id}/execute` | Workflow ausführen | +| DELETE | `/workflows/{id}` | Workflow + Cascade löschen | | GET | `/versions/{workflowId}` | Versionen eines Workflows | +| POST | `/versions/{id}/publish` | Version publizieren | | GET | `/runs` | Läufe mandatsweit | | GET | `/runs/{id}` | Einzelner Run | +| GET | `/runs/{id}/detail` | Run-Detail mit Steps | +| GET | `/runs/{id}/stream` | SSE Run-Stream | +| POST | `/runs/{id}/stop` | Run stoppen | +| DELETE | `/runs/{id}` | Run + Steps löschen | | GET | `/tasks` | Human-Tasks mandatsweit | | POST | `/tasks/{id}/complete` | Task abschliessen | +| POST | `/tasks/{id}/cancel` | Task abbrechen | | GET | `/steps/{runId}` | Step-Logs eines Runs | -| DELETE | `/workflows/{id}` | Workflow + Cascade löschen | -| DELETE | `/runs/{id}` | Run + Steps löschen | +| GET | `/metrics` | Workflow-Metriken | +| GET | `/node-types` | Node-Typ-Katalog | +| GET | `/templates` | Workflow-Vorlagen | +| GET | `/connections` | Verfügbare Connections | ## Navigation @@ -54,10 +70,6 @@ Statischer Block `workflowAutomation` (order 25) mit UI-Objekten: - `page.system.workflowAutomation.runs` - `page.system.workflowAutomation.tasks` -## Migration - -Feature-Routen `/api/workflows/{instanceId}/…` bleiben aktiv (Koexistenz). Die GE-Feature-Registrierung (Store, `TEMPLATE_ROLES`, `UI_OBJECTS`) ist DEPRECATED, wird aber für bestehende Instanzen noch ausgeliefert. Vollständige Entfernung des Feature-Mantels erfolgt nach Abschluss der Datenmigration. - ## Siehe auch - Plan-Dokument: `c-work/2-build/2026-06-automation-system-component.md` diff --git a/c-work/2-build/2026-06-automation-system-component.md b/c-work/4-done/2026-06-automation-system-component.md similarity index 78% rename from c-work/2-build/2026-06-automation-system-component.md rename to c-work/4-done/2026-06-automation-system-component.md index 8fbeff5..c68142a 100644 --- a/c-work/2-build/2026-06-automation-system-component.md +++ b/c-work/4-done/2026-06-automation-system-component.md @@ -1,9 +1,12 @@ - + + # WorkflowAutomation als System-Komponente — `graphicalEditor` raus aus dem Feature-Modell +> **Migration Status: COMPLETE (2026-06-08).** Alle `graphicalEditor`-Code-Referenzen eliminiert. Code aus `features/graphicalEditor/`, `workflows/automation2/`, `workflows/scheduler/` verschoben nach `modules/workflowAutomation/{editor,engine,scheduler}/`. Originale gelöscht, `__init__.py`-Shims als Safety-Net. Test-Imports, DEPRECATED-Kommentare, Store/RBAC-Namespace, Demo-Configs, Frontend-Kommentare/Logs bereinigt. `graphicalEditorRunFileLogger.py` → `runFileLogger.py`. `datamodelFeatureGraphicalEditor.py` gelöscht. Frontend-Monolith gesplittet (D1-D3). RBAC-Migration als idempotente Boot-Routine. Verbleibend: AC5 per-Node Billing + AC7 Run-as-Principal (Scope CustomerCases), automatisierte Tests T1-T5 (pending), Smoke-Test Scheduler (manuell bei Deploy). + > **Treiber:** Entscheid aus `c-work/0-ideas/2026-06-CustomerCases-step1-architecture.md` / `…-step3-features-plan.md` **A0.4**. Dort wurde die Entkopplung als Roadmap markiert; sie wird **vorgezogen**, weil sie sonst die Solution-Schicht (Ownership/RBAC/Billing) später erneut einholt. > > **Namens-Konvention:** Die System-Komponente heisst **`WorkflowAutomation`** (Code-Token `WorkflowAutomation`/`workflowAutomation`) — semantisch eindeutig und gut greppbar. Das generische Wort «Automation» ist im Bestand schon mehrfach belegt (`AutomationsDashboardPage`, `routeAutomationWorkspace`, `/automations`, `workflows/automation2`) und bleibt dort **unverändert**. UI-Label (kundensichtbar): **«Workflow-Automation»** / «Automatisierung». @@ -215,6 +218,57 @@ api/workflowAutomationApi.ts # /api/workflow-automation/... (ersetzt workfl ## Umsetzungs-Checkliste +**Phase A — Code-Migration (Copy to new locations + re-export shims):** +- [x] A2: `modules/workflows/automation2/*.py` → `modules/workflowAutomation/engine/` (executionEngine, graphUtils, runEnvelope, scheduleCron, graphicalEditorRunFileLogger, pickNotPushMigration, featureInstanceRefMigration, workflowArtifactVisibility, clickupTaskUpdateMerge, udmUpstreamShapes) *(2026-06-07)* +- [x] A2: `modules/workflows/automation2/executors/*.py` → `modules/workflowAutomation/engine/executors/` (actionNodeExecutor, inputExecutor, flowExecutor, triggerExecutor, ioExecutor, dataExecutor) *(2026-06-07)* +- [x] A3: `modules/workflows/scheduler/mainScheduler.py` → `modules/workflowAutomation/scheduler/mainScheduler.py` *(2026-06-07)* +- [x] A5: `modules/features/graphicalEditor/{portTypes,adapterValidator,nodeRegistry,nodeAdapter,switchOutput,entryPoints,conditionOperators,upstreamPathsService,_workflowFileSchema}.py` → `modules/workflowAutomation/editor/` *(2026-06-07)* +- [x] A5: `modules/features/graphicalEditor/nodeDefinitions/*.py` → `modules/workflowAutomation/editor/nodeDefinitions/` *(2026-06-07)* +- [x] A5: `modules/features/graphicalEditor/emailPoller.py` → `modules/workflowAutomation/scheduler/emailPoller.py` *(2026-06-07)* +- [x] Re-export shims created at old `__init__.py` locations for backward compatibility + +**Phase F — Delete old originals (cleanup):** +- [x] F1: Deleted all individual .py files from `modules/features/graphicalEditor/` (shims: interfaceFeatureGraphicalEditor.py, mainGraphicalEditor.py; originals: portTypes, adapterValidator, nodeRegistry, nodeAdapter, switchOutput, entryPoints, conditionOperators, upstreamPathsService, _workflowFileSchema, emailPoller + all nodeDefinitions/*.py) *(2026-06-07)* +- [x] F2: Deleted all individual .py files from `modules/workflows/automation2/` and `executors/` (executionEngine, graphUtils, runEnvelope, scheduleCron, graphicalEditorRunFileLogger, pickNotPushMigration, featureInstanceRefMigration, workflowArtifactVisibility, clickupTaskUpdateMerge, udmUpstreamShapes + 6 executor files) *(2026-06-07)* +- [x] F3: Deleted `modules/workflows/scheduler/mainScheduler.py` *(2026-06-07)* +- [x] F4: `nodeDefinitions/__init__.py` converted to re-export shim (imports STATIC_NODE_TYPES from new location) +- [x] F4: `routeWorkflowAutomation.py` imports updated to `modules.workflowAutomation.editor._workflowFileSchema` +- [x] `automation2/__init__.py`, `automation2/executors/__init__.py`, `scheduler/__init__.py` retained as re-export shims → backward compat for remaining importers +- [x] `datamodelFeatureGraphicalEditor.py` gelöscht (keine Caller mehr) *(2026-06-08)* +- [x] Test file imports (`tests/unit/`, `tests/integration/`, `tests/demo/`) updated to canonical `modules.workflowAutomation.*` paths *(2026-06-08)* + +**Phase D — Frontend Struktur (D1-D3):** +- [x] D1: `WorkflowAutomationPage.tsx` monolith (1566 lines) split into `pages/workflowAutomation/` with Hub + 5 tab components + types.ts *(2026-06-08)* +- [x] D2: Editor views re-exported from `pages/workflowAutomation/views/` *(2026-06-08)* +- [x] D3: FlowEditor components re-export shim at `components/workflowAutomation/FlowEditor/` *(2026-06-08)* + +**Phase A10 — RBAC Namespace Migration (Boot-integriert):** +- [x] `_migrateRbacNamespace()` as idempotent routine in `onBootstrap()` — migrates AccessRule objectKeys from `feature.graphicalEditor` to `system.workflowAutomation` on every boot *(2026-06-08)* +- [x] `TABLE_NAMESPACE` in `interfaceRbac.py` updated from `feature.graphicalEditor` to `system.workflowAutomation` *(2026-06-08)* +- [x] Standalone script `scripts/script_db_migrate_rbac_workflow_automation.py` retained as manual fallback *(2026-06-07)* + +**Cleanup — Stale DEPRECATED-Bereinigung:** +- [x] Stale DEPRECATED-Kommentare entfernt: `i18nBootSync.py` (2x), `workflowTools.py` (5x) — Imports zeigen bereits auf `modules.workflowAutomation.*` *(2026-06-08)* +- [x] `resource.store.graphicalEditor` → `resource.store.workflowAutomation` in `interfaceBootstrap.py` + `mainSystem.py` *(2026-06-08)* +- [x] `toolboxRegistry.py`: `featureCode="graphicalEditor"` → `"workflowAutomation"` *(2026-06-08)* +- [x] `datamodelFeatureGraphicalEditor.py` gelöscht (toter Re-Export-Shim, keine Caller) *(2026-06-08)* +- [x] `nodeDefinitions/__init__.py`: DEPRECATED-Label durch neutrales Shim-Label ersetzt *(2026-06-08)* +- [x] `routeWorkflowAutomation.py`: fehlender `DatabaseConnector`-Import ergänzt (Boot-Fix) *(2026-06-08)* +- [x] `routeWorkflowAutomation.py`: staler Import `modules.workflows.automation2.runEnvelope` → `modules.workflowAutomation.engine.runEnvelope` *(2026-06-08)* +- [x] `graphicalEditorRunFileLogger.py` → `runFileLogger.py` umbenannt + alle 4 Import-Stellen aktualisiert *(2026-06-08)* +- [x] `graphicalEditorDatabase` Alias in `interfaceWorkflowAutomation.py` entfernt (kein Caller) *(2026-06-08)* +- [x] Alle verbliebenen `graphicalEditor`-Kommentare/Docstrings in 7 Backend-Dateien neutralisiert *(2026-06-08)* +- [x] Demo-Configs: `graphicalEditor` aus Feature-Listen entfernt (`pwgDemo2026.py`, `investorDemo2026.py`) *(2026-06-08)* +- [x] Frontend: `console.error('[graphicalEditor]` → `'[workflowAutomation]` (6 Stellen), Kommentare aktualisiert *(2026-06-08)* +- [x] `_FEATURES_WITH_EDITOR`: `'graphicalEditor'` entfernt (WA ist kein Feature; nur `'workspace'` verbleibt) *(2026-06-08)* +- [x] Test-Dateien: `graphicalEditor` aus Parametrize-Listen und Assertions entfernt *(2026-06-08)* +- [x] UDB-Surface `'graphEditor'` → `'workflowAutomation'` (UnifiedDataBar.tsx, FilesTab.tsx, Automation2FlowEditor.tsx) *(2026-06-08)* +- [x] `Automation2FlowEditor.tsx`: 12 stale `instanceId`-Parameter aus API-Calls entfernt (API war bereits migriert) *(2026-06-08)* +- [x] `FilesTab.tsx`: `importWorkflowFromFile` Signatur korrigiert (stale `instanceId` entfernt) *(2026-06-08)* +- [x] Log-Prefixe `[automations]` → `[workflowAutomation]` in RunsTab.tsx + WorkflowsTab.tsx *(2026-06-08)* +- [x] Dead code entfernt: `WorkflowTasksPage.tsx` (942 LOC), `WorkflowTasks.module.css` *(2026-06-08)* +- [x] UDB generifiziert: `UdbSurface` → `string` (kein hardcoded Feature-Enum mehr); Workflow-Import-Logik aus `FilesTab.tsx` entfernt → Consumer (`Automation2FlowEditor`) uebernimmt via `onFileSelect`; `onWorkflowImportedFromFile` Prop entfernt *(2026-06-08)* + **Phase 0 — Scheduler-Boot entkoppeln (risikoarm, zuerst):** - [x] Scheduler-Start in System-Lifespan (`app.py`, **nach** `setSchedulerMainLoop`/`eventManager.start()`); Poller bleibt **on-demand** (`ensureRunning`), `onStop`-Stop verlagert (Scheduler + Email-Poller in `app.py` Shutdown Schritt 3.5); GE-`onStart`/`onStop` **entfernt** *(2026-06-07)* - [x] Routen-Registrierung via `loadFeatureMainModules()` weiterhin aktiv (Feature-Mantel noch da) @@ -226,7 +280,7 @@ api/workflowAutomationApi.ts # /api/workflow-automation/... (ersetzt workfl - [x] `PauseForHumanTaskError` + `PauseForEmailWaitError` → `datamodels/serviceExceptions.py` (kanonisch); Re-Export-Shim in `automation2/executors/inputExecutor.py`; Caller `methods/methodContext/actions/setContext.py` umgebogen *(2026-06-07)* - [x] `coerceDocumentDataToBytes` + `_looksLikeAsciiBase64Payload` → `shared/documentUtils.py` (kanonisch); Re-Export-Shim in `automation2/executors/actionNodeExecutor.py`; Caller `methods/methodFile/actions/create.py` umgebogen *(2026-06-07)* - [x] Guard-Test: `modules.workflows.{methods.methodContext.actions.setContext, methods.methodFile.actions.create}` importierbar **ohne** `modules.workflows.automation2.*` → bestätigt, kein `automation2`-Modul transitiv geladen *(2026-06-07)* -- [ ] Node-Katalog (`STATIC_NODE_TYPES`, `features/graphicalEditor/nodeDefinitions/`): bleibt beim Editor, zieht mit ihm um; cross-Caller `system/i18nBootSync.py` + `serviceAgent/workflowTools.py` beachten +- [x] Node-Katalog (`STATIC_NODE_TYPES`, `features/graphicalEditor/nodeDefinitions/`): moved to `workflowAutomation/editor/nodeDefinitions/`; old `__init__.py` converted to re-export shim; cross-Caller `system/i18nBootSync.py` + `serviceAgent/workflowTools.py` work via shim *(2026-06-07)* **Phase 1 — Mandatsweite API + System-RBAC (parallel zur Bestands-API):** - [x] `AutoWorkflow.runAsPrincipal` in `datamodels/datamodelWorkflowAutomation.py` ergänzt (Optional[str], nullable, softFk → UserInDB) @@ -240,7 +294,14 @@ api/workflowAutomationApi.ts # /api/workflow-automation/... (ersetzt workfl - [x] `/workflow-automation`-Route + `WorkflowAutomationPage.tsx` Hub-Seite mit Tabs (Workflows · Läufe · Tasks), `?tab=`-Deeplinks; Import in `App.tsx` - [x] Icons in `pageRegistry.tsx` für `page.system.workflowAutomation.*` registriert (FaSitemap, FaProjectDiagram, FaCopy, FaPlay, FaTasks) - [x] `MandateNavigation.tsx`: `extraStaticBlocks`-Logik — unbekannte statische Blöcke werden als eigene Nav-Sektionen gerendert (nicht mehr in System-Block gemergt) -- Mandanten-Scope-Selector / Editor-Entkopplung / Keep-Alive: spätere Iteration (Editor braucht instanceId bis Feature-Mantel vollständig entfernt) +- [x] Kontext-Selector (Alle Mandanten / Mandant X) im Hub — BillingDataView-Pattern; `selectedMandateId` an alle Tabs *(2026-06-08)* +- [x] Editor-Entkopplung: `mandateId` ist primaerer Kontext; `instanceId` nur noch Access-Gate fuer Workspace-Datasource-APIs *(2026-06-08)* +- [x] WorkflowsTab/RunsTab: Server-seitige Mandantenfilterung via `mandateId`-Query-Param *(2026-06-08)* +- [x] TasksTab im Hub verdrahtet (neue API `/api/workflow-automation/tasks`) *(2026-06-08)* +- [x] WorkflowsTab Edit-Navigation korrigiert: `/workflow-automation?tab=editor&workflowId=...` (statt mandate-scoped Feature-Route) *(2026-06-08)* +- [x] `_FEATURES_WITH_EDITOR`: `'workflowAutomation'` entfernt (ist kein Feature) *(2026-06-08)* +- [x] Dead code entfernt: `WorkflowTasksPage.tsx` (942 LOC, instance-scoped legacy), `WorkflowTasks.module.css` *(2026-06-08)* +- Keep-Alive fuer Editor-Tab: separate Iteration (aktuell wird der gesamte Hub kept-alive) **Phase 3 — DB & Datenmigration:** - [x] `AutoWorkflow.featureInstanceId` → `Optional[str]` (default=None, softFk=True); Pydantic-only, **kein DDL** — Spalte bereits DB-nullable @@ -281,7 +342,7 @@ api/workflowAutomationApi.ts # /api/workflow-automation/... (ersetzt workfl ## Offene Fragen 1. **RBAC-Granularität (grösstenteils entschieden):** Modell = Mandats-Mitgliedschaft + Mandats-Admin + `isPlatformAdmin`; GE-Feature-Rollen (`graphicalEditor-*`) entfallen. Offen nur: brauchen Power-User ohne Admin eine eigene System-Rolle `workflowAutomation-user`, oder genügt Mandats-`user`? (Feature-Instanz-Rollen sind keine Option mehr — `instantiable=False` + `rbac-role-separation.mdc`.) -2. **API-Pfad:** `/api/workflow-automation/…` neu vs. bestehendes `/api/system/workflow-runs` ausbauen — konsolidieren? +2. **API-Pfad:** ~~`/api/workflow-automation/…` neu vs. bestehendes `/api/system/workflow-runs` ausbauen — konsolidieren?~~ **Entschieden (2026-06-08):** `/api/workflow-automation/…` ist der kanonische Pfad. `routeWorkflowAutomation.py` registriert alle Endpunkte dort. `/api/system/workflow-runs` bleibt als Legacy-Alias (Dashboard). 3. **Run-as-Principal-Verwaltung:** Ersteller-Identität vs. dedizierter Service-Principal (siehe CustomerCases offene Frage #1). 4. **Alt-URLs:** wie lange Redirects der `{instanceId}`-Pfade halten (Bookmarks/Deeplinks)? 5. **Datei-/Doku-Rename:** dieses Plan-Dokument ggf. auf `…-workflowautomation-system-component.md` umbenennen (aktuell `…-automation-system-component.md`) — Konsistenz vs. Referenz-Churn. @@ -290,22 +351,22 @@ api/workflowAutomationApi.ts # /api/workflow-automation/... (ersetzt workfl - Architektur/Entscheid: `c-work/0-ideas/2026-06-CustomerCases-step1-architecture.md` (A0.4), `…-step3-features-plan.md` (A0) - Prior Art: `c-work/4-done/2026-04-automation-unification.md`, `2026-04-automation-central-admin.md`, `2026-04-generic-graph-editor.md` -- Code (Backend): `modules/features/graphicalEditor/`, `modules/workflows/{automation2,scheduler}/`, `modules/datamodels/{datamodelPortTypes,datamodelWorkflowAutomation,datamodelNavigation}.py`, `modules/routes/{routeWorkflowDashboard,routeAutomationWorkspace,routeSystem}.py`, `app.py` +- Code (Backend): `modules/workflowAutomation/{editor,engine,scheduler}/`, `modules/datamodels/{datamodelPortTypes,datamodelWorkflowAutomation,datamodelNavigation}.py`, `modules/routes/{routeWorkflowAutomation,routeWorkflowDashboard,routeAutomationWorkspace,routeSystem}.py`, `app.py` - Import-/Layer-Stand (Refactoring 2026-06-05/06, inkl. Deferred-Liste für diese Komponente): `local/notes/refernce-analysis/platform-core-import-analyse.md` - Code (Frontend): `ui-nyla/src/pages/AutomationsDashboardPage.tsx`, `components/Navigation/MandateNavigation.tsx`, `pages/FeatureView.tsx`, `App.tsx` - RBAC: `b-reference/platform/rbac.md`, `.cursor/rules/rbac-role-separation.mdc`, `.cursor/rules/feature-instance-scoping.mdc` ## Abschluss -- [ ] `b-reference/`: neue Kanon-Seite «WorkflowAutomation (System-Komponente)»; `graphicalEditor`-Feature-Seite umschreiben -- [ ] `.cursor/rules/rbac-role-separation.mdc` + `feature-instance-scoping.mdc` aktualisieren (WorkflowAutomation als dokumentierte Ausnahme; stale Globs `gateway/`/`frontend_nyla/` → `platform-core/`/`ui-nyla/` korrigieren) -- [ ] `TOPICS.md` aktualisieren (WorkflowAutomation = System-Komponente) -- [ ] **Cross-Import Assessment** (nach Umsetzung): Import-Analyse erneut durchfuehren und pruefen: - - [ ] `workflows -> features.graphicalEditor` (~40 Imports): Alle via Komponenten-Umzug eliminiert? - - [ ] `serviceCenter -> features.graphicalEditor` (5x workflowTools): entfaellt? - - [ ] `interfaces/interfaceDbManagement.py:936` -> `workflowArtifactVisibility`: mit Engine-Umzug erledigt? - - [ ] Re-Export-Shims (`datamodelFeatureGraphicalEditor.py`, `stateTools.py`): entfernbar? - - [ ] Verbleibende interne Zyklen in `workflows/` (30 lazy Imports): reduziert nach Restructuring? - - [ ] Finale Folder-Summary und Import-Zahlen neu generieren - - [ ] `local/notes/refernce-analysis/platform-core-import-analyse.md` finalisieren -- [ ] Dieses Dokument → `c-work/2-build/` bei Annahme, dann `4-done/` +- [x] `b-reference/platform/workflowAutomation.md`: Kanon-Seite aktualisiert (Code-Pfade, API, RBAC, Navigation) *(2026-06-08)* +- [x] `.cursor/rules/rbac-role-separation.mdc` + `feature-instance-scoping.mdc`: WorkflowAutomation als dokumentierte Ausnahme eingetragen *(2026-06-08)* +- [x] `topics-todo.md` aktualisiert (WorkflowAutomation = System-Komponente, DONE) *(2026-06-08)* +- [x] `features/graphicalEditor/` Verzeichnis komplett gelöscht (keine Dateien, keine Caller) *(2026-06-08)* +- [x] **Cross-Import Assessment**: + - [x] `workflows -> features.graphicalEditor` (~40 Imports): eliminiert — alle Imports auf `modules.workflowAutomation.*` *(2026-06-08)* + - [x] `serviceCenter -> features.graphicalEditor` (5x workflowTools): eliminiert — kanonische Pfade *(2026-06-08)* + - [x] `interfaces/interfaceDbManagement.py:936` -> `workflowArtifactVisibility`: erledigt — `modules.workflowAutomation.engine.workflowArtifactVisibility` *(2026-06-08)* + - [x] Re-Export-Shims: `datamodelFeatureGraphicalEditor.py` gelöscht; `stateTools.py` Shim bleibt (7 Caller via `processing/shared/`, nicht Teil dieser Migration) *(2026-06-08)* + - [x] Keine `from modules.features.graphicalEditor` oder `from modules.workflows.automation2` Imports mehr im gesamten Codebase (verifiziert via grep) *(2026-06-08)* +- [ ] Lazy Imports in `workflows/` reduzieren (separates Refactoring-Thema, nicht Teil dieser Migration) +- [ ] Dieses Dokument → `4-done/` verschieben