{"record":{"id":"88a7cf6fccfaf973","repo":"stablyai/orca","slug":"read-failed","errorCode":"read-failed","errorMessage":"jira_summary_lookup:read-failed","messagePattern":"jira_summary_lookup:read-failed","errorType":"error_code","errorClass":"JiraSummaryLookupError","httpStatus":null,"severity":"error","filePath":"src/main/jira/issues.ts","lineNumber":706,"sourceCode":"    try {\n      const params = new URLSearchParams({ fields: ISSUE_SUMMARY_FIELDS.join(',') })\n      const issue = await settleJiraSummaryRead(\n        jiraRequest<JiraRecord>(\n          entry,\n          `${apiBasePath(entry.site)}/issue/${encodeURIComponent(key)}?${params.toString()}`,\n          { signal: requestSignal }\n        ),\n        requestSignal\n      )\n      return mapJiraIssue(entry.site, issue)\n    } catch (error) {\n      if (isAuthError(error)) {\n        throw new JiraSummaryLookupError('auth', error)\n      }\n      if (getErrorStatus(error) === 404) {\n        throw new JiraSummaryLookupError('not-found', error)\n      }\n      throw new JiraSummaryLookupError('read-failed', error)\n    } finally {\n      release()\n    }\n  })\n}\n\nexport async function createIssue(args: JiraCreateIssueArgs): Promise<JiraCreateIssueResult> {\n  const entry = getClients(args.siteId)[0]\n  if (!entry) {\n    return { ok: false, error: 'Not connected to Jira.' }\n  }\n  const title = args.title.trim()\n  if (!title) {\n    return { ok: false, error: 'Title is required.' }\n  }\n\n  await acquire()\n  try {","sourceCodeStart":688,"sourceCodeEnd":724,"githubUrl":"https://github.com/stablyai/orca/blob/1136503c6a231a16dce8f921f6fadb63d181e8db/src/main/jira/issues.ts#L688-L724","documentation":"Thrown inside getIssueSummary's request body for any failure that is neither auth nor 404 — network errors, timeouts (withJiraDeadline expires), 5xx responses, or aborts. This is the catch-all JiraSummaryLookupError code 'read-failed' with the original error as cause.","triggerScenarios":"Network drop or proxy failure during the GET, the withJiraDeadline timeout (ISSUE_SUMMARY_TIMEOUT_MS) elapsing, the AbortSignal aborting, or Jira returning 500/502/503.","commonSituations":"Flaky connectivity, VPN interruption, Atlassian incident, or a very large/slow issue payload exceeding the summary timeout.","solutions":["Retry with backoff for code 'read-failed' (transient by nature).","Increase ISSUE_SUMMARY_TIMEOUT_MS if payloads are consistently slow.","Check the cause error for status: 5xx → Atlassian side; network → local connectivity.","Abort gracefully if the user navigated away (signal.aborted)."],"exampleFix":"// before\ntry { await getIssueSummary(key, siteId) } catch (e) { giveUp() }\n// after\ntry { return await getIssueSummary(key, siteId) }\ncatch (e) {\n  if (getJiraSummaryLookupErrorCode(e) === 'read-failed' && !signal.aborted) { await backoffRetry(() => getIssueSummary(key, siteId, signal)) }\n  else throw e\n}","handlingStrategy":"retry","validationCode":"if (signal.aborted) return null","typeGuard":"function isJiraSummaryReadFailedError(e: unknown): boolean {\n  return getJiraSummaryLookupErrorCode(e) === 'read-failed'\n}","tryCatchPattern":"try { return await getIssueSummary(key, siteId, signal) }\ncatch (e) {\n  if (getJiraSummaryLookupErrorCode(e) === 'read-failed' && !signal.aborted) { await sleep(backoffMs); return getIssueSummary(key, siteId, signal) }\n  throw e\n}","preventionTips":["Retry with backoff for transient 'read-failed'.","Abort cleanly when the user navigates away (signal.aborted).","Tune ISSUE_SUMMARY_TIMEOUT_MS for consistently slow payloads."],"tags":["jira","network","timeout","summary-lookup","retry"],"backgroundTag":null,"analyzedSha":"1136503c6a231a16dce8f921f6fadb63d181e8db","analyzedAt":"2026-08-12T23:15:58.167Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}