Context. surface studio · domain governance · route /studio/launch-readiness-governance · auth signed-in + studio entitlement · source apps/oshun/web/src/app/studio/launch-readiness-governance/page.tsx
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.
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:
ShellLayoutchrome with the Studio tab active - Workspace heading:
WorkspaceHeadingrenders the page<h1>"Studio Launch Readiness Governance", followed by thedata-launch-readiness-summaryparagraph - 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-actionsdata-lr-quick-action-count="4"wraps 4 siblingquickActionLinks:data-lr-quick-action="backup-disaster-recovery-ux",data-retention-lifecycle-controls,security-hardening-program, andreview-approval-workflows. No self-link and no Route Map panel.
States#
- Loading —
data-lr-loading("Loading launch-readiness evaluator…") - Unauthorized —
data-lr-unauthorized("Access restricted.") on 401/403 - Error —
data-lr-error("Could not load the launch-readiness evaluator.") - Ready / form —
data-lr-enums("N gate statuses · M decisions") plus thedata-lr-formevaluate form seeded withDEFAULT_PAYLOADanddata-lr-form-state="idle|pending" - Pending submit —
data-lr-submit-state="pending", disabled,aria-disabled="true", andaria-busy="true"while the evaluate POST is in flight - Result —
data-lr-resultheadline (data-lr-headlinewithdata-lr-decision,data-lr-score), thedata-lr-blockersanddata-lr-missing-signoffslines, and thedata-lr-blocker-tableofdata-lr-blocker-rowrows (data-lr-blocker-status) - Evaluate error —
data-lr-evaluate-errorfor invalid JSON, a non-200 response, an offline evaluate POST, or a malformed 200 success payload - Offline — catalog GET fails closed to the error panel; the evaluate POST surfaces the generic error when the network is unreachable
- 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#
- Gates & sign-offs (JSON) —
textareadata-lr-payload,aria-label="launch readiness json", seeded with{ gates[{ gateId, category, status, blocking }], signoffs[{ role, granted }] } - Evaluate launch readiness —
buttondata-lr-submit(type="submit"); POSTs the parsed JSON to/v1/admin/studio/launch-readiness/evaluate, settingdata-lr-resulton a 200 with a validresult, ordata-lr-evaluate-errorotherwise - Quick-action links — each
quickActionLinknavigates to its sibling Studio route (see Layout regions for the 4 targets)
Data & contracts#
- Reads:
GET /v1/admin/studio/launch-readinesson 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
fetchwithcache: 'no-store';buildBffAuthHeaders()attaches the bearer token - Auth/role check: admin-scoped fail-closed —
admin:*oradmin:studio, 401/403 under the studio workspace gate
E2E coverage#
apps/oshun/web/e2e/studio-launch-readiness-governance.spec.tsforwardsGET /v1/admin/studio/launch-readinessandPOST /v1/admin/studio/launch-readiness/evaluateto the live dev BFF with explicit admin and non-admin dev bearers. It covers direct admin navigation, catalog bearer forwarding, seeded no-go result60%, blocker filtering (g2only while non-blockingg4does 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 - Sibling:
studio-security-hardening-program.md,studio-data-retention-lifecycle-controls.md - Component source:
apps/oshun/web/src/components/studio/StudioLaunchReadinessGovernanceWorkspace.tsx(re-exportsapps/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#
- Confirm whether the page will gain a breadcrumb/Route Map panel like other
Studio surfaces, or keep the flat quick-action panel — current
page.tsxkeeps 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.