---
path: /studio/isis/model-registry
surface: studio
domain: isis
auth: signed-in + studio entitlement (NOT AAA-gated)
source: apps/oshun/web/src/app/studio/isis/model-registry/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-model-registry.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
  seeded managed-model registry, search/asset-type/NSFW/commercial filters,
  cursor pagination, loading/empty/error/malformed/unauthorized/anonymous
  states, route-map articles, sibling quick-actions, and 44px automated
  hit-target checks for filters, toggles, load-more, and quick-actions.'
---

# Isis Model Registry

## Purpose

Read-only admin lane console for the §24.2 registry of post-intake, Isis-managed
approved models. It filters by text (title/creator), asset type, NSFW, and
commercial-use, returning intake-time-ordered results with cursor pagination.
NSFW and non-commercial models stay hidden unless explicitly enabled.

## Entry points

- Sibling quick-action card from `/studio/isis/analytics-and-reporting`
- Studio index (`/studio`)
- Direct URL / bookmark

## Layout regions

`page.tsx` mounts `ShellLayout active="studio"` and three panels (no breadcrumb
panel).

- **Workspace panel** (`data-isis-model-registry-workspace`):
  - `<h1>` "Isis Model Registry Workspace" (`WorkspaceHeading`)
  - Summary paragraph (`data-isis-model-registry-summary`)
  - Result summary (`data-registry-summary`): matching total, showing count,
    generatedAt
  - Filter controls (`data-registry-search`, `data-registry-asset-filter`,
    `data-registry-nsfw-toggle`, `data-registry-commercial-toggle`)
  - Model list (`data-registry-list`) of `data-registry-model` cards (with
    `data-registry-model-nsfw` badge) + `data-registry-load-more`
- **Route map panel** (`data-isis-model-registry-route-map`): `<h2>` "Route Map"
  enumerating `STUDIO_ISIS_MODEL_REGISTRY_ROUTE_MAP`
- **Quick-actions panel**: `quickAction` links to
  `/studio/isis/analytics-and-reporting` and "Back to Studio workspace index" →
  `/studio`

## States

- [x] **Loading** — `data-registry-loading` "Loading model registry…"
- [x] **Unauthorized** — `data-registry-unauthorized` (admin-scope fail-closed
      on 401/403)
- [x] **Error** — `data-registry-error` on non-OK / malformed response
- [x] **Ready** — summary + filters + model list render
- [x] **Empty (filtered)** — `data-registry-empty` "No managed models match the
      current filters."

## Interactions

### Filters (client-driven re-query)

- [x] **Search (title, creator)** — `data-registry-search` search input
- [x] **Asset type** — `data-registry-asset-filter` select (options from
      response `assetTypes`)
- [x] **Show NSFW** — `data-registry-nsfw-toggle` checkbox
- [x] **Commercial-use only** — `data-registry-commercial-toggle` checkbox
- [x] **Load more** — `data-registry-load-more` button (cursor pagination via
      `nextCursor`)

(Filter prefs persisted via `useStudioWorkspacePersistence`.)

### Route map

- [x] **Route-map articles** — non-interactive path + purpose entries

### Quick-actions

- [x] **Open Isis Analytics And Reporting workspace** →
      `/studio/isis/analytics-and-reporting`
- [x] **Back to Studio workspace index** → `/studio`

## Data & contracts

- **Reads**: `GET /v1/admin/isis/model-registry` (`REGISTRY_ENDPOINT`) on mount
  and on filter/cursor change — items + total + assetTypes + nextCursor
- **Writes**: None (read-only registry; filters re-query)
- **Realtime**: None
- **Caching**: client `fetch`, `cache: 'no-store'`, `buildBffAuthHeaders()`;
  filter preferences persisted locally
- **Auth**: admin-scoped fail-closed (401/403 → unauthorized state); route
  behind the signed-in + studio proxy gate
- **Component sources**:
  - `apps/oshun/web/src/components/studio/StudioIsisModelRegistryWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioIsisModelRegistryRouteMap.ts`

## E2E coverage

- [`apps/oshun/web/e2e/studio-isis-model-registry.spec.ts`](../../../../apps/oshun/web/e2e/studio-isis-model-registry.spec.ts)
  — proves direct `/studio/isis/model-registry` 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 seeded registry with four default
    safe rows, hides `mm_mature_studies_v1` by default, keeps
    `mm_portrait_warmth_v2` visible as non-commercial, renders asset-type
    facets, route-map articles, sibling quick-actions, and bearer-authenticated
    catalog requests.
  - Filter interactions re-query the live BFF for search (`line art`),
    asset-type (`checkpoint`), commercial-use-only, and explicit NSFW inclusion,
    proving that the browser UI is backed by the real `ManagedModelBrowser`
    query contract.
  - Cursor pagination is exercised by constraining the forwarded BFF request to
    two rows, then clicking `data-registry-load-more` and asserting the appended
    second page and live cursor query.
  - Loading, empty catalog, 503 catalog error, malformed catalog, non-admin
    unauthorized, anonymous redirect-before-render, and automated 44px
    hit-target checks for filters, toggles, load-more, and quick-actions are
    asserted.

## Cross-references

- Studio overview: [`../../studio-overview.md`](../../studio-overview.md)
- Sibling routes:
  - [`studio-isis-analytics-and-reporting.md`](./studio-isis-analytics-and-reporting.md)
  - [`studio-isis-civitai-integration.md`](./studio-isis-civitai-integration.md)
  - [`studio-isis-model-merging.md`](./studio-isis-model-merging.md)

## Open questions / known gaps

- [ ] Read-only — intake / approval of a model happens upstream (Civitai
      intake), not from this view
- [ ] Pagination is cursor-based; the matching `total` is computed server-side
      per filter set
- [ ] 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.
