---
path: /studio/isis/job-submission
surface: studio
domain: isis
auth: signed-in + studio entitlement (NOT AAA-gated)
source: apps/oshun/web/src/app/studio/isis/job-submission/page.tsx
status: walked
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-01 addendum: `studio-isis-job-submission.spec.ts` proved the direct
  route remains hard-blocked by the Studio Isis boundary, then drove the
  localhost-only lane-bypass route against the real local BFF, including the
  real generation-type/priority catalog, valid envelope build, pending submit
  disablement, client JSON rejection, live BFF 400 and 422 validation errors,
  loading/error/malformed/unauthorized/anonymous states, route-map articles,
  sibling quick-actions, and 44px automated hit-target checks for form controls
  and quick-actions.'
---

# Isis Job Submission

## Purpose

Admin lane console that wires the real `@isis/job-envelope` builder via
`/v1/admin/isis/job-submission`: it lists the valid generation types +
priorities and builds/validates a candidate job envelope through the real
`createIsisJobEnvelope` (strict zod). All reads and writes flow through
`/v1/admin/isis/job-submission`; it is admin-scoped and fails closed.

## Entry points

- Sibling quick-action from `/studio/isis/audio-generation`
- Studio index (`/studio`)
- Direct URL / bookmark

## 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-job-submission-workspace`):
  - `<h1>` (`WorkspaceHeading`) "Isis Job Submission Workspace"
  - Summary paragraph (`data-isis-job-submission-summary`)
  - "Build a job envelope" form (`data-job-build-form`)
- **Route Map panel** (`data-isis-job-submission-route-map`):
  `<h2>Route Map</h2>` over `STUDIO_ISIS_JOB_SUBMISSION_ROUTE_MAP` (5 entries)
- **Sibling quick-actions panel**: `/studio/isis/audio-generation`, `/studio`

## States

- [x] **Loading** — `data-job-loading`
- [x] **Unauthorized** — 401/403 admin-scope fail-closed;
      `data-job-unauthorized`
- [x] **Error** — non-OK or malformed catalog; `data-job-error`
- [x] **Ready (form)** — catalog present; type + priority selects populated;
      input JSON textarea renders
- [x] **Result** — after a build POST, a valid envelope renders in
      `data-job-envelope` (`data-job-envelope-id` "jobId: …",
      `data-job-envelope-priority` "priority: …"); validation failures list in
      `data-job-issues` (each `data-job-issue=<path>`); build errors in
      `data-job-build-error` (e.g. "Input must be valid JSON.")

## Interactions

### Build a job envelope (`data-job-build-form`)

- [x] **Generation type** (`data-job-field-type`, `<select>` from the catalog's
      generation types)
- [x] **Priority** (`data-job-field-priority`, `<select>` from the catalog's
      priorities)
- [x] **Input (JSON)** (`data-job-field-input`, `<textarea>`)
- [x] **Build envelope** (`data-job-build-submit`, submit; "Building…" while in
      flight) — `POST /v1/admin/isis/job-submission/build`

### Route Map

- [x] **Route-map articles** ×5

### Sibling quick-actions

- [x] **Open Isis Audio Generation workspace** → `/studio/isis/audio-generation`
- [x] **Back to Studio workspace index** → `/studio`

## Data & contracts

- **Reads**: `GET /v1/admin/isis/job-submission` (valid generation types +
  priorities)
- **Writes**: `POST /v1/admin/isis/job-submission/build` (build + validate via
  `createIsisJobEnvelope`; returns the envelope or zod validation issues)
- **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
- **Component sources**:
  - `apps/oshun/web/src/components/studio/StudioIsisJobSubmissionWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioIsisJobSubmissionRouteMap.ts`

## E2E coverage

- [`apps/oshun/web/e2e/studio-isis-job-submission.spec.ts`](../../../../apps/oshun/web/e2e/studio-isis-job-submission.spec.ts)
  — proves direct `/studio/isis/job-submission` is still hard-blocked by the
  Studio Isis boundary, then drives the localhost-only
  `?__oshunStudioIsisLaneE2E=1` lane bypass in the real Next shell with browser
  requests forwarded to the real local BFF. Covered paths:
  - Admin lane-bypass navigation loads the real `@isis/job-envelope`
    generation-type catalog (18 modes), priorities (`low`, `normal`, `high`,
    `urgent`), build form defaults, route-map articles, sibling quick-actions,
    bearer-authenticated catalog requests, and 44px form/link targets.
  - A valid `music-generation` build posts to
    `/v1/admin/isis/job-submission/build`, disables the submit while pending,
    and renders the live BFF envelope (`jobId`, priority, idempotency key)
    without validation or build errors.
  - Client-only malformed JSON rejects before any build POST; a valid JSON array
    reaches the live BFF and renders `invalid_payload` without fabricating an
    envelope.
  - A stale catalog option drives the live BFF strict enum validation path and
    renders `data-job-issues` / `data-job-issue="type"` without fabricating an
    envelope.
  - Loading, 503 catalog error, malformed catalog, non-admin unauthorized,
    anonymous redirect-before-render, route-map articles, quick-action hrefs,
    and the shared axe pass are asserted.

## Cross-references

- Studio overview: [`../../studio-overview.md`](../../studio-overview.md)
- Sibling routes:
  - [`studio-isis-audio-generation.md`](./studio-isis-audio-generation.md)
  - [`studio-isis-job-envelope.md`](./studio-isis-job-envelope.md)
  - [`studio-isis-job-management.md`](./studio-isis-job-management.md)

## Open questions / known gaps

- [ ] No breadcrumb on this route — navigation is via sibling quick-actions
- [ ] This builds and validates an envelope but does not enqueue it; confirm the
      relationship to `/studio/isis/job-management` and the live queue
- [ ] Route-map sub-paths are declared but not yet implemented as separate pages
- [ ] Live screen-reader, touch-device, offline/PWA-cache, and
      telemetry-delivery passes still need a manual or dedicated-device run;
      automated coverage includes Playwright role/locator checks, explicit 44px
      hit-target measurements, and the suite-wide axe pass.
