{"record":{"id":"ac8ed736ad377b63","repo":"facebook/react","slug":"a-dehydrated-suspense-node-should-not-have-a-conte","errorCode":null,"errorMessage":"A dehydrated Suspense node should not have a content Fiber.","messagePattern":"A dehydrated Suspense node should not have a content Fiber\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/react-devtools-shared/src/backend/fiber/renderer.js","lineNumber":3653,"sourceCode":"        const hydrated = isFiberHydrated(fiber);\n        if (hydrated) {\n          if (contentFiberInstance === null) {\n            throw new Error(\n              'There should always be an Offscreen Fiber child in a hydrated Suspense boundary.',\n            );\n          }\n\n          unmountSuspenseChildrenRecursively(\n            contentFiberInstance,\n            stashedSuspenseParent,\n            stashedSuspensePrevious,\n            stashedSuspenseRemaining,\n          );\n          // unmountSuspenseChildren already popped\n          shouldPopSuspenseNode = false;\n        } else {\n          if (contentFiberInstance !== null) {\n            throw new Error(\n              'A dehydrated Suspense node should not have a content Fiber.',\n            );\n          }\n        }\n      } else {\n        unmountRemainingChildren();\n      }\n      removePreviousSuspendedBy(\n        instance,\n        previousSuspendedBy,\n        reconcilingParentSuspenseNode,\n      );\n    } finally {\n      reconcilingParent = stashedParent;\n      previouslyReconciledSibling = stashedPrevious;\n      remainingReconcilingChildren = stashedRemaining;\n      if (shouldPopSuspenseNode) {\n        reconcilingParentSuspenseNode = stashedSuspenseParent;","sourceCodeStart":3635,"sourceCodeEnd":3671,"githubUrl":"https://github.com/facebook/react/blob/eafeac097ba51e1eab809c07102126bd5f8e5425/packages/react-devtools-shared/src/backend/fiber/renderer.js#L3635-L3671","documentation":"Companion invariant to the previous unmount check, on the dehydrated branch: a Suspense boundary that isFiberHydrated reports false must not have any remaining content fiber instances. The backend treats dehydrated boundaries as childless until hydration, so leftover content instances indicate corrupted reconciliation state or a tree shape the backend does not understand.","triggerScenarios":"Unmounting a Suspense boundary that is still dehydrated but somehow has mirrored content instances under it; hydration state flapping between commits; renderer/DevTools disagreement about memoizedState / hydration flags.","commonSituations":"Streaming SSR with boundaries that never hydrated before unmount; canary React hydration changes with an older DevTools backend; race between unmount commits and backend traversal.","solutions":["Update React DevTools / react-devtools-shared to the matching React build","Reload the page to rebuild backend state if DevTools stops responding after the error","Report with details of SSR streaming setup and which boundaries were unmounted before hydration","If embedding, catch invariant errors from the commit hook and rebuild the mirror from scratch as recovery"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  backend.handleCommitFiberRoot(renderer, root);\n} catch (e) {\n  if (/dehydrated Suspense node should not have a content Fiber/.test(e.message)) {\n    scheduleBackendReset(); // hydration state bookkeeping diverged\n  } else throw e;\n}","preventionTips":["Match renderer and DevTools builds; dehydration/hydration flag semantics changed across releases","Let unmounted streaming boundaries be cleaned up before deep inspection","Report interleavings of unmount commits with hydration completion","Reset backend state on first invariant error to avoid cascades"],"tags":["react-devtools","invariant","suspense","hydration","unmount","internal"],"backgroundTag":"suspense-boundary-invariant-violation","analyzedSha":"eafeac097ba51e1eab809c07102126bd5f8e5425","analyzedAt":"2026-08-21T22:01:08.818Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}