US Fertility × MarketerHire · the b‑roll pipeline

How a patient‑consent video
actually gets made.

A walkthrough of the six-stage pipeline behind every US Fertility video — the real commands, the real hard rules, and one real shot followed from script line to rendered clip. Nothing here is a mockup.

6Pipeline stages
5Human approval gates
30Videos in the library
1Gold moment / video
330Reusable swipe assets
scroll
00THE SHAPE OF THE PIPELINE

Six stages. Five gates a human has to clear.

Every video moves through the same fixed chain, and every stage ends where a person looks at something. A batch of 13 storyboard scenes doesn't become 26 animated clips until each of those scenes is individually approved.

1
Script
Patient-consent script → scene breakdown, one image prompt per scene, gold assignment.
usf-video run script
Voice-over
ElevenLabs v3, locked Style-2 voice. Runs beside stages 2–5, blocks nothing.
usf-video run vo
2
Storyboard
Composed 16:9 stills — headline, chips, hero graphic. GPT Image 2. This is the approval path.
usf-video run storyboard
GATE 1 — Daniel / Brittany approve the still. video-prompts/ stays LOCKED until this.
3
Parts
Approved still → its elements regenerated isolated on pure white. Each part is a mid frame.
usf-video run parts
GATE 2 — MF approved. From here the MF is never regenerated; a bad one goes back to stage 3.
4
Frames — FF / MF / LF
Build the first and last frame around the approved mid frame, with the MF itself as the reference.
usf-video run frames
GATE 3 — FF|MF|LF trios approved off the contact sheet. Kling path only.
5
Motion — MiniMax H3
One native 10s clip per shot, generated off the approved MID frame alone. No pair, no join. Legacy Kling path: two 5s clips, FF→MF and MF→LF.
usf-video run motion
GATE 4 — Daniel approves the clips. MANDATORY. Do not self-approve.
6
Wrap-up
Verify every shot, bundle the package, write the handoff for the After Effects editor.
usf-video run wrapup
GATE 5 — the assembled cut comes back from AE and is signed off in the browser.
 ONE COMMAND SURFACE

You never have to know which stage you're on. Ask.

The whole pipeline is one CLI. It holds the state for every video — which stage, which gate, who owns it, who's holding the shared render account — so the operator's job is to run the next legal action, not to remember the chain.

Nothing skips. next will refuse to name a stage whose gate hasn't been cleared, and tell you what's blocking instead.

usf-video doctorVerify the machine, the reference pack, the credits, the lease. Every ✗ prints its own fix. usf-video statusEvery project: owner, stage, gates, counts, and what's next. usf-video next <id>The next legal action — or exactly what's blocking it. usf-video run <stage>script | vo | storyboard | parts | frames | motion | wrapup usf-video gate approveRecord that a named human cleared a gate. usf-video reviewPer-asset verdicts from the review UI: approvals, marks, comments. usf-video swipe searchCheck the 330-asset library before generating anything new. usf-video hf statusWho holds the one shared Higgsfield account, and how long they've had it. usf-video uiServe the review app on :3003 — every still, frame and clip, downloadable.
$ usf-video next B1-13 B1-13 Risks from Fertility Medication stage storyboard → 16 stills on disk BLOCKED gate 1 — 16 stills are waiting for a human to approve next: open https://ext-us-fertility2.exe.xyz/ui then usf-video gate approve B1-13 1 --by ...

The five slash commands wrap all of it, so nobody has to memorise a flag:

/usf-sopThe pipeline in one screen. /usf-statusWhere everything stands, across all 30 videos. /usf-new B1-14Start a video from its script. /usf-continueDo the next thing. Safe to run repeatedly. /usf-reviewPresent what needs a human, record the decision.

One shared render account. Higgsfield is a single login, so a lease serialises it — if someone else has it you're told who and for how long, and you wait rather than colliding mid-batch.

01STAGE 1 · SCRIPT  free

The script decides the scenes. Nothing is invented after this.

A clinician-approved consent script comes in as a .docx. The stage splits it into beats, and for each beat writes a source-of-truth prompt file: the VO line it covers, the on-screen headline, the act tint, the chip copy, and whether this scene owns the video's single gold moment.

Every downstream stage reads those files verbatim. The pipeline never rewrites patient copy — the words on screen are the words a clinician signed off.

  • Split the script into beats → scene-breakdown.md.
  • Write one image prompt per scene, with its metadata table.
  • Claim the gold moment for exactly one beat — usf-video gold claim.
  • Set the Motion intent per scene, so stage 5 isn't improvising a move nine steps later.
