pulumi/pulumi · error

unknown step status %v

Error message

unknown step status %v

What it means

Thrown by unmarshalStepStatus when a pulumirpc.ViewStep_Status enum value has no mapping to a local resource.Status (anything outside OK, PARTIAL_FAILURE, UNKNOWN). It means the status field of a view step message is unrecognized by this engine version.

Source

Thrown at pkg/resource/deploy/resource_status.go:511

		return OpImportReplacement, nil
	case pulumirpc.ViewStep_UNSPECIFIED:
		fallthrough
	default:
		return "", fmt.Errorf("unknown step op %v", op)
	}
}

// unmarshalStepStatus unmarshals a pulumirpc.ViewStep_Status into a resource.Status.
func (rs *resourceStatusServer) unmarshalStepStatus(s pulumirpc.ViewStep_Status) (resource.Status, error) {
	switch s {
	case pulumirpc.ViewStep_OK:
		return resource.StatusOK, nil
	case pulumirpc.ViewStep_PARTIAL_FAILURE:
		return resource.StatusPartialFailure, nil
	case pulumirpc.ViewStep_UNKNOWN:
		return resource.StatusUnknown, nil
	default:
		return 0, fmt.Errorf("unknown step status %v", s)
	}
}

View on GitHub (pinned to 793f7b2e16)

Solutions

  1. Upgrade the pulumi CLI to a version that knows the status constant
  2. Keep engine and CLI versions in sync
  3. Have message producers emit only documented status values (OK, PARTIAL_FAILURE, UNKNOWN)
  4. Regenerate pulumirpc bindings for custom tools

Example fix

// before
default: return 0, fmt.Errorf("unknown step status %v", s)
// after: add mapping for the new constant
case pulumirpc.ViewStep_NEW_STATUS: return resource.StatusNewStatus, nil
Defensive patterns

Strategy: type-guard

Validate before calling

if s != pulumirpc.ViewStep_SUCCEEDED && s != pulumirpc.ViewStep_PARTIAL_FAILURE && s != pulumirpc.ViewStep_UNKNOWN {
    return fmt.Errorf("status %v not mappable", s)
}

Type guard

func knownStepStatus(s pulumirpc.ViewStep_Status) bool {
    switch s {
    case pulumirpc.ViewStep_SUCCEEDED, pulumirpc.ViewStep_PARTIAL_FAILURE, pulumirpc.ViewStep_UNKNOWN:
        return true
    }
    return false
}

Try / catch

if err != nil && strings.Contains(err.Error(), "unknown step status") {
    return fmt.Errorf("unsupported status enum; upgrade CLI: %w", err)
}

Prevention

When it happens

Trigger: A newer proto adds a ViewStep status constant that an older CLI cannot map; a message carries an out-of-range or uninitialized status value.

Common situations: Mixed CLI/engine versions during upgrades; custom gRPC tooling sending unmapped status constants; stale generated bindings.

Related errors


AI-assisted analysis of pulumi/pulumi@793f7b2e16 (2026-08-31). Data as JSON: /api/errors/8721f97a703db55e. Report an issue: GitHub.