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 section
generatedversioned — shot_dialogue_sectionsoptional — when voices are on and someone speaks in the shotshot_dialogue_sections.sourceKey → shots.audioClipsThe time range of a recording this shot speaks in. A recording adds a row for every shot it spoke: selected for the shots it was made for, left as an unselected context reading for the rest, so an edit to one shot re-points one shot. The selected row is cut to a file on shots.audioClips, and that clip's id is the row's id.
Counts
The check compares these. Change one upstream and this goes stale.
- Voice id + line + tone + TTS model of the shot's authored voiced lines (sourceKey)
- Which recording, and from where to where in it
Does not count
Change these freely. Nothing goes stale.
- A newer recording made for another shot (its reading of this shot waits, unselected, until picked)
- The wording a fit rewrite actually delivered (kept as spokenLines; sourceKey keys the authored lines)
- The cut file itself: a cache at a key made from the recording id, the range and the pad floor
Regenerate this and these go stale
- by selected version — the manifest records the clip id (audioClipIds), which is the section's id, so picking another reading of the same lines re-stales only that shot's clip
- via Clip — the selected clip URL
Goes stale when any of these change
- 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 — the voice id is part of sourceKey, so a new voice re-records the shots that voice speaks in
- by selected version — a section is a time range of one recording; a re-record appends a recording and re-points only the shots it was made for
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.