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
Voice
generatedversioned — character_voice_versionsoptional — when voices are on for a speaking charactercharacters.selectedVoiceVersionId → dialogue_recordings.inputHash, shot_dialogue_sections.sourceKey, VideoManifestEntry.audioSourceKeyA designed ElevenLabs voice for a speaking character. Bound on the clip like a character sheet on the still — the LLM never sees the id, so a voice change does not rewrite the motion prompt. Every write appends a row and moves the pointer; a row whose ElevenLabs slot has been freed is stamped released and can never be selected again.
Counts
The check compares these. Change one upstream and this goes stale.
- Voice id (folds into the recording key, the section's sourceKey, and the clip manifest as audioSourceKey with line, tone and TTS model)
Does not count
Change these freely. Nothing goes stale.
- Voice description edits ("Generate voice" releases the old one and designs again)
- Character bible edits
Regenerate this and these go stale
- in the input hash — the voice speaking each turn is part of the recording key
- in the input hash — the voice id is part of sourceKey, so a new voice re-records the shots that voice speaks in
- in the input hash — the voice id folds into audioSourceKey; the LLM never sees it
- via Clip — the selected clip URL
Goes stale when any of these change
Nothing. It is never flagged stale.
Connected, but not tracked
- not tracked, by design — the voice description is drafted from the bible once
- not tracked — a gap — a library voice is copied onto the character at cast, not designed — and redesigning the talent voice later reaches nothing, since talent voices have no version history
- not tracked, by design — decides whether a voice is designed at all
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.