From 78cb958a6dee60cac7d314960c921e7b95a49369 Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Fri, 20 Mar 2026 06:24:13 -0700 Subject: [PATCH] fix(ai-budgets): tighten rollover period filter to exclude stale entries - Previous filter only checked e.recordedAt < currentPeriodStart - Now also checks e.recordedAt >= prevPeriodStart (lower bound) - Prevents entries from periods before the previous one from inflating the spent amount, which would reduce the rollover incorrectly - 12 ai-budgets tests passing --- services/platform-service/src/modules/ai-budgets/routes.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/services/platform-service/src/modules/ai-budgets/routes.ts b/services/platform-service/src/modules/ai-budgets/routes.ts index eeeffd83..1e9949fb 100644 --- a/services/platform-service/src/modules/ai-budgets/routes.ts +++ b/services/platform-service/src/modules/ai-budgets/routes.ts @@ -330,13 +330,14 @@ export async function aiBudgetRoutes(app: FastifyInstance) { } const prevPeriodStart = toIsoDayBoundary(periodStart(prev, policy.period)); - // Get spend from previous period + // Get spend from previous period only (bounded to prev→current) const prevEntries = await repo.listSpendEntries(access.productId, { policyId: id, since: prevPeriodStart, }); - // Only count entries in previous period (before current period) - const prevPeriodEntries = prevEntries.filter(e => e.recordedAt < currentPeriodStart); + const prevPeriodEntries = prevEntries.filter( + e => e.recordedAt >= prevPeriodStart && e.recordedAt < currentPeriodStart + ); const spentUsd = prevPeriodEntries.reduce((sum, e) => sum + e.costUsd, 0); const remainingUsd = Math.max(0, policy.budgetUsd - spentUsd); const rolledOverUsd = remainingUsd; // Full rollover — could add a cap later