Developer Guide
Dependency graph
Interactive map of the generation graph: pick anything you can edit and see which prompts, sheets, stills and clips go stale.
Every generated artifact stores a hash of the inputs it was made from. Staleness is never a flag we set: on every read we recompute the hash from the current inputs and compare. A mismatch is stale. A row with no stored hash is untracked and never stale. Versioned things (green border) keep every generation as a row and a pointer picks one. Renders record which version of a prompt or sheet they used, so selecting a different version is what makes them stale, not editing the text.
- tracked
- not tracked — a gap
- not tracked, by design
- seeded once, then yours
- versioned
- optional
- goes stale
- makes it stale
Shot dialogue lines
you editversioned — shot_dialogue_versionsThe lines spoken in one shot. Seeded by the shot-list call at the Script stage, then edited on the shot — the script's copy stays as the LLM's seed and is only read for a shot with no row yet. A scene's conversation is its shots in order, then each shot's lines in order, so there is no scene-level list to keep in step.
Counts
Change one of these and what depends on it goes stale.
- Voice id + line + tone + TTS model of this shot's voiced lines (the section's sourceKey, the clip's audioSourceKey)
- Which voice is bound to which line (a bound audio element skips TTS)
Does not count
Change these freely. Nothing goes stale.
- Speaker renames that do not change which voice is matched
- A shot reorder: the speaking order is read from the shots, and every shot keeps the audio cut for its own lines
- An edit to another shot's lines: that shot adopts new audio, this one keeps its section
Edit this and these go stale
- in the input hash — the voiced turns that were sent, in speaking order, with the shot each belongs to
- in the input hash — sourceKey keys this shot's own voiced lines; only a shot whose key no longer matches adopts new audio
- in the input hash — line + tone fold into audioSourceKey on the manifest
- via Clip — the selected clip URL
Connected, but not tracked
- seeded once, then yours — the shot-list call assigns every spoken line to a shot and seeds that shot's lines with it
What "Update all" regenerates
The depth picker is cumulative. Each rung includes the ones above it, and no rung ever creates an artifact that does not exist yet.
- 1.Prompts only — Rewrites stale visual and motion prompts. Nothing renders.
- 2.Prompts + images — Also re-renders a still that is stale, or whose prompt was just rewritten. Never renders a first still.
- 3.Prompts, images + dialogue — Also re-records a dialogue reading whose voice or lines moved. Never a first recording. Video stays for the next tick so the new take can be reviewed.
- 4.Prompts, images, dialogue + videos — Also re-renders a clip whose prompt, still, or dialogue changed in this run, or whose manifest already diverged. Never renders a first clip.
- 5.Everything, incl. music — Also rewrites a stale music prompt, then the track if one exists. Never a first track.