diff --git a/src/KArtSell.Host/Jobs/ShadowRunJob.cs b/src/KArtSell.Host/Jobs/ShadowRunJob.cs index db672c6c..c42adb80 100644 --- a/src/KArtSell.Host/Jobs/ShadowRunJob.cs +++ b/src/KArtSell.Host/Jobs/ShadowRunJob.cs @@ -113,6 +113,13 @@ public sealed class ShadowRunJob( var metrics = await calculator.CalculateAsync( replayResult, ohlcvBars, feeSchedule, cancellationToken); + // CRITICAL: Validate metrics are not null (prevents silent failures) + if (metrics == null) + { + logger.LogError("Shadow run {RunId} metrics calculation returned NULL", command.RunId); + throw new InvalidOperationException($"Metrics cannot be null for run {command.RunId}"); + } + LogPhase3Complete(logger, command.RunId, null); // Phase 4: Phase segmentation @@ -182,7 +189,10 @@ public sealed class ShadowRunJob( { try { + // CRITICAL: InsertShadowRunAsync MUST be called to persist metrics + logger.LogDebug("Inserting shadow run {RunId} with metrics to database", result.RunId); await queries.InsertShadowRunAsync(result, cancellationToken); + logger.LogDebug("Shadow run {RunId} metrics persisted successfully to database", result.RunId); var eventMessage = new OutboxMessage( MessageId: Guid.NewGuid(),