Record what four "head swap does not work" reports actually were
Browse filesNone of them was broken code. A missing frame sequence, a weak citation, a
self-inflicted contradiction, and a conditioning imbalance -- and three of
the four were legible in the log before anything was changed.
The one that mattered was found by the user, not me: the failed run had a
clip caption and the successful one did not. "A man wearing an orange tank
top" reaches the encoder as what <Video 1> IS, and contradicts a beat asking
for somebody else, additively, at cfg 1.0. SWAP's own Describe button wrote
it because the caption prompt asked for "who is in it".
Also records the finding that is not a bug and outlives the rest:
reference_video_size is an influence dial. Core aligns reference frame N with
output frame N, so a clip competes with the identity stills for the same face
wherever it shows one clearly, and at MAX it wins. That is why the swap
arrived four seconds in -- exactly when steam covered the original face.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RVz8qNGn2NhrP3KG2Lh5yT
- docs/DEVLOG.md +70 -0
|
@@ -3618,3 +3618,73 @@ The audit's own framing is worth keeping: **a fixture that does not resemble pro
|
|
| 3618 |
not a test**, and the resemblance decays silently every time a feature lands next to an
|
| 3619 |
older checker. Twenty-two green checks were true and four of them were not measuring what
|
| 3620 |
their names claimed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3618 |
not a test**, and the resemblance decays silently every time a feature lands next to an
|
| 3619 |
older checker. Twenty-two green checks were true and four of them were not measuring what
|
| 3620 |
their names claimed.
|
| 3621 |
+
|
| 3622 |
+
## 69. The caption was describing the person it replaced (2026-09-06)
|
| 3623 |
+
|
| 3624 |
+
SWAP shipped in 2.0.0 as a standalone implant: a fifth tab that writes one hop from a
|
| 3625 |
+
reference clip and an identity still, and never touches `ref_plan`. Stages 1 to 3 passed
|
| 3626 |
+
their GPU gate and merged. This is what stage 4 -- the swap modes -- cost to get right, and
|
| 3627 |
+
none of it was in the code.
|
| 3628 |
+
|
| 3629 |
+
**A `headswap` checkbox cannot work here.** The contributed fork had one, and unticking it
|
| 3630 |
+
only omitted a line from the instruct. That does nothing: sampling runs at cfg 1.0 with no
|
| 3631 |
+
negative branch, the identity photograph is in front of the encoder either way, and silence
|
| 3632 |
+
about identity lets it govern the whole subject. What is excluded has to be SAID.
|
| 3633 |
+
|
| 3634 |
+
The taxonomy came from PromptMasterLD, whose edit laws separate a subject replace from a
|
| 3635 |
+
head swap -- *"THE BODY STAYS WITH THE PLATE"*, then build, hands, posture, every garment --
|
| 3636 |
+
and from a features-only face swap. Four named modes, each stating what STAYS. Technique,
|
| 3637 |
+
not code.
|
| 3638 |
+
|
| 3639 |
+
**Then three renders that all looked like "head swap does not work", and were three
|
| 3640 |
+
different things.**
|
| 3641 |
+
|
| 3642 |
+
The first was a description of a pose. SWAP was sent ONE frame, so a vision model looking at
|
| 3643 |
+
a still of somebody with their hands on a bed wrote exactly that, while the instruct told it
|
| 3644 |
+
"the action, place and motion follow the clip" -- asking it to describe something it had
|
| 3645 |
+
never been shown. Three frames now, evenly spaced across the trimmed window and captioned in
|
| 3646 |
+
time order. That is also what "video vision" is in practice: the VLMs advertising it sample
|
| 3647 |
+
frames and present them ordered. Saying the order out loud is what turns three pictures into
|
| 3648 |
+
a movement. The next caption read *"clenching their fists as white steam begins to rise...
|
| 3649 |
+
posture intensifies... vapor swirls more aggressively"*.
|
| 3650 |
+
|
| 3651 |
+
The second was the beat naming the identity once, in a subordinate clause -- *"the person
|
| 3652 |
+
with the head of @ref_1"* -- against a clip carrying 192 frames of conditioning. One
|
| 3653 |
+
photograph, added rather than weighed. The mode rules now specify the construction: the
|
| 3654 |
+
pack's own idiom first, attached to the subject, then a second sentence saying what stays.
|
| 3655 |
+
|
| 3656 |
+
**The third was the one that mattered, and the user found it, not me.** The failed run had a
|
| 3657 |
+
clip description and the successful one did not:
|
| 3658 |
+
|
| 3659 |
+
successful: a reference clip is wired but has no description
|
| 3660 |
+
failed: <Video 1> is a reference clip: A man wearing an orange tank
|
| 3661 |
+
top stands in a dimly lit room...
|
| 3662 |
+
|
| 3663 |
+
That caption reaches the encoder as what `<Video 1>` IS. "A man wearing an orange tank top"
|
| 3664 |
+
asserts the subject's sex, build and clothing, additively, against a beat asking for
|
| 3665 |
+
somebody else. Not a weak signal losing a contest -- a flat contradiction. And SWAP's own
|
| 3666 |
+
Describe button wrote it, because `_DESCRIBE_SYSTEM` asked for *"who is in it"*.
|
| 3667 |
+
|
| 3668 |
+
The clip is a MOTION AND PLACE plate. Identity comes from the stills. The caption now
|
| 3669 |
+
describes the action, the movement, the setting and the light, and is told not to describe
|
| 3670 |
+
the person at all. Because that is an instruction to an LLM rather than a guarantee, the
|
| 3671 |
+
caption is screened for words that describe a person and the tab says which ones it found --
|
| 3672 |
+
a warning, never a rejection, since "a man" is a fine caption for a crowd.
|
| 3673 |
+
|
| 3674 |
+
**And a fourth thing, which is not a bug and is worth more than the rest.** With all of that
|
| 3675 |
+
fixed the swap still only took hold four seconds into an eight second hop. Core truncates a
|
| 3676 |
+
reference clip to `frames[:frame_count]`, so reference frame N conditions output frame N --
|
| 3677 |
+
the clip is temporally aligned with the output, and wherever it shows a clear face it
|
| 3678 |
+
competes with the identity stills for that same face. Decode area sets token count, token
|
| 3679 |
+
count is how loud the clip is, and at MAX it wins until the clip's own face is obscured. The
|
| 3680 |
+
swap arrived exactly when the steam covered him.
|
| 3681 |
+
|
| 3682 |
+
0.3 MP fixed it. `reference_video_size` was documented purely as a memory and detail budget,
|
| 3683 |
+
which is true and is not the half a user needs when an identity swap half works. It is an
|
| 3684 |
+
INFLUENCE dial and now says so.
|
| 3685 |
+
|
| 3686 |
+
What this section is really about: four consecutive reports of "head swap does not work"
|
| 3687 |
+
that were a missing frame sequence, a weak citation, a self-inflicted contradiction and a
|
| 3688 |
+
conditioning imbalance. Nothing in the code was broken. Every one of them was legible from
|
| 3689 |
+
the log -- the caption line, the beat, the frame count -- and three of the four were found by
|
| 3690 |
+
reading it rather than by changing anything.
|