---
path: /isis/lora-training
surface: admin
domain: isis
auth: signed-in (admin)
source: apps/oshun/admin/src/app/isis/lora-training/page.tsx
status: drafted
last_walked: '—'
---

# Isis ops · LoRA training

## Purpose

LoRA training queue admin (§24.5): surfaces operator queue, per-run dataset
rights attestation, training-run config, progress timeline (sample previews per
checkpoint), cost estimate, abort, and the promotion-to-managed-models rehearsal
gate. Backed by `@isis/lora-training-surface`.

## Entry points

- Direct URL — `/isis/lora-training`
- External runbooks / deep links
- Not in canonical IA — no sidebar entry

## Layout regions

Page does NOT wrap in `AdminShell`. Resolves `runs` via `binding`
(`bindTrainingRunsLoader`) and renders `<LoraTrainingPanel runs={runs} />`:

- **LoraTrainingPanel** — `<main>` with 260px aside + detail:
  - **Aside / Training queue**:
    - **State filter** — `<select data-field="stateFilter">` with options `all`
      plus each `TrainingRunState` from `TRAINING_RUN_STATES`
    - **Run list** (`<ul data-testid="run-list">`) — entries with `data-run-id`,
      `data-run-state`; each shows display name, state, rank, cost estimate in
      cents
  - **Detail pane** — selected run (`data-testid="run-detail"`); fields include
    dataset rights attestation, training config, progress timeline, cost
    estimate, abort, rehearsal gate (per the file fileoverview; visible source
    confirms list + selector pattern)

## States

- [ ] Anonymous → global middleware redirects
- [ ] Binding not set → `[]`; queue empty
- [ ] State filter `all` → all runs shown
- [ ] State filter a specific `TrainingRunState` → runs filtered by
      `r.state === stateFilter`
- [ ] Empty filtered list → `selected` null
- [ ] Selected run has dataset rights attestation → detail surfaces the
      attestation block (verify from full source)
- [ ] Selected run is `running` → progress timeline / abort affordance visible
- [ ] Selected run is `completed` → promotion-to-managed-models rehearsal gate
      visible (per the file comment)

## Interactions

- [ ] **State filter select** — `data-field="stateFilter"`
  - Function: sets `stateFilter` (`'all'` or `TrainingRunState`)
- [ ] **Run list item** (`<li role="button" tabIndex={0}>`)
  - Function: sets `selectedIdx`; Enter activates
- [ ] Detail-pane interactions for the selected run (abort, rehearsal-gate
      advance, attestation review) — discoverable in the full panel source

## Data & contracts

- **Reads**: `binding()` returns `readonly TrainingRun[]` from
  `@isis/lora-training-surface`
- **Writes**: per panel (abort, rehearsal-gate progression, promotion) — not
  visible in the inspected portion; verify in full source
- **Realtime**: progress timelines are a natural fit for realtime but the page
  is server-rendered with a static binding
- **Auth/role check**: only the global middleware

## Cross-references

- Shell: `shell/02-routing-layouts.md`
- Sibling Isis routes: `isis-model-merging.md`, `isis-runpod-endpoints.md`,
  `isis-civitai-intake.md` (intake → training → merging → promotion is the
  implicit funnel)
- Related canonical workspace: `../workspaces/content/models.md` (model registry
  is where promoted runs land)
- Library: `@isis/lora-training-surface` — `TRAINING_RUN_STATES`, `TrainingRun`,
  `TrainingRunState`
- Component source:
  `apps/oshun/admin/src/app/isis/lora-training/LoraTrainingPanel.tsx`

## Open questions / known gaps

- [ ] No session / scope check at the page level
- [ ] `bindTrainingRunsLoader` module-level mutable state pattern reused across
      the Isis-ops routes — document the binding strategy
- [ ] Document the rehearsal gate / promotion handoff into `/models` (the
      canonical model registry) — relationship not declared in
      `OSHUN_ADMIN_WORKSPACE_RELATIONSHIPS` because the Isis routes are outside
      the canonical IA
