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>
This commit is contained in:
master
2026-03-20 19:14:44 +02:00
parent e56f9a114a
commit f5b5f24d95
422 changed files with 85428 additions and 0 deletions

View File

@@ -0,0 +1,213 @@
{
"Date": "2026-03-17",
"Workspace": "C:\\dev\\serdica-backend4",
"TestCommand": "dotnet test src/Serdica/Ablera.Serdica.Workflow/__Tests/Ablera.Serdica.Workflow.IntegrationTests/Ablera.Serdica.Workflow.IntegrationTests.csproj -c Release --no-build --filter \"FullyQualifiedName~PostgresPerformance\"",
"SuiteResult": {
"Passed": 11,
"Total": 11,
"Duration": "2 m 16 s"
},
"RawArtifactDirectory": "src/Serdica/Ablera.Serdica.Workflow/__Tests/Ablera.Serdica.Workflow.IntegrationTests/bin/Release/net9.0/TestResults/workflow-performance/",
"PostgresEnvironment": {
"DockerImage": "postgres:16-alpine",
"Database": "workflow",
"Version": "PostgreSQL 16.13",
"Backend": "Durable queue tables plus LISTEN/NOTIFY wake hints"
},
"MeasurementViews": {
"SerialLatencyScenario": "postgres-signal-roundtrip-latency-serial",
"SteadyThroughputScenario": "postgres-signal-roundtrip-throughput-parallel",
"CapacityScenarioPrefix": "postgres-signal-roundtrip-capacity-"
},
"Notes": {
"TopWaitCounts": [
{
"Name": "Client:ClientRead",
"Count": 13
},
{
"Name": "",
"Count": 1
}
],
"Interpretation": [
"Serial latency baseline and steady throughput baseline are separated from the capacity ladder.",
"The capacity ladder still scales through c16 on this local PostgreSQL Docker setup.",
"Immediate queue handling remains much cheaper than full workflow resume.",
"The dominant observed backend state is client read waiting, not an obvious storage stall."
]
},
"Scenarios": [
{
"ScenarioName": "postgres-signal-roundtrip-capacity-c1",
"Tier": "WorkflowPerfCapacity",
"OperationCount": 16,
"Concurrency": 1,
"DurationMilliseconds": 3895.54,
"ThroughputPerSecond": 4.11,
"AverageLatencyMilliseconds": 3738.08,
"P95LatencyMilliseconds": 3762.51,
"MaxLatencyMilliseconds": 3771.10,
"TopWait": "Client:ClientRead",
"CounterDeltas": {
"xact_commit": 251,
"xact_rollback": 7,
"blks_hit": 1654,
"blks_read": 24,
"tup_inserted": 48,
"tup_updated": 48,
"tup_deleted": 16
}
},
{
"ScenarioName": "postgres-signal-roundtrip-capacity-c4",
"Tier": "WorkflowPerfCapacity",
"OperationCount": 64,
"Concurrency": 4,
"DurationMilliseconds": 3700.99,
"ThroughputPerSecond": 17.29,
"AverageLatencyMilliseconds": 3577.49,
"P95LatencyMilliseconds": 3583.70,
"MaxLatencyMilliseconds": 3584.43,
"TopWait": "Client:ClientRead",
"CounterDeltas": {
"xact_commit": 1080,
"xact_rollback": 21,
"blks_hit": 7084,
"blks_read": 1,
"tup_inserted": 192,
"tup_updated": 192,
"tup_deleted": 64
}
},
{
"ScenarioName": "postgres-signal-roundtrip-capacity-c8",
"Tier": "WorkflowPerfCapacity",
"OperationCount": 128,
"Concurrency": 8,
"DurationMilliseconds": 3853.89,
"ThroughputPerSecond": 33.21,
"AverageLatencyMilliseconds": 3713.31,
"P95LatencyMilliseconds": 3718.66,
"MaxLatencyMilliseconds": 3719.34,
"TopWait": "Client:ClientRead",
"CounterDeltas": {
"xact_commit": 2348,
"xact_rollback": 44,
"blks_hit": 17069,
"blks_read": 0,
"tup_inserted": 384,
"tup_updated": 384,
"tup_deleted": 128
}
},
{
"ScenarioName": "postgres-signal-roundtrip-capacity-c16",
"Tier": "WorkflowPerfCapacity",
"OperationCount": 256,
"Concurrency": 16,
"DurationMilliseconds": 4488.07,
"ThroughputPerSecond": 57.04,
"AverageLatencyMilliseconds": 4251.48,
"P95LatencyMilliseconds": 4287.87,
"MaxLatencyMilliseconds": 4294.09,
"TopWait": "Client:ClientRead",
"CounterDeltas": {
"xact_commit": 4536,
"xact_rollback": 48,
"blks_hit": 40443,
"blks_read": 0,
"tup_inserted": 768,
"tup_updated": 768,
"tup_deleted": 256
}
},
{
"ScenarioName": "postgres-signal-roundtrip-latency-serial",
"Tier": "WorkflowPerfLatency",
"OperationCount": 16,
"Concurrency": 1,
"DurationMilliseconds": 49290.47,
"ThroughputPerSecond": 0.32,
"AverageLatencyMilliseconds": 3079.33,
"P95LatencyMilliseconds": 3094.94,
"MaxLatencyMilliseconds": 3101.71,
"PhaseLatencySummaries": {
"start": {
"AverageMilliseconds": 6.12,
"P95Milliseconds": 9.29,
"MaxMilliseconds": 11.26
},
"signalPublish": {
"AverageMilliseconds": 5.63,
"P95Milliseconds": 6.82,
"MaxMilliseconds": 7.53
},
"signalToCompletion": {
"AverageMilliseconds": 3073.20,
"P95Milliseconds": 3086.59,
"MaxMilliseconds": 3090.44
}
}
},
{
"ScenarioName": "postgres-signal-roundtrip-throughput-parallel",
"Tier": "WorkflowPerfThroughput",
"OperationCount": 96,
"Concurrency": 16,
"DurationMilliseconds": 3729.17,
"ThroughputPerSecond": 25.74,
"AverageLatencyMilliseconds": 3603.54,
"P95LatencyMilliseconds": 3635.59,
"MaxLatencyMilliseconds": 3649.96,
"TopWait": "Client:ClientRead",
"CounterDeltas": {
"xact_commit": 1502,
"xact_rollback": 38,
"blks_hit": 21978,
"blks_read": 24,
"tup_inserted": 288,
"tup_updated": 288,
"tup_deleted": 96
},
"PhaseLatencySummaries": {
"start": {
"AverageMilliseconds": 16.21,
"P95Milliseconds": 40.31,
"MaxMilliseconds": 47.02
},
"signalPublish": {
"AverageMilliseconds": 18.11,
"P95Milliseconds": 23.62,
"MaxMilliseconds": 28.41
},
"signalToCompletion": {
"AverageMilliseconds": 3504.24,
"P95Milliseconds": 3530.38,
"MaxMilliseconds": 3531.14
}
}
},
{
"ScenarioName": "postgres-signal-roundtrip-soak",
"Tier": "WorkflowPerfSoak",
"OperationCount": 108,
"Concurrency": 8,
"DurationMilliseconds": 25121.68,
"ThroughputPerSecond": 4.30,
"AverageLatencyMilliseconds": 4164.52,
"P95LatencyMilliseconds": 4208.42,
"MaxLatencyMilliseconds": 4209.96,
"TopWait": "Client:ClientRead",
"CounterDeltas": {
"xact_commit": 3313,
"xact_rollback": 352,
"blks_hit": 26548,
"blks_read": 269,
"tup_inserted": 774,
"tup_updated": 339,
"tup_deleted": 108
}
}
]
}