plandex-ai/plandex · error
error adding org membership: %v
Error message
error adding org membership: %v
What it means
CreateOrg wraps a failure inserting the owner's row into orgs_users into 'error adding org membership: %v'. The org was created but linking the owner with the owner role failed, leaving the transaction to roll back.
Source
Thrown at app/server/db/org_helpers.go:124
if err != nil {
if IsNonUniqueErr(err) {
// Handle the uniqueness constraint violation
return nil, fmt.Errorf("an org with domain %s already exists", *domain)
}
return nil, fmt.Errorf("error creating org: %v", err)
}
orgOwnerRoleId, err := GetOrgOwnerRoleId()
if err != nil {
return nil, fmt.Errorf("error getting org owner role id: %v", err)
}
_, err = tx.Exec("INSERT INTO orgs_users (org_id, user_id, org_role_id) VALUES ($1, $2, $3)", org.Id, userId, orgOwnerRoleId)
if err != nil {
return nil, fmt.Errorf("error adding org membership: %v", err)
}
return org, nil
}
func GetOrgForDomain(domain string) (*Org, error) {
var org Org
query := fmt.Sprintf("SELECT %s FROM orgs WHERE domain = $1", orgFields)
err := Conn.Get(&org, query, domain)
if err != nil {
if err == sql.ErrNoRows {
return nil, nil
}
return nil, fmt.Errorf("error getting org for domain: %v", err)
}
View on GitHub (pinned to e2d772072e)
Solutions
- Check the wrapped %v for a 23503 FK violation and verify GetOrgOwnerRoleId returned a valid org_roles.id
- Rely on the transaction rollback: the partial org row is not committed, so simply retry after fixing the cause
- For concurrent self-insert races, add ON CONFLICT ON CONSTRAINT org_user_unique DO NOTHING like AddOrgDomainUsers does
- Verify the DB connection is stable for multi-statement transactions (pool settings, timeouts)
Example fix
// before
_, err = tx.Exec("INSERT INTO orgs_users (org_id, user_id, org_role_id) VALUES ($1, $2, $3)", org.Id, userId, orgOwnerRoleId)
// after
_, err = tx.Exec("INSERT INTO orgs_users (org_id, user_id, org_role_id) VALUES ($1, $2, $3) ON CONFLICT ON CONSTRAINT org_user_unique DO NOTHING", org.Id, userId, orgOwnerRoleId) Defensive patterns
Strategy: try-catch
Validate before calling
orgOwnerRoleId, err := db.GetOrgOwnerRoleId()
if err != nil { return err } // resolve before insert
// optionally pre-check membership
ok, _ := db.ValidateOrgMembership(userId, orgId) Try / catch
org, err := db.CreateOrg(req, userId, &domain, tx)
if err != nil {
var pqErr *pq.Error
if errors.As(err, &pqErr) && pqErr.Code == "23503" {
return fmt.Errorf("invalid role/org reference: %s", pqErr.Detail)
}
return err
} Prevention
- Use ON CONFLICT DO NOTHING on orgs_users inserts for idempotency
- Keep the whole CreateOrg flow in one tx so partial orgs roll back
- Validate role ids against org_roles before insert
- Watch connection stability for multi-statement transactions
When it happens
Trigger: tx.Exec('INSERT INTO orgs_users ...') fails: invalid org_role_id (foreign key violation 23503), org_user_unique conflict, connection drop, or aborted transaction.
Common situations: Role-id lookup returned a stale/incorrect id violating the FK to org_roles; concurrent creation raced on the same user/org pair; connection reset inside a long transaction.
Related errors
- error creating invite: %v
- error deleting invite: %v
- error adding org users: %v
- error deleting org member: %v
- error deleting custom models: %w
AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05).
Data as JSON: /api/errors/ca7baa4e53fd5308.
Report an issue: GitHub.