Gold is spent exactly once per video. Assign it here — nobody can reconstruct the budget later.
# B1-13 · S03 — A stronger response (OHSS) | Beat | A stronger response | | VO | "Stimulation encourages multiple | follicles to grow. Occasionally the | ovaries respond more strongly than | expected — this is called OHSS." | | Headline | A stronger response | | Act tint | Pale Emerald #E7F0EE (procedure) | | Chips | 1 LABEL chip — "OHSS" | | Gold | No — gold is spent at S12 | | Anchor | 01_cluster-clean.png (--image) | + STYLE_LOCK_eggs |

The real metadata table for the scene we'll follow all the way to a rendered clip.

02STAGE 2 · STORYBOARD  ~7 cr / scene

The composed scene: hero graphic, headline, chips — one frame, spelling‑perfect.

This is what Daniel's and Brittany's teams actually approve. Every scene is a single 16:9 frame generated from that prompt file, with the full style lock injected into every generation and every edit — even a one-element fix.

Then every frame is QA'd by eye against the checklist that lists the failure modes which actually recur here: misspelled or invented on-screen words, two hero graphics, both chip types in one frame, a gradient ground, gold spent twice, type under 14pt at delivery size. A failed check is a regenerate, not a note for later.

GPT Image 2stills only — never Nano Banana, it goes 3D-glossy and miscounts subjects
1 of 5gates cleared here — and it locks the video prompts until it passes
Approved storyboard still, B1-13 scene 3
Live production still · B1‑13 · S03 “A stronger response”
HERO GRAPHIC — held to the right, occupying roughly the right third with generous white space: the four-follicle cluster wrapped in a soft periwinkle #8598E3 membrane that reads as gently, slightly enlarged — swollen a touch beyond calm, not distended, not distressed. … a bare fine needle drawn as two simple strokes and nothing more: one straight emerald #0E635D hairline ending in a slim bevel tip … resting nearby and touching nothing.

Real excerpt from this scene's actual prompt file — the level of literal, positive description every hero graphic is written at.

03STAGE 3 · PARTS  15–20 cr / part

One approved scene becomes N isolated, animation‑ready parts.

Nothing in the composed scene can move on its own — it's one flat image. This stage reads the approved still and re-generates every element that needs independent motion, isolated on pure #FFFFFF, so it keys cleanly in After Effects.

The anchor mechanism is the intellectual core of the chain. Pick the subject everything keys off, and pass that exact render — not a text description of it — as the reference image for every asset that reuses it. Scene 3's swollen cluster is chained off the canonical cluster anchor, which is why it stays the same four follicles here and in every other video that shows one.

In the 83-asset audit, referenced generations had zero drift. All drift came from text-only renders of composed subjects.

And the part IS the mid frame. It isn't an intermediate export — it's literally the middle instant of the 10-second shot that follows.

The canonical cluster anchor
The anchor
Isolated swollen cluster on pure white
Scene3_cluster-swollen_MF

Left: the canonical four-follicle cluster, shared across the whole library. Right: scene 3's swollen state, generated with that anchor passed as --image — same cluster, one changed property.

04STAGE 4 · FRAMES  2 renders / shot  legacy Kling path only

Every shot is three frames of one calm motion.

On the default H3 path this stage is skipped. H3 animates off the MID frame alone, so there is no FF and no LF to build. Everything below describes the legacy Kling path, where the pair of clips has to join on a shared frame.

The part is the MID frame. This stage reasons backward and forward from it: what does the frame before this motion look like, and what does the frame after it look like? Both are generated with the MF itself passed as the reference image, so only the state changes — never the subject.

First frame: cluster calm, membrane at resting size
FF · calm, at rest
Mid frame: the approved isolated part
MF · the approved part
Last frame: membrane at its fullest
LF · fullest, at rest

The real trio, straight off disk. The state difference is deliberately subtle — a gentle response, not a distended one; the QA note on this shot reads “PASS — 4 follicles, pixel-stable, subtle state diff as expected.”

Two rendered clips come out of the trio: FF→MF and MF→LF, 5 seconds each. Cut together they form one seamless 10-second shot, because clip A ends on exactly the frame clip B starts on. That's why gate 2 exists and why the MF is never regenerated once FF and LF are built around it — it would silently break the join. A wrong MF goes back a stage; it is not patched here.

05STAGE 5 · MOTION  160 cr / 10s clip @768P

One prompt, one 10‑second clip, per shot.

Frontal locked camera. No rotate, tilt, pan, yaw, or zoom. Nothing snaps, bounces, spins, or splashes — every motion in the library reads as slow, deliberate and reassuring, on purpose, because this plays before a real medical consent decision.

Since 2026‑08‑11 the default engine is MiniMax H3, on kie. It animates straight off the approved MID frame in one pass — there is no FF, no LF and no join, so stage 4 and gate 3 are skipped on this path. The Kling walkthrough further down is the legacy path, and every clip embedded on this page was rendered on it.

