Extract product-agnostic workflow engine from Ablera.Serdica.Workflow into standalone StellaOps.Workflow.* libraries targeting net10.0. Libraries (14): - Contracts, Abstractions (compiler, decompiler, expression runtime) - Engine (execution, signaling, scheduling, projections, hosted services) - ElkSharp (generic graph layout algorithm) - Renderer.ElkSharp, Renderer.ElkJs, Renderer.Msagl, Renderer.Svg - Signaling.Redis, Signaling.OracleAq - DataStore.MongoDB, DataStore.PostgreSQL, DataStore.Oracle WebService: ASP.NET Core Minimal API with 22 endpoints Tests (8 projects, 109 tests pass): - Engine.Tests (105 pass), WebService.Tests (4 E2E pass) - Renderer.Tests, DataStore.MongoDB/Oracle/PostgreSQL.Tests - Signaling.Redis.Tests, IntegrationTests.Shared Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tutorial 1: Hello World
The simplest possible workflow: initialize state from a start request, activate a single human task, and complete the workflow when the task is done.
Concepts Introduced
IDeclarativeWorkflow<T>— the contract every workflow implementsWorkflowSpec.For<T>()— the builder entry point.InitializeState()— transforms the start request into workflow state.StartWith(task)— sets the first task to activateWorkflowHumanTask.For<T>()— defines a human task.OnComplete(flow => flow.Complete())— terminal step
What Happens at Runtime
- Client calls
StartWorkflowAsyncwithWorkflowName = "Greeting"and payload{ "customerName": "John" } - State initializes to
{ "customerName": "John" } - Task "Greet Customer" is created with status "Pending"
- A user assigns the task to themselves, then completes it
OnCompleteexecutes.Complete()— the workflow finishes
Variants
Next
Tutorial 2: Service Tasks — call external services before or after human tasks.