---
path: /studio/launch-readiness-governance
surface: studio
domain: governance
auth: signed-in + studio entitlement
source: apps/oshun/web/src/app/studio/launch-readiness-governance/page.tsx
status: walked
last_walked:
  '2026-07-03 real-dev-infra Playwright addendum — focused route journey
  verified direct admin navigation, live BFF catalog, seeded and edited
  launch-readiness scoring, waiver/non-blocking gate behavior, blocking pending
  vetoes, client-only JSON validation, live BFF 400 details, pending-submit
  lockout, malformed/offline fail-closed paths, catalog loading/error, non-admin
  fail-closed auth, direct BFF auth/schema gates, quick-action affordances,
  shared axe, mobile containment, and anonymous redirect. Evidence:
  WALKTHROUGH/results/v1-real-infra-run-2026-06-22.md §263;
  apps/oshun/web/e2e/studio-launch-readiness-governance.spec.ts. Previous:
  2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data
  (2xx), console/page-errors, expected content, screenshot verified.'
---

# Studio · Launch Readiness Governance

## Purpose

Render the go / no-go launch decision with the real evaluator: the Launch
Readiness Lane requires every blocking gate to be passed or waived and every
required sign-off granted; advisory gates inform the readiness score but never
veto a launch. It is a live admin console wired to
`/v1/admin/studio/launch-readiness`, not an in-page simulation.

## Entry points

- **Direct URL / bookmark** — `/studio/launch-readiness-governance` (signed-in +
  studio entitlement; admin scope required to evaluate)
- **Sibling Studio routes** — reached via the quick-action panel on
  backup-disaster-recovery-ux, data-retention-lifecycle-controls,
  security-hardening-program, and review-approval-workflows pages

## Layout regions

`page.tsx` mounts `<ShellLayout active="studio">` and renders
`<StudioLaunchReadinessGovernanceWorkspace />` (re-exported from
`StudioLaunchReadinessGovernanceDashboard`) followed by a single `panel` of
quick-action links.

- **Shell**: `ShellLayout` chrome with the Studio tab active
- **Workspace heading**: `WorkspaceHeading` renders the page `<h1>` "Studio
  Launch Readiness Governance", followed by the `data-launch-readiness-summary`
  paragraph
