Skip to content

Development

Layout

  • SimulatedExecutor/, ShadowExecutor/, LiveExecutor/ — one directory per worker: src/, tests/, config/config.json, scripts/*.py, its own versions.env + CHANGELOG.md.
  • @common/scripts/ — shared deployment tooling (copied from strategies/@common/scripts, corrected for virtufin-workmanager 0.6.0+'s topics list field).
  • docs/ — this MkDocs site.
  • versions.env — docs-only pin (API_VERSION=v1; each worker has its own LIBRARY_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 .csproj carries its own PackageWorker MSBuild target (copied from strategies/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 IExecutor implementation, not by branching inside one worker on strategy.world — separate deployable workers, not one generic worker with a runtime switch.

See virtufin-execution-devkit's docs for ExecutorWorkerBase<TState>'s own contract.