CMK Result Unpack -Pipe-
Unpacking a CMK result without quietly mixing two model families
- 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.
PROCESSmust 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.IMAGEmust be non-NoneandLOGmust be a dict. No silent empties.- If a
MODELis 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 atCMK Image Load and Resize -Pipe-orCMK Swap Image Loader -Pipe-carriessource_model_family: imageand needs no diffusion model at all. - A process whose
family_activeisFalseis 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.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| MODEL (opt)opt | * | — | |
| PROCESSopt | * | — | |
| IMAGEopt | * | — | |
| LOGopt | * | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| MODEL | CMK_MODEL_PIPE | — |
| PROCESS | CMK_PIPE | — |
| IMAGE | IMAGE | — |
| LOG | CMK_LOG_PIPE | — |