plandex-ai/plandex · error

org member role id is empty

Error message

org member role id is empty

What it means

Fallback guard in GetOrgMemberRoleId: the member-role DB lookup reported success but the cached orgMemberRoleId is still empty, so the function returns this error instead of an invalid role id. Like error 481, it signals inconsistent cache state.

Source

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

	}

	if orgOwnerRoleId == "" {
		return "", fmt.Errorf("org owner role id is empty")
	}

	return orgOwnerRoleId, nil
}

func GetOrgMemberRoleId() (string, error) {
	if orgMemberRoleId == "" {
		err := cacheOrgMemberRoleId()
		if err != nil {
			return "", fmt.Errorf("error getting org member role id: %v", err)
		}
	}

	if orgMemberRoleId == "" {
		return "", fmt.Errorf("org member role id is empty")
	}

	return orgMemberRoleId, nil
}

func GetOrgOwners(orgId string) ([]*User, error) {
	var users []*User
	err := Conn.Select(&users, "SELECT * FROM users WHERE id IN (SELECT user_id FROM orgs_users WHERE org_id = $1 AND org_role_id = $2)", orgId, orgOwnerRoleId)

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

	return users, nil
}

func CacheOrgRoleIds() error {
	err := cacheOrgOwnerRoleId()

View on GitHub (pinned to e2d772072e)

Solutions

  1. Initialize via CacheOrgRoleIds() during startup and abort on failure
  2. Protect cache population with sync.Once or a mutex
  3. Retry the lookup once inside this branch before returning the error
  4. Audit for code that resets orgMemberRoleId at runtime

Example fix

// before
if orgMemberRoleId == "" {
	return "", fmt.Errorf("org member role id is empty")
}
// after
if orgMemberRoleId == "" {
	if err := cacheOrgMemberRoleId(); err != nil {
		return "", fmt.Errorf("org member role id is empty: %v", err)
	}
}
Defensive patterns

Strategy: validation

Validate before calling

if orgMemberRoleId == "" {
	if err := CacheOrgRoleIds(); err != nil {
		return fmt.Errorf("cannot resolve member role id: %w", err)
	}
}
role, err := GetOrgMemberRoleId()

Type guard

func memberRoleCacheReady() bool {
	return orgMemberRoleId != ""
}

Prevention

When it happens

Trigger: cacheOrgMemberRoleId returned nil but did not populate the global (corrupted caching logic), or the global was cleared concurrently after caching.

Common situations: Concurrent initialization races; manual edits to package globals; schema where the 'member' row id is an empty string.

Related errors


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