MiniMax H3 Chain De-Rope Freeze Mask
Stop pass 2 from re-texturing the frames you already locked down
- state
- mask
- dilated_length
- status
MiniMax H3 Chain De-Rope Freeze Mask is the partner to Chain De-Rope Guard, and it answers a subtle question: once the Guard has told Time Smear which frames not to retime, how does pass 2 know which pixels it's allowed to re-texture? The Guard protects the timing; this node builds the time-varying mask that protects the texture.
The scenario: a Drift-Control continuation prefix (the frames carried over from the previous scene) gets protected from retiming by the Guard - rate 1 in the hold map means "do not stretch these frames." But the actual pass-2 sampling still runs over the whole scene, and if the sampler re-denoises those protected prefix frames, it re-textures them anyway. You'd get a prefix whose timing survived but whose content got rewritten - a new continuity break, caused by the fix for continuity. Freeze Mask closes that loop.
How it works
It consumes the current Upscale state (which carries the exact RAW/delivered prefix contract) and hold_map_used - the final hold map emitted by H3 Time Smear, including its end expansion and legal-grid padding. From that it derives a time-varying regenerate mask: zero over the continuation prefix (freeze it), one over the material pass 2 may refine. You feed that mask to MAINodes H3 V2V Init and enable its time_varying option.
Why "time-varying"? Because the mask changes over the clip's timeline - the prefix region is frozen early and the mask opens up for the genuinely new material. A static mask would either freeze too much or let the sampler rewrite the prefix. The dilated_length output gives you the exact dilated frame count encoded by hold_map_used, which is your cross-check that the mask and the Time Smear clock agree.
The three outputs are mask (connect to H3 V2V Init), dilated_length, and status (prefix-freeze and dilated-clock summary).
Where it sits
In the bundled de-rope workflow it comes right after Time Smear:
H3 Jerk Oracle → Chain De-Rope Guard → H3 Time Smear → Chain De-Rope Freeze Mask
↓
H3 V2V Init (mask input, time_varying on)
It's used in concert with Guard - Guard handles the hold map and expand_to_end; Freeze Mask turns the resulting clock into a sampling mask. They're two halves of one protection: one for time, one for pixels.
Installing it
Part of ComfyUI-MiniMaxH3-Contex-Loop (ComfyUI Manager: "MiniMax H3 Contex Loop"), or:
cd ComfyUI/custom_nodes && git clone https://github.com/ethanfel/ComfyUI-MiniMaxH3-Contex-Loop.git
Restart ComfyUI. Like the other de-rope nodes it wraps MAINodes, so install ComfyUI-MAINodes (matlowai) for H3 Time Smear and H3 V2V Init. Standing requirements: H3 weights, current ComfyUI with native Add Guide (PR #15439).
Common issues
The two things that break it: feeding Time Smear's input hold map instead of its hold_map_used output (you need the final map with end expansion and padding baked in - the padding is exactly what makes the dilated clock legal), and forgetting to enable time_varying on H3 V2V Init, which silently turns the freeze into a static mask. If the prefix still gets re-textured, check both.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| state | H3_CHAIN_UPSCALE_STATE | Current Upscale state carrying the exact RAW/delivered prefix contract. | |
| hold_map_used | STRING | Final hold_map_used emitted by H3 Time Smear. It includes end expansion and legal padding. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| mask | MASK | Time-varying regenerate mask for H3 V2V Init: zero over the continuation prefix and one over material pass 2 may refine. |
| dilated_length | INT | Exact dilated frame length encoded by hold_map_used. |
| status | STRING | Prefix-freeze and dilated-clock summary. |