- **Launch Readiness Lane**: an `<h2>` `data-lr-lane-heading` ("Launch Readiness
  Lane") section with the load states and, when ready, the evaluate form and
  result
- **Quick-actions panel**: `data-lr-quick-actions`
  `data-lr-quick-action-count="4"` wraps 4 sibling `quickAction` `Link`s:
  `data-lr-quick-action="backup-disaster-recovery-ux"`,
  `data-retention-lifecycle-controls`, `security-hardening-program`, and
  `review-approval-workflows`. No self-link and no Route Map panel.

## States

- [x] **Loading** — `data-lr-loading` ("Loading launch-readiness evaluator…")
- [x] **Unauthorized** — `data-lr-unauthorized` ("Access restricted.") on
      401/403
- [x] **Error** — `data-lr-error` ("Could not load the launch-readiness
      evaluator.")
- [x] **Ready / form** — `data-lr-enums` ("N gate statuses · M decisions") plus
      the `data-lr-form` evaluate form seeded with `DEFAULT_PAYLOAD` and
      `data-lr-form-state="idle|pending"`
- [x] **Pending submit** — `data-lr-submit-state="pending"`, disabled,
      `aria-disabled="true"`, and `aria-busy="true"` while the evaluate POST is
      in flight
- [x] **Result** — `data-lr-result` headline (`data-lr-headline` with
      `data-lr-decision`, `data-lr-score`), the `data-lr-blockers` and
      `data-lr-missing-signoffs` lines, and the `data-lr-blocker-table` of
      `data-lr-blocker-row` rows (`data-lr-blocker-status`)
- [x] **Evaluate error** — `data-lr-evaluate-error` for invalid JSON, a non-200
      response, an offline evaluate POST, or a malformed 200 success payload
- [x] **Offline** — catalog GET fails closed to the error panel; the evaluate
      POST surfaces the generic error when the network is unreachable
- [x] **Gated** — admin scope denied → `data-lr-unauthorized`; the route itself
      is proxy-gated to signed-in + studio
- [ ] **Standalone PWA** — renders within the shell; no URL-bar dependency

## Interactions

- [x] **Gates & sign-offs (JSON)** — `textarea` `data-lr-payload`,
      `aria-label="launch readiness json"`, seeded with
      `{ gates[{ gateId,     category, status, blocking }], signoffs[{ role, granted }] }`
- [x] **Evaluate launch readiness** — `button` `data-lr-submit`
      (`type="submit"`); POSTs the parsed JSON to
      `/v1/admin/studio/launch-readiness/evaluate`, setting `data-lr-result` on
      a 200 with a valid `result`, or `data-lr-evaluate-error` otherwise
- [x] **Quick-action links** — each `quickAction` `Link` navigates to its
      sibling Studio route (see Layout regions for the 4 targets)

## Data & contracts

- **Reads**: `GET /v1/admin/studio/launch-readiness` on mount — returns the
  catalog (`statuses[]`, `decisions[]`)
- **Writes**: `POST /v1/admin/studio/launch-readiness/evaluate` — returns
  `{ result: { decision, blockers[], missingSignoffs[], readinessScore, summary{ gateCount, passCount, failCount, pendingCount, waivedCount, blockingCount, signoffCount, grantedSignoffCount } } }`
- **Realtime**: none
- **Caching**: client `fetch` with `cache: 'no-store'`; `buildBffAuthHeaders()`
  attaches the bearer token
- **Auth/role check**: admin-scoped fail-closed — `admin:*` or `admin:studio`,
  401/403 under the studio workspace gate

## E2E coverage

- `apps/oshun/web/e2e/studio-launch-readiness-governance.spec.ts` forwards
  `GET /v1/admin/studio/launch-readiness` and
  `POST /v1/admin/studio/launch-readiness/evaluate` to the live dev BFF with
  explicit admin and non-admin dev bearers. It covers direct admin navigation,
  catalog bearer forwarding, seeded no-go result `60%`, blocker filtering (`g2`
  only while non-blocking `g4` does not veto), missing sign-off rendering, go
  decisions with a waived blocking gate and pending advisory gate, pending
  blocking vetoes, malformed JSON zero-POST rejection, live BFF invalid-payload
  details, pending-submit lockout, catalog loading/error, malformed catalog,
  malformed 200 evaluate success, network-unreachable evaluate error, non-admin
  fail-closed state, direct BFF auth/schema gates, quick-action href/touch
  targets, shared axe, anonymous redirect, and mobile containment.

## Cross-references

- Parent: [`../studio-overview.md`](../studio-overview.md)
- Sibling:
  [`studio-security-hardening-program.md`](./studio-security-hardening-program.md),
  [`studio-data-retention-lifecycle-controls.md`](./studio-data-retention-lifecycle-controls.md)
- Component source:
  `apps/oshun/web/src/components/studio/StudioLaunchReadinessGovernanceWorkspace.tsx`
  (re-exports
  `apps/oshun/web/src/components/studio/StudioLaunchReadinessGovernanceDashboard.tsx`)
- BFF store: `apps/oshun/bff/src/studio/` launch-readiness gate evaluator behind
  `/v1/admin/studio/launch-readiness`

## Open questions / known gaps

- [x] Confirm whether the page will gain a breadcrumb/Route Map panel like other
      Studio surfaces, or keep the flat quick-action panel — current `page.tsx`
      keeps the flat quick-action panel with no self-link and no Route Map panel
      as of 2026-07-03.
- [ ] Document the live gate/sign-off feed the evaluator should consume once
      readiness scoring drives real release gating. Current V1 browser behavior
      scores caller-supplied JSON through the real deterministic BFF evaluator;
      automatic release-gate ingestion remains a product data-source gap, not a
      browser interaction gap.
