{"record":{"id":"5c17634517ec59a4","repo":"stablyai/orca","slug":"timed-out-loading-check-details","errorCode":null,"errorMessage":"Timed out loading check details.","messagePattern":"Timed out loading check details\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/main/github/client.ts","lineNumber":4304,"sourceCode":"        : null\n    return {\n      name: nullableString(checkRun?.name) ?? args.checkName ?? 'Check',\n      status: nullableString(checkRun?.status),\n      conclusion: nullableString(checkRun?.conclusion),\n      url: nullableString(checkRun?.html_url) ?? args.url ?? null,\n      detailsUrl: nullableString(checkRun?.details_url) ?? args.url ?? null,\n      startedAt: nullableString(checkRun?.started_at),\n      completedAt: nullableString(checkRun?.completed_at),\n      title: nullableString(output?.title),\n      summary: nullableString(output?.summary),\n      text: nullableString(output?.text),\n      annotations,\n      jobs\n    }\n  } catch (err) {\n    console.warn('getPRCheckDetails failed:', err)\n    if (hostDeadlineExpired && !callerSignal?.aborted) {\n      throw new Error(GITHUB_CHECK_DETAILS_TIMEOUT_MESSAGE)\n    }\n    throw err\n  } finally {\n    clearTimeout(hostDeadline)\n    callerSignal?.removeEventListener('abort', forwardCallerAbort)\n    if (acquired) {\n      release()\n    }\n  }\n}\n\nfunction parseActionsRunId(url: string | null | undefined): number | undefined {\n  if (!url) {\n    return undefined\n  }\n  const match = /\\/actions\\/runs\\/(\\d+)(?:\\/|$)/.exec(url)\n  if (!match) {\n    return undefined","sourceCodeStart":4286,"sourceCodeEnd":4322,"githubUrl":"https://github.com/stablyai/orca/blob/1136503c6a231a16dce8f921f6fadb63d181e8db/src/main/github/client.ts#L4286-L4322","documentation":"Thrown by getPRCheckDetails in the outer catch when hostDeadlineExpired is true AND the caller's own signal has not aborted. The host deadline bounds the total time spent on gh API calls for check details; expiring it without a caller abort means the lookup genuinely timed out (slow network, stalled gh, GitHub incident) rather than being cancelled upstream. The constant GITHUB_CHECK_DETAILS_TIMEOUT_MESSAGE lets UI match it for a 'try again' prompt.","triggerScenarios":"gh api calls for check runs/jobs are slow due to a GitHub incident; a slow corporate proxy; a PR with hundreds of check runs requiring many paginated calls; the host running gh is CPU-starved; attachFailedJobLogTails fetching large log payloads over a slow link.","commonSituations":"GitHub incident slowing api.github.com; proxy latency; very large PR with many CI jobs; the SSH host has limited bandwidth; the caller did not pass an abort signal and the user navigated away without cancelling.","solutions":["Retry — transient GitHub slowness is the most common cause.","Check https://www.githubstatus.com for incidents during the failure window.","Pass a callerSignal so navigations away abort the lookup cleanly instead of running to the deadline.","For PRs with many checks, accept partial detail rather than re-running the full multi-page load."],"exampleFix":"// before: caller omits signal, lookup runs to deadline\nconst details = await getPRCheckDetails(...)\n\n// after: pass abort signal so leaving the view cancels cleanly\nconst controller = new AbortController()\nonNavigateAway(() => controller.abort())\nconst details = await getPRCheckDetails(..., { signal: controller.signal })","handlingStrategy":"retry","validationCode":null,"typeGuard":"function isCheckDetailsTimeout(err: unknown): boolean {\n  return err instanceof Error && err.message === GITHUB_CHECK_DETAILS_TIMEOUT_MESSAGE\n}","tryCatchPattern":"const controller = new AbortController()\nconst off = onNavigateAway(() => controller.abort())\ntry {\n  const details = await getPRCheckDetails(..., { signal: controller.signal })\n} catch (err) {\n  if (controller.signal.aborted) return // user navigated; ignore\n  if (isCheckDetailsTimeout(err)) {\n    toast.info('Check details timed out. Retry?')\n    return\n  }\n  throw err\n} finally {\n  off()\n}","preventionTips":["Always pass a callerSignal so navigation cancels cleanly instead of running to the deadline.","Retry once for transient GitHub slowness, then stop.","For PRs with many checks, render partial detail as it arrives."],"tags":["github","pr-checks","timeout","network","retry"],"backgroundTag":null,"analyzedSha":"1136503c6a231a16dce8f921f6fadb63d181e8db","analyzedAt":"2026-08-12T23:15:58.167Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}