Novoads Claymation Ad skill

Novoads Claymation Ad — Poster frame: a crumpled plastic bottle with sad eyes lying in a wet gutter under a street lamp (from the novoads/agent-skills README)

Illustration · not a resultFrom the novoads/agent-skills README — shows the whole collection, not only this skill.source ↗

Builds a hand-sculpted stop-motion CLAY ad on the Novoads REST API as a STORYBOARD: five to eight beats, each rendered from its own key frame, a storyteller narration laid into the gaps, a music bed, captions burned on, assembled locally with ffmpeg.

by novoads·MIT license·★ 23 Stars on the repo·GitHub ↗

Use now
Novoads Claymation Ad — Poster frame: a crumpled plastic bottle with sad eyes lying in a wet gutter under a street lamp (from the novoads/agent-skills README)

Illustration · not a resultFrom the novoads/agent-skills README — shows the whole collection, not only this skill.view on GitHub

Files of Novoads Claymation Ad

novoads/main1 file shown
SKILL.md
Show the full text501 lines

Novoads Claymation Ad

One product in. A 40 to 70 second hand-sculpted clay ad out, cut from five to eight separately rendered beats, with narration, music and captions.

This is the sibling of pixar-ad and it runs the same pipeline: the same gates, the same calls, the same still gate, the same local assembly. Read that skill for the pipeline. This file owns two things it does not: the clay look, and a narrative arc that is longer and quieter than the Pixar one.

The two are not interchangeable, and the difference is not decoration:

Pixar storyboard Claymation storyboard
Hook an anthropomorphized problem with eyes, speaking a named person in their kitchen, and a narrator
Arc 4 to 6 beats, a want and a turn 5 to 8 beats, a small life story
Voice in-scene SYNC plus narration a storyteller carrying almost all of it
Surface smooth, wet-eyed, subsurface scattering matte clay, thumbprints, tool marks
Runs on want, then relief affection for a character

Picking the wrong one is not a style mistake, it is a story mistake. If the product's pain is a moment, that is the Pixar skill. If it is a season of someone's life, it is this one.

Every clay ask lands here, including the short ones. There is no one-call clay tier. A five-beat short is the small end of this pipeline, not a different door: still per-beat renders, still ffmpeg, still an assembly.

Before anything: this runs on a Novoads account

  1. A Novoads account with credits. https://novoads.ai. There is no free tier and no trial: every plan is a paid monthly subscription, published at novoads.ai/pricing. Never call it free.
  2. An API key in .env at the repo root, as NOVOADS_API_KEY=novo_…. Check it with ./scripts/check-novoads-env.sh; if it is missing, run ./scripts/setup.sh. That is the whole setup: curl and jq, one key, no connector to add and no session to restart.
  3. ffmpeg on your machine. The assembly happens here, not on the server. ffmpeg -version before you start.

REST key required. A Novoads MCP connector is not a substitute. If NOVOADS_API_KEY is missing or still the placeholder, stop before any generation work and tell the user: "Before continuing, create an API key at https://novoads.ai/dashboard/settings?tab=api and paste it into .env." That holds even when mcp__novoads__* tools are connected and authenticated in the session. Never call mcp__novoads__* tools from this repo's workflows: they are a different surface with different behavior, including the units they quote costs in. Repo installs verify with ./scripts/check-novoads-env.sh; a solo install checks NOVOADS_API_KEY in the environment.

Pack version. Every /v1 response carries X-Novoads-Pack-Version; mention a newer pack at https://github.com/novoads/agent-skills only when that header names a version NEWER than this file's metadata.packVersion — equal or older is nothing to say, and it is never a reason to stop.

Every HTTP mechanic here belongs to the pack, not to this skill. Auth, strict bodies, status codes, the poll loop, rate limits and error envelopes are written out once in skills/novoads-api/SKILL.md and its reference.md. The per-call fields this genre needs are in pixar-ad's The calls section, which this file shares unchanged.

What one run costs

Two shapes, and the choice is the operator's. What changes between them is the COUNT of the same components, never their kind:

Component 5-beat short 8-beat full
Cast sheet image 1 1
Beat stills 5 8
Beat clips 5 × 6s 8 × 7s
Voice-over lines 5 8
Music bed 1 1
Transcript, then one caption pass 1 each 1 each

There is no price column, on purpose. Every credit number this run shows a user comes from POST /v1/estimates, in this session, before anything is charged: price each KIND once, multiply by the counts above, and quote what came back. A rate written into a skill file goes on being quoted long after it moved.

The clips are most of the bill either way, and a still is a small fraction of the clip it seeds. That is the whole economic argument for the board gate.

Say the shape out loud before pricing it. An 8-beat clay ad is the most expensive thing in this family, and the honest question at Gate 0 is whether beats 3, 4 and 5 are earning the three extra clips they cost. They often are; the arc is what this genre is for. But the operator decides that, not you.

Hard constraints

Everything in pixar-ad's Hard constraints section applies unchanged: one call per beat, 4 to 15 seconds, 9:16, audioEnabled: true, a narrator line in the prompt OR the VO track and never both, one continuous voice, no styleFamily field. Read them there.

Three are different here:

  • Five to eight beats, not four to six. The arc is a story and a story needs its middle. Below five beats it is a Pixar-shaped ad in clay, and the Pixar skill will render it better and cheaper.
  • The narrator carries the ad. This genre is third-person storytelling, and the narration is not filler between spoken lines the way it is in the Pixar skill. Most beats are VO beats and that is correct here.
  • At least one beat is still SYNC. Usually beat 3, the social beat, where a second character says the thing the protagonist has been avoiding. A whole ad of narration over silent faces is the failure this rule exists to prevent.

Two ways in

A. From a product

Run pixar-ad's Gate 0 and Gate 1 unchanged: is the pain emotional, visible on a face, in a relationship, impulse-priced; then the product read. One extra question at this length: does this product have a before and an after that a viewer would recognise a month apart? The transformation beat is the spine of the clay arc, and a product with no visible change does not have one.

B. From a found video

The other entry, and the one this genre is usually asked for: someone shows you a clay ad and wants theirs. Do not guess at its structure from the thumbnail.

