Children’s content channel
Cheap images before expensive video
Ten episodes produced by a single operator, with cost control enforced by architecture rather than discipline.
Stack
- Python
- Claude
- JSON schema validation
- ElevenLabs
- pytest
- 7
- idempotent, resumable stages
- Stage 5
- human approval gate, with no flag to skip it
- 20 → 37
- written blocks become shots, which is why that layer needs judgment
- 26 · 15
- tests, of which 15 are negative
The problem
A children’s content channel needed a ten-episode animated series produced by a single operator.
Generative image and video burn credits at every step, and a single bad decision propagates: approve a wrong character sheet and you pay for it across every shot of every episode.
The real risk in a generative pipeline is not quality. It is spending real money generating video from a frame nobody looked at.
The approach
Seven idempotent, resumable stages: lint, shot sheet, voice, keyframes, approval, animate, assemble. Every stage reads the episode manifest first and only does what is still pending, so re-running any stage is always safe.
Stage five is a hard human gate. Animation will not start while a single shot is unapproved, and there is no flag to skip it. Cheap images get reviewed before expensive video gets generated. That ordering is the whole architecture.
Every generation stage has a dry run that prints exactly what would be sent to the model without spending anything.
The decision worth copying
Splitting a script block into shots is judgment, not a rule: episode one has twenty written blocks and thirty-seven shots.
So an LLM resolves that one layer, and everything downstream validates its output deterministically against a JSON schema.
That is the pattern I bring to client work: a model where judgment is genuinely required, deterministic validation everywhere else. Not a model asked to be reliable at things a schema does better.
What validation caught
Linting runs clean across all ten scripts, covered by twenty-six tests of which fifteen are negative — they assert the linter rejects what it should reject.
Episode one’s shot sheet is the golden reference, and the command refuses to overwrite it. Regenerating it reproduced thirty-seven shots against the golden thirty-seven.
The segmentation layer has three interchangeable backends, so the expensive path stays optional.
The project’s own documentation reports a known defect rather than hiding it: the scripts declare more spoken words than they actually run, so real episode runtime lands below what the format assumed. The linter raises it as a warning on all ten and does not block the pipeline. A system that hides its own known defects is worse than one that reports them.
The result
Ten episodes produced on the pipeline.
The architecture is format-agnostic, and it has already been forked for a second series in a completely different genre — live action rather than animation — currently in production scoping.
That is what makes it an offer rather than a project.
The transferable piece
Put the human gate before the expensive step, and make it impossible to skip. Cost control that depends on remembering is not cost control.