plandex-ai/plandex · error
error deleting draft plans: %v
Error message
error deleting draft plans: %v
What it means
DeleteDraftPlans removes all plans named 'draft' for a project+owner and returns their ids. This error wraps a failure of the DELETE ... RETURNING query itself, meaning the database refused or could not execute the statement (connection issue, SQL error).
Source
Thrown at app/server/db/plan_helpers.go:355
bytes, err := json.Marshal(description)
if err != nil {
return fmt.Errorf("error marshalling convo message description: %v", err)
}
err = os.WriteFile(filepath.Join(descriptionsDir, description.Id+".json"), bytes, os.ModePerm)
if err != nil {
return fmt.Errorf("error writing convo message description: %v", err)
}
return nil
}
func DeleteDraftPlans(orgId, projectId, userId string) error {
res, err := Conn.Query("DELETE FROM plans WHERE project_id = $1 AND owner_id = $2 AND name = 'draft' RETURNING id;", projectId, userId)
if err != nil {
return fmt.Errorf("error deleting draft plans: %v", err)
}
defer res.Close()
// get ids
var ids []string
for res.Next() {
var id string
err := res.Scan(&id)
if err != nil {
return fmt.Errorf("error scanning deleted draft plan id: %v", err)
}
ids = append(ids, id)
}
errCh := make(chan error, len(ids))
for _, planId := range ids {View on GitHub (pinned to e2d772072e)
Solutions
- Check the wrapped driver error for the exact Postgres failure
- Verify DB connectivity and connection-pool limits
- Confirm schema migrations ran (plans table, project_id/owner_id columns exist)
- Enable driver-level retry/reconnect on transient connection errors
Example fix
// before
if err != nil {
return fmt.Errorf("error deleting draft plans: %v", err)
}
// after
if err != nil {
return fmt.Errorf("error deleting draft plans: %w", err)
} Defensive patterns
Strategy: retry
Validate before calling
if err := db.PingContext(ctx); err != nil {
return fmt.Errorf("database unreachable: %w", err)
} Try / catch
err := DeleteDraftPlans(orgId, projectId, userId)
if err != nil {
if isTransientDBError(err) { // net.Error, driver.ErrBadConn
err = retry(3, func() error { return DeleteDraftPlans(orgId, projectId, userId) })
}
return err
} Prevention
- Keep migrations in sync with deployed code
- Use database/sql retry on driver.ErrBadConn
- Monitor connection-pool saturation
- Verify DELETE privileges for the app DB role
When it happens
Trigger: Conn.Query("DELETE FROM plans WHERE project_id = $1 AND owner_id = $2 AND name = 'draft' RETURNING id;", ...) fails: connection to Postgres dropped, table missing after migration drift, syntax/type mismatch, or DB timeout.
Common situations: DB connection pool exhausted; schema migration out of sync (plans table or columns missing); network blip between app and database; using a closed global Conn after failed reconnect.
Understand the failure class
Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.
Related errors
- error deleting plans: %v
- error deleting invite: %v
- error removing all locks: %v
- error creating plan: %v
- error inserting lockable plan id: %v
AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05).
Data as JSON: /api/errors/57cf8a2c19047ec8.
Report an issue: GitHub.