video-production-skills

agent
Security Audit
Fail
Health Warn
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 5 GitHub stars
Code Fail
  • rm -rf — Recursive force deletion command in look-library/fetch_spectral_bases.sh
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

Agent skills for making video from generated footage: pre-production, cost-gated generation, edit, audio, finish and QC

README.md

video-production-skills

Fifteen agent skills, two host-side tools and a look library for producing video: short-form
ad campaigns, short films and music videos made from generated footage or from a client's own clips, and
narrated motion-graphics explainers drawn in code. The measurements behind the finishing rules are in the
references.

What is in the box

directory what
skills/video-production the entry skill. Fixes the genre, rehydrates a paused project, routes the next step to the phase skill that owns it, and conforms supplied footage to one frame rate
skills/ad-spot-preprod · skills/film-preprod pre-production for an ad campaign, polished or creator-style, or for a film and a music video. When the client supplies the picture, a curation procedure picks the shots from their pack of clips
skills/video-refs-continuity the derived reference set, the start image, the continuity ledger and a refs gate that runs in code before any generation call
skills/video-prompt-dialects the prompt compiled per venue dialect (Seedance 2.5 / 2.0, MiniMax H3, a web front end, two image models), with a linter, and the phone-native dialect a creator-style spot is prompted in
skills/video-gen-cost-gate the venue table, the cost line and the operator's GO, the gated submit path, receipts at acceptance, detached polling. Five hosted routes sell the same Seedance 2.5 model, and the table ranks whichever of them you hold by marginal cost. The table is a roster you declare, and its rules shape a recommendation rather than refuse a run
skills/video-take-review the per-seed read: continuity first, then the acceptance matrix, voids and usable windows, instruments with self-tests
skills/video-edit-edl the edit as a derived EDL: the beat list from the script, a builder that computes every time, a script-fidelity gate
skills/spot-audio-assembly voice-over, dubs, off-screen voices, sfx and music cues, room tone, captions, the loudness pass and its verification
skills/designed-elements end cards, turntables, piece walls and drifts as deterministic HyperFrames compositions
skills/explainer-video a narrated motion-graphics explainer drawn in code: sourced facts, a script whose spoken anchors time every scene, the voice and its word times, HyperFrames scenes and captions, a frame instrument and an audit of every on-screen string
skills/video-finish · skills/video-finish-qc the per-clip finishing order (upscale, grade, grain, watermark, downscale, encode) and the spot pipeline that runs it from the EDL, plus the QC of the delivered file. A second finish, the phone-native tier, for a spot that has to read as phone-shot
skills/client-rounds client notes located before anything moves, classified, executed by a ladder, delivered with a numbered ask
skills/mastering-audio a standalone loudness master for a finished mix
tools/ the local Topaz upscale wrapper and the unattended Resolve + Dehancer hero pass
look-library/ five looks, each as a baked .cube and an authored Dehancer .drx, plus the cube-only colour tier of the phone-native finish, their YAML recipes and baker, the dial-ins, and a guide to the whole grading method
CHAIN.md the handoff contract every skill runs under: a budget of three automatic hops, a visited set, stop conditions

Each skill is a SKILL.md with the steps and their completion criteria, a references/ directory
with the contracts and measurements, and a scripts/ directory of small Python and shell tools.
Every Python and shell script prints its usage on --help and changes nothing, and the scripts that
work inside a project take its folder as --root <project>.

skills/ is generated from a separate source tree and exported here, so an edit made to it in this
repository is overwritten by the next export. Read it, run it, copy from it; to change a skill, open an
issue rather than a patch.

What you need

The base install is an agent that reads SKILL.md — Claude Code and Codex both do — Python 3.10 or newer
with numpy, Pillow, scipy and PyYAML (pip install numpy pillow scipy pyyaml), and
ffmpeg.
On Windows, run the kit inside WSL2. The skills give the agent bash commands, and WSL2 is where we built the kit.
AGENTS.md is the short orientation an agent reads before its first action; this file is the long form.

The table follows a production in the order it runs. Each row names a step and its skill, what that step adds
on top of the base install, and the key or variable it reads from .env. Set up the rows you will use. The
entry skill (video-production), pre-production (ad-spot-preprod, film-preprod), the prompt
(video-prompt-dialects), the cut (video-edit-edl) and the client round (client-rounds) need nothing
more, and the status line reads the balances of a Higgsfield subscription, monid and ElevenLabs once those are
set up. The Higgsfield API has no balance to read, so its row keeps the wallet in a local ledger. Three rows want a
GPU of your own, and how much VRAM it has decides which. If you have no GPU, or a small one is the whole answer in one place.

