{"record":{"id":"4e75bbb0c980f1ab","repo":"facebook/react","slug":"490","errorCode":"490","errorMessage":"Expected the resume to render <Suspense> in this slot but instead it rendered <${getComponentNameFromType(type) || 'Unknown'}>. The tree doesn't match so React will fallback to client rendering.","messagePattern":"Expected the resume to render <Suspense> in this slot but instead it rendered <(.+?)>\\. The tree doesn't match so React will fallback to client rendering\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"packages/react-server/src/ReactFizzServer.js","lineNumber":3323,"sourceCode":"        // replay nodes which might be Suspense boundaries which are able to\n        // absorb the error and we can still continue with siblings.\n        const thrownInfo = getThrownInfo(task.componentStack);\n        erroredReplay(\n          request,\n          task.blockedBoundary,\n          request.aborted ? request.fatalError : x,\n          thrownInfo,\n          childNodes,\n          childSlots,\n          __DEV__ ? task.debugTask : null,\n        );\n      }\n      task.replay = replay;\n    } else {\n      // Let's double check that the component type matches.\n      if (type !== REACT_SUSPENSE_TYPE) {\n        const expectedType = 'Suspense';\n        throw new Error(\n          'Expected the resume to render <' +\n            expectedType +\n            '> in this slot but instead it rendered <' +\n            (getComponentNameFromType(type) || 'Unknown') +\n            '>. ' +\n            \"The tree doesn't match so React will fallback to client rendering.\",\n        );\n      }\n      // Matched a replayable path.\n      replaySuspenseBoundary(\n        request,\n        task,\n        keyPath,\n        props,\n        node[5],\n        node[2],\n        node[3],\n        node[4] === null ? [] : node[4][2],","sourceCodeStart":3305,"sourceCodeEnd":3341,"githubUrl":"https://github.com/facebook/react/blob/eafeac097ba51e1eab809c07102126bd5f8e5425/packages/react-server/src/ReactFizzServer.js#L3305-L3341","documentation":"During resume, a recorded replay slot was a Suspense boundary, but the resumed render placed a component whose type is not REACT_SUSPENSE_TYPE at that position. React throws error code 490 and the boundary falls back to client rendering.","triggerScenarios":"Wrapping or unwrapping a subtree in <Suspense> between prerender and resume; a code change or flag adding/removing a Suspense boundary at a recorded slot; a framework version change that alters where Suspense boundaries are injected.","commonSituations":"Code changes between build-time prerender and runtime resume; conditional Suspense wrappers; framework upgrades that inject Suspense boundaries differently across versions.","solutions":["Keep the Suspense structure identical between the prerender and resume passes","Do not conditionally wrap subtrees in Suspense based on runtime state","Regenerate prerendered payloads whenever the Suspense layout changes"],"exampleFix":"// before\n// prerender slot: <Suspense><Row /></Suspense>\n// resume slot: <Row /> (wrapper removed) -> throws\n\n// after\n// keep the boundary in both passes\nreturn <Suspense fallback={<Skeleton />}><Row /></Suspense>;","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"// React catches this and client-renders the boundary; no user try/catch needed.\n// Log via the render/resume error hooks:\n//   onError(err) { log.warn('Suspense slot mismatch -> client fallback:', err.message); }","preventionTips":["Keep Suspense boundary placement identical between prerender and resume","Never conditionally wrap subtrees in Suspense based on runtime state","Regenerate payloads after changes to Suspense structure"],"tags":["ssr","resume","tree-mismatch","suspense"],"backgroundTag":"ssr-resume-tree-mismatch","analyzedSha":"eafeac097ba51e1eab809c07102126bd5f8e5425","analyzedAt":"2026-08-21T22:01:08.818Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}