plandex-ai/plandex · error
error storing default plan config: %v
Error message
error storing default plan config: %v
What it means
Returned from the update-default-plan-config transaction when db.StoreDefaultPlanConfig fails to persist the user's default model pack config. The WithTx closure aborts and the handler responds 500 'Error updating default plan config'.
Source
Thrown at app/server/handlers/plan_config.go:143
auth := Authenticate(w, r, true)
if auth == nil {
return
}
var req shared.UpdateDefaultPlanConfigRequest
err := json.NewDecoder(r.Body).Decode(&req)
if err != nil {
log.Println("Error decoding request body: ", err)
http.Error(w, "Error decoding request body", http.StatusBadRequest)
return
}
err = db.WithTx(r.Context(), "update default plan config", func(tx *sqlx.Tx) error {
err := db.StoreDefaultPlanConfig(auth.User.Id, req.Config, tx)
if err != nil {
log.Println("Error storing default plan config: ", err)
return fmt.Errorf("error storing default plan config: %v", err)
}
return nil
})
if err != nil {
log.Println("Error updating default plan config: ", err)
http.Error(w, "Error updating default plan config", http.StatusInternalServerError)
return
}
log.Println("UpdateDefaultPlanConfigHandler processed successfully")
}
View on GitHub (pinned to e2d772072e)
Solutions
- Check logs for the wrapped error to identify the exact Postgres failure
- Verify every model/provider/pack name in the request config still exists for the org/user before updating
- Retry after restoring deleted custom models/providers or sending a valid config
- Check DB connectivity/pool if the cause is a connection error
Example fix
// before: config references a deleted custom provider
{ "config": { "plannerModel": { "provider": "my-deleted-provider" } } }
// after: re-add the provider or use a valid one
{ "config": { "plannerModel": { "provider": "anthropic" } } } Defensive patterns
Strategy: validation
Validate before calling
// verify referenced model/provider names still exist before updating config
const known = await client.GetCustomModels() // returns org's custom models/providers
const refs = [config.plannerModel, config.coderModel, ...]
for (const r of refs.filter(Boolean)) {
if (r.custom && !known.models.some(m => m.ModelId === r.model)) {
throw new Error(`config references deleted model ${r.model}`)
}
}
await client.UpdateDefaultPlanConfig(config) Try / catch
try {
await client.UpdateDefaultPlanConfig(config)
} catch (err) {
if (String(err.message).includes('error storing default plan config')) {
// restore referenced custom models/providers or send a built-in-model config
}
} Prevention
- Never send default configs that reference custom models/providers deleted in another tab/process
- Fetch the current config (GetDefaultPlanConfig) and merge rather than blind-overwrite
- Retry transient failures — the tx rollback leaves the old config in place
When it happens
Trigger: POST to the update-default-plan-config endpoint where db.StoreDefaultPlanConfig(userId, req.Config, tx) returns a DB error: FK violation from an unknown model pack/provider in the config, oversized payload, connection failure, or deadlock.
Common situations: Client sends a config referencing custom models/providers that were deleted server-side; DB connectivity problems; concurrent updates to the same user's config deadlocking.
Related errors
- error creating invite: %v
- error deleting invite: %v
- error accepting invite: %v
- error creating org user: %v
- error starting transaction: %v
AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05).
Data as JSON: /api/errors/c45ece48f5999509.
Report an issue: GitHub.