CD · Character Lock
A character sheet your prompts can't quietly drift away from
- character
- character_json
- character_hash
Character consistency is the most complained-about problem in this hobby, and here's the uncomfortable part nobody likes to say out loud: the generation model has no memory. It never met your character. Every take is a fresh sample from a probability distribution, and "keep the same person" is a property the model only approximates via LoRAs, reference images, and edit models. CDCharacterLock doesn't try to fix that at the pixel level - it does something arguably more useful: it gives every take in your project the exact same written identity contract, so the drift isn't silent.
It's from Continuity Director, a 20-node pack for repeatable AI video production, and it's one of the "lock" nodes at the top of the chain. Think of it as the character sheet that lives in the workflow instead of a Google Doc.
What you fill in
Seven fields, and most of them are plain prose:
- character_id - your stable key, e.g.
leadorcharacter-001. It gets normalized, so keep it clean. - display_name - "Lead", "Sarah", whatever the prompt should call them.
- appearance and wardrobe - the actual description of who they are and what they're wearing.
- forbidden_changes - the drift you're declaring off-limits. The default,
hair color, facial structure, is a genuinely smart start. - reference_ids - a comma-separated list pointing at your reference images or assets elsewhere in the workflow.
- identity_seed - an integer. This is the reproducibility lever: same character seed + same model stack + same prompt gets you closer to the same face run after run.
How it works
The node wraps your description into a CD_CHARACTER record with a SHA-256 hash - the "lock." Change the wardrobe text and the hash changes, which means anything downstream that referenced the character can detect the drift instead of silently continuing with stale state. The three outputs are the standard lock pattern you'll see across the pack: character (the typed wire that only plugs into other Continuity Director nodes), character_json (plain text, your bridge to anything else), and character_hash (the fingerprint).
Feed character into CDManifestBuilder to make it part of the project manifest, and into CDShotLock so individual shots record which characters are in them. CDBatchDirector then carries that identity spec into every take it expands - which is where the consistency work actually pays off, because the prompt for take 12 and take 3 both derive from the same locked character.
Installing it
Same story for every node in this pack: no models, no keys, no Python dependencies - requirements.txt is literally just a comment saying so. In ComfyUI Manager search "Continuity Director", or:
cd ComfyUI/custom_nodes
git clone https://github.com/xinjian0101/continuity-director.git ComfyUI-ContinuityDirector
Restart ComfyUI; the nodes show up as CD · ... and there's a Continuity Director sidebar with an "Add starter chain" starter graph. Update with git pull.
The honest take
This is a governance node, not a magic wand. If you're generating one-off stills, a LoRA or an edit model is doing the real consistency work and you should read up on that (the modidex character-consistency essay is the right map). Where CDCharacterLock earns its place is the multi-shot pipeline: it makes the character spec explicit, identical across a batch, and hash-verified so nobody can claim the drift was intended. Pair it with a real identity tool for the pixels and this node for the discipline, and you've got the boring, reliable version of continuity that actually ships.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| character_id | STRING | character-001 | — |
| display_name | STRING | Lead | — |
| appearance | STRING | — | |
| wardrobe | STRING | — | |
| forbidden_changes | STRING | hair color, facial structure | — |
| reference_ids | STRING | — | |
| identity_seed | INT | 10–2147483647 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| character | CD_CHARACTER | — |
| character_json | STRING | — |
| character_hash | STRING | — |