{"record":{"id":"9a954685d2af975f","repo":"pulumi/pulumi","slug":"source-snapshot-is-missing-extension-blob-s-v-re","errorCode":null,"errorMessage":"source snapshot is missing extension blob(s) %v referenced by moved resources","messagePattern":"source snapshot is missing extension blob\\(s\\) (.+?) referenced by moved resources","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/cmd/pulumi/state/state_move.go","lineNumber":478,"sourceCode":"\t\toptions := []string{\n\t\t\tyes,\n\t\t\tno,\n\t\t}\n\n\t\tswitch response := ui.PromptUser(msg, options, no, cmdutil.GetGlobalColorization()); response {\n\t\tcase yes:\n\t\t// continue\n\t\tcase no:\n\t\t\tfmt.Fprintln(cmd.Stdout, \"Confirmation denied, not proceeding with the state move\")\n\t\t\treturn nil\n\t\t}\n\t}\n\n\t// Carry extension blobs across the move so any moved resource's ExtensionRef\n\t// still resolves on the destination. Drop blobs the source no longer references.\n\tdestExts, missing := deploy.MapExtensions(destSnapshot.Resources, destSnapshot.Extensions, sourceSnapshot)\n\tif len(missing) > 0 {\n\t\treturn fmt.Errorf(\"source snapshot is missing extension blob(s) %v referenced by moved resources\", missing)\n\t}\n\tdestSnapshot.Extensions = destExts\n\tsourceSnapshot.Extensions, _ = deploy.MapExtensions(sourceSnapshot.Resources, sourceSnapshot.Extensions, nil)\n\n\terr = destSnapshot.VerifyIntegrity()\n\tif err != nil {\n\t\treturn fmt.Errorf(`failed to verify integrity of destination snapshot: %w\n\nThis is a bug! We would appreciate a report: https://github.com/pulumi/pulumi/issues/`, err)\n\t}\n\n\terr = sourceSnapshot.VerifyIntegrity()\n\tif err != nil {\n\t\treturn fmt.Errorf(`failed to verify integrity of source snapshot: %w\n\nThis is a bug! We would appreciate a report: https://github.com/pulumi/pulumi/issues/`, err)\n\t}\n","sourceCodeStart":460,"sourceCodeEnd":496,"githubUrl":"https://github.com/pulumi/pulumi/blob/793f7b2e160db4321fb7fb6b0607461e01cb251e/pkg/cmd/pulumi/state/state_move.go#L460-L496","documentation":"After collecting moved resources, `pulumi state move` calls `deploy.MapExtensions` to carry extension blobs from the source snapshot into the destination (state_move.go:474-479). If a moved resource references an ExtensionRef whose blob is absent from the source snapshot's Extensions map, the move aborts listing the missing blobs, since the moved resource would otherwise reference an unresolvable extension in the destination.","triggerScenarios":"A resource selected for the move carries an ExtensionRef, but the source snapshot's `Extensions` map lacks the corresponding blob hash — typically a corrupted or hand-edited source checkpoint, or state written by code that dropped extension blobs.","commonSituations":"Source state manually edited or truncated (extension blobs stripped by export/import tooling); state manipulated by an older/buggy CLI that didn't persist extension blobs; merging snapshots from different sources where blobs were lost.","solutions":["Restore the source stack from a checkpoint backup that still contains the extension blobs (backend history or `~/.pulumi/backups`)","Re-export/re-import the source state carefully (`pulumi stack export`/`import`) ensuring the `extensions` entries are preserved, then retry","Remove or recreate the affected moved resource so it no longer references the missing extension blob (e.g. `pulumi state delete` the resource and re-create it via `pulumi up`)","If blobs are legitimately absent, report it at https://github.com/pulumi/pulumi/issues — a source snapshot referencing missing blobs usually indicates corruption or a bug"],"exampleFix":"// before\n$ pulumi state move dest 'urn:pulumi:src::proj::pkg:type::res'\nerror: source snapshot is missing extension blob(s) [sha256:abcd...] referenced by moved resources\n\n// after: restore source snapshot with extension blobs intact\n$ pulumi stack select src && pulumi stack import --file restored-state.json\n$ pulumi state move dest 'urn:pulumi:src::proj::pkg:type::res'","handlingStrategy":"validation","validationCode":"# Ensure the source snapshot retains its extension blobs before moving\n$ pulumi stack select <src> && pulumi stack export | jq '.extensions // empty | length'\n# every moved resource's extensionRefs must have a matching entry; a length of 0 with extension refs present is a red flag","typeGuard":null,"tryCatchPattern":"if err := runStateMove(dest, urns); err != nil &&\n    strings.Contains(err.Error(), \"missing extension blob\") {\n    return fmt.Errorf(\"source state lost extension blobs; restore from backup before moving\")\n}","preventionTips":["Never hand-edit or strip fields from exported state files — keep `extensions` intact","Restore source state only from full checkpoint backups, not partial copies","After any export/import round-trip, diff against the original to confirm blobs survived","If extensions appear missing, stop and restore from backup rather than moving resources"],"tags":["pulumi","state","extensions","cli"],"backgroundTag":"missing-extension-blob","analyzedSha":"793f7b2e160db4321fb7fb6b0607461e01cb251e","analyzedAt":"2026-08-31T09:36:43.099Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}