Add a no-LoRA reference-image identity anchor to LTXDirector__koolook, the
way a WAN VACE reference works: attach reference image(s) and the model keeps
the character's face / mouth consistent even when keyframes show a closed (or
different) mouth than the audio-driven motion needs. Targets the mouth /
identity drift seen in the talking-goat lip-sync workflow.
Mechanism (Ghost Mask): the reference image(s) are appended as masked guide
frames *after* the clean video region, so the transformer attends to them for
identity but they never appear in the output; the trailing reference frames
are then sliced off the result.
- LTXDirector__koolook: new optional `reference_images` (IMAGE) +
`reference_strength` inputs, and appended `clean_latent_frames` /
`clean_pixel_frames` outputs. All additive/optional -> saved workflows
unaffected. Refs are appended AFTER snap/ease so they are never grid-snapped
or ease-expanded; the auto latent is grown to hold them. ltx_director.py is
under ruff's forks/ exclude.
- reference_ghost.py (new, Koolook-original, pure stdlib): trailing-reference
geometry (insert frames, grown latent length, slice bounds). Unit-tested.
- k_clean_latent_slice.py (new root node `CleanLatentSlice`): torch.narrow
slice to drop the trailing reference frames (start=0,
length=clean_latent_frames). torch imported lazily; clamp math unit-tested,
slice path tested when real torch is present (skips under the CI stub).
- Registered the node; added to sync_to_dev RUNTIME_PATHS.
- Attribution: the Ghost Mask APPROACH is adapted (idea only, reimplemented)
from CGlide/WhatDreamsCost-CSGlide (main_cs @ 21dd076, GPL-3.0, license
verified 2026-06-24, GPL->GPL OK). THIRD_PARTY.md, forks_manifest.yaml,
UPSTREAM_PIN.yaml, CHANGELOG updated.
Phase 1: Ghost Mask only. The LoRA-backed Licon MSR prefix mode and the
editor's character-slot UI are intentionally NOT ported.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>