Development
Layout
SimulatedExecutor/,ShadowExecutor/,LiveExecutor/— one directory per worker:src/,tests/,config/config.json,scripts/*.py, its ownversions.env+CHANGELOG.md.@common/scripts/— shared deployment tooling (copied fromstrategies/@common/scripts, corrected forvirtufin-workmanager0.6.0+'stopicslist field).docs/— this MkDocs site.versions.env— docs-only pin (API_VERSION=v1; each worker has its ownLIBRARY_VERSION, no lockstep across workers).Virtufin.ExecutionEngines.slnx— solution for the C# worker projects.
Build & test
dotnet build Virtufin.ExecutionEngines.slnx
dotnet test Virtufin.ExecutionEngines.slnx
Publishing
Per-worker CI workflow (e.g.
.github/workflows/simulatedexecutor-nuget.yaml): tests, then dotnet
publish (which produces the worker nupkg via the PackageWorker
MSBuild target in the worker's own .csproj, not a plain dotnet
pack output), then pushes to the Gitea NuGet feed, failing loudly if
the version is already published.
Versioning
Each worker directory is versioned independently (its own
versions.env + CHANGELOG.md), matching virtufin-strategies'
MovingAverage/MovingAveragePython convention.
Conventions
- Each worker's
.csprojcarries its ownPackageWorkerMSBuild target (copied fromstrategies/MovingAverage's identical target) — don't hand-roll packaging differently per worker. - An executor worker binds explicit topics
(
sc.<scenarioid>.trading.order.submitted) per scenario it serves — never a wildcard. - Route by
IExecutorimplementation, not by branching inside one worker onstrategy.world— separate deployable workers, not one generic worker with a runtime switch.
See virtufin-execution-devkit's docs
for ExecutorWorkerBase<TState>'s own contract.