Nodes/ComfyUI-GTE/Sigma Segment (gte)
ComfyUI Node

Sigma Segment (gte)

Stop slicing schedules relative to the last cut

By mgkgng·Created 2 days ago·Updated 2 days ago· 4
Sigma Segment (gte)
  • sigmas
  • sigmas
  • start_sigma
  • end_sigma
start_step0
end_step4

Core's SplitSigmas cuts a schedule in two. Chain it - 0→4, then 4→9, then 9→20 - and each stage cuts the leftover of the previous one, so the numbers you type stop being the numbers you get. Splitting a 20-step schedule at 4 and then wanting absolute step 9 means asking for relative index 5. That off-by-N is invisible until an image comes out slightly soft and you spend an evening wondering why.

Sigma Segment takes the other approach: build the full schedule once and let every stage name absolute steps against it.

sigmas[start_step : end_step + 1]

The +1 is the load-bearing part. Adjacent segments share their boundary sigma - 0→4 ends on exactly the sigma 4→9 starts on - which is what makes the hand-off seamless. The next stage isn't just given its itinerary, it's told the noise level it's resuming at. A segment holds end_step - start_step steps.

Why you'd reach for it

Because the noise left at a step is what your branching decision actually depends on, and a step number alone doesn't tell you that. The same "step 5" is 2% noise under karras and 37% under simple on an 8-step flow schedule. Segment gives you the real sigma at both ends of the range, so an abstract index becomes a concrete amount of noise on the canvas.

This is the schedule-slicing half of the pack's staged workflow (Seed Range Noise → Segment → sampler → Stamp Step → Noise Rotate → Candidate Select). If you're not staged-sampling, you don't need it.

Inputs and outputs

Three inputs, all required:

  • sigmas (SIGMAS) - the full schedule, straight off the scheduler. Not a previous segment.
  • start_step - where this stage begins. Wire it from Resume Step, not from a hand-typed number; then it reads the latent rather than the wiring.
  • end_step - where it stops. Default 4, while start_step defaults 0.

Three outputs:

  • sigmas → the sampler's sigmas input.
  • start_sigma - the sigma this stage starts at. Informational, mostly. It's the number to wire into Noise Rotate's current_sigma when you want to branch at this boundary.
  • end_sigma - the sigma the stage's output latent stops at. Wire it into Stamp Step's sigma, and the latent carries its own noise level forward with nothing else wired. A step number is not enough for that job; the same step is different noise on different schedulers, which is the recurring theme in docs/knowledge/concepts.md.

Bad ranges raise instead of clamping, on purpose. A silently clamped range gives you a plausible image from the wrong part of the trajectory, and you'll never notice. The errors name the problem: end_step before start_step ("did the two get swapped?"), both equal (a one-sigma segment does zero sampling steps), or past the end of the schedule - that last one tells you how many steps the schedule really has and suggests raising the scheduler's step count. So if you see a red node, read the message; it's the fix.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/mgkgng/ComfyUI-GTE

Restart. [gte] loaded 8 node(s) in the console means it loaded. No Python dependencies (the pack's requirements file is empty by design), no model files. Manager search: ComfyUI-GTE, display name "Generative Trajectory Explorer".

Common issues

"end_step is past the end of this schedule." You're asking for step 20 on a 20-step schedule, where the highest addressable index is 20 only if the scheduler emitted 21 sigmas (N steps = N+1 sigmas, the terminal zero included). Short version: your total-steps widget is lower than the checkpoint you typed, or you're slicing a segment that's already been sliced. Feed this node the scheduler output, not another Segment.

Only euler (or heun/ddim). Splitting a trajectory only works for samplers whose next step depends on (x, sigma) alone. dpmpp_2m carries derivative history and degrades; dpmpp_2m_sde injects its own noise and breaks outright. Nothing will error - the images just quietly stop being what you asked for.

Don't wire start_sigma from the segment that already ran. That's the previous boundary, and Noise Rotate prints a warning when it sees sigma ≈ 1.0 because the reconstruction then keeps no signal at all. end_sigma of the stage that produced the latent, start_sigma of the stage about to run.

Node IDs are GTE_-prefixed, and that's load-bearing. If you have graphs saved against an earlier build of these nodes under a different prefix, the nodes won't resolve - open the graph and re-add them. It's a new pack; the first commit is September 2026.

Categorygte/sampling

Inputs (3)

NameTypeDefaultDescription
sigmasSIGMAS
start_stepINT00–10000
end_stepINT40–10000

Outputs (3)

NameTypeDescription
sigmasSIGMASThe slice of the schedule this stage samples.
start_sigmaFLOATThe noise level this stage STARTS at — informational, so an abstract step number becomes a concrete amount of noise on the canvas.
end_sigmaFLOATThe noise level this stage ENDS at, which is where its output latent will be sitting. Wire it into Stamp Step so the latent carries its own noise level onward: a latent is meaningless without its sigma, and the next stage's Noise Rotate needs that number to vary it correctly.