Best for
- A multi-scene run names the same character on screen more than
- A character drift bug landed (face / outfit / prop changed between
- A series, episode, or recurring ad uses the same on-screen identity.
event4u-app/agent-config/src/skills/character-consistency/SKILL.md
Use when a character must stay visually identical across AI video scenes — locks identity tokens (silhouette, palette, wardrobe, prop) in JSON. Triggers 'character lock', 'same character'.
Decision brief
Lock a character's visual identity into agents/reference/ai-video//characters/.json so every scene reuses the exact same tokens verbatim. Downstream skills (video-director, pixar-storyteller, motion-choreographer) read this file and never paraphrase. Verified by visual regressio…
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/event4u-app/agent-config --skill "src/skills/character-consistency"Inspect the Agent Skill "character-consistency" from https://github.com/event4u-app/agent-config/blob/0adf49a8ae84b0ff6e2de8759eea43257e020eff/src/skills/character-consistency/SKILL.md at commit 0adf49a8ae84b0ff6e2de8759eea43257e020eff. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
1. Check agents/reference/ai-video//characters/ — if a lock already exists for this id, read it, do not redraft. Edits require an explicit revision note (Phase 6 visual regression must rerun). 2. Confirm the character will appear in ≥ 2 scenes; one-shot → skip.
1. Check agents/reference/ai-video//characters/ — if a lock already exists for this id, read it, do not redraft. Edits require an explicit revision note (Phase 6 visual regression must rerun). 2. Confirm the character will appear in ≥ 2 scenes; one-shot → skip.
Emit a JSON file at agents/reference/ai-video//characters/.json with the following fields. Every field is mandatory; missing field → fail the lock.
1. After the first scene renders, copy the highest-quality frame showing the character full-face and full-body to agents/reference/ai-video//characters/.ref.png. 2. Update referenceframe in the JSON to point at it. 3. Phase 6 visual regression compares every subsequent scene's c…
1. JSON parses (jq . characters/.json exits 0). 2. All mandatory fields present and non-empty. 3. subjectclass (when present) is one of humanoid | creature | vehicle | abstract | object; each field reads per the matrix row for that class — a creature lock with a garment list in…
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 96/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 7 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Lock a character's visual identity into
agents/reference/ai-video/<project>/characters/<id>.jsonso every scene reuses the exact same tokens verbatim. Downstream skills (video-director,pixar-storyteller,motion-choreographer) read this file and never paraphrase. Verified by visual regression (pixel similarity ≥ 95%, Phase 6 Step 3).
Do NOT use when:
style.json lock pattern in the project's notes
instead. Recurring creatures, vehicles, and hero objects DO get a
real lock — pick the matching subject_class below.agents/reference/ai-video/<project>/characters/ — if a lock already
exists for this id, read it, do not redraft. Edits require an
explicit revision note (Phase 6 visual regression must rerun).Emit a JSON file at
agents/reference/ai-video/<project>/characters/<character-id>.json with the
following fields. Every field is mandatory; missing field → fail
the lock.
{
"id": "kebab-case-id",
"name": "Display Name",
"subject_class": "humanoid | creature | vehicle | abstract | object",
"silhouette": "one-line read of the body shape from 30m",
"palette": ["#hex1", "#hex2", "#hex3"],
"wardrobe": "garment list, materials, era",
"signature_prop": "the one object that travels with them",
"posture_default": "how they stand when not acting",
"eye_behavior": "blink rhythm, glance habit",
"face": "age band, skin tone, hair (length / color / texture), distinguishing marks",
"voice_note": "timbre + cadence for native-audio adapters; null if N/A",
"reference_frame": "scenes/<id>/frames/<n>.png or null",
"version": 1
}
Field NAMES are fixed (downstream consumers extract them verbatim);
their SEMANTICS shift per subject_class. Missing subject_class →
humanoid (back-compat with existing locks). The blueprint layer
stays subject-agnostic on purpose — it only consumes the rendered
SUBJECT string; class semantics live here, in the one file the
drafting agent reads.
| Field | humanoid | creature | vehicle | abstract | object |
|---|---|---|---|---|---|
silhouette | body shape from 30m | body shape + locomotion read | hull/body outline | dominant form | outline + scale cue |
wardrobe | garments, materials, era | integument: fur / scales / skin texture + markings | body panels, livery, decals, wear | motif / texture field | surface finish, material, wear |
signature_prop | the object that travels with them | anatomical signature (horn, tail tuft, scar) | hood ornament / aerial / charm | recurring sub-form | defining attachment or mark |
posture_default | how they stand | gait + resting stance | stance / ride attitude | motion signature | resting pose / orientation |
eye_behavior | blink rhythm, glance habit | eye/ear behavior | lighting signature (headlights, dash glow) | pulse / emission rhythm | highlight + reflection behavior |
face | age band, skin, hair, marks | head anatomy (muzzle, eyes, dentition) | front fascia (grille, lights) | focal form | defining front / face side |
voice_note | timbre + cadence | vocalization | engine / motion sound | sound signature | interaction sound |
Universal slots (id, name, palette, reference_frame,
version) keep one meaning across all classes.
Worked example — creature:
{
"id": "moor-wyrm",
"name": "Moor Wyrm",
"subject_class": "creature",
"silhouette": "low six-limbed serpentine bulk, head held below shoulder line",
"palette": ["#2e4a3f", "#c9b458", "#1a1a1a"],
"wardrobe": "moss-green plated scales, gold-flecked underbelly, mud-matted ridge fur",
"signature_prop": "broken left tusk capped with a brass ring",
"posture_default": "coiled low, weight on forelimbs, tail tip always moving",
"eye_behavior": "slow horizontal nictitating blink; ears flatten before lunges",
"face": "blunt muzzle, four-nostril ridge, amber eyes with horizontal pupils",
"voice_note": "sub-bass rumble with clicking overtones; null if scenes are scored only",
"reference_frame": null,
"version": 1
}
agents/reference/ai-video/<project>/characters/<id>.ref.png.reference_frame in the JSON to point at it.compare
≥ 95% similarity).jq . characters/<id>.json exits 0).subject_class (when present) is one of humanoid | creature | vehicle | abstract | object; each field reads per the matrix row
for that class — a creature lock with a garment list in wardrobe
is a drafting error, not a style choice.agents/reference/ai-video/<project>/characters/<id>.json — locked
identity tokens, schema above.agents/reference/ai-video/<project>/characters/<id>.ref.png —
reference frame (added after first render).agents/reference/ai-video/<project>/characters/CHANGELOG.md — one
line per revision: v<n> · YYYY-MM-DD · reason · scenes-to-rerun.subject_class reads as humanoid
downstream — the lock is structurally weaker and nobody can tell.
Always set the class for non-humanoid subjects.version.voice_note: null is explicit; missing the key entirely breaks
the schema validator.version bumped) requires Phase 6 visual regression
to rerun against every prior scene that used the old version.version and
adding a CHANGELOG line.When a character lock would identify or render a real person, consult before emitting the JSON:
agents/settings/policies/media/likeness.md — real-person identity tokens require a cited likeness release.agents/settings/policies/media/public-figures.md — recognised public figures carry the harder gate (publicity rights + transformative-intent).agents/settings/policies/media/voice-cloning.md — when voice_note references a real person's voice.agents/settings/policies/media/disclosure.md — outputs carrying a real-person lock require the non-removable AI-generation disclosure downstream.Refuse-and-surface the file path; do not silently sanitise the prompt.