Episode Lifecycle
Statuses​
| Status | Description |
|---|---|
draft | Work in progress — all editing is allowed |
active | In active production — editing is allowed |
completed | Finished — episode is locked (read-only) |
paused | Temporarily suspended — episode is locked |
Locking​
When an episode's status is completed or paused, it is locked. A locked episode prevents:
- Editing scene blocks
- Adding or removing creator assignments
- Generating voiceovers, frames, or videos
- Importing or deleting the episode
The lock state is surfaced in the UI via the episode.isLocked flag, which gates drag-and-drop, edit buttons, and the Save button in the creators modal.
An Admin can unblock a locked episode to resume work on it.
State transitions​
draft ──► active ──► completed
▲ │
│ ▼
└──── paused
Transitions are made by editing the episode and changing its status field. Only users with episode:edit can change status; only Admins can delete episodes (episode:delete).
Episode fields​
| Field | Type | Description |
|---|---|---|
id | UUID | Unique identifier |
name | string | Episode title |
number | number | Episode number within the project |
description | string | Optional description |
status | enum | draft / active / completed / paused |
targetDuration | number | Target length in seconds |
isLocked | boolean | Derived from status |
projectId | UUID | Parent project |
previewUrl | string? | Preview image URL |