{"record":{"id":"371069ff2cf4c3f8","repo":"tinyhumansai/openhuman","slug":"daemonlifecycle-retry-failed","errorCode":null,"errorMessage":"[DaemonLifecycle] Retry failed:","messagePattern":"\\[DaemonLifecycle\\] Retry failed:","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/hooks/useDaemonLifecycle.ts","lineNumber":142,"sourceCode":"      clearTimeout(retryTimeoutRef.current);\n    }\n\n    retryTimeoutRef.current = setTimeout(async () => {\n      if (!isMountedRef.current) return;\n\n      const { uid, startDaemon } = latestLifecycleRef.current;\n\n      try {\n        setIsRecovering(uid, true);\n        incrementConnectionAttempts(uid);\n\n        const result = await startDaemon();\n\n        if (result?.result && result.result.state === 'Running') {\n          console.log('[DaemonLifecycle] Retry successful');\n          resetConnectionAttempts(uid);\n        } else {\n          console.warn('[DaemonLifecycle] Retry failed:', result);\n          // Will trigger another retry via useEffect\n        }\n      } catch (error) {\n        console.error('[DaemonLifecycle] Retry error:', error);\n        // Will trigger another retry via useEffect\n      } finally {\n        setIsRecovering(uid, false);\n      }\n    }, retryDelay);\n  }, [calculateRetryDelay]);\n\n  // Handle visibility change (background/foreground)\n  const handleVisibilityChange = useCallback(() => {\n    if (!isTauri() || !isMountedRef.current) return;\n\n    const { isAutoStartEnabled, status, isRecovering } = latestLifecycleRef.current;\n\n    if (document.visibilityState === 'visible') {","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/hooks/useDaemonLifecycle.ts#L124-L160","documentation":"A scheduled daemon reconnection retry failed: the backoff timer fired and startDaemon either threw or returned a result whose state was not 'Running'. The attempt counter was already incremented for this try; the hook re-arms another backoff-scheduled retry while attempts remain under MAX_RECONNECTION_ATTEMPTS, so this warn represents one failed round in the bounded retry sequence rather than a terminal state.","triggerScenarios":"Thrown at app/src/hooks/useDaemonLifecycle.ts:142 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check the warned result/error for this round's failure reason","Correlate with prior retry warns to see whether failures repeat with the same cause (e.g. daemon crash loop)","Fix the underlying daemon start failure; subsequent scheduled retries will then succeed and reset the counter","If retries exhaust, use the manual restart action or restart the app"],"exampleFix":null,"handlingStrategy":"retry","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"}