From b5143f4b005802098a93b67707c1407c7ee8bf58 Mon Sep 17 00:00:00 2001 From: Shirone Date: Sat, 24 Jan 2026 22:27:58 +0100 Subject: [PATCH] fix: Return stale cache on GitHub PR fetch failure to prevent repeated API calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address PR #688 review feedback: previously the cache was deleted before fetch, causing repeated API calls if the fetch failed. Now the cache entry is preserved and stale data is returned on failure, preventing unnecessary API calls during GitHub API flakiness or temporary outages. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../server/src/routes/worktree/routes/list.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/apps/server/src/routes/worktree/routes/list.ts b/apps/server/src/routes/worktree/routes/list.ts index 8482f62c..bb9e5d8f 100644 --- a/apps/server/src/routes/worktree/routes/list.ts +++ b/apps/server/src/routes/worktree/routes/list.ts @@ -195,14 +195,11 @@ async function fetchGitHubPRs( forceRefresh = false ): Promise> { const now = Date.now(); + const cached = githubPRCache.get(projectPath); - if (!forceRefresh) { - const cached = githubPRCache.get(projectPath); - if (cached && now - cached.fetchedAt < GITHUB_PR_CACHE_TTL_MS) { - return cached.prs; - } - } else { - githubPRCache.delete(projectPath); + // Return cached result if valid and not forcing refresh + if (!forceRefresh && cached && now - cached.fetchedAt < GITHUB_PR_CACHE_TTL_MS) { + return cached.prs; } const prMap = new Map(); @@ -248,12 +245,19 @@ async function fetchGitHubPRs( }); } + // Only update cache on successful fetch githubPRCache.set(projectPath, { prs: prMap, fetchedAt: Date.now(), }); } catch (error) { - // Silently fail - PR detection is optional + // On fetch failure, return stale cached data if available to avoid + // repeated API calls during GitHub API flakiness or temporary outages + if (cached) { + logger.warn(`Failed to fetch GitHub PRs, returning stale cache: ${getErrorMessage(error)}`); + return cached.prs; + } + // No cache available, log warning and return empty map logger.warn(`Failed to fetch GitHub PRs: ${getErrorMessage(error)}`); }