{"record":{"id":"61b03924eea3f9e7","repo":"stablyai/orca","slug":"timed-out-after-options-timeoutminutes-m-waiting","errorCode":null,"errorMessage":"Timed out after ${options.timeoutMinutes}m waiting for mac release build workflow ${workflowRunId}.","messagePattern":"Timed out after (.+?)m waiting for mac release build workflow (.+?)\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"config/scripts/run-release-mac-build-workflow.mjs","lineNumber":136,"sourceCode":"  const deadlineMs = now() + options.timeoutMinutes * 60 * 1000\n\n  while (now() <= deadlineMs) {\n    const run = await api.request(\n      'GET',\n      `/repos/${api.owner}/${api.repo}/actions/runs/${workflowRunId}`\n    )\n\n    if (run.status === 'completed') {\n      return run\n    }\n\n    console.log(\n      `Mac release build workflow is ${run.status}; polling again in ${options.pollSeconds}s`\n    )\n    await sleep(options.pollSeconds * 1000)\n  }\n\n  throw new Error(\n    `Timed out after ${options.timeoutMinutes}m waiting for mac release build workflow ${workflowRunId}.`\n  )\n}\n\nexport function createGitHubApiClient(options, deps = {}) {\n  const fetchImpl = deps.fetch ?? globalThis.fetch\n  if (typeof fetchImpl !== 'function') {\n    throw new Error('A fetch implementation is required.')\n  }\n\n  const [owner, repo] = options.repo.split('/')\n  if (!owner || !repo) {\n    throw new Error(`GITHUB_REPOSITORY must be in owner/repo form, got \"${options.repo}\".`)\n  }\n\n  return {\n    owner,\n    repo,","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/stablyai/orca/blob/1136503c6a231a16dce8f921f6fadb63d181e8db/config/scripts/run-release-mac-build-workflow.mjs#L118-L154","documentation":"Thrown by waitForReleaseMacBuildRun when the deadline (now + options.timeoutMinutes*60*1000, default 90m via RELEASE_MAC_BUILD_TIMEOUT_MINUTES) passes while the run's status is still not 'completed'. The run exists and is reachable but never finished in the allotted window.","triggerScenarios":"Polling GET .../actions/runs/<id> keeps returning status in (queued, in_progress, waiting, ...) until the timeout elapses; conclusion is never reached.","commonSituations":"macOS runners are scarce/slow (long queue), the build genuinely hangs (notarization stall), timeoutMinutes too low for cold first builds, runner lost and GitHub slow to mark failure.","solutions":["Raise RELEASE_MAC_BUILD_TIMEOUT_MINUTES to cover realistic mac build + queue time.","Open the run URL and check whether it is queued (runner capacity) vs in_progress (stalled step).","For capacity issues, add mac runners or use larger instances; for stalls, fix the hanging step.","Re-dispatch once capacity is available."],"exampleFix":"# before\nenv: RELEASE_MAC_BUILD_TIMEOUT_MINUTES=45\n# after\nenv: RELEASE_MAC_BUILD_TIMEOUT_MINUTES=120","handlingStrategy":"retry","validationCode":"const timeoutMinutes = readPositiveInteger(env.RELEASE_MAC_BUILD_TIMEOUT_MINUTES, 90)\nif (timeoutMinutes < 120) {\n  console.warn('mac builds can exceed 90m; consider RELEASE_MAC_BUILD_TIMEOUT_MINUTES=120')\n}","typeGuard":"function isCompleted(run) { return run?.status === 'completed' }","tryCatchPattern":"try {\n  await waitForReleaseMacBuildRun(api, workflowRun.id, options)\n} catch (err) {\n  if (/Timed out .* waiting for mac release build/.test(err.message)) {\n    // re-poll with an extended timeout only after confirming the run is still in_progress\n  }\n  throw err\n}","preventionTips":["Set RELEASE_MAC_BUILD_TIMEOUT_MINUTES to cover queue + build + notarization worst case.","Watch for queued-vs-in_progress to distinguish capacity from stalls.","Alert on repeated timeouts rather than silently lengthening the window."],"tags":["ci","github-api","timeout","release","mac"],"backgroundTag":null,"analyzedSha":"1136503c6a231a16dce8f921f6fadb63d181e8db","analyzedAt":"2026-08-12T23:15:58.167Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}