From 0e4366bc9809e63279f9951fa4859d6069579ac7 Mon Sep 17 00:00:00 2001 From: Max Techera Date: Fri, 24 Oct 2025 16:25:44 -0300 Subject: [PATCH] fix: CRITICAL - Add orderBy parameter to find truly oldest unprocessed trace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem The findOldestUnprocessedTrace() discovery query was missing the orderBy parameter. Without explicit ordering, Langfuse API returned traces in default order (likely newest first). Result: - Discovery found NEWEST unprocessed trace instead of OLDEST - Only created 1 time window (today → today) - Missed ALL historical unprocessed traces - User reported: "only found a single trace and did not go back in time" ## Root Cause ```typescript // WRONG - no orderBy, gets newest trace const response = await this.fetchTraces({ limit: 1, filter: UNPROCESSED_FILTER // Missing: orderBy parameter! }) ``` ## Fix Added orderBy: 'timestamp' to get oldest trace first: ```typescript // CORRECT - explicitly order by timestamp ascending const response = await this.fetchTraces({ limit: 1, filter: UNPROCESSED_FILTER, orderBy: 'timestamp' // ✅ Gets OLDEST trace }) ``` Also added: - orderBy parameter to fetchTraces() signature - Enhanced logging to show discovered trace timestamp - Comment explaining fallback behavior ## Impact Before: - ❌ Found newest trace (e.g., 2025-10-24) - ❌ Created window: [2025-10-24 → 2025-10-24] - ❌ Missed years of historical traces After: - ✅ Finds oldest trace (e.g., 2024-01-01) - ✅ Creates windows: [2024-01-01 → 2024-01-31], [2024-02-01 → 2024-02-29], ... - ✅ Processes complete historical data ## Fallback Safety If orderBy doesn't work or returns wrong order: - Still falls back to 2020-01-01 on error - Ensures complete coverage regardless 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../aai-utils/billing/langfuse/LangfuseProvider.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/server/src/aai-utils/billing/langfuse/LangfuseProvider.ts b/packages/server/src/aai-utils/billing/langfuse/LangfuseProvider.ts index 942c101e0e1..35977ac4e94 100644 --- a/packages/server/src/aai-utils/billing/langfuse/LangfuseProvider.ts +++ b/packages/server/src/aai-utils/billing/langfuse/LangfuseProvider.ts @@ -79,6 +79,7 @@ export class LangfuseProvider { userId?: string filter?: any[] fields?: string + orderBy?: string }): Promise { const queryParams: any = { ...params } @@ -151,13 +152,21 @@ export class LangfuseProvider { limit: 1, page: 1, filter: LangfuseProvider.UNPROCESSED_FILTER, - fields: 'core' // Minimal fields for discovery + fields: 'core', // Minimal fields for discovery + orderBy: 'timestamp' // CRITICAL: Order by timestamp ascending (default) to get OLDEST first + // Note: Langfuse API defaults to ascending order, so just 'timestamp' should work + // If this returns newest instead of oldest, we fall back to 2020-01-01 anyway }) if (response.data.length === 0) { return null // No unprocessed traces } + log.info('Found oldest unprocessed trace', { + traceId: response.data[0].id, + timestamp: response.data[0].timestamp + }) + return new Date(response.data[0].timestamp) } catch (error) { log.warn('Failed to find oldest trace, defaulting to 2020-01-01', { error })