File size: 11,766 Bytes
94004a2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# 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).