step · skill what it does install or sign up for key or variable
references · video-refs-continuity makes the stills: the reference set and the start image a kie.ai key, the default still route; credits on a Higgsfield subscription are the second, since the Higgsfield API does not sell that image model KIE_API_KEY
references · video-refs-continuity the scene proxy, a room rebuilt as labelled boxes on your own GPU ComfyUI with one node pack and two checkpoints, listed under ComfyUI COMFY_HOST, plus COMFY_DIR, COMFY_VENV, COMFY_ARGS, COMFY_LOG and COMFY_SSH for comfy_up.sh
generation · video-gen-cost-gate buys Seedance 2.5 and MiniMax H3 seeds by subscription, each behind a cost line and your go a Higgsfield subscription and its CLI: npm install -g @higgsfield/cli, then higgsfield auth login and higgsfield workspace set <workspace-id>. This is the one route that reaches 1080p Seedance, the hosted Topaz upscale and GPT Image 2.5. A fal.ai key opens a second route, which refuses photoreal people in references FAL_KEY; the Higgsfield CLI logs in on its own
generation · video-gen-cost-gate the same Seedance 2.5 on the Higgsfield REST API, pay-as-you-go, with edit and extend as endpoints of their own. The API quotes no price for Seedance, so hf_api.py computes the cost line from the vendor's token formula. It has no balance endpoint either, so the same script keeps the wallet in a local ledger that the submit and poll scripts write an API key pair from the Higgsfield console. It is a separate account with its own wallet, apart from any subscription. It generates at 480p or 720p only. Its uploads take no mp3, so hf_api_upload.py converts a voice reference to WAV HF_API_KEY_ID, HF_API_KEY_SECRET; HF_API_LEDGER, optional
generation · video-gen-cost-gate buys the same Seedance 2.5 seeds pay-as-you-go — by the second rather than by the month — and hosts the reference images they cite, free a monid account and its CLI: npm install -g @monid-ai/cli, then monid keys add to store the key and monid balance to confirm it. Credit is pay-as-you-go, so there is no plan to exhaust and no credits to expire. People-free shots only: real human faces are refused upstream by the model host none — monid keeps the key in its own CLI store, not in .env
generation · video-gen-cost-gate the same Seedance 2.5 with its content filter relaxed, pay-as-you-go, for a shot whose reference is a real person a treg account and its CLI: pipx install tools-registry, then treg login, which registers you the first time. A call that carries a file has to go through the CLI, and treg host is how each reference gets its public URL none; the CLI keeps its own login
generation · video-gen-cost-gate MiniMax H3 seeds on your own GPU, free per take an NVIDIA card (we ran a 24 GB one), ComfyUI and the weights in MiniMax H3 on your own GPU the COMFY_* variables
the read · video-take-review a take's cut list, contact sheet and frame instruments nothing more; faster-whisper (pip install faster-whisper) adds a transcript to the take's record none
the sound · spot-audio-assembly voice-over, dubs, voice clones and generated sfx an ElevenLabs key ELEVENLABS_API_KEY
the sound · spot-audio-assembly music cues an AceDataCloud token. It resells Suno and is the default music route, about $0.08 a call for two takes. The kit documents the call and ships no client of its own; the vendor publishes one. A cue the operator generates by hand, or a library bed, is the fallback ACEDATACLOUD_API_TOKEN
the sound · spot-audio-assembly word times for captions and sound placement faster-whisper, free on the CPU, or ElevenLabs Scribe, billed per minute ELEVENLABS_API_KEY for Scribe
the sound · spot-audio-assembly burned-in captions the caption fonts, which the kit does not ship; see Caption fonts none
designed elements · designed-elements, explainer-video end cards, turntables and piece walls, and narrated explainers drawn in code Node.js 22 or newer and unzip on the machine that renders, and your display font as a TTF. npx fetches HyperFrames, which draws in headless Chromium. Headless Chromium hangs under WSL2, so from WSL2 render_hyper.sh --host renders on another Linux machine over ssh and rsync. An explainer's voice and word times come from the sound rows none
the finish · video-finish, video-finish-qc a look's colour nothing more; ffmpeg's lut3d filter applies the cubes LOOK_LIBRARY_CUBES, optional
the finish · video-finish, video-finish-qc the phone-native tier: the texture probe, the temporal layer and the phone-class encode nothing more; ffmpeg 4.4 or newer, which has the colortemperature filter, and numpy for the probe none
the finish · video-finish-qc the hosted upscale, a billed 4× pass for wides where faces sit small and shots with text to read, and for every take if you skip Topaz the fal key (Topaz Starlight) or a Higgsfield subscription (Rhea; the Higgsfield API has no Topaz), behind a cost line and your go FAL_KEY
the finish · video-finish-qc the local upscale, a free 4× Rhea pass over approved takes framed chest-up or closer, before the grade. A talking head generated at 720p skips it for a 1.5× scale; see How a production runs Topaz Video and a GPU with room for it, only if you upscale on your own card; see Topaz TOPAZ_FFMPEG, TVAI_MODEL_DIR and TVAI_MODEL_DATA_DIR, all optional
the finish · video-finish-qc a look's halation, bloom and grain, graded clip by clip in the hero pass Windows with an NVIDIA GPU, DaVinci Resolve Studio (the kit targets 21; the looks were authored on 18.5 and need no rework), a Dehancer Pro 7.x licence, and the in-app bridge from davinci-resolve-mcp RESOLVE_PY, DAVINCI_RESOLVE_MCP_DIR and the rest in tools/README.md
any step, optional · your agent lets the agent drive Resolve itself, to inspect a project, apply a grade or render outside the hero pass the MCP server from davinci-resolve-mcp, v4.1.3 or newer. npx davinci-resolve-mcp setup installs it and can register it with Claude Code and eleven other agents and editors. In Resolve Studio, set Preferences ▸ General ▸ External scripting using to Local none
looks · look-library/ rebakes a look or ships a new one the spectral base cubes from look-library/fetch_spectral_bases.sh, and an ffmpeg built with libvmaf for the VMAF gate none
mastering · mastering-audio a standalone loudness master for a finished mix Node.js 18 or newer, then npm install once in skills/mastering-audio none