Read the reference locally. Follow skills/analyze-video/SKILL.md: frames out with ffmpeg, dialogue out with Whisper, then read the beats off what you extracted. It costs nothing, needs no key, and — unlike a fixed-window reader — it covers the whole runtime, which is what a 60-second arc needs.

There is a hosted alternative, and it is not the default. POST /v1/analyses returns the structured hook/beat/casting breakdown in one call (poll it if it answers running), priced through POST /v1/estimates with {"kind":"analysis"}. Reach for it only when ffmpeg is missing or the local read has already failed: the local path costs nothing, ffmpeg is a hard dependency of the assembly anyway, and /analyses defaults to reading the first 20 seconds, which is exactly the setup third a clay arc cannot afford to lose. If you do offer it, price it first and let the user choose. See reference.md § Ad analysis is on this API now.

Two things to hold on to whichever way you read it:

  • Sample the whole video, not its opening. A clay ad spends its first third on setup, so a read that stops early gives you the hook, the casting and the palette and none of the arc. A board that claims eight beats from a partial read is a board with invented beats in it.
  • Write our own story. Recreate the FORMAT, never the script: their protagonist, their brand and their claims are theirs. What transfers is the shape, the palette, the pacing and the narrator persona.

The clay look

Style lock — one paragraph, pasted verbatim into every prompt
Hand-sculpted stop-motion clay look. Plasticine characters with visible
fingerprint impressions and sculpting-tool marks, matte clay surfaces with
subtle micro-bumps, slightly asymmetric features, painted-on or sculpted
eyebrows. Real knit-fabric clothing with visible wool weave and stitch lines,
wooden and ceramic miniature-set props with hand-painted finishes. Warm tungsten
interior lighting, shallow macro depth of field, soft photographic bokeh.
Subtle imperfection in every surface. Vertical 9:16 composition.

Never name a studio or a franchise. The lineage this look comes from belongs to two specific studios, and naming either is both an IP problem and a worse prompt: the model reaches for their characters instead of your sculpt. "Hand-sculpted stop-motion clay" is what the words above are doing.

The negative block
no live-action footage, no photorealistic humans, no uncanny faces, no dead eyes,
no smooth 3D digital render, no glossy surfaces, no ray-traced reflections,
no subsurface scattering, no wet-eye highlights, no anime style,
no 2D illustration, no named or copyrighted animated film characters,
no extra fingers, no melted features, no morphing between frames,
no warped product labels, no on-screen text, no subtitles, no captions

Half of this block is doing a job the Pixar one does not: holding the render away from its own default. The video models smooth clay into 3D plastic over the length of a clip, so no smooth 3D digital render, no glossy surfaces and no subsurface scattering are load-bearing, not boilerplate.

Material detail — paste the lines that apply to what is in frame
Skin: matte plasticine, visible thumbprint impressions on cheeks and forehead,
small sculpting-knife creases at the corners of the eyes, slight asymmetry
between the left and right side of the face.
Hair: sculpted in distinct ribbon-strands of plasticine, individual strand
grooves carved with a tool, slightly stiff and not flowing.
Eyes: small matte clay orbs set into sculpted sockets, a single soft highlight,
no wet shine.
Knitwear: real chunky wool yarn, individual stitches visible, slight wear at the
cuffs and hems.
Wood props: hand-painted matte finish, visible grain, small dents and scratches
that suggest age.
Ceramic: hand-thrown irregular form, glaze pooling at the bottom edges, slightly
off-round.
Product packaging: a clay-shaded prop with a hand-painted label, the paint
slightly uneven and matte.

This block is the difference between clay and a cartoon of clay. Paste the relevant lines into every still prompt. Drop the ones for materials that are not in the frame; a knitwear line on a product close-up buys nothing.

Faces here may be quirky. That is a licence, not a defect

The Pixar sibling chases APPEAL: symmetrical, soft, a moment before a smile. This genre does the opposite and it is the single easiest thing to lose when the two skills sit side by side. Clay characters are allowed to be odd. Oversized noses, deep wrinkles where the sculptor pressed, eyes set slightly unevenly, a jaw that is not quite level. Quirky beats appealing here, and a clay protagonist rendered pretty reads as a 3D render wearing a clay texture.

Say it in the prompt, per character, or the model will smooth it out: "an oversized nose, deep sculpted wrinkles at the eyes, slightly uneven eye placement."

Smooth motion or stop-motion judder

Real stop-motion carries a 12 to 15 fps judder. Our renders come out smooth at 24 or 30, and smooth is the default because it is what the genre's own reference ads do.

If the operator wants the judder, it is a post step and never a prompt:

ffmpeg -i captioned.mp4 -filter:v "fps=12,fps=24" -c:a copy captioned-judder.mp4

Run it before the music bed goes on. music_mix.py stream-copies the picture, so every pass that re-encodes the picture belongs ahead of it — and then the file the mixer measures and verifies is the file you ship.

Asking the render for "stop-motion judder" does not control frame rate and does break the look. Do not put it in a prompt.

The arc

Eight beats, and the operator picks how many of them get made. The beat formulas, the variable tables and the worked prompts are in references/formulas.md.

# Beat Seconds Track Drop for the short?
1 Setup — the protagonist in their own world 7 VO keep
2 Inciting moment — they notice the problem 6 VO keep
3 Social validation — someone else says it out loud 8 SYNC drop
4 Quiet despair — alone, at a mirror or a window 6 VO drop
5 Clay infographic — the mechanism, sculpted 7 VO drop
6 Discovery — they find the product 6 VO keep
7 Transformation — weeks pass, the change is visible 9 VO keep
8 Resolution — confident, then the end card 6 VO closes keep

The 5-beat short is 1, 2, 6, 7, 8 and lands around 34 seconds. It is the right call for a first run with a brand, and it is what the dry run below uses.

Beat 3 is where the SYNC line goes when the short is not being made. When it is, promote the SYNC line to beat 6: the protagonist says one short thing to themselves when they find the product. Do not ship an ad where no mouth ever moves.

Beat 5 is optional even in the full arc. A sculpted clay chart sells a mechanism; it wastes 7 seconds on a product that has none.

