plandex-ai/plandex · error

Error getting current plan state:

Error message

Error getting current plan state: 

What it means

CurrentPlanHandler failed inside its ExecRepoOperation block: either checking out the requested sha, or db.GetCurrentPlanState reading the plan's git-backed state from the database. The handler responds 500 with the underlying error string appended, so the exact cause (checkout failure, DB error, lock failure) is in the response and server log.

Source

Thrown at app/server/handlers/plans_changes.go:89

				}
			}()
		}

		planState, err = db.GetCurrentPlanState(db.CurrentPlanStateParams{
			OrgId:  auth.OrgId,
			PlanId: planId,
		})

		if err != nil {
			return fmt.Errorf("error getting current plan state: %v", err)
		}

		return nil
	})

	if err != nil {
		log.Printf("Error getting current plan state: %v\n", err)
		http.Error(w, "Error getting current plan state: "+err.Error(), http.StatusInternalServerError)
		return
	}

	jsonBytes, err := json.Marshal(planState)

	if err != nil {
		log.Printf("Error marshalling plan state: %v\n", err)
		http.Error(w, "Error marshalling plan state: "+err.Error(), http.StatusInternalServerError)
		return
	}

	log.Println("Successfully retrieved current plan state")

	w.Write(jsonBytes)
}

func ApplyPlanHandler(w http.ResponseWriter, r *http.Request) {
	log.Println("Received request for ApplyPlanHandler")

View on GitHub (pinned to e2d772072e)

Solutions

  1. Read the appended error detail in the 500 response — it names the failing step (checkout vs. state query)
  2. If a sha was passed, verify it exists on the branch (git rev-parse) and retry without the sha parameter
  3. Check for a stuck repo lock from a crashed session and that Postgres is healthy
  4. If the plan state is corrupt, reject all pending changes or restore the plan from backup

Example fix

null
Defensive patterns

Strategy: try-catch

Validate before calling

if (sha) { /* confirm sha exists on the branch, e.g. via plan revisions list, before requesting it */ }

Type guard

null

Try / catch

try {
  const res = await fetch(currentPlanUrl);
  if (!res.ok) {
    const msg = await res.text(); // includes underlying cause (checkout/DB/lock)
    if (msg.includes('error checking out sha')) { /* retry without sha param */ }
    throw new Error(msg);
  }
  const planState = await res.json();
} catch (err) { /* handle */ }

Prevention

When it happens

Trigger: GET current plan with ?sha=<sha> where the sha does not exist or checkout fails; GetCurrentPlanState DB query fails; repo operation lock cannot be acquired or context is cancelled during the read.

Common situations: Client caching a sha that was garbage-collected or belongs to another branch; Postgres unavailable; concurrent operation holding the plan repo lock; plan corrupted by an interrupted apply.

Related errors


AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05). Data as JSON: /api/errors/d226bb9f761dfc72. Report an issue: GitHub.