hashicorp/terraform · warning

can't display a cloud plan that is currently

Error message

can't display a cloud plan that is currently %s

What it means

Thrown by Cloud.ShowPlanForRun in the default branch of the switch over r.Plan.Status. Only PlanFinished and PlanErrored are displayable (errored plans may still have partial output). Any other status — pending, queued, running, canceled, canceled-by-user — means the plan is not in a viewable final state and cannot be rendered.

Solutions

  1. Wait for the run's plan to reach 'finished' (or 'errored') status in HCP Terraform, then re-run `terraform show`.
  2. If the plan was canceled, start a new run and show that one instead.
  3. Check the run status in the HCP Terraform UI to confirm it has reached a terminal plan state.
Defensive patterns

Strategy: retry

Validate before calling

// Poll run plan status until terminal before showing.
for r.Plan.Status != tfe.PlanFinished && r.Plan.Status != tfe.PlanErrored {
    // wait and re-read r
}

Type guard

func planDisplayable(s tfe.PlanStatus) bool {
    return s == tfe.PlanFinished || s == tfe.PlanErrored
}

Prevention

When it happens

Trigger: The referenced run's plan is still in progress (status pending/running/queued) or was canceled before producing output. `terraform show` on a cloud plan reference whose plan hasn't reached a terminal state.

Common situations: Showing a plan reference for a run that is still executing; showing a plan that was canceled; race between plan creation and `terraform show` before the plan finishes streaming.

Related errors


AI-assisted analysis of hashicorp/terraform@d32a084675 (2026-08-11). Data as JSON: /api/errors/d8b4fdf0db8a70f5. Report an issue: GitHub.

Appendix: source

Thrown at internal/cloud/backend_show.go:58

	if r.IsDestroy {
		mode = plans.DestroyMode
	} else if r.RefreshOnly {
		mode = plans.RefreshOnlyMode
	}

	// Check that the plan actually finished
	switch r.Plan.Status {
	case tfe.PlanErrored:
		// Errored plans might still be displayable, but we want to mention it to the renderer.
		opts = append(opts, plans.Errored)
	case tfe.PlanFinished:
		// Good to go, but alert the renderer if it has no changes.
		if !r.Plan.HasChanges {
			opts = append(opts, plans.NoChanges)
		}
	default:
		// Bail, we can't use this.
		err = fmt.Errorf("can't display a cloud plan that is currently %s", r.Plan.Status)
		return nil, err
	}

	// Fetch the json plan!
	if redacted {
		jsonBytes, err = readRedactedPlan(ctx, b.client.BaseURL(), b.Token, r.Plan.ID)
	} else {
		jsonBytes, err = b.client.Plans.ReadJSONOutput(ctx, r.Plan.ID)
	}
	if err == tfe.ErrResourceNotFound {
		if redacted {
			return nil, fmt.Errorf("couldn't read plan data for cloud run %s; make sure you've run `terraform login` and that you have permission to view the run", runID)
		} else {
			return nil, fmt.Errorf("couldn't read unredacted JSON plan data for cloud run %s; make sure you've run `terraform login` and that you have admin permissions on the workspace", runID)
		}
	} else if err != nil {
		return nil, fmt.Errorf("couldn't read plan data for cloud run %s: %w", runID, err)
	}

View on GitHub (pinned to d32a084675)