{"record":{"id":"c75e65925762cf95","repo":"thedotmack/claude-mem","slug":"failed-to-capture-session-id-while-priming-corpus","errorCode":null,"errorMessage":"Failed to capture session_id while priming corpus \"${corpus.name}\"","messagePattern":"Failed to capture session_id while priming corpus \"(.+?)\"","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/services/worker/knowledge/KnowledgeAgent.ts","lineNumber":75,"sourceCode":"        if (msg.session_id) sessionId = msg.session_id;\n        if (msg.type === 'result') {\n          logger.info('WORKER', `Knowledge agent primed for corpus \"${corpus.name}\"`);\n        }\n      }\n    } catch (error) {\n      if (sessionId) {\n        if (error instanceof Error) {\n          logger.debug('WORKER', `SDK process exited after priming corpus \"${corpus.name}\" — session captured, continuing`, {}, error);\n        } else {\n          logger.debug('WORKER', `SDK process exited after priming corpus \"${corpus.name}\" — session captured, continuing (non-Error thrown)`, { thrownValue: String(error) });\n        }\n      } else {\n        throw error;\n      }\n    }\n\n    if (!sessionId) {\n      throw new Error(`Failed to capture session_id while priming corpus \"${corpus.name}\"`);\n    }\n\n    corpus.session_id = sessionId;\n    this.corpusStore.write(corpus);\n\n    return sessionId;\n  }\n\n  async query(corpus: CorpusFile, question: string): Promise<QueryResult> {\n    if (!corpus.session_id) {\n      throw new Error(`Corpus \"${corpus.name}\" has no session — call prime first`);\n    }\n\n    try {\n      const result = await this.executeQuery(corpus, question);\n      if (result.session_id !== corpus.session_id) {\n        corpus.session_id = result.session_id;\n        this.corpusStore.write(corpus);","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/thedotmack/claude-mem/blob/d8bc9755e74915e5c3b999181e10a67c889bce2a/src/services/worker/knowledge/KnowledgeAgent.ts#L57-L93","documentation":"KnowledgeAgent.prime() starts a Claude session for a corpus and extracts the returned session_id; if the session started but no session_id could be captured, it throws this error. Without a session_id the corpus cannot be queried later, so priming aborts and the corpus file is left un-primed (or with a stale session).","triggerScenarios":"The priming conversation completed but the SDK response contained no session_id — e.g. the claude CLI/SDK changed its response shape, output parsing failed, or the process errored in a way that returned without an id but was not rethrown.","commonSituations":"Claude Agent SDK version upgrade changing where session_id appears in the result; malformed output from the priming prompt; corpus store write permission issue masking a partially completed prime; transient backend error swallowed by an earlier catch branch.","solutions":["Retry prime() — transient output issues often resolve on a second run","Check the parsed response shape against your installed Claude SDK/CLI version (session_id location may have changed)","Log the raw priming result to see why sessionId stayed undefined","Update or pin the Claude Agent SDK version to one matching the parser, then reprime"],"exampleFix":"// before\nconst result = await runPriming(corpus);\nconst sessionId = result.session_id; // undefined after SDK upgrade\n// after\nconst result = await runPriming(corpus);\nconst sessionId = result.session_id ?? result.sessionId ?? undefined; // handle both shapes\nif (!sessionId) logger.debug('WORKER', 'prime result', { result });","handlingStrategy":"retry","validationCode":"function primeResultLooksValid(result: unknown): boolean {\n  const r = result as { session_id?: unknown } | null;\n  return !!r && typeof r.session_id === 'string' && r.session_id.length > 0;\n}","typeGuard":null,"tryCatchPattern":"try {\n  const sessionId = await agent.prime(corpus);\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith('Failed to capture session_id')) {\n    logger.warn('prime did not yield session_id — check SDK version / response shape', { corpus: corpus.name, cause: err });\n    // retry once after logging the raw response shape\n  } else {\n    throw err;\n  }\n}","preventionTips":["Pin the Claude Agent SDK/CLI version and re-test prime() on upgrades","Log the raw priming result at debug level to diagnose missing session_id","Verify corpus JSON has session_id persisted after every prime","Alert on prime() failures so un-primed corpora never reach query paths"],"tags":["session","integration","knowledge-base"],"backgroundTag":"unexpected-api-response-shape","analyzedSha":"d8bc9755e74915e5c3b999181e10a67c889bce2a","analyzedAt":"2026-09-17T16:40:26.182Z","contentChangedAt":"2026-09-17T16:40:26.182Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}