Which beats earn their place, by category
Category Arc What changes
Supplement, stress, sleep the full 8 Beat 5 is the one that sells it. Keep the chart
Beauty and skincare 8, chart optional Beats 2 and 4 carry it: the mirror, then the reflection alone
Office or B2B the full 8 Beats 1 to 4 in cool fluorescent light, warm only from the discovery on. The palette is the story
Food and kitchen the 5-beat short Beats 1, 6 and 7 dominate; if you keep beat 3, make it a family table rather than a cafe

The office row is the one worth reading twice. Everywhere else this genre is warm tungsten throughout; a fluorescent first half and a tungsten second half tells the arc in light before a word is spoken.

Everything else about the board — one action per beat, its own setup, the word budget, VO and SYNC never overlapping in the same beat, no em dashes, never "free" — is the Pixar skill's board section, unchanged.

The cast sheet

Same call, same single image, different contents. Clay ads usually carry two named characters, and the narrator is a third presence who is never on screen.

Write the sheet text first from the template in references/formulas.md, then render it. The template's slots that matter most here:

  • A name. The narrator says it out loud, and a named protagonist is most of why this genre works. "Diane" is a person. "A woman in her 50s" is a stock photo.
  • Middle-aged or older. The look flatters sculpted laugh lines and hooded eyelids, and the arc needs a life already in progress.
  • The terse tag, 11 to 30 characters, anchored on wardrobe. Our renders re-cast on every cut, so this is what carries one face across eight beats.
  • A narrator persona, chosen once from GET /v1/voices and reused for every line. Warm storyteller and wry observer are the two that fit; pick one and say which.

The gates

Gates 2 through 8 are pixar-ad's, unchanged, including:

  • Gate 2 — price every kind once with POST /v1/estimates, multiply, announce in one line, proceed.
  • Gate 3 — every still before any clip, each chained on the cast sheet and the previous still by the assetId that POST /v1/images returns, then STOP at the board gate. At eight beats there are eight clips waiting behind it. This gate is worth more here than anywhere else in the family. A still that answers status: "running" (API 2.39.0) is polled at GET /v1/generations/{jobId} to a terminal status, its assetId read from images[] there, and never resubmitted: a resubmit is a second charge.
  • Gate 4 — clips in waves of at most five. Eight beats is two waves, five then three, because a sixth concurrent POST /v1/videos comes back 429 with details.reason: concurrency_limit, and that is a real refusal, not a queue.
  • Gate 5 — one voice, chosen once from GET /v1/voices and passed as voiceId on every POST /v1/voiceovers. Gate 6 — generate the music bed. Laying it is the last thing that happens in the run and it belongs to music-mix and its scripts/music_mix.py, run over the captioned cut, never to hand-written ffmpeg.
  • Gate 7 — trim each clip to its narration plus 0.5 seconds, concat, build ONE voice track, composite the end card from the real photograph, transcribe and read it back. Read the mix out of the Pixar skill rather than from here — the clip level is per beat, not one recipe, and this line used to restate it as a flat VO 100% / clip 28% / music 10%. That recipe was written when every beat was a VO beat. This genre has a SYNC beat (beat 3), where the clip's own audio IS the dialogue, and 28% buries it under a caption spelling out words the viewer cannot hear. One number cannot serve both cases, so this file states none — and the bed's level is no longer a number at all, it is whatever the mixer measures.
  • Gate 8 — captions, and the BLOCKING caption gate. A garbled brand name is a failed run, not a note in the report.

Gate 7 in particular carries four rules this genre needs verbatim and does not restate here: trim to the VO or extend the VO to fill the shot, never atempo a long line to fit, re-check the caption's vertical position after trimming because the frame at the new cut is not the frame that was there, and build the voice track with amix=duration=longest — first ends the mix when its first input ends, which is how an eight-beat arc ships a silent resolution card.

Do the assembly in outputs/<ad-name>/, not in the directory you started in. The downloaded beats, beats.txt, the trimmed clips, the placed VO lines and the master are one run's working set — a dozen of them loose in a repo root is a diff somebody else has to explain. That includes the judder pass above: captioned-judder.mp4 and the master live there too.

Two caption looks fit this genre, and the preset guidance in the Pixar skill's Gate 8 is how you choose between them. The default is the heavy white sans with a thick dark outline. The alternative, and the one the genre's own reference ads use, is a solid warm-orange rounded block behind white text, sitting slightly tilted in the lower third. No preset renders that block, so it is the one case where the local burn is the right call rather than the fallback.

Two clay-specific additions:

The clay QA is its own check and it is not the Pixar one. Both checklists are in references/formulas.md. The one that matters: the render smooths clay into plastic over the length of a clip. Watch the last second, not the first frame. A still that passed and a clip that ends in glossy 3D is the single most common failure in this genre.

Beat 7's improvement must be localised. "Weeks later" on a whole face produces a different person, which reads as a lie and breaks continuity in one shot. Name the one thing that changed and say that everything else is unchanged.

Output format

Deliver in this order, no preamble:

  1. PRODUCT READ — or, on entry B, the breakdown of the reference with a line saying how much of it was actually read.
  2. FIT — one line confirming Gate 0, or a plain refusal naming a better format. If the pain is a moment rather than a season, hand off to pixar-ad and say so.
  3. ARC LENGTH — 5-beat short or 8-beat full, and why, with both prices.
  4. CAST + STYLE LOCK — the cast sheet text including the name and the terse tag, and the paragraph pasted into every prompt.
  5. BEAT BOARD — the table. At least one SYNC beat.
  6. COST — the POST /v1/estimates figures, announced in one line.
  7. Then generate: cast sheet, all stills, stop at the board gate, clips, VO, music, composite the end card, assemble the voice mix, verify, caption, lay the bed with music_mix.py, and read the captions against the script before calling it finished.

The calls

Identical to pixar-ad's call list — POST /v1/uploads, /v1/estimates, /v1/images, /v1/videos, GET /v1/voices, POST /v1/voiceovers, /v1/music, /v1/captions, /v1/transcripts, and GET /v1/generations/{jobId} with its /watch — with the fields each one takes. Entry B adds no endpoint: the reference read is local ffmpeg and Whisper, and spends nothing.

Worked beat prompt

