OmniVoice-Studio / design /05-batch-queue.md
LΓͺ Phi Nam
Deploy to HF Space
94004a2
|
Raw
History Blame Contribute Delete
11.8 kB
# 05 Β· Batch Queue
The honest view of the machine. What's running, what's waiting, what went wrong, and where in the pipeline each job is parked. Named "Batch" because once the task queue is persistent, batches of videos become the natural unit of work.
## View
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ☰ β€Ί Batch Queue [+ New batch] ●Ready β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚ β”‚
β”‚ β”‚ Active 2 running β”‚
β”‚ 🎬 β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ 🧬 β”‚ β”‚ β–£ Keynote 2026 (ENβ†’DE) started 14:02 β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ πŸ“š β”‚ β”‚ Ingest ASR Transcribe Translate Generate Export ↓ β”‚ β”‚
β”‚ β”‚ β”‚ ●────────●─────────●───────────●──────────◐──────────○ β”‚ β”‚
β”‚ πŸ›  β”‚ β”‚ 14/42 β”‚ β”‚
β”‚ β”‚ β”‚ ETA 3m 20s GPU β”‚β–“β–“β–“β–“β–“β–“β–‘β–‘β”‚ 72% VRAM 6.1 GB [⏸] [⏹] β”‚ β”‚
β”‚ πŸ“¦ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β”‚ βš™ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
│ │ │ ▣ Tutorial ep. 2 (EN→JA) started 13:48 │ │
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ Ingest ASR Transcribe Translate Generate Export ↓ β”‚ β”‚
β”‚ β”‚ β”‚ ●────────●─────────●───────────◆──────────○──────────○ β”‚ β”‚
β”‚ β”‚ β”‚ ⏸ awaiting review β”‚ β”‚
β”‚ β”‚ β”‚ Paused by user Β· 3 flagged segments need approval [Review] [⏹] β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β”‚ β”‚ Queued 3 pending β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
│ │ │ #3 Product demo v3 · EN→ES · est. 9 min · depends-on: none [⇅] │ │
│ │ │ #4 Product demo v3 · EN→FR · est. 9 min · depends-on: #3 [⇅] │ │
│ │ │ #5 Cooking show pilot · EN→IT · est. 22 min · depends-on: none [⇅] │ │
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β”‚ β”‚ Completed today 4 done β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ β”‚ βœ“ Interview β€” Huberman (ENβ†’DE) 12m 04s Β· 42 seg Β· 1 warning [open] β”‚ β”‚
β”‚ β”‚ β”‚ βœ“ Product demo v3 (ENβ†’DE) 9m 12s Β· 28 seg [open] β”‚ β”‚
β”‚ β”‚ β”‚ βœ“ Marketing cutdown v4 2m 31s Β· 7 seg [open] β”‚ β”‚
β”‚ β”‚ β”‚ βœ— Untitled-17 (ENβ†’KO) failed at step 6 Β· "OOM" [retry] [logs] β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β”‚ β”‚ Logs (tail -f) [β‹” filter] β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ β”‚ 14:07:11 info dub.generate seg=14 dur=4.6s voice=marcus β”‚ β”‚
β”‚ β”‚ β”‚ 14:07:13 info dub.generate seg=14 lip_sync=0.98 ok β”‚ β”‚
β”‚ β”‚ β”‚ 14:07:13 info dub.generate seg=15 dur=4.9s voice=spk-02 β”‚ β”‚
β”‚ β”‚ β”‚ 14:07:15 warn rvc skipped: model not loaded β”‚ β”‚
β”‚ β”‚ β”‚ 14:07:15 info dub.generate seg=15 lip_sync=1.04 ok β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
## Pipeline step glyphs
```
● completed
◐ in progress
β—† paused at checkpoint (awaiting review)
β—‹ queued
βœ— failed
```
Each stage is explicitly **resumable**: a `●` means the artifact for that stage is persisted in the job store with a checksum. A crash before a `●` re-runs just that stage.
## Anatomy of a job row
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚
β”‚ [icon] {project name} {from β†’ to} started {time} β”‚
β”‚ β”‚
β”‚ {pipeline steps visualised} β”‚
β”‚ β”‚
β”‚ {current-step progress} β”‚
β”‚ β”‚
β”‚ {resource readout} {wall-clock ETA} [action buttons] β”‚
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
- Pipeline glyphs are **never** animated (no spinners inside the ASCII track). The current step pulses the text underneath.
- Action buttons are role-aware: `[⏸]` when running, `[Resume]` when paused, `[retry]` when failed.
## Rules of the view
- **Only one GPU job runs at a time.** Queued jobs with no dependency run in FIFO order. Users can reorder (`[β‡…]`) at will.
- **Dependencies** are first-class. `depends-on: #3` means "start after #3 finishes, regardless of final state." Failures break the chain and surface a banner.
- **Paused jobs don't block the queue.** A job in `awaiting_review` releases the GPU; the next queued job starts. When the user resumes, it re-queues.
- **Completed today** is a 24-hour window. Older jobs live in each project's own history.
- **Logs pane** tails `/metrics/logs` SSE with filter chips. Defaults to active-job logs only.
## States the view must handle
- **Empty queue**: full-page empty state with `[+ New batch]` and a link to Launchpad.
- **Nothing active, things queued** (rare, usually means GPU is warming up): active region shows `⏳ GPU warming up…`.
- **Server restart during a run**: job re-appears in "Active" on reload with the step marker rewound to the last `●`; banner: *"Resumed from checkpoint at step 5 β€” no data lost."*
## What binds to what
| UI region | API | Store |
|---|---|---|
| Active jobs | `GET /jobs?state=active`, SSE `/jobs/stream` | `jobs.active` |
| Step glyph state | SSE payload `{job_id, step, state}` | `jobs.steps[job_id]` |
| Reorder | `PUT /jobs/{id}/priority` | `jobs.queued` |
| Cancel / retry | `POST /jobs/{id}/{cancel|retry}` | `jobs` |
| Logs pane | SSE `/metrics/logs?job={id}` | `logs.tail` |
## Roadmap phase
Fully realised in **Phase 4** (staged checkpoints + step-level resumability). Skeleton of this page appears at end of **Phase 1** (active/queued strips, no checkpoint gating yet). Logs pane requires Phase 1.6 (structured logging baseline).