V1 Web PWA · Surface walkthrough

Isis Model Registry

A per-surface walkthrough of the V1 Web PWA studio surface: layout, states, interactions, data, and cross-references.

walked
9sections3 minread

On this page

Context. surface studio · domain isis · route /studio/isis/model-registry · auth signed-in + studio entitlement (NOT AAA-gated) · source apps/oshun/web/src/app/studio/isis/model-registry/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-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.

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#

  • Loadingdata-registry-loading "Loading model registry…"
  • Unauthorizeddata-registry-unauthorized (admin-scope fail-closed on 401/403)
  • Errordata-registry-error on non-OK / malformed response
  • Ready — summary + filters + model list render
  • Empty (filtered)data-registry-empty "No managed models match the current filters."

Interactions#

Filters (client-driven re-query)#

  • Search (title, creator)data-registry-search search input
  • Asset typedata-registry-asset-filter select (options from response assetTypes)
  • Show NSFWdata-registry-nsfw-toggle checkbox
  • Commercial-use onlydata-registry-commercial-toggle checkbox
  • Load moredata-registry-load-more button (cursor pagination via nextCursor)

(Filter prefs persisted via useStudioWorkspacePersistence.)

Route map#

  • Route-map articles — non-interactive path + purpose entries

Quick-actions#

  • Open Isis Analytics And Reporting workspace/studio/isis/analytics-and-reporting
  • 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 — 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#

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.