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}`
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).