Skip to content

About

Keep a character the same person across every shot of an AI film. Casting, drift diagnosis, continuity sheets and an audit script. Vendor-neutral, evidence-backed.

Topics

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Repository files navigation

Character Continuity — keep one face across every shot of an AI film

CC BY 4.0 MIT 1 skill Agent Skills format portable

Character Continuity

Production discipline for AI-generated narrative film, written as a portable agent skill.

Plain Markdown. No dependencies, no SDK, no vendor lock-in.


The problem this solves

You generate shot 1. Your character looks great.

You generate shot 7. She's the same person, roughly — but her nose is straighter, she's four years younger, and the scar through her eyebrow is gone. By shot 40 she's someone else entirely, and because the change happened a little at a time you didn't notice until you cut the sequence together.

This is character drift, and it is the single thing that separates AI films that look like films from AI films that look like a folder of nice clips. It is not solved by a better model or a better prompt. It is solved by production discipline — the same discipline live-action crews have used for a century, adapted for generative tools.

That discipline is what this skill encodes.


What the skill actually does

character-continuity gives an AI agent — or you — a repeatable method for keeping a character recognisably the same person across every shot of a film.

It covers seven things:

Casting Build a canon frame, a turnaround set and detail plates before generating a single shot. Includes why you cast for a distinctive face rather than an attractive one.
Prompt blocks The locked identity block you paste verbatim into every prompt, plus the turnaround, detail-plate and setup-frame prompts that build your reference assets.
Tool selection Identity mechanisms across Veo, Runway, Kling, Midjourney, Sora, Luma, Higgsfield, LoRA and the PuLID/InstantID family — organised by conditioning mode rather than by vendor, so it survives the next model release.
Drift diagnosis Seven named causes of drift, each with a mitigation. When a face goes wrong, you run the checklist instead of guessing.
Continuity tracking A per-shot sheet ported from live-action script supervision: wardrobe, props, marks, story-day progression, screen direction.
Multi-character work Face blending, eyelines, shot-reverse-shot, the 180-degree line, and the reverse-angle trap that generates you a second room.
Repair vs regenerate A decision tree for damaged shots, restoration settings, and the rule that saves the most time: reject any version that is sharper but less recognisably the same person.

Plus a drift-audit script that tiles your shots against the canon frame so slow drift becomes visible.

What it is not

It will not make a model produce frame-identical output — nothing does that in 2026. It reduces the failure rate and catches the failures that remain. If you want a magic prompt, this is the wrong repo.

It also assumes your tool accepts image input. The core of the method is conditioning on an approved canon frame. If your pipeline is text-to-video only — as many MCP servers and API wrappers are — the canon frame, turnarounds and frame chaining are unavailable to you. The identity block, casting discipline, continuity sheet and audit script still apply, and SKILL.md has a section on getting the most out of a text-only pipeline. But be clear-eyed: text conditioning alone is the weakest lever here, and the A/B below shows exactly how weak.


Does it actually work?

Controlled test. Same character, same three story beats, same model (Gemini 3.1 Flash Image), same session. The only variable is the method.

A/B test: without the skill the character changes completely between shots; with the skill she holds

Top row — without the skill. Three independent text prompts, the character re-described in words each time. This is what most people do. The result is three different women: different bone structure, different hair, different skin tone. Not one of them is the approved canon frame on the left.

Bottom row — with the skill. Canon frame supplied as a reference image, locked identity block pasted verbatim, only the scene block varying. Same woman in all three shots. Face structure, hair, skin tone and wardrobe all hold across a wide, a medium close-up and an 85mm close-up in three different lighting setups.

Both contact sheets were built with scripts/contact-sheet.sh, the audit tool in this repo.

Does it survive motion?

Stills are the easy case. The three approved setup frames from the test above were then animated — one action per clip, locked camera, 6 seconds each.

The audit below samples a frame 4.5 seconds into each clip — well past the conditioned first frame, where drift would show if it were going to — and tiles them against the canon frame:

Frames sampled mid-clip from all three videos, audited against the canon frame

Same woman in a wide, a profile turn and a close-up, across three lighting setups. Built with scripts/contact-sheet.sh, which samples video directly.

A finding from making this clip. Attempting to pass a character reference image and a first frame in the same Veo request fails outright:

Error: Image and reference images cannot be both set.

That is the conditioning-mode exclusivity described in references/tool-matrix.md, confirmed against the live API rather than inferred from documentation. It is also why the method builds the setup frame first and animates it second — that sequencing is what makes the constraint a non-issue.

Honest caveats. This is one test with one character on one model, not a benchmark. Arm B is not perfect — the 85mm close-up came back looser than the framing asked for. And the result is not surprising: image conditioning beating text description is the mechanism the whole method is built on. The test confirms the mechanism works and shows the size of the gap; it does not prove every claim in these files.


How to use it

With an agent

Once installed, just describe the work. The skill loads itself when the task matches:

"I'm making a 12-shot short film with one recurring character. Help me set it up."

"My character's face changed between shot 4 and shot 9. What went wrong?"

"Generate the turnaround set for this character from this canon frame."

"Shot 6 came back with a warped face. Should I repair it or regenerate?"

"Two characters in one frame keep blending into each other."

The agent reads SKILL.md for the method and pulls in the deeper reference files only when it needs them, so a simple question doesn't drag the whole corpus into context.

By hand

