The AI in our ad factory is not allowed to write its own prompts

Everyone is generating UGC ads right now. And most of them read as AI in the first second.
The skin is too even. The script sounds like a landing page. The voice stays on one note the whole way through.
Then at second ten the video just ends, because that's where the model ends.
We built a Claude Code skill that goes after each of those problems separately. It takes a product and one actor reference photo and returns a finished 20-second talking-head ad, one unbroken take, 9:16, with sound.
It's open source: https://github.com/MegaTroll222/OMNI-UGC-AD-FACTORY

Here's how it works.

The realism layer comes from Emily
The casting style is built on Raw Camera Casting Realism, a prompting method written by Emily’s realistic prompting method so here is the shoutout https://x.com/IamEmily2050/status/2073745972036006044 Full credit to her for this part. It's the best realism prompt work we've seen, go read the original.
@IamEmily2050 - keep crushing it!
Her core rule: never write "photorealistic". Describe physical evidence.
> Visible pores on the cheeks and nose. Fine vellus hair along the jaw. Mild redness around the eyelids. One eyelid slightly different from the other. Faint grain in the shadows. Ordinary window light and a plain background that's out of focus.
> And ban the beauty words. Stunning, flawless, glass skin, porcelain, perfect symmetry. That vocabulary is how you end up with a render instead of a person.
You give the model evidence and it gives you a casting test photo.
That was our starting point. Everything below is the fork we built on top of it.
The fork, part 1: age is a physiology problem
First wall we hit: realism vocabulary is age-loaded.
Words like fine lines, chapped, uneven tone all sit next to 40-year-olds in the training data. We described a woman in her early 20s using the full realism vocabulary and got back a woman pushing 40.
> Writing "22 years old" does not fix it. We tried. One age token loses against a paragraph of aging physiology every time.
So the skill ships an age lexicon, and the gate enforces it.
For a 20s actor the required words are oily T-zone, large visible pores, an active blemish, plump lips, full under-eye, creases that only exist while the brow is raised and vanish at rest.
Young skin is oilier, more porous, more blemished. It just has no static lines. Write the physiology and the age falls out on its own.
For 40s and 50s you flip the same table on purpose. Now fine lines, crepey, nasolabial depth are the correct vocabulary instead of an accident.
One more lever most people miss. The framing words carry age too.
"Casting-style" and "documentary" pull older. "Front-camera selfie" pulls the whole distribution younger before you touch a single skin word.

Where the actor comes from
The reference photo does not come from a model. It comes from Pinterest.
Go search for the kind of UGC photo that would never win a photography award. Uneven light, awkward crop, real skin, a person mid-expression. That mess is exactly what you want.
The photo never enters the generator. Pass it as an image reference and you get a 1:1 likeness of a real human being. That's a rights problem, and it's lazy casting on top.
The photo is a casting brief. You read it with your eyes.
So the skill reverse prompts it. You describe what the camera saw: the crop, the face angle, the lighting direction, the expression written as physical mechanics, the hair, the background.
That description goes through Emily's rules and the age gate from the section above.
Then you generate from text only. gpt-image-2, a fresh face, nobody's identity. Same energy as the Pinterest photo, zero pixels from it.

The fork, part 2: gates instead of vibes
The agent never hand-writes a generation prompt. It writes structured JSON.
A Python gate validates the JSON against glossary files, and when everything passes, the gate assembles the final prompt itself. A prompt that skipped its gate does not exist.
The casting gate checks: age lexicon words present, banned words absent, lighting has a direction and a quality, color grade drawn from a real camera vocabulary, at least two accidental-composition markers.
And no device words. Write "iphone" or "tripod" in a prompt and the phone renders into the shot. We learned that one the hard way.
The clip gate is stricter.
Every script line gets tagged with an internal state, and behaviors come from a glossary of 32 micro-behaviors. A gaze drop. A nose exhale. A swallow mid-sentence.
Emotion words are rejected outright. Write "nervous" and you get acting. Write the swallow and you get a person.
The voice block has to cover six categories: pitch, texture, pacing, volume, terminal pitch, accent mechanics. With a city.
"Soft voice" fails the gate. "Speech patterns of someone raised in Sacramento" passes.
And the voice block must be byte-identical across both clips. The gate hash-locks it so the actor can't drift between takes.