tools/README.md and look-library/GUIDE.md §5 walk through both Windows setups.

A real person in a reference narrows the routes, and the dividing line is whose face it is, not which venue
you pick. fal refuses any photoreal person, and monid's model host refuses real faces before generation starts.
The Higgsfield API and treg both generated from a photograph of an ordinary person, and both refused a
photograph of a public figure. treg refused it with its content filter switched off, so that switch relaxes the
check on ordinary faces and leaves the public-figure check in place. No venue checks whether you hold the rights
to a likeness; that clearance is yours.

ComfyUI, only for work on your own GPU

Install ComfyUI only if you want to run models on your own GPU, for MiniMax H3 seeds or the scene proxy.
Every hosted route works without it. Comfy-Org/ComfyUI lists the ways
to install it: the desktop app for Windows and macOS, a portable build for Windows, comfy-cli, or a manual
install. skills/video-refs-continuity/scripts/comfy_up.sh starts a manual install headless from the
COMFY_* variables in .env, locally or over ssh. With any other install, start the server yourself and
point COMFY_HOST at it; comfy_ready.py, in the same folder, names anything missing.

The scene proxy needs ComfyUI 0.31 or newer,
ComfyUI-Majoor-OmniCam in custom_nodes/, and two
checkpoints under models/: geometry_estimation/moge_2_vitl_normal_fp16.safetensors from Comfy-Org/MoGe
and checkpoints/sam3.1_multiplex_fp16.safetensors from Comfy-Org/sam3.1. The H3 recipe needs more, and
the next section lists it.

MiniMax H3 on your own GPU

Local seeds cost nothing, but each run holds the whole card. On a 24 GB RTX 3090 in a box with about
64 GB of RAM, the recipe renders a 5-second take at 768×1344 in about two minutes, and VRAM peaks at
23.9 GB. We have not tried a smaller card.

The speed depends on a PyTorch build for CUDA 13.0 or newer. Put it in a virtualenv of its own, so the
tools that depend on your current PyTorch keep theirs:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130

