diff --git a/apps/webapp/app/services/runsRepository/clickhouseRunsRepository.server.ts b/apps/webapp/app/services/runsRepository/clickhouseRunsRepository.server.ts index 9d3a92e9110..6758af79a67 100644 --- a/apps/webapp/app/services/runsRepository/clickhouseRunsRepository.server.ts +++ b/apps/webapp/app/services/runsRepository/clickhouseRunsRepository.server.ts @@ -101,7 +101,11 @@ export class ClickHouseRunsRepository implements IRunsRepository { previousCursor = reversedRunIds.at(1) ?? null; nextCursor = reversedRunIds.at(options.page.size) ?? null; } else { - nextCursor = reversedRunIds.at(options.page.size - 1) ?? null; + // Use the last item (oldest run) as the forward cursor. + // We can't use a fixed index (pageSize - 1) because the result set + // may have fewer items than pageSize (e.g., when new runs were created + // while the user was browsing, shifting page boundaries). + nextCursor = reversedRunIds.at(reversedRunIds.length - 1) ?? null; } break; diff --git a/apps/webapp/app/services/runsRepository/postgresRunsRepository.server.ts b/apps/webapp/app/services/runsRepository/postgresRunsRepository.server.ts index eaf22420901..6349aa11947 100644 --- a/apps/webapp/app/services/runsRepository/postgresRunsRepository.server.ts +++ b/apps/webapp/app/services/runsRepository/postgresRunsRepository.server.ts @@ -75,7 +75,11 @@ export class PostgresRunsRepository implements IRunsRepository { previousCursor = reversedRuns.at(1)?.id ?? null; nextCursor = reversedRuns.at(options.page.size)?.id ?? null; } else { - nextCursor = reversedRuns.at(options.page.size - 1)?.id ?? null; + // Use the last item (oldest run) as the forward cursor. + // We can't use a fixed index (pageSize - 1) because the result set + // may have fewer items than pageSize (e.g., when new runs were created + // while the user was browsing, shifting page boundaries). + nextCursor = reversedRuns.at(reversedRuns.length - 1)?.id ?? null; } break; }