A finished beat 3 (social validation) POST /v1/videos prompt: the SYNC beat, one action, style lock and material detail included, negatives at the end. lib/generation/__tests__/claymation-storyboard-skill-prompts.test.ts reads this exact block and runs it through the same rule engine POST /v1/estimates lints with.

Hand-sculpted stop-motion clay look, vertical 9:16, animating the two characters
in the reference image. A sunlit miniature clay kitchen, green-painted wooden
cabinets, a red gingham tablecloth, warm tungsten light from a window on
camera-left.

Diane, a woman in her late 50s in a cream chunky knit cardigan, matte plasticine
skin with visible thumbprint impressions and deep sculpted laugh lines, sits
across the table from her friend in a sage-green cable-knit sweater.

From zero to three seconds Diane lowers her cup and her sculpted brow furrows.
From three to eight seconds her friend leans in and says: "You have not been
sleeping, have you." Diane holds still and her eyes drop to the table.

Camera: locked medium two-shot at table height, gentle handheld breathing motion,
no dolly, no zoom. Shallow macro depth of field with the window softly out of
focus.

Skin: matte plasticine, visible thumbprint impressions on cheeks and forehead,
small sculpting-knife creases at the corners of the eyes. Knitwear: real chunky
wool yarn, individual stitches visible, slight wear at the cuffs. Ceramic:
hand-thrown irregular cups, glaze pooling at the bottom edges.

Audio: two warm, unhurried voices at a kitchen table, close and intimate, with
faint kettle and street ambience behind them.

Both characters stay visually unchanged from the reference image: same face
proportions, same hair, same wool weave, same clay texture held to the last
frame. no live-action footage, no photorealistic humans, no uncanny faces, no
dead eyes, no smooth 3D digital render, no glossy surfaces, no ray-traced
reflections, no subsurface scattering, no wet-eye highlights, no anime style, no
named or copyrighted animated film characters, no extra fingers, no melted
features, no on-screen text, no subtitles, no captions

Failure modes

Everything in pixar-ad's Failure modes list applies. Four are this skill's own:

  • The clay turned into plastic by the end of the clip. The most common failure here. The material detail block was thin or the negative block was missing its anti-smoothing lines. Re-render with both, and add "clay texture held to the last frame" to the constraints.
  • The eyes went wet. A Pixar-style multi-catchlight eye leaked in. no wet-eye highlights in the negative block and a single soft highlight, no wet shine in the material block. Both, not either.
  • The transformation beat produced a different person. The improvement was described on the whole face. Name the one thing and pin the rest.
  • Eight beats and no mouth ever moved. Every beat went to the narrator. Beat 3 is a SYNC beat; if you dropped it for the short, beat 6 is.

Hard rules

  • One product per run.
  • Stop at the board gate. The operator approves the board before the clips fire.
  • Never name a studio or a franchise, in a prompt or in ad copy.
  • Never invent reviews, ratings, prices, or performance claims.
  • Use the real brand and the real packaging from the photo.
  • On-screen text is short words and numbers only, never sentences.
  • No em dashes in ad copy. Never say free: every Novoads plan is paid.
  • On entry B, recreate the format and never the script.
  • The end card is composited from the real photograph. Never rendered.
  • Transcribe the master before you call it finished, and read the burned captions against the script. A garbled brand name blocks the ship.