Those wheels run on RTX 20-series (Turing) cards and newer, with a driver that supports CUDA 13 (on
Linux, 580.65.06 or later). nvidia-smi prints the highest CUDA version your driver takes. On an older
build ComfyUI warns at startup that it needs cu130 for its optimized CUDA operations, and our take ran
2.1× slower.

ComfyUI provides the H3 nodes, the comfy-kitchen attention backend and the block-sparse attention node
the recipe uses, so you need no SageAttention build. We ran 0.35.0. Three custom node packs go into
custom_nodes/, each with its requirements installed into the same virtualenv:
ComfyUI-KJNodes,
ComfyUI-VideoHelperSuite and, for the ×2
master pass, Comfyui_Minimax_h3_latent_Upscaler.

Every weight is public on Hugging Face, about 45 GB for the recipe; hf comes with
pip install -U huggingface_hub.

cd ComfyUI
hf download Comfy-Org/MiniMax-H3 text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors \
  vae/minimax_h3_video_vae_fp16.safetensors vae/minimax_h3_audio_vae_fp32.safetensors \
  loras/minimax_h3_ref2v_turbo_4step_v0.1_comfyui_bf16.safetensors --local-dir models
hf download WarmBloodAban/Minimax-h3_Singularity \
  Minimax-h3_Singularity_ref2va_Pruned_v1.3_int8.safetensors --local-dir models/diffusion_models
# the ×2 master pass
hf download LBH-123-AI/Minimax_h3_latent_Upscaler \
  minimax_h3_latent_upscaler_3d_fp16.safetensors --local-dir models/latent_upscale_models

The sharpener pass adds loras/minimax_h3_lms_v1.0_r64.safetensors from Alissonerdx/Minimax-H3-ComfyUI
and the stock trunk that LoRA was trained on, diffusion_models/minimax_h3_ref2va_pruned_int8_convrot.safetensors
from Comfy-Org/MiniMax-H3. Every model carries its own licence. The kit ships no graph. Build yours from
skills/video-gen-cost-gate/references/LOCAL-H3.md, which has the settings and the measurements behind
them.

Caption fonts

The kit ships no fonts. build_captions.py loads a caption style's font from hyper/fonts in the project,
or from the folder --fonts-dir names, and stops if the file is missing. It knows three styles: A is
Bangers, saved as Bangers-Regular.ttf; B is Inter, saved as Inter.ttf; C is Nunito, saved as
Nunito.ttf. Style B sets the Black weight by name, so Inter has to be the variable font, and so does any
font you give a weight. All three are free on Google Fonts under the SIL Open
Font License, and Google Fonts is the place to look for more; each family's page shows its licence. To use
another face, put its TTF in the same folder and write the file name as font in the EDL's caption_style.

Topaz, only for upscaling on your own GPU

Install Topaz only if you want the local upscale. It does one job in the kit: a Rhea ×4 pass over approved takes
framed chest-up or closer, plus at most an Iris ×1 pass over a punch-in, on the GPU of a Windows machine that WSL2
drives. Without a card to spare, skip it and use the hosted upscale, which covers the same takes with Rhea on
Higgsfield credits or Starlight on fal, each behind a cost line. Our 4× Rhea run held an 11 GB card at 92% VRAM.

Topaz Video was called Topaz Video AI before the rename. The wrapper in
tools/topaz-upscale/ finds either one's install and model folders, and tools/README.md lists the variables that
override it. We measured it on Topaz Video AI 6.0.2 only. It drives Topaz's command line, which Topaz says it is
phasing out, so check a new release before a job depends on it.

What still works when a dependency is missing

Most of the kit degrades rather than stops, and it is worth knowing where, because the substitutes are not
always worse.