The small movements that sell the speech
One operator note killed an otherwise perfect clip early on: "She talks in a way no human will believe that's how she feels."
The face was right, the light was right, the words were right. The delivery was a performance.
So delivery is its own system in the skill.
We studied real high-engagement talking-head creators (get-ready-with-me, storytime, rant) and wrote down what their bodies actually do.
The voice creaks at the end of phrases. Pauses land between almost every clause, 0.3 to 0.6 seconds, uneven and undramatic. An audible inhale arrives before a new thought.
The clip opens with a lip smack and an exhale before the first word. A laugh is never a full laugh, it's one exhale through the nose.
Then the glossary: 32 micro-behaviors across gaze, breath, mouth, throat, face, head, self-touch and posture.
Her eyes drift off to the side while she finds the words. Her gaze drops on the embarrassing line and comes back. A swallow before the confession. A short nose exhale at the end of a line, the ghost of a laugh with no humor in it.
Each behavior is tied to internal states like thinking, fed up, confiding. Use a behavior in a state where it doesn't belong and the gate rejects it.
And there's a budget: three to six behaviors per clip, from at least two categories. Enough to read alive, few enough that she doesn't twitch.
The rule that holds it together: describe the state, never the choreography.
Write "pause for half a second" and she performs a pause. Write "she stops because she is thinking, and the gaps come out uneven" and the pause arrives on its own.
The fork, part 3: 20 seconds from a 10-second model
Omni generates 10 seconds. UGC needs 20.
Omni has a quirk: it holds its reference image for the first frames of a clip before dissolving into the generated scene.
So we seed clip 2 with the trimmed last frame of clip 1, and the hold hides the cut.
We measure the seam as pixel difference between the two sides of the join. Anything above 5 on a 0-255 scale fails. Our production runs measure around 3.
I knew where the cut was and still couldn't find it.

What we used
-
gpt-image-2 for casting. We spent four rounds tuning prompts on another model and kept getting plastic skin. gpt-image-2 fixed it on the first try with the same prompt. Change the model before you change the prompt.
-
gemini-omni-flash for both clips, chained.
-
The MaxFusion MCP for meta ads + tiktok research, image and video generation.
-
ffmpeg for speech measurement, trimming and the stitch.
Script rules that survived production: the script is a person talking, never ad copy. The brand name gets the smallest sentence in the script. Complaint first, endorsement almost by accident.
And every script goes through humanizer (blader/humanizer by Siqi Chen, also credited in the repo) before it's allowed anywhere near the voice gate.
Grab it
The repo has the full skill, the four glossary files, the three gate scripts and finished example ads: https://github.com/MegaTroll222/OMNI-UGC-AD-FACTORY
Edit the JSON glossaries and you've changed the system.
That's the point of the design. The rules live in data files, so improving the factory never means rewriting prose.
Go try it out -
https://maxfusion.ai/?via=stav-x
I drop these skills and workflows in my free Telegram channel before they go live on X.
Join here:
Built on MaxFusion.
MIT licensed.
Related articles

How to hit $1M with AI UGC (Fable 5 edition)
Somewhere right now, a brand is paying $3,000 for a single UGC video. A model, a studio, a script that took two weeks to get approved through three rounds of feedback. By the time it goes live, it’s…

$6 In. $150 Out. AI Ad Arbitrage Nobody Is Telling You Is This Simple
Saw you're running 2 video creatives. Made you 3 more, different angles, attached. If any of them beat your current best, I'll do 20 a month

from $0 to $38K in 30 days with a product I could not code
a few people asked me to write the whole story. not the tweet version. the real one, with the boring parts.