Read references/worked-example.md first — one scene, three shots, start to finish, including the six failures and how each was fixed. It shows the order of operations, which is most of the method.

Then work in this order:

  1. Cast — approve one canon frame, generate the turnaround set from it
  2. Write the identity block — the text you'll paste into every prompt from here on
  3. Build setup frames as stills — resolve framing, light and screen direction cheaply, before any motion exists
  4. Animate the approved stills — one action per clip, 5–10 seconds
  5. Log continuity — wardrobe, props, marks, story day
  6. Audit — run the contact-sheet script every 8–10 shots and compare against canon

The drift audit

./skills/character-continuity/scripts/contact-sheet.sh \
    refs/mara_canon.png \
    shots/ \
    audit_s04.jpg

Samples a frame from every clip, puts the canon frame first, tiles them into one image. Needs ffmpeg; uses ImageMagick for labelled tiles if you have it, falls back to ffmpeg-only if you don't.

Drift is invisible shot-to-shot and obvious in aggregate. This is the whole point.


Install

Claude Code

git clone https://github.com/Nagacash/character-continuity-skill.git
mkdir -p ~/.claude/skills
cp -r character-continuity-skill/skills/character-continuity ~/.claude/skills/

Loads automatically when a task matches. For a single project instead of your whole account, use .claude/skills/ inside the project directory.

claude.ai

Zip the skills/character-continuity folder and upload it under Settings → Capabilities → Skills.

Hermes, Llama, Mistral, Qwen — open models

Open models have no skills runtime; a "skill" is just a system prompt plus files the model can read. Two ways to run it:

Paste it. In LM Studio, Jan, Open WebUI or any chat UI, paste the contents of SKILL.md into the system prompt field. It's about 1,800 words — roughly 2.5k tokens — so it fits comfortably. Paste a reference file in as well when you need that depth.

Bake it into a model. With Ollama:

# Modelfile
FROM hermes3:8b
SYSTEM """
<paste the contents of skills/character-continuity/SKILL.md here>
"""
ollama create hermes-film -f Modelfile
ollama run hermes-film

Load it programmatically against any OpenAI-compatible endpoint (Nous Portal, OpenRouter, vLLM, llama.cpp server):

from pathlib import Path
from openai import OpenAI

skill = Path("skills/character-continuity/SKILL.md").read_text()

client = OpenAI(base_url="https://openrouter.ai/api/v1", api_key="...")

resp = client.chat.completions.create(
    model="nousresearch/hermes-4-70b",
    messages=[
        {"role": "system", "content": skill},
        {"role": "user",   "content": "I'm making a 12-shot short with one recurring character. Set me up."},
    ],
)
print(resp.choices[0].message.content)

To give the model the deeper material, load the relevant references/*.md file into the system prompt too, or expose the folder through whatever file-reading tool your harness provides.

Cursor, Cline, Continue, OpenCode, Windsurf

Drop the folder into your project and point the agent at it in your rules file (.cursorrules, .clinerules, AGENTS.md — whichever your tool uses):

Before planning or generating any film shot, read
skills/character-continuity/SKILL.md.
Load files under skills/character-continuity/references/ when you need detail.

Anything else

There is nothing Claude-specific in the content. It's Markdown. If your agent can read a file, it can use this.


What's in the repo

skills/character-continuity/
  SKILL.md                      the method, kept scannable
  references/
    worked-example.md           one scene end to end, including the failures
    prompt-blocks.md            turnaround, detail-plate and setup-frame prompts,
                                identity block, scene block, negative lists
    tool-matrix.md              identity mechanisms, choosing a conditioning mode
    drift.md                    seven causes of drift, and fixes
    continuity-sheet.md         copy-paste tracking template
    repair.md                   repair vs regenerate
    sources.md                  sources, graded by confidence
  scripts/
    contact-sheet.sh            builds the drift-audit contact sheet

SKILL.md carries the method and points to depth only when depth is needed, so routine tasks don't load the whole corpus.


Honesty about scope

Vendor-documented facts, academic findings and practitioner reports are graded separately in references/sources.md, and claims that are reported experience rather than documented are marked [PRACTITIONER] inline, where you actually read them.

Some of what circulates about these tools originates in their own content marketing. Where a claim couldn't be verified against vendor documentation, the file says so instead of asserting it confidently.

This deliberately does not contain a per-vendor parameter table. Those numbers change monthly, and a stale table is worse than no table. It teaches you the six questions to ask of any tool instead.

Accurate as of August 2026.


Contributing

Corrections welcome, particularly:

  • Parameters that have changed
  • Tools with identity mechanisms not covered here
  • Techniques that failed for you — negative results are useful and rarely published

Open an issue or a PR.


Licence

Dual licensed, because this repo is mostly writing and a little code:

  • Documentation — SKILL.md and everything under references/ — is CC BY 4.0. Use it commercially, fork it, adapt it, build it into your own product. Just credit the source.
  • Code — scripts/ — is MIT. No attribution burden on the script.

Attribution for the documentation, wherever it's reasonable to put it:

Character continuity method by Naga Codex (Maurice Holda) — https://github.com/Nagacash/character-continuity-skill

Created by Naga Codex — Maurice Holda, Hamburg.

About

Keep a character the same person across every shot of an AI film. Casting, drift diagnosis, continuity sheets and an audit script. Vendor-neutral, evidence-backed.

Topics

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages