Nodes/Polyhedron Suite/⬡ Polyhedron MiniMax Second Pass Hold
ComfyUI Node

⬡ Polyhedron MiniMax Second Pass Hold

Keeping the join intact when you upscale a continued scene

By PolyhedronAI·Created 5 months ago·Updated a day ago· 7
⬡ Polyhedron MiniMax Second Pass Hold
  • latent
  • vae
  • tail
  • clip_latent
  • latent
  • sigmas
  • info
◄context_frames22►
◄release_frames16►
◄freeze_audiotrue►
◄sigmas0.50, 0.30, 0.14, 0.06, 0►

Here's a failure that costs an evening if you don't see it coming. You continued a scene with MiniMax Continue, held the head so the join was seamless, then upscaled the latent and ran a second pass. And the join got worse. Not broken, just… softer, a little off, as if the two scenes had been introduced at a party.

⬡ Polyhedron MiniMax Second Pass Hold exists for that gap. It sits between H3 Latent Upscale and the second sampler and does three things: puts the end of the scene before back at full size at the start of the lifted latent, holds it and releases it toward the join; freezes the first pass's sound so the second pass doesn't get opinions about it; and hands you a schedule for the short second sample.

Why the hold needs redoing at all

Continue's hold copied clip n's ending into the first pass's latent, at the first pass's resolution. H3 Latent Upscale then lifts that latent to a bigger canvas - and the copied rows come along as upscaled latent, which is not the same thing as the previous scene's ending. The second sampler, running at 0.2-ish denoise, will happily smooth over the discrepancy.

So this node re-establishes the hold at the new size. context_frames (22 default, 5–362, snapped down to H3's 5/22/39… grid) should be the same value you gave Continue - that's the whole point, the same window of the scene before. release_frames (16 default, 0–64) is how many of the held frames get released back into the new picture, counted back from the join, rounded to whole tokens of 1 or 4 frames with info reporting what it came to. 0 holds hard right up to the join.

freeze_audio (on by default) holds the first pass's entire sound stream exactly as it is. Turn it off if you want the second pass to re-touch the audio - usually you don't, since there's nothing to gain from re-sampling a soundtrack you already liked.

Feeding it the scene before

Two interchangeable ways, and the difference is a VAE round trip:

  • vae + tail - the previous scene's last frames as the film actually shows them, at any size; they're resized to the lifted latent. From the Cine Timeline's tail output.
  • clip_latent - the previous scene's final latent, stored after its second pass. Same size as this latent, needs no VAE. Cheaper and sharper, but only valid if that scene already went through its own second pass.

latent in is the lifted latent from H3 Latent Upscale. Outputs are latent (into the second sampler), sigmas, and info.

The schedule

sigmas defaults to 0.50, 0.30, 0.14, 0.06, 0 - four steps ending at zero, the preset the author credits to Easy Media's second-pass-with-a-held-join recipe. Wire it into the second sampler's sigmas input and you're done. Don't wire it and your own schedule stays, which is the polite behaviour.

The full chain, for the record:

Continue (hold) → Sampler 1 → H3 Latent Upscale → Second Pass Hold → Sampler 2
                                       │                  │
                                       └──────────────────┴→ VAE Decode → Save

Note what changed versus a single-pass upscale: the second pass now has both a resolution jump and a held head to respect, which is why it gets its own node rather than a denoise value on the sampler.

Install

Manager → "Polyhedron Suite", or:

cd ComfyUI/custom_nodes
git clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git
# restart ComfyUI

No required dependencies - none, per the pack's requirements.txt. You need the H3 latent upscaler weight file in models/latent_upscale_models for the step before this one, and Core master (0.37+) if you're continuing scenes at all, since Continue needs it.

Where it goes wrong

context_frames doesn't match Continue's. The most common mistake, and it's silent: you hold 22 frames at the start of a scene whose head was only 5, and the extra held rows just constrain picture that had no reason to be constrained. Match the number.

clip_latent from a first-pass scene. If the stored latent is pre-upscale, it's the wrong size and the hold won't line up. Feed the final latent or use tail.

No vae with tail. The frames have to be encoded at the lifted size; without a VAE there's nothing to encode them with.

Second pass at first-pass denoise. This is a second pass on an already-decided picture. Anything much above 0.3 and you're re-imagining the clip - with a held head arguing against you. Keep it low; the preset schedule is already the right neighbourhood.

CategoryPolyhedron/Cine

Inputs (8)

NameTypeDefaultDescription
latentLATENTThe LIFTED H3 AV latent (H3 Latent Upscale's latent) -- the second pass's input. Wire the output into the second sampler.
context_framesINT225–362How much of the scene before is held at the start, in frames -- the same as MiniMax Continue's context_frames (snapped down to 5, 22, 39 ...).
release_framesINT160–64Over how many of the held frames the picture is released again, counted back from the join (rounded to whole tokens -- 1 or 4 frames each; the info says what it came to). 0 = held hard up to the join.
freeze_audioBOOLEANtrueKeep the first pass's sound exactly as it is (its whole stream held). Off: the second pass may rework the sound too.
sigmasSTRING0.50, 0.30, 0.14, 0.06, 0The schedule given out at `sigmas` for a second pass with a held join (Easy Media's preset). Use it by wiring the output into the second sampler; your own schedule stays if you don't.
vaeoptVAEVideo VAE -- encodes `tail` at the lifted size.
tailoptIMAGEThe scene before's last frames as the film shows them (Cine Timeline `tail`) -- any size, resized to the lifted latent.
clip_latentoptLATENTOr the scene before's FINAL latent (Clip Chain Source clip_latent, stored after ITS second pass) -- same size as this latent, no VAE.

Outputs (3)

NameTypeDescription
latentLATENT—
sigmasSIGMAS—
infoSTRING—