---
id: w6/m7/t003
title: Render parity — own- identifiers consistent across REST/GraphQL/MCP; record the deliberate non-goals
worker: worker6
status: done
estimate: 20m
depends_on: [w6/m7/t002]
---

## Objective

Verify the `own-` member identifiers are consistent across every surface that
exposes them, match render.com's documented shape, and **record why two adjacent
Render behaviors are deliberately not implemented** (so they don't get silently
re-attempted later).

## Context

- Compare against `docs/render-artifacts/owners-api.md` (pinned Render OpenAPI + MCP contract): member `userId` = `own-` id.
- Surfaces: REST `/v1/owners/{id}/members`, the GraphQL members field, the MCP members surface. Same fields/semantics/error shapes (`docs/ADR006-bex-api.md`, `internal/api/CLAUDE.md`).
- **Deliberate non-goals to document** (the honest reassessment that trimmed this milestone):
  1. **Owner `type: user` is never emitted.** bex mints only `tea-` team workspaces; it has no personal-account / user-owner entity. Retrieving by an `own-` id returns the caller's default workspace — a **team** — so `type` correctly stays `"team"`. `type: user` would only appear if bex modeled personal workspaces (a product decision, not on this roadmap).
  2. **No peer `own-` resolution.** `GET /v1/owners/{own-id}` already resolves the **caller's** own id → their default workspace. Resolving a _peer's_ `own-` id is not a real Render workflow (a key only reaches workspaces it's a member of) and has no consumer — left as the documented divergence in `w6/done/001.md`.

## Steps

1. Diff member `userId` (`own-`) across REST/GraphQL/MCP; confirm identical mapping.
2. Confirm the dashboard needs no change (it keys users by Kratos session, not `own-` id).
3. Update `docs/render-artifacts/owners-api.md` + `w6/done/001.md`: member `userId` parity resolved; `type: user` and peer-resolve recorded as deliberate non-goals with the reasons above.

## Files

- `lego/backend/internal/workspaces/{render,graphql,mcp}.go`
- `docs/render-artifacts/owners-api.md`, `.pm/w6/done/001.md`

## Acceptance criteria

- [ ] REST/GraphQL/MCP emit the same `own-` `userId`; drift (if any) filed, not silent
- [ ] The two non-goals (no `type: user`, no peer-resolve) are recorded with reasons

## Out of scope

- Building either documented non-goal.
