Source profileQuality 96/100

event4u-app/agent-config/src/skills/character-consistency/SKILL.md

character-consistency

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'.

Source repository stars
7
Declared platforms
0
Static risk flags
0
Last source update
2026-07-28
Source checked
2026-07-28

Decision brief

What it does—and where it fits

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…

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.

Not for

  • Tasks that require unconfirmed production actions or broad system permissions.
  • Environments where the pinned source and install steps cannot be inspected.

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexNot declaredNo explicit evidencePortability before use
Claude CodeNot declaredNo explicit evidencePortability before use
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/event4u-app/agent-config --skill "src/skills/character-consistency"
Safe inspection promptEditorial

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

What the source asks the agent to do

  1. 01

    Procedure

    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.

    Check agents/reference/ai-video//characters/ — if a lock alreadyConfirm the character will appear in ≥ 2 scenes; one-shot → skip.After the first scene renders, copy the highest-quality frame
  2. 02

    Step 0: Inspect

    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.

    Check agents/reference/ai-video//characters/ — if a lock alreadyConfirm 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 w…
  3. 03

    Step 1: Draft identity tokens

    Emit a JSON file at agents/reference/ai-video//characters/.json with the following fields. Every field is mandatory; missing field → fail the lock.

    Emit a JSON file at agents/reference/ai-video//characters/.json with the following fields. Every field is mandatory; missing field → fail the lock.Field NAMES are fixed (downstream consumers extract them verbatim); their SEMANTICS shift per subjectclass. Missing subjectclass → humanoid (back-compat with existing locks). The blueprint layer stays subject-agnostic o…Universal slots (id, name, palette, referenceframe, version) keep one meaning across all classes.
  4. 04

    Step 2: Reference frame

    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…

    After the first scene renders, copy the highest-quality frameUpdate referenceframe in the JSON to point at it.Phase 6 visual regression compares every subsequent scene's
  5. 05

    Step 3: Validate

    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…

    JSON parses (jq . characters/.json exits 0).All mandatory fields present and non-empty.subjectclass (when present) is one of humanoid | creature |

Permission review

Static risk signals and limitations

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

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score96/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars7SourceRepository attention, not individual Skill quality
Compatibility0 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
event4u-app/agent-config
Skill path
src/skills/character-consistency/SKILL.md
Commit
0adf49a8ae84b0ff6e2de8759eea43257e020eff
License
MIT
Collected
2026-07-28
Default branch
main
View the original SKILL.md

character-consistency

Lock a character's visual identity into agents/reference/ai-video/<project>/characters/<id>.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 regression (pixel similarity ≥ 95%, Phase 6 Step 3).

When to use

  • A multi-scene run names the same character on screen more than once — Character Lock is mandatory before the second scene drafts.
  • A character drift bug landed (face / outfit / prop changed between scenes) — re-lock and rerun the affected scenes.
  • A series, episode, or recurring ad uses the same on-screen identity.

Do NOT use when:

  • One-shot scene with no recurring character — overhead is wasted.
  • The "character" is an environment or set (a place, not an entity) — use a 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.

Procedure

Step 0: Inspect

  1. Check 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).
  2. Confirm the character will appear in ≥ 2 scenes; one-shot → skip.

Step 1: Draft identity tokens

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
}

Subject-class token matrix

Field NAMES are fixed (downstream consumers extract them verbatim); their SEMANTICS shift per subject_class. Missing subject_classhumanoid (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.

Fieldhumanoidcreaturevehicleabstractobject
silhouettebody shape from 30mbody shape + locomotion readhull/body outlinedominant formoutline + scale cue
wardrobegarments, materials, eraintegument: fur / scales / skin texture + markingsbody panels, livery, decals, wearmotif / texture fieldsurface finish, material, wear
signature_propthe object that travels with themanatomical signature (horn, tail tuft, scar)hood ornament / aerial / charmrecurring sub-formdefining attachment or mark
posture_defaulthow they standgait + resting stancestance / ride attitudemotion signatureresting pose / orientation
eye_behaviorblink rhythm, glance habiteye/ear behaviorlighting signature (headlights, dash glow)pulse / emission rhythmhighlight + reflection behavior
faceage band, skin, hair, markshead anatomy (muzzle, eyes, dentition)front fascia (grille, lights)focal formdefining front / face side
voice_notetimbre + cadencevocalizationengine / motion soundsound signatureinteraction 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
}

Step 2: Reference frame

  1. After the first scene renders, copy the highest-quality frame showing the character full-face and full-body to agents/reference/ai-video/<project>/characters/<id>.ref.png.
  2. Update reference_frame in the JSON to point at it.
  3. Phase 6 visual regression compares every subsequent scene's character frame against this reference (ImageMagick compare ≥ 95% similarity).

Step 3: Validate

  1. JSON parses (jq . characters/<id>.json exits 0).
  2. All mandatory fields present and non-empty.
  3. 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.
  4. Palette has ≥ 2 and ≤ 5 hex values.
  5. Downstream skills cite this file by path, never paraphrase its contents.

Output format

  1. agents/reference/ai-video/<project>/characters/<id>.json — locked identity tokens, schema above.
  2. agents/reference/ai-video/<project>/characters/<id>.ref.png — reference frame (added after first render).
  3. agents/reference/ai-video/<project>/characters/CHANGELOG.md — one line per revision: v<n> · YYYY-MM-DD · reason · scenes-to-rerun.

Gotcha

  • A non-humanoid lock without subject_class reads as humanoid downstream — the lock is structurally weaker and nobody can tell. Always set the class for non-humanoid subjects.
  • The model wants to "improve" identity tokens on each scene — this is the silent drift failure. Tokens are immutable until a revision note bumps version.
  • Palette without a count fails downstream — adapters need a small closed set (2–5 hex).
  • voice_note: null is explicit; missing the key entirely breaks the schema validator.
  • Reference frame is captured after the first successful render, not before — bootstrap scenes have no reference and only the JSON locks them.
  • A revision (version bumped) requires Phase 6 visual regression to rerun against every prior scene that used the old version.

Do NOT

  • Do NOT paraphrase identity tokens when drafting scene prompts — copy verbatim or break the lock.
  • Do NOT edit a locked JSON in place without bumping version and adding a CHANGELOG line.
  • Do NOT skip the reference frame after the first render — visual regression has nothing to compare against.
  • Do NOT lock a character that appears in only one scene.

Policies

When a character lock would identify or render a real person, consult before emitting the JSON:

Refuse-and-surface the file path; do not silently sanitise the prompt.