Swan Sigmas Split: Low Runs to Zero
Split One Noise Schedule Into Two, and Make the First Half Actually Finish
- sigmas
- low_sigmas
- high_sigmas
Every two-stage workflow in ComfyUI - hi-res fix, whatever Res4Lyf-flavoured progressive thing you copied off Discord - needs the same piece of plumbing: one noise schedule, cut in half, so sampler one gets the cheap steps and sampler two gets the expensive ones. This node is that cut, with one deliberate twist that the name is telling you about.
Low Runs to Zero. The low-res half ends at sigma 0.
Why you'd want the low stage to finish
Normal hi-res fix doesn't let the first pass finish. It stops denoising partway, upscales a half-noised latent, and hands that fog directly to the second sampler. For image work that's fine - it's even an advantage, because the leftover noise gives the second pass something to reinterpret.
The transition nodes in this pack don't want that. Swan H3 Transition Lift upscales a clean latent and then lets the next sampler re-noise it, because the thing it's doing - comparing a learned latent lift against a VAE pixel-space lift to find artifact risk - only makes sense on a fully denoised endpoint. It needs x0. A half-noised latent gives it nothing to compare and a pile of noise to upscale.
So this node appends a zero to the low schedule:
low_sigmas = [s0, s1, ... sk, 0] -> low-res SamplerCustom, add_noise = True
high_sigmas = [sk, ... 0] -> high-res SamplerCustom, add_noise = True
The cost is one extra denoiser evaluation - you go from N steps to N+1, because that final low-res interval has to actually run to complete the picture. That's the entire trade: one NFE for a clean handoff.
The two inputs
sigmas comes from anything that outputs a schedule - stock BasicScheduler, a manual sigma editor, a distilled-model preset. The node is agnostic; it just slices. It needs a 1D schedule with at least three intervals, so don't feed it something degenerate or a two-point linear ramp.
low_steps (default 5) is how many denoiser evaluations run at low resolution. The high stage gets everything left over. Two rules, both enforced with a readable error: at least one step here, and at least one interval left for the high stage. A 20-sigma schedule has 19 intervals, so low_steps can be 1 through 18. Push it past that and you'll get told the schedule doesn't have the intervals for it rather than a silent no-op.
For H3 specifically, the low-res stage is the one you can afford to be generous with, since it's a fraction of the pixel count. Five to eight is a sane starting range; there's no reason to make the cheap half a sketch.
Outputs and wiring
Both outputs are SIGMAS. low_sigmas goes into the first SamplerCustom, high_sigmas into the second, and both samplers want add_noise = True - the second one especially, since the lift hands it a clean latent and the sampler is the thing putting the split sigma's worth of noise back on. Wire it with add_noise off and the sampler will assume noise that isn't there. The reference graph from the pack:
BasicScheduler -> SWAN_SigmasLowZero
low_sigmas -> SamplerCustom #1 (low res latent, add_noise=True)
-> Swan H3 Transition Lift
high_sigmas -> SamplerCustom #2 (target res, add_noise=True)
One thing worth internalising: this node doesn't generate anything and doesn't own the resolution change. It only decides where the seam is. Everything about how the image grows happens in the lift node between your two samplers.
Install
Same pack, so if you already run any Swan node you have it:
cd ComfyUI/custom_nodes
git clone https://github.com/swan7-py/ComfyUI_Swan_Bits
# restart ComfyUI
Manager users: search Swan_Bits. No dependencies to resolve - the pack has no requirements file and needs nothing beyond torch, einops and ComfyUI. You'll find this one under SwanBits/H3, alongside the pack's audio nodes, which are unrelated to this workflow.
Gotchas
The schedule you feed in has to be the whole schedule. People reasonably assume you give it the low half and it gives back the high half; you don't, it does the cut. Feed a schedule that's already been truncated and you'll get an odd second stage that starts from a later sigma than you intended.
Flow-matching models do not want aggressive scheduler reshapes, so pick your schedule before you split it - Karras and exponential are the habitual choices that don't travel. And if the second sampler's output looks washed out or smeared, check add_noise before you check anything else. That one flag is the difference between the high stage re-noising your lifted clean latent and treating it as if it were already noisy.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| sigmas | SIGMAS | — | |
| low_steps | INT | 51–10000 | Denoiser evaluations executed at low resolution. The high stage receives the remaining intervals. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| low_sigmas | SIGMAS | — |
| high_sigmas | SIGMAS | — |