namespace StellaOps.Evidence.Budgets; public sealed partial class EvidenceBudgetService { public async Task GetBudgetStatusAsync(Guid scanId, CancellationToken ct) { var budget = _options.CurrentValue; var usage = await GetCurrentUsageAsync(scanId, ct).ConfigureAwait(false); return new BudgetStatus { ScanId = scanId, TotalBudgetBytes = budget.MaxScanSizeBytes, UsedBytes = usage.TotalBytes, RemainingBytes = Math.Max(0, budget.MaxScanSizeBytes - usage.TotalBytes), UtilizationPercent = (decimal)usage.TotalBytes / budget.MaxScanSizeBytes * 100, ByType = usage.ByType.ToDictionary( kvp => kvp.Key, kvp => new TypeBudgetStatus { Type = kvp.Key, UsedBytes = kvp.Value, LimitBytes = budget.MaxPerType.GetValueOrDefault(kvp.Key), UtilizationPercent = budget.MaxPerType.TryGetValue(kvp.Key, out var limit) ? (decimal)kvp.Value / limit * 100 : 0 }) }; } }