Pass / Fail Route
Routing yes, saving you GPU time, no
- image
- PASS_IMAGE
- FAIL_IMAGE
- passed
This is the node where reading the description first saves you an evening. The author wrote it in bold, in the node itself and again in the README: this is not true lazy or conditional execution. Nodes wired to the unused output can still run.
So what is it? A splitter. One IMAGE in, and it decides which of two IMAGE outputs is the real picture and which is a black rectangle, based on a score against a threshold.
The mechanism, precisely
passed is score >= threshold. Then:
- passed →
PASS_IMAGEis your image,FAIL_IMAGEistorch.zeros_like(image) - failed →
PASS_IMAGEis the zero tensor,FAIL_IMAGEis your image passed(BOOLEAN) comes out either way
Both outputs always exist, always with the same shape as the input. This is worth internalizing, because it means the "empty" branch isn't empty - it's a correctly-sized all-black image. Wire a SaveImage to FAIL_IMAGE and you will not get a skipped save; you will get a saved black PNG. People frame it as a routing node and then get surprised by exactly this.
Inputs and outputs
image(IMAGE) - what you're routing.score(FLOAT, default 0, range -1 to 2, step 0.001) - the metric.threshold(FLOAT, default 0.6, range -1 to 2, step 0.01) - the line.- PASS_IMAGE / FAIL_IMAGE (IMAGE), passed (BOOLEAN).
What it's actually good for
Sorting a batch into folders. Two save nodes with different filename_prefix values - keepers/run and rejects/run - and you wake up to a sorted directory. The black-image side is a real cost here (you're writing black PNGs into the reject folder), but on the accept side it's exactly what you want.
A visible QC signal in the graph. Watching PASS_IMAGE in a preview node tells you the gate fired as you debug a threshold.
Feeding a downstream consumer that needs an image either way. If the next node must receive something, this always provides something.
What it is not good for
Skipping work. If your reject branch contains an upscaler or a second sampling pass, that work happens regardless. This is the same limitation every "cheap routing" node has, and it's the reason the community keeps reaching for a different tool: asked how to branch a workflow, the standard answer is KJNodes' LazySwitch, precisely because it defers evaluation of the branch you didn't pick. ComfyUI's execution model caches backwards from output nodes and runs everything it thinks it needs - a boolean is not a control-flow statement.
If your goal is "don't spend four minutes upscaling images that failed QC," wire passed into a lazy switch and keep this node purely as the image splitter.
Install
Manager → search Orel's Nodes → Install → restart → hard-refresh the browser.
cd ComfyUI/custom_nodes
git clone https://github.com/DarkOrel/Orels-Nodes.git orels-nodes
python -m pip install -r orels-nodes/requirements.txt
Restart, hard-refresh. No optional dependencies needed - it uses torch, which ComfyUI already has. The requirements.txt install is for the pack's Hugging Face download features; skip it and this node is unaffected.
Gotchas
The idle output is black, not None. Already said, but it's the one that catches everyone. Side effects from downstream nodes still happen.
No batching, no per-image loop. First item of the IMAGE batch is what the routing decision effectively applies to; a batch is passed through as a batch. If you're running eight images with one score, they all go the same way.
Not downstream of the similarity node by default. The obvious wiring is Multi Reference Face Similarity → average_score into score, threshold matched on both nodes. If you set 0.6 on one and 0.55 on the other, the verdict string in your log and the folder the image landed in will disagree - and that's a genuinely annoying bug to chase.
Threshold lives in two places. Face QC has a threshold, the similarity node has a threshold, this node has a threshold. Pick one source and wire it to the others, or you'll be editing three widgets every time you tune.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| score | FLOAT | 0.000-1–2 | — |
| threshold | FLOAT | 0.60-1–2 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| PASS_IMAGE | IMAGE | — |
| FAIL_IMAGE | IMAGE | — |
| passed | BOOLEAN | — |