{"record":{"id":"605be1dde8212c84","repo":"hashicorp/terraform","slug":"failed-to-convert-provider-version-to-go-version","errorCode":null,"errorMessage":"Failed to convert provider version to Go version: %s","messagePattern":"Failed to convert provider version to Go version: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/command/state_migrate.go","lineNumber":292,"sourceCode":"\t\tif !diags.HasErrors() {\n\t\t\tmigrateOpts.DestinationType = rootMod.StateStore.Type\n\t\t\tmigrateOpts.Destination = dstB\n\t\t}\n\n\t\t// Capture details of the destination state store for updating the backend state file after a successful migration.\n\t\t_, cHash, sscDiags := c.stateStoreConfig(&BackendOpts{\n\t\t\tStateStoreConfig: rootMod.StateStore,\n\t\t\tLocks:            destinationLock,\n\t\t})\n\t\tdiags = diags.Append(sscDiags)\n\t\tif sscDiags.HasErrors() {\n\t\t\tview.Diagnostics(diags)\n\t\t\treturn 1\n\t\t}\n\t\tv := destinationLock.Provider(rootMod.StateStore.ProviderAddr).Version() // We just downloaded this provider, so the lock wil be present.\n\t\tversion, err := providerreqs.GoVersionFromVersion(v)\n\t\tif err != nil {\n\t\t\tdiags = diags.Append(fmt.Errorf(\"Failed to convert provider version to Go version: %s\", err))\n\t\t\tview.Diagnostics(diags)\n\t\t\treturn 1\n\t\t}\n\n\t\tbsf.StateStore = &workdir.StateStoreConfigState{\n\t\t\tType: rootMod.StateStore.Type,\n\t\t\tHash: uint64(cHash),\n\t\t\tProvider: &workdir.ProviderConfigState{\n\t\t\t\tSource:  &rootMod.StateStore.ProviderAddr,\n\t\t\t\tVersion: version,\n\t\t\t},\n\t\t\tProviderSupplyMode: rootMod.StateStore.ProviderSupplyMode,\n\t\t}\n\t\terr = bsf.StateStore.SetConfig(stateStoreConfigVal, dstB.ConfigSchema())\n\t\tif err != nil {\n\t\t\tdiags = diags.Append(fmt.Errorf(\"Failed to set state store configuration: %w\", err))\n\t\t\tview.Diagnostics(diags)\n\t\t\treturn 1","sourceCodeStart":274,"sourceCodeEnd":310,"githubUrl":"https://github.com/hashicorp/terraform/blob/d32a084675427f5ac3f7d2868578ef8b2c1dc525/internal/command/state_migrate.go#L274-L310","documentation":"Thrown during state-store migration after the destination state-store provider is downloaded; providerreqs.GoVersionFromVersion(v) cannot turn the provider's version into a Go semver-compatible version for storage in ProviderConfigState.Version. The version came from the just-fetched dependency lock. Uses %s so the parse error is flattened to a string.","triggerScenarios":"The downloaded state-store provider lock entry has a version string that Go's semver parser rejects: leading zeros, non-semver build tags, a version with invalid prerelease syntax, or an empty version field.","commonSituations":"State-store provider published with a non-semver tag (e.g. `v1.0` without patch, or `1.0.0+build.999` with disallowed chars); corrupted lock file; dev override pointing at a build with `0.0.0` placeholder; prerelease provider with malformed metadata.","solutions":["Inspect `.terraform.lock.hcl` for the state-store provider's version string and verify it is valid semver.","Pin the state-store provider to a known-good released version in `required_providers`.","Remove provider dev overrides (TF_CLI_CONFIG_FILE / use_provider_dev_overrides) for the state-store provider.","Delete `.terraform.lock.hcl` and re-run `terraform init` to regenerate from registry metadata."],"exampleFix":"# before: lock file has version = \"0.0.0\"\n rm .terraform.lock.hcl\n terraform init -upgrade\n\n# after\n terraform state migrate","handlingStrategy":"validation","validationCode":"// Verify the state-store provider version string parses as semver before migration.\nif v := destinationLock.Provider(rootMod.StateStore.ProviderAddr).Version(); v == \"\" {\n    return fmt.Errorf(\"state-store provider %s has empty version in lock file\", rootMod.StateStore.ProviderAddr)\n}\nif _, err := providerreqs.GoVersionFromVersion(v); err != nil {\n    return fmt.Errorf(\"state-store provider version %q is not valid semver: %w\", v, err)\n}","typeGuard":null,"tryCatchPattern":"version, err := providerreqs.GoVersionFromVersion(v)\nif err != nil {\n    // Treat as recoverable: regenerate the lock file.\n    diags = diags.Append(fmt.Errorf(\"Failed to convert provider version to Go version: %s; delete .terraform.lock.hcl and re-init\", err))\n    view.Diagnostics(diags)\n    return 1\n}","preventionTips":["Commit `.terraform.lock.hcl` from a clean `terraform init` run.","Pin state-store provider versions explicitly in required_providers.","Disable provider dev overrides during migrations.","Reject provider releases with non-semver tags in your registry pipeline."],"tags":["terraform","state-migration","state-store","provider","semver","lock-file"],"backgroundTag":null,"analyzedSha":"d32a084675427f5ac3f7d2868578ef8b2c1dc525","analyzedAt":"2026-08-11T18:43:52.779Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}