{"record":{"id":"c45ece48f5999509","repo":"plandex-ai/plandex","slug":"error-storing-default-plan-config-v-c45ece","errorCode":null,"errorMessage":"error storing default plan config: %v","messagePattern":"error storing default plan config: (.+?)","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"app/server/handlers/plan_config.go","lineNumber":143,"sourceCode":"\tauth := Authenticate(w, r, true)\n\tif auth == nil {\n\t\treturn\n\t}\n\n\tvar req shared.UpdateDefaultPlanConfigRequest\n\terr := json.NewDecoder(r.Body).Decode(&req)\n\tif err != nil {\n\t\tlog.Println(\"Error decoding request body: \", err)\n\t\thttp.Error(w, \"Error decoding request body\", http.StatusBadRequest)\n\t\treturn\n\t}\n\n\terr = db.WithTx(r.Context(), \"update default plan config\", func(tx *sqlx.Tx) error {\n\n\t\terr := db.StoreDefaultPlanConfig(auth.User.Id, req.Config, tx)\n\t\tif err != nil {\n\t\t\tlog.Println(\"Error storing default plan config: \", err)\n\t\t\treturn fmt.Errorf(\"error storing default plan config: %v\", err)\n\t\t}\n\n\t\treturn nil\n\t})\n\n\tif err != nil {\n\t\tlog.Println(\"Error updating default plan config: \", err)\n\t\thttp.Error(w, \"Error updating default plan config\", http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\tlog.Println(\"UpdateDefaultPlanConfigHandler processed successfully\")\n}\n","sourceCodeStart":125,"sourceCodeEnd":157,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/server/handlers/plan_config.go#L125-L157","documentation":"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'.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before: config references a deleted custom provider\n{ \"config\": { \"plannerModel\": { \"provider\": \"my-deleted-provider\" } } }\n// after: re-add the provider or use a valid one\n{ \"config\": { \"plannerModel\": { \"provider\": \"anthropic\" } } }","handlingStrategy":"validation","validationCode":"// verify referenced model/provider names still exist before updating config\nconst known = await client.GetCustomModels() // returns org's custom models/providers\nconst refs = [config.plannerModel, config.coderModel, ...]\nfor (const r of refs.filter(Boolean)) {\n  if (r.custom && !known.models.some(m => m.ModelId === r.model)) {\n    throw new Error(`config references deleted model ${r.model}`)\n  }\n}\nawait client.UpdateDefaultPlanConfig(config)","typeGuard":null,"tryCatchPattern":"try {\n  await client.UpdateDefaultPlanConfig(config)\n} catch (err) {\n  if (String(err.message).includes('error storing default plan config')) {\n    // restore referenced custom models/providers or send a built-in-model config\n  }\n}","preventionTips":["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"],"tags":["database","transaction","plan-config"],"backgroundTag":"db-transaction-aborted","analyzedSha":"e2d772072efadbe41d2946d97d79be55532dbab5","analyzedAt":"2026-09-05T20:56:53.631Z","contentChangedAt":"2026-09-05T20:56:53.631Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}