without you lose what still works
ffmpeg the encode, the loudness read, the format checks, silence detection everything up to the master; a hosted upscale returns a finished file
Node 22+ designed elements and explainers — they render through headless Chromium every generated-footage lane, and the mastering tool on Node 18
a GPU with enough VRAM local generation needs ~24 GB (ours peaked at 23.9); the local finish — Topaz and Dehancer — measured 92% of an 11 GB card, so below ~11 GB it goes too the hosted lanes, all of them, and every finishing step — plus scene_proxy.py, which needs no GPU and still reads any scene.json you have. Which tier is yours
faster-whisper word times on your own machine the billed transcription service, or hand-placed captions
Resolve Studio + Dehancer halation, bloom, grain and gate weave as a graded pass the colour itself, through a LUT in ffmpeg, and the whole phone-native finish, which never opens Resolve
Windows Topaz and Resolve, which are Windows-only here the Linux lanes; a hosted upscale replaces Topaz
an ElevenLabs key generated voice-over and generated sfx the take's own sound, a library sound, and every caption, loudness and mix step
a music vendor generated cues a cue the operator brings or a library bed — the cut, duck and licence rules are the same either way
the monid CLI the pay-as-you-go generation route and its free reference hosting the subscription route for the same model, and any other venue in the table
a Higgsfield API key a pay-as-you-go route that takes an ordinary face, the edit and extend endpoints, and 2K MiniMax H3 at the API's rate the subscription CLI, which reaches the same models and adds 1080p; treg for an ordinary face; every other Seedance route
the treg CLI the relaxed-filter route for an ordinary face the Higgsfield API, which also takes one; fal and monid do not

The rule the kit holds to: nothing you are asked to watch needs a build step. A master plays in any
player; a designed element's source is one HTML file a browser opens.

If you have no GPU, or a small one

"Do I have a GPU" is the wrong question — every local step has its own VRAM floor, and ours are measured,
not estimated. Find your row first.

your card what we measured on it what it means
24 GB (RTX 3090) local MiniMax H3 peaked at 23.9 GB of 24 everything local runs, but generation holds the whole card — nothing else can share it
~11 GB (GTX 1080 Ti) Resolve Studio 18.5 + Dehancer Pro 7.4 graded at 92% VRAM; the Topaz Rhea ×4 pass also held 92% the local finish fits and local generation does not. Both jobs sit near the edge, so 11 GB is the floor, not the comfortable case
under ~11 GB (8 GB, 6 GB) never tested — "we have not tried a smaller card" those two jobs used about 10.1 GB, so they do not fit. Treat this as the no-local-GPU row below
an AMD card or APU (e.g. Radeon 780M) local generation is out by construction — the wheels need CUDA 13 on an RTX 20-series card or newer. Dehancer is not out: it ships a separate OpenCL build for AMD, so the graded pass turns on VRAM, not on vendor. On an APU that VRAM is carved out of system RAM, so 4 GB of it also costs you 4 GB of the RAM everything else wants
Intel integrated (Iris, HD) Dehancer does not support these at all, and local generation needs CUDA. Every hosted lane is unaffected

Resolve's own floor is lower than ours — 2 GB VRAM and 16 GB system RAM — so it may well install on a modest card and
still be unable to carry the graded pass we measured, which held 92% of 11 GB. Treat "it launches" and "it can finish
a job" as separate questions.

On an APU those two floors compete for one pool. The iGPU takes its VRAM from the same system RAM Resolve wants
16 GB of, so a 16 GB machine satisfies neither floor comfortably once the carve-out lands. Leave the BIOS UMA buffer
at its default: it sets a minimum reserve rather than a cap, and raising it only takes RAM away from everything else.

Which Resolve licence you hold decides export speed more than the card does. On the free edition, H.264 and H.265
encoding is CPU-only — the GPU's hardware encoder is not selectable on the Deliver page — so exports are slow on any
machine, and slowest where that CPU is also feeding an iGPU. Studio uses the hardware encoder. The documented
workaround on free is to export an intermediate (DNxHR) and transcode that with ffmpeg, which does reach the encoder.

At ~11 GB, ignore only MiniMax H3 on your own GPU and buy your seeds
hosted. Keep tools/topaz-upscale/ and the Resolve chain — they are the two things that do fit. Expect
them to be slow rather than impossible: a Dehancer frame took 5.5 s at 3416×1920, and a full pass ran about
135 minutes.

Everything below applies to the last two rows — no card, one under about 11 GB, or a non-NVIDIA one.

Ignore three sections: ComfyUI,
MiniMax H3 on your own GPU, and
Topaz.

Five scripts cannot run. Nothing else calls them, so nothing else breaks — but read the note under the list:

skills/video-refs-continuity/scripts/comfy_up.sh
skills/video-refs-continuity/scripts/comfy_ready.py
skills/video-refs-continuity/scripts/scene_blockout.py
skills/video-finish-qc/scripts/upscale_local.sh
tools/topaz-upscale/topaz_upscale.py

