plandex-ai/plandex · error

error getting member role id: %v

Error message

error getting member role id: %v

What it means

cacheOrgMemberRoleId runs 'SELECT id FROM org_roles WHERE name = member' via Conn.Get; any failure (no matching row, dead connection, query error) is wrapped with this message and surfaces through GetOrgMemberRoleId and CacheOrgRoleIds. It is the low-level lookup for the member role id.

Source

Thrown at app/server/db/rbac_helpers.go:93

func cacheOrgOwnerRoleId() error {
	var roleId string
	err := Conn.Get(&roleId, "SELECT id FROM org_roles WHERE name = 'owner'")

	if err != nil {
		return fmt.Errorf("error getting owner role id: %v", err)
	}

	orgOwnerRoleId = roleId

	return nil
}

func cacheOrgMemberRoleId() error {
	var roleId string
	err := Conn.Get(&roleId, "SELECT id FROM org_roles WHERE name = 'member'")

	if err != nil {
		return fmt.Errorf("error getting member role id: %v", err)
	}

	orgMemberRoleId = roleId

	return nil
}

View on GitHub (pinned to e2d772072e)

Solutions

  1. Insert the 'member' row: INSERT INTO org_roles (name) VALUES ('member');
  2. Run pending migrations and seed both roles together
  3. Distinguish sql.ErrNoRows (data missing) from ping/connection errors in the wrapped error
  4. Ensure DB initialization ran before the first call

Example fix

// before
var roleId string
err := Conn.Get(&roleId, "SELECT id FROM org_roles WHERE name = 'member'")
// after
var roleId string
err := Conn.Get(&roleId, "SELECT id FROM org_roles WHERE name = 'member'")
if errors.Is(err, sql.ErrNoRows) {
	return fmt.Errorf("org_roles 'member' row missing — run seed migrations")
}
Defensive patterns

Strategy: retry

Validate before calling

var n int
err := db.QueryRow("SELECT count(*) FROM org_roles WHERE name = 'member'").Scan(&n)
if err != nil || n == 0 {
	return fmt.Errorf("member role row missing")
}

Type guard

func isNoRows(err error) bool {
	return err != nil && (errors.Is(err, sql.ErrNoRows) || strings.Contains(err.Error(), "sql: no rows"))
}

Try / catch

roleId, err := GetOrgMemberRoleId()
if err != nil {
	if isNoRows(err) {
		return fmt.Errorf("seed data missing: %w", err)
	}
	return retryWithBackoff(3, func() error { // transient connectivity
		_, e := GetOrgMemberRoleId()
		return e
	})
}

Prevention

When it happens

Trigger: First GetOrgMemberRoleId (via AddOrgDomainUsers) or CacheOrgRoleIds call when org_roles lacks a 'member' row, the table doesn't exist, or the DB is unreachable.

Common situations: Unseeded or partially seeded database; connection refused after DB restart; migrations not applied on a fresh environment.

Related errors


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