{"record":{"id":"38682489cb86ea55","repo":"tinyhumansai/openhuman","slug":"log-fallback-budget-read-failed-kind-errorkin","errorCode":null,"errorMessage":"${LOG} fallback budget read failed kind=${errorKind(err)}","messagePattern":"(.+?) fallback budget read failed kind=(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/hooks/useEmbeddingBudgetState.ts","lineNumber":206,"sourceCode":"        // while `useUsageState`'s own request is still in flight, so gate on\n        // `!usageLoading` too — otherwise a normal managed user whose provider\n        // read resolves first fires a redundant `getTeamUsage()` that\n        // `useUsageState` is about to make anyway.\n        if (managed && !hasUsage && !usageLoading) {\n          console.debug(`${LOG} fallback budget read start (managed + usage settled empty)`);\n          try {\n            const usage = await creditsApi.getTeamUsage();\n            if (!cancelled) setFallbackUsage(deriveBudget(usage));\n            console.debug(`${LOG} fallback budget read ok`);\n          } catch (err) {\n            // Auth-expired is handled globally by coreRpcClient; any failure\n            // here just means \"no budget data\", so stay silent rather than\n            // guess. Never manufacture a warning from a failed read.\n            if (err instanceof CoreRpcError && err.kind === 'auth_expired') {\n              console.debug(`${LOG} fallback budget read skipped: session expired`);\n              if (!cancelled) setFallbackUsage(null);\n            } else {\n              console.warn(`${LOG} fallback budget read failed kind=${errorKind(err)}`);\n              if (!cancelled) setFallbackUsage(null);\n            }\n          }\n        } else if (!cancelled) {\n          // Not needed (BYO/local, or `useUsageState` already has the figure).\n          console.debug(\n            `${LOG} fallback budget read not needed ` +\n              `(managed=${managed} hasUsage=${hasUsage} usageLoading=${usageLoading})`\n          );\n          setFallbackUsage(null);\n        }\n      } catch (err) {\n        // Conservative on failure: an unknown provider is treated as\n        // NOT managed, so a transient RPC error can never manufacture a\n        // budget warning for a user who funds their own embeddings.\n        console.warn(`${LOG} provider read failed kind=${errorKind(err)} — treating as unmanaged`);\n        if (!cancelled) {\n          setProvider(null);","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/hooks/useEmbeddingBudgetState.ts#L188-L224","documentation":"Degraded-path warning in useEmbeddingBudgetState: for a managed user whose provider budget read came back empty, a fallback creditsApi.getTeamUsage() call failed (kind-classified in the message). The hook clears fallbackUsage to null and continues — the budget indicator is hidden rather than wrong; embedding features still work.","triggerScenarios":"Thrown at app/src/hooks/useEmbeddingBudgetState.ts:206 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Treat as soft-degradation: hide the budget UI, don't block embedding usage","Check backend session validity if the failure is persistent (401 kind)","Retry the team-usage read on next mount/reconnect instead of caching the failure"],"exampleFix":null,"handlingStrategy":"fallback","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-14T05:17:10.506Z"}