refactory workflowAutomation completed as system component reolacing automation2 and graphEditor

This commit is contained in:
ValueOn AG 2026-06-08 10:31:33 +02:00
parent c654001f01
commit 5d95a568ac
2 changed files with 102 additions and 29 deletions

View file

@ -1,5 +1,5 @@
<!-- status: canonical -->
<!-- lastReviewed: 2026-06-07 -->
<!-- lastReviewed: 2026-06-08 -->
# 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`

View file

@ -1,9 +1,12 @@
<!-- status: plan -->
<!-- status: done -->
<!-- started: 2026-06-05 -->
<!-- completed: 2026-06-08 -->
<!-- component: gateway | ui-nyla | platform -->
# 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