Context. surface studio · domain isis · route /studio/isis/text-to-speech · auth signed-in + studio entitlement (AAA-gated — text-to-speech is in AAA_ONLY_STUDIO_ROUTES) · source apps/oshun/web/src/app/studio/isis/text-to-speech/page.tsx
Last walked. 2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data (2xx), console/page-errors, expected content, screenshot verified; live screen-reader, touch, offline, and telemetry-delivery checks pending a manual AT pass. Evidence: WALKTHROUGH/results/runtime-sweep-2026-05-29.md; body re-derived 2026-06-03 from current source (lane-console architecture). 2026-07-03 addendum: real-dev-infra Playwright coverage added in apps/oshun/web/e2e/studio-isis-text-to-speech.spec.ts. The spec verifies the Studio Isis boundary, localhost E2E lane, live BFF voice-cloning records, filters, route map, quick actions, touch targets, create workflow, every visible lifecycle transition through release, revoke, high-abuse auto-reject, invalid transition feedback, loading, service failure, malformed response, network failure, non-admin unauthorized, and anonymous redirect.
Purpose#
Admin §24.7 voice-clone governance console (a cloned voice profile is the input
a TTS voice runs on): it reads the live clone-workflow records from
GET /v1/admin/isis/voice-cloning and drives each through consent →
id-verification → samples → naturalness → watermark → abuse-risk → multi-party
signoff → registration → release (or revoke) via
POST …/voice-cloning/workflows + …/:workflowId/transition. The state machine
is the enforcer (high abuse-risk auto-rejects); it is admin-scoped and fails
closed.
Entry points#
- Sibling quick-action from
/studio/isis/live-preview - Studio index (
/studio) - Direct URL / bookmark (AAA entitlement required)
Layout regions#
page.tsx mounts <ShellLayout active="studio"> (no breadcrumb panel) and
three panels: the workspace, the Route Map, and sibling quick-actions.
- Header: shell header
- Workspace panel (
data-isis-text-to-speech-workspace):<h1>(WorkspaceHeading) "Isis Text-to-Speech Workspace"- Summary paragraph (
data-isis-text-to-speech-summary) - Workflow list (
data-tts-workflow-row=<workflowId>, activedata-tts-workflow-row-active); filterdata-tts-search - Create-workflow form (
data-tts-create-form) - Workflow detail (
data-tts-detail) with the lifecycle action panel (data-tts-action-panel) offering only the transitions valid for the workflow's current state
- Route Map panel (
data-isis-text-to-speech-route-map):<h2>Route Map</h2>overSTUDIO_ISIS_TEXT_TO_SPEECH_ROUTE_MAP(5 entries) - Sibling quick-actions panel:
/studio/isis/live-preview,/studio
States#
- Loading —
data-tts-loading - Unauthorized — 401/403 admin-scope fail-closed;
data-tts-unauthorized - Error — non-OK, malformed response, or network failure;
data-tts-error - Ready — records present; list + detail + action panel render
- Result — after a create or transition POST,
data-tts-action-result(data-tts-action-status)
Interactions#
Create-workflow form (data-tts-create-form)#
- New workflow id (
data-tts-create-workflow, text input) - Subject id (
data-tts-create-subject, text input) - Create (
data-tts-create-submit) —POST /v1/admin/isis/voice-cloning/workflows
Workflow action panel (data-tts-action-panel) — state-gated transitions#
- Consent (
data-tts-action-consent→data-tts-action-consent-submit) - Verify identity (
data-tts-action-verify, actionverify-identity) - Samples (
data-tts-action-samples→data-tts-action-samples-submit) - Naturalness scores (
data-tts-action-scores→data-tts-action-scores-submit) - Watermark (
data-tts-action-watermark→data-tts-action-watermark-submit) - Abuse-risk (
data-tts-action-abuse→data-tts-action-abuse-submit) - Signoff (
data-tts-action-signoff→data-tts-action-signoff-submit) - Register (
data-tts-action-register→data-tts-action-register-submit) - Revoke (
data-tts-action-revoke, actionrevoke) - Each transition →
POST /v1/admin/isis/voice-cloning/workflows/:workflowId/transition
Route Map#
- Route-map articles ×5
Sibling quick-actions#
- Open Isis Live Preview workspace →
/studio/isis/live-preview - Back to Studio workspace index →
/studio
E2E coverage#
apps/oshun/web/e2e/studio-isis-text-to-speech.spec.tsruns against the real Next shell and local BFF, with browser voice-cloning requests forwarded into/v1/admin/isis/voice-cloning.- It proves direct route hard-blocking (
x-studio-boundary: hard-block) and the localhost-only?__oshunStudioIsisLaneE2E=1admin lane. - It walks a unique workflow through create, consent, identity verification, samples, naturalness scores, watermark, low abuse-risk, all four signoff roles, profile registration/release, and exact POST body capture.
- It also covers pending-consent revoke, invalid consent payload feedback, high abuse-risk auto-reject, loading, 503, malformed response, aborted GET, non-admin 403, anonymous redirect, route-map articles, filters, quick actions, and 44px minimum touch targets for the main controls.
Data & contracts#
- Reads:
GET /v1/admin/isis/voice-cloning(clone-workflow records) - Writes:
POST /v1/admin/isis/voice-cloning/workflows(create a clone workflow)POST /v1/admin/isis/voice-cloning/workflows/:workflowId/transition(drive the consent → … → release/revoke state machine)
- Realtime: none
- Caching: client fetch on mount,
cache: 'no-store',buildBffAuthHeaders() - Auth/role check: admin-scoped, fail-closed (401/403); route gated on signed-in + studio entitlement (AAA segment)
- Component sources:
apps/oshun/web/src/components/studio/StudioIsisTextToSpeechWorkspace.tsxapps/oshun/web/src/components/studio/StudioIsisTextToSpeechRouteMap.ts
Cross-references#
- Studio overview:
../../studio-overview.md - AAA gating:
libs/isis/entitlements/src/studio-boundary.ts - Sibling routes:
Open questions / known gaps#
- No breadcrumb on this route — navigation is via sibling quick-actions
- This console governs the clone-workflow lifecycle, not the TTS synthesis itself; confirm where the registered voice profile feeds the synthesis path