tools/topaz-upscale/ is safe to delete in these rows only — at ~11 GB it is one of the few local things that still works. Leave every COMFY_*, TOPAZ_* and TVAI_* variable unset in .env.

One caveat on scene_blockout.py: it ran in ~15–25 s per frame on a 24 GB card, but that is the card it happened
to run on, not a measured requirement — its two checkpoints are small and nobody has tried it on a lesser card.
If you have some GPU, it is worth one attempt before you assume it is out.

You keep all fifteen skills and every generation route, because all of them are hosted: Seedance 2.5 on
Higgsfield by subscription or through its API, on monid or treg pay-as-you-go, and on fal for people-free
shots, plus kie for stills. You keep the
whole finish chain, with the hosted upscale doing the job Topaz would have done. And you keep look-library/,
because applying a look is an ffmpeg lut3d filter — Resolve is only needed to author or rebake one. The
phone-native finish is ffmpeg from end to end.

One METHOD changes, not just a tool. Without scene_blockout.py you cannot compute a room from a keeper
frame, so the geometry for a new angle is read off that frame at 2–4× zoom and copied into the prompt
verbatim, and the GO ask says "no scene proxy for this shot"
(skills/video-refs-continuity/SKILL.md § Failure behavior). The reader, scene_proxy.py, needs no GPU and
still works on any scene.json you already have.

tools/resolve-pass/ is a different axis, not this one. It needs Windows, DaVinci Resolve Studio and a
Dehancer licence whether or not you have a card. Without it a look still applies as a LUT; what you lose is
halation, bloom, grain and gate weave as a graded pass.

Install

git clone https://github.com/konradre/video-production-skills
cd video-production-skills && ./install.sh