1---
2name: claymation-ad
3metadata: {packVersion: 1.3.0}
4description: >-
5 Builds a hand-sculpted stop-motion CLAY ad on the Novoads REST API as a
6 STORYBOARD: five to eight beats, each rendered from its own key frame, a
7 storyteller narration laid into the gaps, a music bed, captions burned on,
8 assembled locally with ffmpeg. Carries the genre's arc (named protagonist,
9 inciting moment, social beat, quiet despair, sculpted clay infographic,
10 discovery, transformation, resolution card), and also recreates a found clay
11 ad by reading the reference video locally with ffmpeg and Whisper. Use for
12 ANY clay or stop-motion ask at ANY length: "claymation ad", "stop-motion
13 ad", "clay ad", "a quick clay ad", "plasticine characters", "make an ad like
14 this clay one", or a reference video with sculpted clay characters in it.
15 There is no one-call tier here, so ffmpeg is required. Not for the smooth 3D
16 animated look (use pixar-ad, which covers every Pixar-style length),
17 talking-head UGC (novoads-api), or a static image ad.
18---
19<!-- AUTO-GENERATED FILE. Do not edit it: the next build overwrites you.
20 Source of truth is sections/, registered in sections/manifest.json.
21 Edit the section, then run: python3 scripts/build-skill-md.py -->
22 
23# Novoads Claymation Ad
24 
25One product in. A 40 to 70 second hand-sculpted clay ad out, cut from five to
26eight separately rendered beats, with narration, music and captions.
27 
28This is the **sibling** of `pixar-ad` and it runs the same pipeline: the
29same gates, the same calls, the same still gate, the same local assembly. Read
30that skill for the pipeline. **This file owns two things it does not: the clay
31look, and a narrative arc that is longer and quieter than the Pixar one.**
32 
33The two are not interchangeable, and the difference is not decoration:
34 
35| | Pixar storyboard | Claymation storyboard |
36|---|---|---|
37| Hook | an anthropomorphized problem with eyes, speaking | a named person in their kitchen, and a narrator |
38| Arc | 4 to 6 beats, a want and a turn | 5 to 8 beats, a small life story |
39| Voice | in-scene SYNC plus narration | a storyteller carrying almost all of it |
40| Surface | smooth, wet-eyed, subsurface scattering | matte clay, thumbprints, tool marks |
41| Runs on | want, then relief | affection for a character |
42 
43Picking the wrong one is not a style mistake, it is a story mistake. If the
44product's pain is a moment, that is the Pixar skill. If it is a season of
45someone's life, it is this one.
46 
47**Every clay ask lands here, including the short ones.** There is no one-call
48clay tier. A five-beat short is the small end of this pipeline, not a different
49door: still per-beat renders, still ffmpeg, still an assembly.
50 
51## Before anything: this runs on a Novoads account
52 
531. A Novoads account with credits. https://novoads.ai. There is no free tier and no trial:
54 every plan is a paid monthly subscription, published at novoads.ai/pricing. Never call it free.
552. **An API key in `.env` at the repo root**, as `NOVOADS_API_KEY=novo_…`. Check
56 it with `./scripts/check-novoads-env.sh`; if it is missing, run
57 `./scripts/setup.sh`. That is the whole setup: `curl` and `jq`, one key, no
58 connector to add and no session to restart.
593. **ffmpeg on your machine.** The assembly happens here, not on the server.
60 `ffmpeg -version` before you start.
61 
62> **REST key required. A Novoads MCP connector is not a substitute.** If
63> `NOVOADS_API_KEY` is missing or still the placeholder, stop before any
64> generation work and tell the user: "Before continuing, create an API key at
65> <https://novoads.ai/dashboard/settings?tab=api> and paste it into `.env`."
66> That holds even when `mcp__novoads__*` tools are connected and authenticated in
67> the session. Never call `mcp__novoads__*` tools from this repo's workflows: they
68> are a different surface with different behavior, including the units they quote
69> costs in. Repo installs verify with `./scripts/check-novoads-env.sh`; a solo
70> install checks `NOVOADS_API_KEY` in the environment.
71 
72**Pack version.** Every `/v1` response carries `X-Novoads-Pack-Version`; mention a newer pack at <https://github.com/novoads/agent-skills> only when that header names a version NEWER than this file's `metadata.packVersion` — equal or older is nothing to say, and it is never a reason to stop.
73 
74**Every HTTP mechanic here belongs to the pack, not to this skill.** Auth, strict
75bodies, status codes, the poll loop, rate limits and error envelopes are written
76out once in [`skills/novoads-api/SKILL.md`](../novoads-api/SKILL.md) and its
77[`reference.md`](../novoads-api/reference.md). The per-call fields this genre
78needs are in `pixar-ad`'s *The calls* section, which this file shares
79unchanged.
80 
81## What one run costs
82 
83Two shapes, and the choice is the operator's. What changes between them is the
84COUNT of the same components, never their kind:
85 
86| Component | 5-beat short | 8-beat full |
87|---|---|---|
88| Cast sheet image | 1 | 1 |
89| Beat stills | 5 | 8 |
90| Beat clips | 5 × 6s | 8 × 7s |
91| Voice-over lines | 5 | 8 |
92| Music bed | 1 | 1 |
93| Transcript, then one caption pass | 1 each | 1 each |
94 
95**There is no price column, on purpose.** Every credit number this run shows a
96user comes from `POST /v1/estimates`, in this session, before anything is
97charged: price each KIND once, multiply by the counts above, and quote what came
98back. A rate written into a skill file goes on being quoted long after it moved.
99 
100**The clips are most of the bill either way**, and a still is a small fraction of
101the clip it seeds. That is the whole economic argument for the board gate.
102 
103**Say the shape out loud before pricing it.** An 8-beat clay ad is the most
104expensive thing in this family, and the honest question at Gate 0 is whether
105beats 3, 4 and 5 are earning the three extra clips they cost. They often are; the
106arc is what this genre is for. But the operator decides that, not you.
107 
108## Hard constraints
109 
110Everything in `pixar-ad`'s Hard constraints section applies unchanged:
111one call per beat, 4 to 15 seconds, 9:16, `audioEnabled: true`, a narrator line
112in the prompt OR the VO track and never both, one continuous voice, no
113`styleFamily` field. Read them there.
114 
115Three are different here:
116 
117- **Five to eight beats**, not four to six. The arc is a story and a story needs
118 its middle. Below five beats it is a Pixar-shaped ad in clay, and the Pixar
119 skill will render it better and cheaper.
120- **The narrator carries the ad.** This genre is third-person storytelling, and
121 the narration is not filler between spoken lines the way it is in the Pixar
122 skill. Most beats are VO beats and that is correct here.
123- **At least one beat is still SYNC.** Usually beat 3, the social beat, where a
124 second character says the thing the protagonist has been avoiding. A whole ad
125 of narration over silent faces is the failure this rule exists to prevent.
126 
127## Two ways in
128 
129### A. From a product
130 
131Run `pixar-ad`'s Gate 0 and Gate 1 unchanged: is the pain emotional,
132visible on a face, in a relationship, impulse-priced; then the product read. One
133extra question at this length: **does this product have a before and an after
134that a viewer would recognise a month apart?** The transformation beat is the
135spine of the clay arc, and a product with no visible change does not have one.
136 
137### B. From a found video
138 
139The other entry, and the one this genre is usually asked for: someone shows you a
140clay ad and wants theirs. Do not guess at its structure from the thumbnail.
141 
142**Read the reference locally.** Follow
143[`skills/analyze-video/SKILL.md`](../analyze-video/SKILL.md):
144frames out with ffmpeg, dialogue out with Whisper, then read the beats off what
145you extracted. It costs nothing, needs no key, and — unlike a fixed-window
146reader — it covers the whole runtime, which is what a 60-second arc needs.
147 
148**There is a hosted alternative, and it is not the default.**
149`POST /v1/analyses` returns the structured hook/beat/casting breakdown in one
150call (poll it if it answers `running`), priced through `POST /v1/estimates` with
151`{"kind":"analysis"}`. Reach for it only when ffmpeg is missing or the local
152read has already failed: the local path costs nothing, ffmpeg is a hard
153dependency of the assembly anyway, and `/analyses` defaults to reading the
154first 20 seconds, which is exactly the setup third a clay arc cannot afford to
155lose. If you do offer it, price it first and let the user choose. See
156[`reference.md`](../novoads-api/reference.md) § *Ad analysis is on this API now*.
157 
158Two things to hold on to whichever way you read it:
159 
160- **Sample the whole video, not its opening.** A clay ad spends its first third
161 on setup, so a read that stops early gives you the hook, the casting and the
162 palette and none of the arc. A board that claims eight beats from a partial
163 read is a board with invented beats in it.
164- **Write our own story.** Recreate the FORMAT, never the script: their
165 protagonist, their brand and their claims are theirs. What transfers is the
166 shape, the palette, the pacing and the narrator persona.
167 
168## The clay look
169 
170### Style lock — one paragraph, pasted verbatim into every prompt
171 
172<!-- eval:style-lock:start -->
173```
174Hand-sculpted stop-motion clay look. Plasticine characters with visible
175fingerprint impressions and sculpting-tool marks, matte clay surfaces with
176subtle micro-bumps, slightly asymmetric features, painted-on or sculpted
177eyebrows. Real knit-fabric clothing with visible wool weave and stitch lines,
178wooden and ceramic miniature-set props with hand-painted finishes. Warm tungsten
179interior lighting, shallow macro depth of field, soft photographic bokeh.
180Subtle imperfection in every surface. Vertical 9:16 composition.
181```
182<!-- eval:style-lock:end -->
183 
184**Never name a studio or a franchise.** The lineage this look comes from belongs
185to two specific studios, and naming either is both an IP problem and a
186worse prompt: the model reaches for their characters instead of your sculpt.
187"Hand-sculpted stop-motion clay" is what the words above are doing.
188 
189### The negative block
190 
191<!-- eval:negative-block:start -->
192```
193no live-action footage, no photorealistic humans, no uncanny faces, no dead eyes,
194no smooth 3D digital render, no glossy surfaces, no ray-traced reflections,
195no subsurface scattering, no wet-eye highlights, no anime style,
196no 2D illustration, no named or copyrighted animated film characters,
197no extra fingers, no melted features, no morphing between frames,
198no warped product labels, no on-screen text, no subtitles, no captions
199```
200<!-- eval:negative-block:end -->
201 
202Half of this block is doing a job the Pixar one does not: **holding the render
203away from its own default.** The video models smooth clay into 3D plastic over
204the length of a clip, so `no smooth 3D digital render`, `no glossy surfaces` and
205`no subsurface scattering` are load-bearing, not boilerplate.
206 
207### Material detail — paste the lines that apply to what is in frame
208 
209<!-- eval:material-detail:start -->
210```
211Skin: matte plasticine, visible thumbprint impressions on cheeks and forehead,
212small sculpting-knife creases at the corners of the eyes, slight asymmetry
213between the left and right side of the face.
214Hair: sculpted in distinct ribbon-strands of plasticine, individual strand
215grooves carved with a tool, slightly stiff and not flowing.
216Eyes: small matte clay orbs set into sculpted sockets, a single soft highlight,
217no wet shine.
218Knitwear: real chunky wool yarn, individual stitches visible, slight wear at the
219cuffs and hems.
220Wood props: hand-painted matte finish, visible grain, small dents and scratches
221that suggest age.
222Ceramic: hand-thrown irregular form, glaze pooling at the bottom edges, slightly
223off-round.
224Product packaging: a clay-shaded prop with a hand-painted label, the paint
225slightly uneven and matte.
226```
227<!-- eval:material-detail:end -->
228 
229This block is the difference between clay and a cartoon of clay. Paste the
230relevant lines into every still prompt. Drop the ones for materials that are not
231in the frame; a knitwear line on a product close-up buys nothing.
232 
233### Faces here may be quirky. That is a licence, not a defect
234 
235The Pixar sibling chases APPEAL: symmetrical, soft, a moment before a smile. This
236genre does the opposite and it is the single easiest thing to lose when the two
237skills sit side by side. **Clay characters are allowed to be odd.** Oversized
238noses, deep wrinkles where the sculptor pressed, eyes set slightly unevenly,
239a jaw that is not quite level. Quirky beats appealing here, and a clay
240protagonist rendered pretty reads as a 3D render wearing a clay texture.
241 
242Say it in the prompt, per character, or the model will smooth it out: "an
243oversized nose, deep sculpted wrinkles at the eyes, slightly uneven eye
244placement."
245 
246### Smooth motion or stop-motion judder
247 
248Real stop-motion carries a 12 to 15 fps judder. Our renders come out smooth at 24
249or 30, and **smooth is the default** because it is what the genre's own reference
250ads do.
251 
252If the operator wants the judder, it is a post step and never a prompt:
253 
254```bash
255ffmpeg -i captioned.mp4 -filter:v "fps=12,fps=24" -c:a copy captioned-judder.mp4
256```
257 
258**Run it before the music bed goes on.** `music_mix.py` stream-copies the
259picture, so every pass that re-encodes the picture belongs ahead of it — and then
260the file the mixer measures and verifies is the file you ship.
261 
262Asking the render for "stop-motion judder" does not control frame rate and does
263break the look. Do not put it in a prompt.
264 
265## The arc
266 
267Eight beats, and the operator picks how many of them get made. The beat formulas,
268the variable tables and the worked prompts are in
269[`references/formulas.md`](references/formulas.md).
270 
271| # | Beat | Seconds | Track | Drop for the short? |
272|---|---|---|---|---|
273| 1 | Setup — the protagonist in their own world | 7 | VO | keep |
274| 2 | Inciting moment — they notice the problem | 6 | VO | keep |
275| 3 | Social validation — someone else says it out loud | 8 | **SYNC** | drop |
276| 4 | Quiet despair — alone, at a mirror or a window | 6 | VO | drop |
277| 5 | Clay infographic — the mechanism, sculpted | 7 | VO | drop |
278| 6 | Discovery — they find the product | 6 | VO | keep |
279| 7 | Transformation — weeks pass, the change is visible | 9 | VO | keep |
280| 8 | Resolution — confident, then the end card | 6 | VO closes | keep |
281 
282**The 5-beat short is 1, 2, 6, 7, 8** and lands around 34 seconds. It is the
283right call for a first run with a brand, and it is what the dry run below uses.
284 
285**Beat 3 is where the SYNC line goes** when the short is not being made. When it
286is, promote the SYNC line to beat 6: the protagonist says one short thing to
287themselves when they find the product. Do not ship an ad where no mouth ever
288moves.
289 
290**Beat 5 is optional even in the full arc.** A sculpted clay chart sells a
291mechanism; it wastes 7 seconds on a product that has none.
292 
293### Which beats earn their place, by category
294 
295| Category | Arc | What changes |
296|---|---|---|
297| Supplement, stress, sleep | the full 8 | Beat 5 is the one that sells it. Keep the chart |
298| Beauty and skincare | 8, chart optional | Beats 2 and 4 carry it: the mirror, then the reflection alone |
299| Office or B2B | the full 8 | **Beats 1 to 4 in cool fluorescent light**, warm only from the discovery on. The palette is the story |
300| Food and kitchen | the 5-beat short | Beats 1, 6 and 7 dominate; if you keep beat 3, make it a family table rather than a cafe |
301 
302The office row is the one worth reading twice. Everywhere else this genre is
303warm tungsten throughout; a fluorescent first half and a tungsten second half
304tells the arc in light before a word is spoken.
305 
306Everything else about the board — one action per beat, its own setup, the word
307budget, VO and SYNC never overlapping in the same beat, no em dashes, never
308"free" — is the Pixar skill's board section, unchanged.
309 
310## The cast sheet
311 
312Same call, same single image, different contents. Clay ads usually carry **two
313named characters**, and the narrator is a third presence who is never on screen.
314 
315Write the sheet text first from the template in
316[`references/formulas.md`](references/formulas.md), then render it. The template's
317slots that matter most here:
318 
319- **A name.** The narrator says it out loud, and a named protagonist is most of
320 why this genre works. "Diane" is a person. "A woman in her 50s" is a stock
321 photo.
322- **Middle-aged or older.** The look flatters sculpted laugh lines and hooded
323 eyelids, and the arc needs a life already in progress.
324- **The terse tag**, 11 to 30 characters, anchored on wardrobe. Our renders
325 re-cast on every cut, so this is what carries one face across eight beats.
326- **A narrator persona**, chosen once from `GET /v1/voices` and reused for every
327 line. Warm storyteller and wry observer are the two that fit; pick one and say
328 which.
329 
330## The gates
331 
332Gates 2 through 8 are `pixar-ad`'s, unchanged, including:
333 
334- **Gate 2** — price every kind once with `POST /v1/estimates`, multiply,
335 announce in one line, proceed.
336- **Gate 3** — every still before any clip, each chained on the cast sheet and
337 the previous still by the `assetId` that `POST /v1/images` returns, then
338 **STOP at the board gate**. At eight beats there are eight clips waiting behind
339 it. This gate is worth more here than anywhere else in the family. A still that
340 answers `status: "running"` (API 2.39.0) is polled at `GET /v1/generations/{jobId}` to a
341 terminal status, its `assetId` read from `images[]` there, and never resubmitted: a
342 resubmit is a second charge.
343- **Gate 4** — clips in waves of at most five. **Eight beats is two waves**, five
344 then three, because a sixth concurrent `POST /v1/videos` comes back `429` with
345 `details.reason: concurrency_limit`, and that is a real refusal, not a queue.
346- **Gate 5** — one voice, chosen once from `GET /v1/voices` and passed as
347 `voiceId` on every `POST /v1/voiceovers`. **Gate 6** — generate the music bed.
348 **Laying** it is the last thing that happens in the run and it belongs to
349 [music-mix](../../shared/skills/music-mix/SKILL.md) and its
350 `scripts/music_mix.py`, run over the captioned cut, never to hand-written
351 ffmpeg.
352- **Gate 7** — trim each clip to its narration plus 0.5 seconds, concat, build
353 ONE voice track, composite the end card from the real photograph, transcribe
354 and read it back. **Read the mix out of the Pixar skill rather than from here**
355 — the clip level is per beat, not one recipe, and this line used to restate it
356 as a flat `VO 100% / clip 28% / music 10%`. That recipe was written when every
357 beat was a VO beat. This genre has a SYNC beat (beat 3), where the clip's own
358 audio IS the dialogue, and 28% buries it under a caption spelling out words the
359 viewer cannot hear. One number cannot serve both cases, so this file states
360 none — and the bed's level is no longer a number at all, it is whatever the
361 mixer measures.
362- **Gate 8** — captions, and the **BLOCKING** caption gate.
363 **A garbled brand name is a failed run, not a note in the report.**
364 
365Gate 7 in particular carries four rules this genre needs verbatim and does not
366restate here: trim to the VO or extend the VO to fill the shot, **never
367`atempo`** a long line to fit, re-check the caption's vertical position after
368trimming because the frame at the new cut is not the frame that was there, and
369build the voice track with **`amix=duration=longest`** — `first` ends the mix
370when its first input ends, which is how an eight-beat arc ships a silent
371resolution card.
372 
373**Do the assembly in `outputs/<ad-name>/`, not in the directory you started in.** The
374downloaded beats, `beats.txt`, the trimmed clips, the placed VO lines and the master are one
375run's working set — a dozen of them loose in a repo root is a diff somebody else has to
376explain. That includes the judder pass above: `captioned-judder.mp4` and the master live
377there too.
378 
379Two caption looks fit this genre, and the preset guidance in the Pixar skill's
380Gate 8 is how you choose between them. The default is the heavy white sans with
381a thick dark outline. The alternative, and the one the genre's own reference ads
382use, is **a solid warm-orange rounded block behind white text, sitting slightly
383tilted** in the lower third. No preset renders that block, so it is the one case
384where the local burn is the right call rather than the fallback.
385 
386Two clay-specific additions:
387 
388**The clay QA is its own check and it is not the Pixar one.** Both checklists are
389in `references/formulas.md`. The one that matters: **the render smooths clay into
390plastic over the length of a clip.** Watch the last second, not the first frame.
391A still that passed and a clip that ends in glossy 3D is the single most common
392failure in this genre.
393 
394**Beat 7's improvement must be localised.** "Weeks later" on a whole face
395produces a different person, which reads as a lie and breaks continuity in one
396shot. Name the one thing that changed and say that everything else is unchanged.
397 
398## Output format
399 
400Deliver in this order, no preamble:
401 
4021. **PRODUCT READ** — or, on entry B, the breakdown of the reference with a line
403 saying how much of it was actually read.
4042. **FIT** — one line confirming Gate 0, or a plain refusal naming a better
405 format. If the pain is a moment rather than a season, hand off to
406 `pixar-ad` and say so.
4073. **ARC LENGTH** — 5-beat short or 8-beat full, and why, with both prices.
4084. **CAST + STYLE LOCK** — the cast sheet text including the name and the terse
409 tag, and the paragraph pasted into every prompt.
4105. **BEAT BOARD** — the table. At least one SYNC beat.
4116. **COST** — the `POST /v1/estimates` figures, announced in one line.
4127. Then generate: cast sheet, all stills, **stop at the board gate**, clips, VO,
413 music, composite the end card, assemble the voice mix, verify, caption, lay
414 the bed with `music_mix.py`, and **read the captions against the script before
415 calling it finished**.
416 
417## The calls
418 
419Identical to `pixar-ad`'s call list — `POST /v1/uploads`,
420`/v1/estimates`, `/v1/images`, `/v1/videos`, `GET /v1/voices`,
421`POST /v1/voiceovers`, `/v1/music`, `/v1/captions`, `/v1/transcripts`, and
422`GET /v1/generations/{jobId}` with its `/watch` — with the fields each one takes.
423Entry B adds no endpoint: the reference read is local ffmpeg and Whisper, and
424spends nothing.
425 
426### Worked beat prompt
427 
428A finished **beat 3** (social validation) `POST /v1/videos` prompt: the SYNC beat,
429one action, style lock and material detail included, negatives at the end.
430`lib/generation/__tests__/claymation-storyboard-skill-prompts.test.ts` reads this
431exact block and runs it through the same rule engine `POST /v1/estimates` lints
432with.
433 
434<!-- eval:beat-prompt:start -->
435```
436Hand-sculpted stop-motion clay look, vertical 9:16, animating the two characters
437in the reference image. A sunlit miniature clay kitchen, green-painted wooden
438cabinets, a red gingham tablecloth, warm tungsten light from a window on
439camera-left.
440 
441Diane, a woman in her late 50s in a cream chunky knit cardigan, matte plasticine
442skin with visible thumbprint impressions and deep sculpted laugh lines, sits
443across the table from her friend in a sage-green cable-knit sweater.
444 
445From zero to three seconds Diane lowers her cup and her sculpted brow furrows.
446From three to eight seconds her friend leans in and says: "You have not been
447sleeping, have you." Diane holds still and her eyes drop to the table.
448 
449Camera: locked medium two-shot at table height, gentle handheld breathing motion,
450no dolly, no zoom. Shallow macro depth of field with the window softly out of
451focus.
452 
453Skin: matte plasticine, visible thumbprint impressions on cheeks and forehead,
454small sculpting-knife creases at the corners of the eyes. Knitwear: real chunky
455wool yarn, individual stitches visible, slight wear at the cuffs. Ceramic:
456hand-thrown irregular cups, glaze pooling at the bottom edges.
457 
458Audio: two warm, unhurried voices at a kitchen table, close and intimate, with
459faint kettle and street ambience behind them.
460 
461Both characters stay visually unchanged from the reference image: same face
462proportions, same hair, same wool weave, same clay texture held to the last
463frame. no live-action footage, no photorealistic humans, no uncanny faces, no
464dead eyes, no smooth 3D digital render, no glossy surfaces, no ray-traced
465reflections, no subsurface scattering, no wet-eye highlights, no anime style, no
466named or copyrighted animated film characters, no extra fingers, no melted
467features, no on-screen text, no subtitles, no captions
468```
469<!-- eval:beat-prompt:end -->
470 
471## Failure modes
472 
473Everything in `pixar-ad`'s Failure modes list applies. Four are this
474skill's own:
475 
476- **The clay turned into plastic by the end of the clip.** The most common
477 failure here. The material detail block was thin or the negative block was
478 missing its anti-smoothing lines. Re-render with both, and add "clay texture
479 held to the last frame" to the constraints.
480- **The eyes went wet.** A Pixar-style multi-catchlight eye leaked in. `no
481 wet-eye highlights` in the negative block and `a single soft highlight, no wet
482 shine` in the material block. Both, not either.
483- **The transformation beat produced a different person.** The improvement was
484 described on the whole face. Name the one thing and pin the rest.
485- **Eight beats and no mouth ever moved.** Every beat went to the narrator. Beat
486 3 is a SYNC beat; if you dropped it for the short, beat 6 is.
487 
488## Hard rules
489 
490- One product per run.
491- Stop at the board gate. The operator approves the board before the clips fire.
492- Never name a studio or a franchise, in a prompt or in ad copy.
493- Never invent reviews, ratings, prices, or performance claims.
494- Use the real brand and the real packaging from the photo.
495- On-screen text is short words and numbers only, never sentences.
496- No em dashes in ad copy. Never say free: every Novoads plan is paid.
497- On entry B, recreate the format and never the script.
498- The end card is composited from the real photograph. Never rendered.
499- Transcribe the master before you call it finished, and read the burned captions
500 against the script. A garbled brand name blocks the ship.
501 

