All case studies

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
Cheap images before expensive videoCheap images before expensive video — Lint · shot sheet → Voice · keyframes → Human gate → Animate · assemble. Dry run on every stage that spends01Lint · shot sheet02Voice · keyframes03Human gate04Animate · assembleDry run on every stage that spends

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.

Next caseA document process turned into software

Let's talk

Send me the process that costs you the most time.

I will tell you whether it is worth automating before you spend anything. Thirty minutes, no commitment, no pitch deck.