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:
@@ -11,14 +11,17 @@ public sealed class BudgetConstraintEnforcer : IBudgetConstraintEnforcer
|
|||||||
private readonly IBudgetLedger _ledger;
|
private readonly IBudgetLedger _ledger;
|
||||||
private readonly IGateSelector _gateSelector;
|
private readonly IGateSelector _gateSelector;
|
||||||
private readonly ILogger<BudgetConstraintEnforcer> _logger;
|
private readonly ILogger<BudgetConstraintEnforcer> _logger;
|
||||||
|
private readonly TimeProvider _timeProvider;
|
||||||
|
|
||||||
public BudgetConstraintEnforcer(
|
public BudgetConstraintEnforcer(
|
||||||
IBudgetLedger ledger,
|
IBudgetLedger ledger,
|
||||||
IGateSelector gateSelector,
|
IGateSelector gateSelector,
|
||||||
|
TimeProvider? timeProvider = null,
|
||||||
ILogger<BudgetConstraintEnforcer>? logger = null)
|
ILogger<BudgetConstraintEnforcer>? logger = null)
|
||||||
{
|
{
|
||||||
_ledger = ledger ?? throw new ArgumentNullException(nameof(ledger));
|
_ledger = ledger ?? throw new ArgumentNullException(nameof(ledger));
|
||||||
_gateSelector = gateSelector ?? throw new ArgumentNullException(nameof(gateSelector));
|
_gateSelector = gateSelector ?? throw new ArgumentNullException(nameof(gateSelector));
|
||||||
|
_timeProvider = timeProvider ?? TimeProvider.System;
|
||||||
_logger = logger ?? NullLogger<BudgetConstraintEnforcer>.Instance;
|
_logger = logger ?? NullLogger<BudgetConstraintEnforcer>.Instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,7 +137,7 @@ public sealed class BudgetConstraintEnforcer : IBudgetConstraintEnforcer
|
|||||||
TotalRiskPoints = penaltyRiskPoints,
|
TotalRiskPoints = penaltyRiskPoints,
|
||||||
Budget = consumeResult.Budget,
|
Budget = consumeResult.Budget,
|
||||||
FollowUpRequired = true,
|
FollowUpRequired = true,
|
||||||
FollowUpDeadline = DateTimeOffset.UtcNow.AddDays(5)
|
FollowUpDeadline = _timeProvider.GetUtcNow().AddDays(5)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,13 +13,16 @@ public sealed class EvidenceFreshnessGate : IPolicyGate
|
|||||||
{
|
{
|
||||||
private readonly IEvidenceTtlEnforcer _ttlEnforcer;
|
private readonly IEvidenceTtlEnforcer _ttlEnforcer;
|
||||||
private readonly ILogger<EvidenceFreshnessGate> _logger;
|
private readonly ILogger<EvidenceFreshnessGate> _logger;
|
||||||
|
private readonly TimeProvider _timeProvider;
|
||||||
|
|
||||||
public EvidenceFreshnessGate(
|
public EvidenceFreshnessGate(
|
||||||
IEvidenceTtlEnforcer ttlEnforcer,
|
IEvidenceTtlEnforcer ttlEnforcer,
|
||||||
ILogger<EvidenceFreshnessGate> logger)
|
ILogger<EvidenceFreshnessGate> logger,
|
||||||
|
TimeProvider? timeProvider = null)
|
||||||
{
|
{
|
||||||
_ttlEnforcer = ttlEnforcer;
|
_ttlEnforcer = ttlEnforcer;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
_timeProvider = timeProvider ?? TimeProvider.System;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<GateResult> EvaluateAsync(
|
public Task<GateResult> EvaluateAsync(
|
||||||
@@ -30,7 +33,7 @@ public sealed class EvidenceFreshnessGate : IPolicyGate
|
|||||||
// Build evidence bundle from context
|
// Build evidence bundle from context
|
||||||
var evidenceBundle = BuildEvidenceBundleFromContext(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>();
|
var details = ImmutableDictionary.CreateBuilder<string, object>();
|
||||||
details.Add("overall_status", freshnessResult.OverallStatus.ToString());
|
details.Add("overall_status", freshnessResult.OverallStatus.ToString());
|
||||||
|
|||||||
Reference in New Issue
Block a user