hashicorp/terraform · error
Failed to convert provider version to Go version
Error message
Failed to convert provider version to Go version: %s
What it means
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.
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.
Example fix
# before: lock file has version = "0.0.0" rm .terraform.lock.hcl terraform init -upgrade # after terraform state migrate
Defensive patterns
Strategy: validation
Validate before calling
// Verify the state-store provider version string parses as semver before migration.
if v := destinationLock.Provider(rootMod.StateStore.ProviderAddr).Version(); v == "" {
return fmt.Errorf("state-store provider %s has empty version in lock file", rootMod.StateStore.ProviderAddr)
}
if _, err := providerreqs.GoVersionFromVersion(v); err != nil {
return fmt.Errorf("state-store provider version %q is not valid semver: %w", v, err)
} Try / catch
version, err := providerreqs.GoVersionFromVersion(v)
if err != nil {
// Treat as recoverable: regenerate the lock file.
diags = diags.Append(fmt.Errorf("Failed to convert provider version to Go version: %s; delete .terraform.lock.hcl and re-init", err))
view.Diagnostics(diags)
return 1
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Failed obtain the in-use version of provider
- Failed to set state store provider configuration
- error when obtaining provider instance during state store…
- failed to read dependency lock file
- Failed to set state store configuration
AI-assisted analysis of hashicorp/terraform@d32a084675 (2026-08-11).
Data as JSON: /api/errors/605be1dde8212c84.
Report an issue: GitHub.
Appendix: source
Thrown at internal/command/state_migrate.go:292
if !diags.HasErrors() {
migrateOpts.DestinationType = rootMod.StateStore.Type
migrateOpts.Destination = dstB
}
// Capture details of the destination state store for updating the backend state file after a successful migration.
_, cHash, sscDiags := c.stateStoreConfig(&BackendOpts{
StateStoreConfig: rootMod.StateStore,
Locks: destinationLock,
})
diags = diags.Append(sscDiags)
if sscDiags.HasErrors() {
view.Diagnostics(diags)
return 1
}
v := destinationLock.Provider(rootMod.StateStore.ProviderAddr).Version() // We just downloaded this provider, so the lock wil be present.
version, err := providerreqs.GoVersionFromVersion(v)
if err != nil {
diags = diags.Append(fmt.Errorf("Failed to convert provider version to Go version: %s", err))
view.Diagnostics(diags)
return 1
}
bsf.StateStore = &workdir.StateStoreConfigState{
Type: rootMod.StateStore.Type,
Hash: uint64(cHash),
Provider: &workdir.ProviderConfigState{
Source: &rootMod.StateStore.ProviderAddr,
Version: version,
},
ProviderSupplyMode: rootMod.StateStore.ProviderSupplyMode,
}
err = bsf.StateStore.SetConfig(stateStoreConfigVal, dstB.ConfigSchema())
if err != nil {
diags = diags.Append(fmt.Errorf("Failed to set state store configuration: %w", err))
view.Diagnostics(diags)
return 1View on GitHub (pinned to d32a084675)