{"record":{"id":"52bb59aa82691e3b","repo":"facebook/react","slug":"489","errorCode":"489","errorMessage":"Expected the resume to render <${node[0]}> in this slot but instead it rendered <${name}>. The tree doesn't match so React will fallback to client rendering.","messagePattern":"Expected the resume to render <(.+?)> 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":3256,"sourceCode":"  childIndex: number,\n  type: any,\n  props: Object,\n  ref: any,\n  replay: ReplaySet,\n): void {\n  // We're replaying. Find the path to follow.\n  const replayNodes = replay.nodes;\n  for (let i = 0; i < replayNodes.length; i++) {\n    // Flow doesn't support refinement on tuples so we do it manually here.\n    const node = replayNodes[i];\n    if (keyOrIndex !== node[1]) {\n      continue;\n    }\n    if (node.length === 4) {\n      // Matched a replayable path.\n      // Let's double check that the component name matches as a precaution.\n      if (name !== null && name !== node[0]) {\n        throw new Error(\n          'Expected the resume to render <' +\n            (node[0] as any) +\n            '> in this slot but instead it rendered <' +\n            name +\n            '>. ' +\n            \"The tree doesn't match so React will fallback to client rendering.\",\n        );\n      }\n      const childNodes = node[2];\n      const childSlots = node[3];\n      const currentNode = task.node;\n      task.replay = {nodes: childNodes, slots: childSlots, pendingTasks: 1};\n      try {\n        renderElement(request, task, keyPath, type, props, ref);\n        if (\n          task.replay.pendingTasks === 1 &&\n          task.replay.nodes.length > 0\n          // TODO check remaining slots","sourceCodeStart":3238,"sourceCodeEnd":3274,"githubUrl":"https://github.com/facebook/react/blob/eafeac097ba51e1eab809c07102126bd5f8e5425/packages/react-server/src/ReactFizzServer.js#L3238-L3274","documentation":"During resume, a slot recorded at prerender time expected a component named X (stored as node[0]), but the resumed render produced a component with a different name at the same key/index. As a precaution React verifies the name matches; on mismatch it throws error code 489 and the boundary falls back to client rendering.","triggerScenarios":"The component at a given position changed identity between prerender and resume: a renamed component, a dynamic import resolving to a different implementation, an A/B flag flipping the branch, or a different dependency version in the resume environment.","commonSituations":"Deploying renamed components while resuming old prerendered payloads; per-request feature flags choosing different components; vendored vs npm versions of a component resolving differently.","solutions":["Render the same component at each slot in both passes (pin code versions between prerender and resume)","Keep the component at the slot stable and vary only its props instead of its identity","Move flag-dependent component choices behind a postponed or client-rendered boundary","Regenerate the prerendered payload after renaming or swapping components"],"exampleFix":"// before\n// prerender: <OldButton>; resume (flag flipped): <NewButton> in the same slot -> throws\nreturn flag ? <NewButton /> : <OldButton />;\n\n// after\n// keep one stable component at the slot and vary props\nreturn <Button variant={flag ? 'new' : 'old'} />;","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('slot component mismatch -> client fallback:', err.message); }","preventionTips":["Keep the component identity at each resumed slot stable across passes","Vary props, not component identity, when behavior must differ","Regenerate prerendered payloads whenever components are renamed or swapped"],"tags":["ssr","resume","tree-mismatch","component-mismatch"],"backgroundTag":"ssr-resume-tree-mismatch","analyzedSha":"eafeac097ba51e1eab809c07102126bd5f8e5425","analyzedAt":"2026-08-21T22:01:08.818Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}