{"record":{"id":"0a35962037e079ee","repo":"facebook/react","slug":"558","errorCode":"558","errorMessage":"Client rendering an Activity suspended it again. This is a bug in React.","messagePattern":"Client rendering an Activity suspended it again\\. This is a bug in React\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/react-reconciler/src/ReactFiberBeginWork.js","lineNumber":1137,"sourceCode":"        renderLanes,\n      );\n    } else if (\n      (workInProgress.memoizedState as null | ActivityState) !== null\n    ) {\n      // Something suspended and we should still be in dehydrated mode.\n      // Leave the existing child in place.\n\n      workInProgress.child = current.child;\n      // The dehydrated completion pass expects this flag to be there\n      // but the normal offscreen pass doesn't.\n      workInProgress.flags |= DidCapture;\n      return null;\n    } else {\n      // We called retryActivityComponentWithoutHydrating and tried client rendering\n      // but now we suspended again. We should never arrive here because we should\n      // not have pushed a suspense handler during that second pass and it should\n      // instead have suspended above.\n      throw new Error(\n        'Client rendering an Activity suspended it again. This is a bug in React.',\n      );\n    }\n  }\n}\n\nfunction updateActivityComponent(\n  current: null | Fiber,\n  workInProgress: Fiber,\n  renderLanes: Lanes,\n) {\n  const nextProps: ActivityProps = workInProgress.pendingProps;\n\n  // Check if the first pass suspended.\n  const didSuspend = (workInProgress.flags & DidCapture) !== NoFlags;\n  workInProgress.flags &= ~DidCapture;\n\n  if (current === null) {","sourceCodeStart":1119,"sourceCodeEnd":1155,"githubUrl":"https://github.com/facebook/react/blob/eafeac097ba51e1eab809c07102126bd5f8e5425/packages/react-reconciler/src/ReactFiberBeginWork.js#L1119-L1155","documentation":"updateActivityComponent() drives <Activity> boundaries during hydration. When a hydration attempt fails, React retries the boundary as a client render via retryActivityComponentWithoutHydrating. On a later render pass, arriving at the same boundary with no ForceClientRender flag and no remaining dehydrated state is a state the design treats as impossible, so it throws.","triggerScenarios":"Hydrating an <Activity> boundary whose content suspends; the first client-render retry suspends again inside the same boundary instead of bubbling to an outer Suspense handler. Reachable only through internal bugs in the dehydrated-Activity state machine, not through any supported public API.","commonSituations":"Streaming SSR with nested Activity/Suspense boundaries and client-suspending data; React canary builds after <Activity> shipped; selective hydration combined with Activity mode=\"hidden\".","solutions":["Update to the latest React canary - the Activity hydration state machine has received multiple fixes","Replace the <Activity> with <Suspense> in a repro to confirm the boundary type is required, then file an issue with the SSR + hydration steps","Preload the data used inside the Activity subtree so the client render resolves synchronously and never suspends twice","Verify server and client render the same tree shape around the boundary - conditional tree mismatches prolong the buggy path"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"Thrown during render, so an ErrorBoundary above the Activity boundary may catch it - but treat the tree as suspect: log the error, fall back to a non-Activity tree shape, and remount if the boundary keeps failing.","preventionTips":["Preload data used inside Activity boundaries so the client render never suspends twice","Keep react and react-dom on the same canary version","This path is explicitly labeled a React bug - capture a repro and file an issue"],"tags":["activity","hydration","suspense","ssr","invariant"],"backgroundTag":"react-hydration-invariant","analyzedSha":"eafeac097ba51e1eab809c07102126bd5f8e5425","analyzedAt":"2026-08-21T22:01:08.818Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}