---
path: /studio/isis/civitai-integration
surface: studio
domain: isis
auth:
  signed-in + studio entitlement (segment not in `AAA_ONLY_STUDIO_ROUTES` —
  renders as-is)
source: apps/oshun/web/src/app/studio/isis/civitai-integration/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)'
---

# Isis Civitai Integration

## Purpose

Admin §24.2 intake-review console for Civitai asset candidates: it reads the live
intake-review context and renders the rights/license/safety review queue plus the
searchable-candidate pool with full governance metadata (license tag, NSFW
posture, lineage, content labels, recommended sampler config, compatibility
notes), the position of each queued entry along the canonical promotion pipeline,
and the decision history that moved it there. Reads flow through
`/v1/admin/isis/civitai-intake` and decisions through
`/v1/admin/isis/civitai-intake/decisions`; it is admin-scoped and fails closed —
without the Isis scope the operator gets a governance message and no candidate
data.

## Entry points

- Sibling quick-action from `/studio/isis/model-registry`
- 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-civitai-integration-workspace`):
  - `<h1>` (`WorkspaceHeading`) "Isis Civitai Integration Workspace"
  - Summary paragraph (`data-isis-civitai-integration-summary`)
  - Promotion-pipeline rail (`data-civitai-pipeline-rail`) with per-stage
    `data-civitai-pipeline-stage` and `data-civitai-pipeline-current`; off-pipeline
    terminal queues (`data-civitai-terminal-state`)
  - **Review queue** (`<h2>`) — `data-civitai-review-queue` of
    `data-civitai-review-row` (active row `data-civitai-review-row-active`); empty
    state `data-civitai-review-queue-empty`; queue filter
    `data-civitai-queue-filter`
  - **Candidate detail** (`<h2>`) — `data-civitai-review-detail` with NSFW badge
    (`data-civitai-nsfw-badge`), decision history (`data-civitai-history` /
    `data-civitai-history-entry`), and the **Decision** form
    (`data-civitai-decision-form`)
  - **Searchable candidate pool** (`<h2>`) — `data-civitai-search-pool` of
    `data-civitai-search-candidate`; search input `data-civitai-search-input`,
    asset filter `data-civitai-asset-filter`; empty state
    `data-civitai-search-pool-empty`
- **Route Map panel** (`data-isis-civitai-integration-route-map`): `<h2>Route
  Map</h2>` over `STUDIO_ISIS_CIVITAI_INTEGRATION_ROUTE_MAP` (5 entries)
- **Sibling quick-actions panel**: `/studio/isis/model-registry`, `/studio`

## States

- [ ] **Loading** — `data-civitai-loading`
- [ ] **Unauthorized** — 401/403 admin-scope fail-closed;
      `data-civitai-unauthorized` (governance message, no candidate data)
- [ ] **Error** — non-OK or malformed response; `data-civitai-error`
- [ ] **Ready** — context present; review queue + candidate detail + search pool
      render; selecting a row populates the detail/decision form
- [ ] **Result** — after a decision POST, `data-civitai-decision-result`
      (`data-civitai-decision-status`)

## Interactions

### Review queue / pool

- [ ] **Review row** (`data-civitai-review-row`) — selects the active candidate
- [ ] **Queue filter** (`data-civitai-queue-filter`, `<select>`)
- [ ] **Search input** (`data-civitai-search-input`) + **asset filter**
      (`data-civitai-asset-filter`)
- [ ] **Search candidate** (`data-civitai-search-candidate`) — selectable pool
      entries

### Decision form (`data-civitai-decision-form`)

- [ ] **Decision kind** (`data-civitai-decision-kind`, `<select>`)
- [ ] **Note** (`data-civitai-decision-note`, text)
- [ ] **Conditions** (`data-civitai-decision-conditions`)
- [ ] **Recipe** (`data-civitai-decision-recipe`)
- [ ] **Record decision** (`data-civitai-decision-submit`) —
      `POST /v1/admin/isis/civitai-intake/decisions`

### Route Map

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

### Sibling quick-actions

- [ ] **Open Isis Model Registry workspace** → `/studio/isis/model-registry`
- [ ] **Back to Studio workspace index** → `/studio`

## Data & contracts

- **Reads**: `GET /v1/admin/isis/civitai-intake` (review-queue context: rows,
  candidate pool, pipeline stages, decision history)
- **Writes**: `POST /v1/admin/isis/civitai-intake/decisions` (record a
  rights/license/safety decision; advances the candidate along the
  `@isis/ai-providers/civitai-intake` REVIEW_QUEUES 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
- **Component sources**:
  - `apps/oshun/web/src/components/studio/StudioIsisCivitaiIntegrationWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioIsisCivitaiIntegrationRouteMap.ts`

## Cross-references

- Studio overview: [`../../studio-overview.md`](../../studio-overview.md)
- Review-queue domain: `@isis/ai-providers/civitai-intake` (REVIEW_QUEUES)
- Sibling routes:
  - [`studio-isis-model-registry.md`](./studio-isis-model-registry.md)
  - [`studio-isis-lora-training.md`](./studio-isis-lora-training.md)

## Open questions / known gaps

- [ ] No breadcrumb on this route — navigation is via sibling quick-actions
- [ ] This intake console is a distinct review/decision shape (queue + pipeline
      rail + decision history), not the single-form lane used by most Isis
      surfaces; image/LoRA intake here is separate from the `model-governance-3d`
      domain
