Nodes/CMK Flow/CMK Result Unpack -Pipe-
ComfyUI Node

CMK Result Unpack -Pipe-

Unpacking a CMK result without quietly mixing two model families

By CMKFlow·Created 3 months ago·Updated a day ago· 6
CMK Result Unpack -Pipe-
  • MODEL (opt)
  • PROCESS
  • IMAGE
  • LOG
  • MODEL
  • PROCESS
  • IMAGE
  • LOG

CMK Result Unpack -Pipe- is the twin of CMK Result Pack -Pipe-: pack turns four wires into the neutral CMK_RESULT_* sockets, unpack turns them back into a MODEL, a PROCESS, an IMAGE and a LOG that plain CMK modules can consume. Inside CMK Flow it's the node that sits right before the Visualizer.

What it's really checking

Superficially it's a pass-through with a type name change - CMK_PIPE comes out of the PROCESS socket instead of CMK_RESULT_PROCESS, and MODEL reverts to CMK_MODEL_PIPE. The value is in the validation, which is where a lot of "why is my face pass running on the wrong branch" bugs get caught before they cost you a render.

  • PROCESS must be a dict, and it has to be a complete path: SDXL, Z-Image Turbo, the output of the PostProcess Boundary, or a complete CMK image-input path. Anything partial is refused.
  • IMAGE must be non-None and LOG must be a dict. No silent empties.
  • If a MODEL is supplied, its family has to match the process family - with two named exceptions. A post-process model (model_role: postprocess) is legitimate for a family-neutral process, and the pure pixel path that starts at CMK Image Load and Resize -Pipe- or CMK Swap Image Loader -Pipe- carries source_model_family: image and needs no diffusion model at all.
  • A process whose family_active is False is rejected outright, which is the check that stops the inactive parallel family's branch being quietly resolved.

The output PROCESS is re-stamped as result_contract: family_neutral with source_model_family preserved, so anything downstream of it knows the generation provenance independently of which model is currently loaded. If the incoming process is CMK_MASK_DETAILER_PROCESS, that's handled as its own case and MODEL becomes mandatory - the interactive mask detailer is the terminal editing step and needs its own model.

Inputs and outputs

All four inputs are optional sockets: MODEL (opt), PROCESS, IMAGE, LOG. In practice PROCESS, IMAGE and LOG are mandatory - you'll just find out at execution instead of in the editor. Outputs mirror them as MODEL, PROCESS, IMAGE, LOG under the normal CMK types.

Like the rest of the boundary family this node is DEV_ONLY, so it doesn't appear in the everyday node search. It lives in saved workflows and in the subgraph internals; find it by opening a shipped CMK workflow rather than by searching an empty canvas.

Installing

cd ComfyUI/custom_nodes
git clone https://github.com/CMKFlow/cmk_nodes.git cmk_nodes
python3 cmk_nodes/scripts/install_cmk_requirements.py

Or via ComfyUI Manager - search CMK Flow. Restart after installing, and turn on Vue Nodes / Nodes 2.0, which CMK requires for its dropdowns and node sizing to behave. Weights aren't in the pip package; run scripts/check_cmk_resources.py if a workflow complains about a missing model.

When it errors, it errors honestly

The messages here read like a developer wrote them for a reason - "received MODEL and PROCESS from different families", "received the inactive family path". Both mean the same thing in practice: something upstream is still wired to the branch you didn't select in 01 START HERE. Don't paper over it by unplugging the model. Trace back to the family gate and fix the wiring; otherwise the family-neutral result you hand to FaceSwap or the upscaler is assembled from whichever branch happened to execute first.

CategoryCMK/Internal/Result

Inputs (4)

NameTypeDefaultDescription
MODEL (opt)opt*—
PROCESSopt*—
IMAGEopt*—
LOGopt*—

Outputs (4)

NameTypeDescription
MODELCMK_MODEL_PIPE—
PROCESSCMK_PIPE—
IMAGEIMAGE—
LOGCMK_LOG_PIPE—