{"record":{"id":"84b3ffbffc0d7423","repo":"facebook/react","slug":"could-not-suspend-id-suspendedset-i-since-th","errorCode":null,"errorMessage":"Could not suspend ID '${suspendedSet[i]}' since the instance can't be found.","messagePattern":"Could not suspend ID '(.+?)' since the instance can't be found\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/react-devtools-shared/src/backend/fiber/renderer.js","lineNumber":7578,"sourceCode":"   * @param suspendedSet List of IDs of SuspenseComponent Fibers\n   */\n  function overrideSuspenseMilestone(suspendedSet: Array<FiberInstance['id']>) {\n    if (\n      typeof setSuspenseHandler !== 'function' ||\n      typeof scheduleUpdate !== 'function'\n    ) {\n      throw new Error(\n        'Expected overrideSuspenseMilestone() to not get called for earlier React versions.',\n      );\n    }\n\n    const unsuspendedSet: Set<Fiber> = new Set(forceFallbackForFibers);\n\n    let resuspended = false;\n    for (let i = 0; i < suspendedSet.length; ++i) {\n      const instance = idToDevToolsInstanceMap.get(suspendedSet[i]);\n      if (instance === undefined) {\n        console.warn(\n          `Could not suspend ID '${suspendedSet[i]}' since the instance can't be found.`,\n        );\n        continue;\n      }\n\n      if (instance.kind === FIBER_INSTANCE) {\n        const fiber = instance.data;\n        if (\n          forceFallbackForFibers.has(fiber) ||\n          (fiber.alternate !== null &&\n            forceFallbackForFibers.has(fiber.alternate))\n        ) {\n          // We're already forcing fallback for this fiber. Mark it as not unsuspended.\n          unsuspendedSet.delete(fiber);\n          if (fiber.alternate !== null) {\n            unsuspendedSet.delete(fiber.alternate);\n          }\n        } else {","sourceCodeStart":7560,"sourceCodeEnd":7596,"githubUrl":"https://github.com/facebook/react/blob/eafeac097ba51e1eab809c07102126bd5f8e5425/packages/react-devtools-shared/src/backend/fiber/renderer.js#L7560-L7596","documentation":"overrideSuspenseMilestone() implements the Suspense scrubber: given a suspendedSet of element ids captured at a milestone, it re-suspends each one. When an id from that set is no longer in idToDevToolsInstanceMap it warns 'Could not suspend ID ... since the instance can't be found' and continues with the remaining ids. The set is a point-in-time snapshot, so any boundary that unmounted since the milestone was recorded triggers this; the scrub still applies to everything that survives.","triggerScenarios":"Scrubbing the Suspense timeline back to a milestone whose boundaries have since unmounted (route change, list mutation); a milestone recorded before an HMR remount; scrubbing after component filters removed a boundary from the tracked tree.","commonSituations":"Using the Suspense scrubber on apps whose boundaries churn between milestones; live-reload during timeline inspection; automated replay harnesses feeding old milestone snapshots.","solutions":["Accept the partial scrub - remaining boundaries still re-suspend; re-record a milestone on the current tree for a full set.","Reload the page and recapture milestones so the suspendedSet matches live ids.","Avoid unmounting/remounting boundaries between recording a milestone and scrubbing to it.","Embedders: filter your suspendedSet against live store ids (store.getElementByID) before invoking the scrub API."],"exampleFix":"// before\nbridge.send('overrideSuspenseMilestone', {rendererID, suspendedSet});\n\n// after - drop ids that no longer resolve before scrubbing\nconst liveSet = suspendedSet.filter(id => store.getElementByID(id) !== null);\nbridge.send('overrideSuspenseMilestone', {rendererID, suspendedSet: liveSet});","handlingStrategy":"validation","validationCode":"// before scrubbing to a milestone, keep only ids that still resolve\nconst liveSuspendedSet = suspendedSet.filter(id => store.getElementByID(id) !== null);\nbridge.send('overrideSuspenseMilestone', {rendererID, suspendedSet: liveSuspendedSet});","typeGuard":"function isLiveElement(store: Store, id: number): boolean %checks {\n  return store.getElementByID(id) !== null;\n}","tryCatchPattern":null,"preventionTips":["Remember suspendedSet is a snapshot: re-validate each id against the live tree before scrubbing.","Re-record milestones after unmounts/HMR instead of scrubbing to stale snapshots.","Design for partial success - the backend skips missing ids and still suspends the rest.","In replay tooling, map old ids to remounted elements or drop them before invoking the scrub."],"tags":["react-devtools","suspense","time-travel","stale-id","console-warning"],"backgroundTag":"stale-element-reference","analyzedSha":"eafeac097ba51e1eab809c07102126bd5f8e5425","analyzedAt":"2026-08-21T22:01:08.818Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}