DET-004: Refactor more Policy Gates for determinism

- BudgetConstraintEnforcer: inject TimeProvider
- EvidenceFreshnessGate: inject TimeProvider

Replace DateTimeOffset.UtcNow with _timeProvider.GetUtcNow()

Sprint: SPRINT_20260104_001_BE_determinism_timeprovider_injection
This commit is contained in:
StellaOps Bot
2026-01-04 12:41:14 +02:00
parent 406c6c119f
commit ef6ce108aa
2 changed files with 9 additions and 3 deletions

View File

@@ -11,14 +11,17 @@ public sealed class BudgetConstraintEnforcer : IBudgetConstraintEnforcer
private readonly IBudgetLedger _ledger;
private readonly IGateSelector _gateSelector;
private readonly ILogger<BudgetConstraintEnforcer> _logger;
private readonly TimeProvider _timeProvider;
public BudgetConstraintEnforcer(
IBudgetLedger ledger,
IGateSelector gateSelector,
TimeProvider? timeProvider = null,
ILogger<BudgetConstraintEnforcer>? logger = null)
{
_ledger = ledger ?? throw new ArgumentNullException(nameof(ledger));
_gateSelector = gateSelector ?? throw new ArgumentNullException(nameof(gateSelector));
_timeProvider = timeProvider ?? TimeProvider.System;
_logger = logger ?? NullLogger<BudgetConstraintEnforcer>.Instance;
}
@@ -134,7 +137,7 @@ public sealed class BudgetConstraintEnforcer : IBudgetConstraintEnforcer
TotalRiskPoints = penaltyRiskPoints,
Budget = consumeResult.Budget,
FollowUpRequired = true,
FollowUpDeadline = DateTimeOffset.UtcNow.AddDays(5)
FollowUpDeadline = _timeProvider.GetUtcNow().AddDays(5)
};
}

View File

@@ -13,13 +13,16 @@ public sealed class EvidenceFreshnessGate : IPolicyGate
{
private readonly IEvidenceTtlEnforcer _ttlEnforcer;
private readonly ILogger<EvidenceFreshnessGate> _logger;
private readonly TimeProvider _timeProvider;
public EvidenceFreshnessGate(
IEvidenceTtlEnforcer ttlEnforcer,
ILogger<EvidenceFreshnessGate> logger)
ILogger<EvidenceFreshnessGate> logger,
TimeProvider? timeProvider = null)
{
_ttlEnforcer = ttlEnforcer;
_logger = logger;
_timeProvider = timeProvider ?? TimeProvider.System;
}
public Task<GateResult> EvaluateAsync(
@@ -30,7 +33,7 @@ public sealed class EvidenceFreshnessGate : IPolicyGate
// Build evidence bundle from context
var evidenceBundle = BuildEvidenceBundleFromContext(context);
var freshnessResult = _ttlEnforcer.CheckFreshness(evidenceBundle, DateTimeOffset.UtcNow);
var freshnessResult = _ttlEnforcer.CheckFreshness(evidenceBundle, _timeProvider.GetUtcNow());
var details = ImmutableDictionary.CreateBuilder<string, object>();
details.Add("overall_status", freshnessResult.OverallStatus.ToString());