The installer symlinks skills/* into ~/.claude/skills/. The skills find the tools and the look
library through those links, so the default layout needs no configuration. Every command inside the
skills calls ~/.claude/skills/<skill>/…, so keep those links whichever agent runs the kit; if your agent
loads skills from another folder, ./install.sh <that folder> links them there as well.

For Codex, that folder is ~/.agents/skills:

./install.sh ~/.agents/skills

That links both, and both are needed: commands inside the skills call ~/.claude/skills/<skill>/… by
absolute path, so that link stays load-bearing whatever agent you run. Codex then invokes a skill with
$<skill-name>, and reads AGENTS.md at the repository root on its own — it does not read this file.
Claude Code reads CLAUDE.md, which is a one-line import of the same AGENTS.md.

Vendor keys never live in the repo or in a skill. Copy .env.example to .env, which git ignores, and
fill in the keys for the parts you use. The file names every key and variable the kit reads and what each
one is for, including two fallback routes that no script calls. The scripts read keys from the
environment rather than from the file, so the agent loads it in the same command that needs it:

set -a; . ~/.claude/skills/video-production/../../.env; set +a

That path resolves through the installer's link to the root of your clone.

How a production runs

Start with /video-production and name the project root and the genre. The entry skill reads the
project's pause block, prints a status line (deliverable, free disk, balances where a vendor lets you
read them, background jobs, open items) and hands off to the phase the next step belongs to. The
phases run downhill and each one carries its own gate:

pre-production → references and continuity → the prompt → the gated generation call → the read →
the cut → the sound → designed elements → the finish and QC → the client round.

METHOD.md walks the whole method in order and says why each rule exists. A few of them bind every
turn, whatever the phase. A cost line and the operator's explicit go come before any billed call, and
the amount does not matter. Nothing is upscaled before the operator has approved the take. The
client's text is the single source of truth and additions are proposed as cost lines. Continuity is
the first acceptance test, before the gag. Masters are 1080p only. Decisions go to the operator as
numbered questions with the cost and the file path inline.

Every other house rule in the kit guides rather than blocks. It says what departing from it would cost, as a
number where one exists, recommends, and then does what the operator decides.

Seedance seeds generate at 480p and are upscaled only after approval, with one exception. A talking head that
has to speak a locked voice-over generates at 720p, with the voice-over passed as an audio reference on a route
that accepts one. The audio drives the words, so there is no lipsync pass, and the finish is a 1.5× lanczos
scale to 1080×1920 in place of a reconstructive upscale. Leave the words out of the prompt: written dialogue
outranks the audio and demotes it to timbre.

The phone-native finish

A creator-style spot, the kind that has to pass as something a person filmed on their phone, does not get
the film finish. It gets a tier of its own, ugc-phone, and that tier inverts two of the rules above on
purpose.

What makes a clip read as phone-shot is not its colour. A .cube carries colour only, and a phone's colour
is close to neutral, so the library's ugc-phone cube is a grade close to identity, with no film stock and
no split-tone, and there is no Dehancer pass at all. Halation, bloom and film grain read as film, and a phone
has none of them. The phone-ness is temporal, and most of it lives in the encode.
skills/video-finish/scripts/phone_native.py runs at delivery resolution, after the cube and the downscale.
It adds a slow exposure drift, a white balance that moves in steps the way a phone's auto white balance does,
an exposure jump at each cut, one to three pixels of handheld shake, and either fine noise like a sensor's or
a light denoise. Then it encodes the way a phone does: H.264 4:2:0, a closed GOP, BT.709 tags, at a bitrate
between 2.5 and 12 Mbps. None of it needs Resolve, Dehancer or a GPU. ffmpeg and numpy cover the whole tier.

The probe decides the dose, not the eye. skills/video-finish-qc/scripts/phone_texture_probe.py reads three
numbers off native centre crops of a clip at five points along it: the share of 8×8 blocks the encoder
flattened to zero variance, the noise floor of the flattest fifth of the blocks, and the median block spread.
Run it on the project's own real phone clips first, by scene class, then on the candidate, and move the dose
until the candidate sits inside the real clips' range. The numbers compare matched content. They are not a
threshold, and a number from one project says nothing about another.

The calibration run overturned the premise we started from. We expected to add noise. Two real phone clips,
as they arrived from a client through a platform re-encode at about 2.5 Mbps, read a noise floor between 0.1
and 0.7, with anywhere from none to a third of their blocks dead-flat depending on which frames the probe
sampled. Three raw 720p takes from a hosted generator read a floor of 1.8 to 2.0 and no dead-flat blocks at
all. The generated take carried more fine texture than the phone clips, not less. Adding noise moved it
further out of the band. A light denoise and a 2.5 Mbps encode moved it in, and the encode was the larger of
the two levers. So the layer carries a denoise arm beside the noise arm, and the probe decides the direction
per pair. On another generator, another raster or another set of real clips the direction can reverse; we
have measured one generator so far. The full table is in skills/video-finish/references/EVIDENCE.md.

The prompt side lives in skills/video-prompt-dialects/references/PHONE-NATIVE.md. The dialect attributes
the camera ("shot on a front camera, handheld, at arm's length") and never names the device, because a
video model tends to draw the noun you hand it. camera_clause.py --phone, in the same skill, prints the
clause. That rule reads more certain than its evidence. We have watched generators draw a negated noun, one
burning in captions it was told to leave off and another drawing a grid it was told to omit, while the
device name case comes from other practitioners' skills and we have not yet checked it against a control on
the same seed. The creative grammar for the sub-genre, hooks, structures, beats by duration, the variant
matrix and the four artifacts a spot ships with, is in skills/ad-spot-preprod/references/UGC-GRAMMAR.md.
The disclosure rules for creator-style ads on the large platforms and under the FTC endorsement guides are
in that skill's references/RISKS.md, written from the primary sources; three claims that circulate in the
write-ups did not survive that reading.

What is not here

Where a skill needs an example of a file shape, the example is a placeholder. The five looks ship
complete, cubes and .drx grades both; the phone tier's cube ships alone, because that tier uses no
Dehancer pass. The .drx files were authored on Dehancer Pro OFX 7.4 and
need a licensed Dehancer Pro 7.x with its film profiles downloaded, because a major version installs
as a separate plugin. The spectral base cubes the film looks were baked from are fetched, not
vendored; you only need them to rebake after editing a recipe. Third-party notices are in NOTICE.md.

License

MIT. The film looks' cubes derive from spectral base cubes in
ComfyUI-Darkroom (MIT, notices in NOTICE.md);
the designed elements render with HyperFrames
(Apache-2.0); the Resolve bridge comes from
davinci-resolve-mcp (MIT). The .drx grades hold
our own settings for the Dehancer plugin and none of its profile data. Cubes exported by Dehancer's own
LUT Generator are licensee-only and must never be published.

Reviews (0)

No results found