A Workshop Needs a Different Kind of Resilience
An always-on service gets its resilience from supervision. Something watches it, notices when it dies, and starts it again; the state it needs is in a database that survived the crash. A workshop has none of that, and it needs an answer, because a video render is a long job made of expensive steps — speech synthesis that costs money per character, image generation that costs money per image, encodes that cost minutes.
The answer is that every stage is cached and individually re-runnable. A run that dies at the encode step does not redo the synthesis. You re-invoke, the finished stages notice their outputs already exist, and the work resumes where it stopped. Rebuilding anyway is a deliberate act — a force flag — rather than something that happens because you ran the command twice.
Freshness Is a Question, Not an Assumption
The whole design lives in one small function: given an output path and a force flag, is what is on disk still good? Naive answers cause the two failures that actually happen in practice. Answer "yes, if the file exists" and you will happily serve a stale artifact from before your edit. Answer "no, always rebuild" and you have thrown away the property you were trying to buy.
The useful version keys the cached artifact to the content that produced it. If the scene definition changes, the path changes, and the old pixels are simply not where anyone looks — the cache cannot serve a stale answer because it no longer has that address. You will meet a memorable failure of exactly this later in the quest, when a cache with a hole in it served an image three hours old into a finished render.
Where You Cut the Stages Is a Design Decision
It is tempting to treat the stage list as an implementation detail — some arbitrary chopping-up of a long script. It isn't. Every stage boundary is doing two jobs at once, and both of them are about people rather than machines.
A boundary is a place work can resume, which is the mechanical job. But it is also a place a human can look, which is the important one. Speech synthesis is its own stage because a person needs to listen to the takes before anything gets built on top of them. Plates are their own stage because someone has to look at the pictures. If synthesis and assembly were one step, the first opportunity to hear a bad take would be after the encode — and the review that catches it would cost a full rebuild instead of a reroll.
So the rule for where to cut is not "wherever the code gets long." It is: cut where a person would want to stop and judge, and cut before anything expensive that depends on that judgment. Get that ordering right and review becomes cheap enough to actually happen. Get it wrong and you build a pipeline that is technically resumable and practically un-reviewable, because every inspection point sits downstream of the spend it was supposed to prevent.