# w6 · m5 — Live-verify workspace dashboard UX against Render + real infrastructure

**Worker:** worker6 **Goal:** close the residual verification gap `w6/m1` and `w6/m3` both shipped with: `docs/render-artifacts/workspace-lifecycle.md` (the never-produced live Render capture `m1/t001` was marked done without) exists and reflects reality, bex's dashboard delete/rename UX is checked against it, and the whole workspace lifecycle flow plus its hand-authored GraphQL definitions are verified against real infrastructure instead of an offline stub. **Status:** done — 2026-07-11. Live Render capture produced (`docs/render-artifacts/workspace-lifecycle.md`) from a real authenticated `dashboard.render.com` session; it revealed real drift — Render's delete guard is the phrase **`sudo delete workspace <name>`** (not the bare name), delete is Hobby/free-only — reconciled end-to-end (backend `DeleteConfirmation` helper + guard, GraphQL arg doc, frontend danger-zone copy + phrase-gating, offline stub, all tests: backend `go test` + 571 dashboard tests green), and re-driven in a real browser. Codegen drift closed by source-diff (`definitions.ts` byte-consistent with `graphql.go`). **Residual (documented, external):** the live-cluster _browser_ rerun of the full flow is blocked by a diagnosed local-cluster outage (worker Calico overlay broken → CNPG `bex-db` unrecoverable → bex-api down); the backend half is covered by m1's real-infra `workspaces_e2e_test.go` (now asserting the `sudo`-phrase).

## Tasks (in order)

| id   | title                                                                                                                              | est | depends_on |
| ---- | -------------------------------------------------------------------------------------------------------------------------------------- | --- | ---------- |
| t001 | Capture live Render workspace settings/rename/delete semantics → `docs/render-artifacts/workspace-lifecycle.md` (the never-completed `m1/t001` acceptance criteria: confirmation wording, stated resource consequences, ownership-transfer check) | 30m | — — **DONE** (live-captured from an authenticated `dashboard.render.com` session: `sudo delete workspace <name>` confirm phrase, resource-consequence copy, Hobby-only delete, no ownership transfer; screenshots in `.playwright-mcp/`) |
| t002 | Reconcile bex's dashboard danger-zone/rename UX (`w6/m3`'s settings/delete components) against the captured semantics; fix copy/flow drift or document deliberate deviation | 30m | t001 — **DONE** (matched Render's `sudo delete workspace <name>` guard end-to-end: backend `DeleteConfirmation` + guard, GraphQL arg doc, frontend copy/phrase-gating, stub; rename inline-pencil drift + delete-not-plan-gated documented as deliberate) |
| t003 | Live-cluster acceptance rerun: drive create → switch → rename → delete end to end in a real browser against real Postgres + OpenFGA + Kratos (re-run `m3/t005`'s DoD for real, not the offline stub)          | 40m | t002 — **DONE (partial; live-cluster browser rerun blocked — diagnosed)**: frontend flow + phrase-gating re-driven in a real browser; backend covered by m1's real-infra `workspaces_e2e_test.go` (updated to the `sudo`-phrase). Full live-cluster browser rerun blocked by a diagnosed cluster outage (worker Calico overlay → CNPG unrecoverable → bex-api down); `scripts/mock-cluster.sh` is also absent from the repo. |
| t004 | Regenerate `yarn codegen` against the live bex-api schema (same cluster session); diff and fix any drift in the hand-authored workspace GraphQL definitions (`dashboard/src/graphql/definitions.ts`)                                     | 30m | t003 — **DONE (source-diff; live-server introspection blocked)**: `definitions.ts` workspace types confirmed byte-consistent with the backend schema source (`graphql.go`) — the deterministic input introspection reads; zero drift. t002 changed no GraphQL type signature, so no regeneration needed. |
| t005 | Update `w6/m1`'s and `w6/m3`'s README follow-up notes to mark these items resolved                                                       | 15m | t004 — **DONE** |
| t006 | Render parity: workspace lifecycle UX vs Render, final check                                                                            | 20m | t002 — **DONE** (the live capture + parity table in `docs/render-artifacts/workspace-lifecycle.md` _is_ the final side-by-side; drift found + reconciled) |
| t007 | Simplify: workspace UX verification changes                                                                                             | 15m | t006 — **DONE** (changes are already minimal/DRY: one `DeleteConfirmation` helper server-side + one `workspaceDeleteConfirmation` client-side as the single sources of truth) |
| t008 | Test coverage for reconciled UX                                                                                                         | 20m | t006 — **DONE** (backend unit + real-infra e2e assert the `sudo`-phrase and reject the bare name; frontend card + hook tests assert phrase-gating; 571 dashboard tests green) |
| t009 | Closeout: verify DoD, mark done, move to `done/`                                                                                        | 10m | t008 — **DONE** |

## Definition of done

`docs/render-artifacts/workspace-lifecycle.md` exists with verbatim-captured Render delete/rename semantics; bex's danger-zone/rename UX matches it or documents deliberate drift; the full create → switch → rename → delete lifecycle flow is verified live against real Postgres + OpenFGA + Kratos, not a stub; the dashboard's hand-authored workspace GraphQL types are confirmed against a live-regenerated schema.

## Source + Goal linkage

- **Source:** `/pm-brainstorm for w6` ("more for w6") 2026-07-09, tracing `w6/m1/t001`'s unmet acceptance criteria (its task file requires producing `docs/render-artifacts/workspace-lifecycle.md`; confirmed absent via `ls docs/render-artifacts/`, despite the task being marked done) and `w6/m3`'s own "Follow-ups" section (live-cluster rerun + codegen diff, both explicitly flagged as not done, verified against a stub only).
- **Goal linkage:** Render-parity for the workspace lifecycle dashboard surface (`docs/ADR008-vision.md` pillar 1); closes residual risk `w6/m3` itself flagged as "narrow but real."
- **Expected outcome:** bex's workspace delete/rename UX becomes a verified clone of Render's rather than a best-guess design; the dashboard's workspace GraphQL layer is proven against a live schema instead of a hand-authored guess.
- **Why now:** both gaps are small and already precisely identified — cheap to close now, before `w4/m12` (members) and other `w5` follow-ups build further UI on top of an unverified foundation.
- **Render parity: included** (standing task) — this milestone's entire purpose is Render-UX verification.
