---
id: w6/m3/t006
title: Render parity — side-by-side vs live Render dashboard; flag drift
worker: worker6
status: done
estimate: 20m
depends_on: [w6/m3/t005]
---

## Closeout

**Done against RESEARCH-workspaces.md's verified findings, not a fresh live-Render side-by-side** — no Render account/credentials are available in this environment, and `docs/render-artifacts/workspace-lifecycle.md` (the live capture m1/t001 was meant to produce) was deferred and never written. Checked against what was verified:

- Switcher placement (top of left pane), list + **+ New Workspace** — matches finding 2–3.
- Plan lineup/prices (Hobby free, Pro $25/mo, Scale $499/mo, Enterprise custom) and Hobby's caps (1 member, 25 services, 5 workspaces/user) — matches findings 1/4, sourced verbatim into the plan-card copy, not invented.
- No payment step for Hobby — matches (Render's docs say "including", not "requires", for the payment step; bex has no billing system at all yet, called out as deliberate scope in `w6/README.md`).
- REST stays mutation-free on `/v1/owners` (finding 9) — unaffected by this milestone; lifecycle is GraphQL-only as m1 shipped it.

**Recorded drift:**

- Workspace names are DNS-label constrained (`^[a-z0-9]([a-z0-9-]{0,28}[a-z0-9])?$`, ≤30 chars) vs Render's freeform names — necessary because a bex workspace name becomes part of every App CR name; already documented as parity drift in m1/t007.
- Delete/rename confirmation UX (exact copy, whether Render enumerates live resource counts, grace period) is unverified — research finding open question 1 was never resolved (live capture deferred), so this milestone's danger-zone wording is an original, reasonable design, not a verified clone.

No cross-surface (GraphQL vs REST `/v1/owners` vs MCP) consistency check was run this session — that would need a live backend to query all three surfaces for the same identity; m2's own test suite already covers REST/MCP internally.

**2026-07-09, follow-up re-verification:** re-fetched render.com's *current* public docs directly (`docs/team-members`, `docs/new-workspace-plans`, `docs/platform-features-by-plan`, `docs/organizations`, `/pricing`) rather than relying only on the cached research doc, at the user's request. Findings:

- Switcher: "+ New Workspace" button, top-of-left-pane dropdown, switch-from-the-same-dropdown — reconfirmed verbatim.
- Plan lineup: Hobby free/1 member/25 services/2 environments-per-project/5-workspace cap; Pro $25/mo flat, unlimited members; Scale $499/mo flat, unlimited members + adds an "organizations" concept (multiple workspaces under one org — out of scope for bex, not modeled); Enterprise custom — all reconfirmed, no numbers changed since the cached research.
- Roles: "Edit workspace settings" and "Delete workspace" are both Admin-only, every other role (Developer/Contributor/Viewer/Billing) is denied — matches this milestone's backend gate (`RelCanManage`) and the note that no non-admin UI case exists yet under m1.
- Confirmed **still no public documentation** of the actual delete-confirmation UI (exact copy, resource-count enumeration, whether it's a type-to-confirm) or of the settings page's exact contents beyond "Team members" — Render's own docs don't describe this UI at the level of detail needed for a true clone, consistent with m1/t001 having deferred a live capture. The type-to-confirm guard this milestone shipped remains an original, reasonable design (and matches this codebase's own established delete-guard pattern elsewhere), not a verified Render replica.

No changes required — the fresh check reconfirms the implementation and surfaces nothing new to fix.

## Objective

Standing parity gate: compare the shipped switcher, `/new/workspace` flow, settings, and delete guard side-by-side against the live Render dashboard (per m1/t001's artifact plus a fresh look), and against the backend surfaces (GraphQL semantics identical to what REST/MCP expose per w6/m2). Drift → w6 inbox notes.

## Context

- Precedent: w3/m4.5 and w5/m7 ran the same side-by-side method.
- Include copy-level checks (plan card wording honestly diverges on billing — that's recorded drift, not silent).

## Steps

1. Side-by-side pass with screenshots of both dashboards.
2. Cross-surface consistency: what the UI shows must match `GET /v1/owners` / MCP for the same user.
3. File drift notes.

## Files

- `.playwright-mcp/` (comparison screenshots)
- `.pm/w6/` (drift notes if any)

## Acceptance criteria

- [ ] Side-by-side comparison recorded for all four surfaces (switcher, create, settings, delete)
- [ ] UI/REST/MCP agree for the same identity
- [ ] All drift either fixed or filed

## Out of scope

- Pixel-perfect cloning; bex keeps its own visual identity.
