Sigma Segment (gte)
Stop slicing schedules relative to the last cut
- sigmas
- sigmas
- start_sigma
- end_sigma
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_stepdefaults 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_sigmawhen 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 indocs/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.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| sigmas | SIGMAS | — | |
| start_step | INT | 00–10000 | — |
| end_step | INT | 40–10000 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| sigmas | SIGMAS | The slice of the schedule this stage samples. |
| start_sigma | FLOAT | The noise level this stage STARTS at — informational, so an abstract step number becomes a concrete amount of noise on the canvas. |
| end_sigma | FLOAT | The 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. |