Discussion

Alternatives

API and interface designGuides stable API and interface design. Use when designing APIs, module boundaries, or any public interface. Use when creating REST or GraphQL endpoints, defining type contracts between modules, or establishing boundaries between frontend and backend.Coding · MITContext7Pulls up-to-date, version-specific library docs and code examples into the prompt so the AI stops inventing old APIs.Coding · MITContext7 Documentation LookupFetch up-to-date documentation and code examples for any library, framework, SDK, CLI tool, or cloud service. Use whenever the user asks about a specific library — even well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot — because training data may not reflect recent API changes or version updates. Always use for: API syntax questions, configuration options, version migration issues, "how do I" questions mentioning a library name, debugging that involves library-specific behavior, setup instructions, and CLI tool usage. Use even when you think you know the answer. Do not rely on training data for API details, signatures, or configuration options — they are frequently out of date. Prefer this over web search for library documentation.Coding · MITAdaptyv Bio Foundry APIHow to use the Adaptyv Bio Foundry API and Python SDK for protein experiment design, submission, and results retrieval. Use this skill whenever the user mentions Adaptyv, Foundry API, protein binding assays, protein screening experiments, BLI/SPR assays, thermostability assays, or wants to submit protein sequences for experimental characterization. Also trigger when code imports `adaptyv`, `adaptyv_sdk`, or `FoundryClient`, or references `foundry-api-public.adaptyvbio.com`.Science · MIT