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

  1. Inspect `.terraform.lock.hcl` for the state-store provider's version string and verify it is valid semver.
  2. Pin the state-store provider to a known-good released version in `required_providers`.
  3. Remove provider dev overrides (TF_CLI_CONFIG_FILE / use_provider_dev_overrides) for the state-store provider.
  4. 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

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


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 1

View on GitHub (pinned to d32a084675)