Files
git.stella-ops.org/docs/workflow/tutorials/01-hello-world
master f5b5f24d95 Add StellaOps.Workflow engine: 14 libraries, WebService, 8 test projects
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>
2026-03-20 19:14:44 +02:00
..

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 implements
  • WorkflowSpec.For<T>() — the builder entry point
  • .InitializeState() — transforms the start request into workflow state
  • .StartWith(task) — sets the first task to activate
  • WorkflowHumanTask.For<T>() — defines a human task
  • .OnComplete(flow => flow.Complete()) — terminal step

What Happens at Runtime

  1. Client calls StartWorkflowAsync with WorkflowName = "Greeting" and payload { "customerName": "John" }
  2. State initializes to { "customerName": "John" }
  3. Task "Greet Customer" is created with status "Pending"
  4. A user assigns the task to themselves, then completes it
  5. OnComplete executes .Complete() — the workflow finishes

Variants

Next

Tutorial 2: Service Tasks — call external services before or after human tasks.