{"record":{"id":"66b3e04c95e1d4c7","repo":"tinyhumansai/openhuman","slug":"ptt-thread-resolution-failed-aborting-commit","errorCode":null,"errorMessage":"[ptt] thread resolution failed — aborting commit","messagePattern":"\\[ptt\\] thread resolution failed — aborting commit","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/services/pttService.ts","lineNumber":144,"sourceCode":"\n    const trimmed = text.trim();\n\n    if (!trimmed) {\n      deps.logger.info('[ptt] session dropped — empty transcript', { sessionId });\n      await deps.playChime('error');\n      return;\n    }\n\n    let threadId: string;\n    try {\n      const resolved = await deps.resolveActiveThreadId();\n      if (!resolved) {\n        threadId = await deps.createNewVoiceThread();\n      } else {\n        threadId = resolved;\n      }\n    } catch (err) {\n      deps.logger.warn('[ptt] thread resolution failed — aborting commit', {\n        sessionId,\n        err: String(err),\n      });\n      await deps.playChime('error');\n      return;\n    }\n\n    try {\n      await deps.sendMessage({\n        threadId,\n        body: trimmed,\n        metadata: { source: 'ptt', session_id: sessionId },\n        speakReply: settings.speakReplies,\n      });\n    } catch (err) {\n      deps.logger.warn('[ptt] sendMessage failed', { sessionId, threadId, err: String(err) });\n      await deps.playChime('error');\n      return;","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/services/pttService.ts#L126-L162","documentation":"Resolving or creating the destination thread for a finished push-to-talk turn failed: deps.resolveActiveThreadId() threw, and the fallback path deps.createNewVoiceThread() also threw inside the same try block. The transcribed text is discarded (the commit is aborted) and the error chime plays, because there is no thread to post the message to.","triggerScenarios":"Thrown at app/src/services/pttService.ts:144 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check the core log for the underlying RPC error — resolveActiveThreadId and createNewVoiceThread both go through core RPC to the threads domain","Verify the core process is healthy and the RPC bearer token is still valid (a SessionExpired event often precedes this)","If thread creation consistently fails, inspect threads.db / the threads store for the active user workspace","Retry the push-to-talk session once the underlying RPC path recovers — the transcript is not queued, so it must be re-spoken"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}