kie create --model minimax-h3/image-to-video \ --input image="<stem>_MF.png" \ --input prompt="<the locked template, one [[MOTION]] filled>" \ --input duration=10 --input resolution=768P

The motion prompt is a locked template — you fill exactly one [[MOTION …]] bracket and everything around it stays verbatim. animate_shots.sh refuses to render a prompt that still contains [[. Free‑forming it measurably drops quality; that finding is why the template exists.

kie is not under the Higgsfield lease. The lease protects one shared browser account with one credit pool; kie is an API key with no such constraint, so holding the lease for it would make the next operator wait for nothing. Check it with kie doctor and kie credits, not usf-video hf.

The legacy Kling path — 70 cr ≈ $0.35 / 5s clip

higgsfield generate create kling3_0 \ --prompt "<the shot's move, verbatim>" \ --start-image ./FF.png --end-image ./MF.png \ --duration 5 --aspect_ratio 1:1 \ --mode std --sound off --wait

--mode std while reviewing; approved shots are re-run at pro for the final pass. The stage never picks the move itself — it fills in the motion intent authored back at stage 1.

MiniMax H3the default since 2026‑08‑11 — Kling 3.0 is the legacy path, Seedance is superseded
Clip A · FF → MF — legacy Kling render
Clip B · MF → LF — legacy Kling render

The same hero, all the way through: anchored → isolated → bracketed → now in motion. One real shot, its actual two rendered clips.

06STAGE 6 · WRAP-UP  free

The last stage doesn't generate anything — it verifies and hands off.

Once every clip in a video is approved, this stage checks that every shot actually has its frames, prompts and clips; writes a handoff document structured so an editor's own tooling can parse exactly what was built and where; and zips the package. It never blocks on an optional gap — only “zero rendered clips” stops it, everything else prints as a checklist for a human to judge.

Verify — read only
Checks every shot for its frames, prompts and rendered clips, plus VO and approved stills. Prints a present/missing table. Nothing is written.
The only hard stop
It halts only if a video has zero rendered clips — nothing to hand off. Every other gap is reported, never silently dropped.
One handoff doc
A structured doc pointing at the exact path of everything created, so a downstream tool — or a person — can parse what was built and where.
Raw material, not the final cut
The zip is clips + frames + prompts + VO for the editor to assemble. It's upstream of the client deliverable, not the deliverable.

After Effects is where a human assembles it: duplicate the Control template, composite the clips, re-set the text live. The render comes back into the project's 07_final-video/ and shows up in the browser — which is the one thing the older version of this pipeline had no answer for. “Is this video finished?” now has a recorded answer, and it's gate 5.

 HOW A HUMAN ACTUALLY APPROVES SOMETHING

Two different things: the per-asset verdict, and the gate.

Reviewers work in the browser — approve a still, mark one for regeneration with a comment. That's the verdict. The gate is the project-level unlock, and it's recorded on the CLI against a named person, because a gate nobody signed is a gate that gets skipped.

1
The storyboard stills
Every composed 16:9 scene, reviewed frame by frame. video-prompts/ stays locked until it passes.
Daniel / Brittany
usf-video gate approve <id> 1 --by "Daniel"
2
The mid frames
Each isolated part, on white. Load-bearing: after this the MF can never be regenerated without breaking the A/B join.
Operator + reviewer
usf-video gate approve <id> 2 --by "…"
3
The FF|MF|LF trios
Read off the contact sheet, one row per shot — does the state actually change, and does the subject stay identical?
Reviewer
usf-video gate approve <id> 3 --by "…"
4
The rendered clips
Mandatory. Do not self-approve. This is the last look before real money and an editor's time go downstream.
Daniel
usf-video gate approve <id> 4 --by "Daniel"
5
The assembled cut
Back from After Effects. Three states — absent, awaiting, approved. A re-upload sends it back to awaiting.
Set in the browser
:3003 → final-video tab

shortcut /usf-review <id> does the whole loop — presents what's waiting, records the decision with the right attribution. The marks a reviewer leaves in the UI are then actioned by /check-feedback, which reads them back, prices the redo, confirms, runs it, and clears the marks.

 WHAT ACTUALLY MAKES THIS CONSISTENT

The style isn't a vibe. It's a fixed list of hard rules, injected verbatim, every time.

Consistency doesn't come from the model — it comes from re-stating the same locks in every single prompt, plus a human catching what the lock alone doesn't prevent.

The look was set by the Control video and is closed: your job is adherence, not interpretation. Where the design system and the process spec could disagree, precedence is written down — and the approved artifact beats the document that describes it.

Care-team illustration, the one face exception
The one carved-out exception · care-team style

Everyday subjects are featureless periwinkle silhouettes. The care-team illustration style is the single documented exception — simple, warm, diverse faces, on purpose.

Gold, exactly once
#FFBB06 may appear in exactly one scene per video — the single emotional high point. It's claimed at stage 1 and every other scene is checked for stray gold.
Light grounds, always
Warm white or one pale act wash, flat and even. Never a gradient, vignette, or floor. Brand colors are ink and linework, never a full-bleed ground.
Eggs are rings, never dots
Small pale thin-outlined hollow rings. A solid dot reads as an eye — automatic reject.
Needle = suction, not stabbing
A straight fine hairline with a bevel tip that stops at the target's edge. Never an arrowhead, never a realistic barrel, never through to the far side.
Never red. Never a face.
No red, orange, beige or black. No blood, no babies, no identifiable patients or staff, no facial features — outside the care-team exception.
Describe positively, never negate
“No syringe” reliably draws a syringe. Nine separate rejects on one batch before this was understood.
Graphics lead, photography supports
One flat 2D schematic hero at 1/3–1/2 of the frame. Photography is a framed 40–60% inset — never a hero, never full-bleed, never stock.
Sentence case, two lines, no banned words
All text horizontal, nothing under 14pt at delivery size, no exclamation points. Banned: journey · path · next steps · every step of the way.
Frontal and calm by default
Camera locked, motion slow and eased, everything ends at rest — with rare, deliberately authored exceptions for one specific shot, never accidental.
 WHAT WE'D TELL A NEW TEAM RUNNING THIS

The things that actually cost time weren't the models. They were consistency.

Someone has to actually look
A mechanical palette check catches stray color. It doesn't catch text the model invented in a frame that explicitly forbade text.
A real reject, still on disk
Rejected take
The prompt ended with “absolutely no text, letters, numbers, captions, titles, labels, watermarks or logos anywhere in the frame.” Kling drew a caption anyway — garbled, low-contrast, bottom-centre. The negative didn't stop it; a person watching the clip did. It lives in _rejected/ named for exactly what was wrong with it.
Reference the render, not the description
Chaining a shape off its own prior render holds it pixel-stable. Off a text description, it drifts a little every time.
A chained pair, same subject
The canonical anchor
Anchor
Chained off the anchor
Chained
Scene 3's swollen cluster used the anchor render itself as its reference image — not a redescription of it. Four follicles, same geometry, one changed property.
Anchor leak is the #1 documented failure
The same mechanism that holds a subject stable will drag it into frames that shouldn't contain it.
When to pass the anchor
follicle cluster is the subject → pass --image
ovary bearing follicles → pass --image
a funnel → do NOT
a microscope → do NOT
a calendar → do NOT
Pass the cluster anchor only when a cluster or a follicle-bearing ovary is the actual subject. On anything else it drags the cluster into the frame — and it's on the QA reject list by name.
Reuse beats regenerate
Cross-video consistency is worth more than a perfect per-scene fit — and it's free.
Search before you spend
$ usf-video swipe search needle

  ico_needle-bare_MF.png   approved
    used by B1-01, B1-05, B1-13
  ico_needle-suction_MF.png approved

  2 hits — use, don't generate
111 stills and 219 clips already exist in the shared swipe library. A hit copies byte-identically into the scene for 0 credits. It also means a client rejection can be applied library-wide in one command, instead of hunting 30 folders.

And one that's structural: a fix has to reach every copy of a rule. Corrections used to live in three separate places — a style-lock file, a reference image, and a fallback string in a script — so fixing the obvious one let the old version quietly resurface. That's why the design system now declares a written precedence order, and why the reference pack ships as versioned files with a doctor command that verifies all 97 of them are present.

 WHERE THE LIBRARY STANDS TODAY

30 videos in flight. The bottleneck is a person, not a model.

The generation side is not what's slow. Five videos have already been carried all the way through motion and have real rendered clips sitting on disk — behind a gate 1 nobody has signed.

Waiting on a human

12
  • All parked at gate 1 — storyboard stills awaiting approval
  • B1-13, B1-09, B1-11, B1-12, B1-10 have completed frames and clips downstream of it
  • Reviewing those five first unblocks the most finished work

Ready to move

18
  • Next action is stage 1 — the script has never been broken into scenes
  • Stills exist on disk but aren't attached to any beat
  • Free, no credits, no lease needed

Signed off

0
  • No video has cleared any gate yet
  • Every project is unowned — no named reviewer on any gate
  • That, not throughput, is what's holding the slate

Figures from usf-video status, 2026-08-11; engine and gate notes updated 2026-08-12. The same picture with the actual frames and clips is at ext-us-fertility2.exe.xyz/ui.

WHERE TO START

Three commands and you're inside the pipeline.

$ usf-video doctor # every ✗ prints its own fix $ usf-video status # what everyone has going $ usf-video ui # the same thing, with pictures

Every stage is a versioned skill with its own hard rules, QA checklist and do-not-touch list — not a one-off prompt. Ask about any of it.