Nodes/CMK Flow/CMK Diagnostic Concat
ComfyUI Node

CMK Diagnostic Concat

Thirty-two diagnostic feeds, one timeline you can actually read

By CMKFlow·Created 3 months ago·Updated 2 days ago· 6
CMK Diagnostic Concat
  • diagnostic_1
  • diagnostic_2
  • diagnostic_3
  • diagnostic_4
  • diagnostic_5
  • diagnostic_6
  • diagnostic_7
  • diagnostic_8
  • diagnostic_9
  • diagnostic_10
  • diagnostic_11
  • diagnostic_12
  • diagnostic_13
  • diagnostic_14
  • diagnostic_15
  • diagnostic_16
  • diagnostic_17
  • diagnostic_18
  • diagnostic_19
  • diagnostic_20
  • diagnostic_21
  • diagnostic_22
  • diagnostic_23
  • diagnostic_24
  • diagnostic_25
  • diagnostic_26
  • diagnostic_27
  • diagnostic_28
  • diagnostic_29
  • diagnostic_30
  • diagnostic_31
  • diagnostic_32
  • diagnostic

Most node packs have no idea what happened during a run. CMK Flow's nodes each emit a CMK_DIAGNOSTIC - a structured payload with a title, the node name, a mode, an ordered list of preview stages, a text summary, warnings and metrics. CMK Diagnostic Concat is the node that gathers thirty-two of those into one readable timeline.

What it is

A pure transport node in CMK/Toolbox/Diagnostics. It takes diagnostic_1 through diagnostic_32 - all optional, all typed CMK_DIAGNOSTIC - and emits a single diagnostic. That's the entire contract, and the source is unusually opinionated about it: "Concat is intentionally non-semantic: every input contributes all of its cards, unchanged and in connection order. Deciding which process is active or visually important belongs to the producer and renderer, never to this transport node."

That's the right design for this job, and it's why it works with a modular pipeline. Each CMK module knows what it did - ControlNet knows the model and the preprocessor and the source image, a face pass knows the detector and the crop - and this node doesn't second-guess any of it. The output goes into a visualizer or preview board, where you get one scrolling report of the run instead of twelve disconnected preview thumbnails.

How it works

Inputs are read in order, and unconnected ones are simply absent - optional inputs in ComfyUI aren't passed to the node at all when you leave them empty, so there's no null-checking theatre involved. Each payload is normalized defensively: the node accepts a direct diagnostic and also unwraps the occasional single-item tuple or dict wrapper the execution engine hands out, then validates the shape.

What comes out the other end preserves the whole structure. Every input keeps its own block, so a renderer can show process boundaries rather than flattening everything into one grid. Stages from all inputs concatenate in connection order. Warnings get prefixed with the originating source's title, so you can tell which module complained. The summary line builds a name chain for you:

Diagnostic Count: 7
Stage Count: 24
Sources: ControlNet Prepare → Smart Detailer → FaceProcess → Final Preview

Two small behaviours keep the timeline honest. An input that isn't a valid diagnostic is skipped rather than thrown, and it's reported by type - "expected CMK_DIAGNOSTIC, received str" - so a mis-wired string socket tells you what it was. And a nested concat with no real stages is dropped outright; the source comment says the point is not to turn a normalizer fallback into a meaningless black card in the middle of your timeline. Someone got annoyed by that once and fixed it.

Install

Ships with the pack. Manager: search CMK Flow, install the CMKFlow entry, restart. Manually, from the folder containing main.py:

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

Wait for CMK dependency check: OK before restarting - the helper installs requirements.txt into the Python environment ComfyUI is actually using, and a manual clone never does that on its own. Be aware that this is a heavy environment: ultralytics, onnxruntime, insightface, segment-anything, imageio-ffmpeg, opencv-python, nudenet==3.4.2. Installing it will do things to your shared environment.

Also switch on ComfyUI's Vue Nodes / Nodes 2.0 setting. CMK's dynamic nodes need it; without it you're on old LiteGraph rendering and the pack warns you at startup.

Issues worth knowing

This is CMK-specific plumbing: it only accepts CMK_DIAGNOSTIC, so it isn't a general-purpose "combine my reports" node. If you plug a STRING or a generic REPORT into it, you'll get a skipped input and a warning rather than a merged timeline.

There's no ordering widget. The order is the order you wired, which is fine - and it's also the reason a tidy source-to-sink wiring habit pays off here. If your timeline reads backwards, it's the wiring, not the node.

And there's no compression or de-duplication. Thirty-two diagnostics means thirty-two blocks and every preview image from each. If the visualizer feels sluggish, feed it fewer modules rather than assuming the concat is broken.

CategoryCMK/Toolbox/Diagnostics

Inputs (32)

NameTypeDefaultDescription
diagnostic_1optCMK_DIAGNOSTIC—
diagnostic_2optCMK_DIAGNOSTIC—
diagnostic_3optCMK_DIAGNOSTIC—
diagnostic_4optCMK_DIAGNOSTIC—
diagnostic_5optCMK_DIAGNOSTIC—
diagnostic_6optCMK_DIAGNOSTIC—
diagnostic_7optCMK_DIAGNOSTIC—
diagnostic_8optCMK_DIAGNOSTIC—
diagnostic_9optCMK_DIAGNOSTIC—
diagnostic_10optCMK_DIAGNOSTIC—
diagnostic_11optCMK_DIAGNOSTIC—
diagnostic_12optCMK_DIAGNOSTIC—
diagnostic_13optCMK_DIAGNOSTIC—
diagnostic_14optCMK_DIAGNOSTIC—
diagnostic_15optCMK_DIAGNOSTIC—
diagnostic_16optCMK_DIAGNOSTIC—
diagnostic_17optCMK_DIAGNOSTIC—
diagnostic_18optCMK_DIAGNOSTIC—
diagnostic_19optCMK_DIAGNOSTIC—
diagnostic_20optCMK_DIAGNOSTIC—
diagnostic_21optCMK_DIAGNOSTIC—
diagnostic_22optCMK_DIAGNOSTIC—
diagnostic_23optCMK_DIAGNOSTIC—
diagnostic_24optCMK_DIAGNOSTIC—
diagnostic_25optCMK_DIAGNOSTIC—
diagnostic_26optCMK_DIAGNOSTIC—
diagnostic_27optCMK_DIAGNOSTIC—
diagnostic_28optCMK_DIAGNOSTIC—
diagnostic_29optCMK_DIAGNOSTIC—
diagnostic_30optCMK_DIAGNOSTIC—
diagnostic_31optCMK_DIAGNOSTIC—
diagnostic_32optCMK_DIAGNOSTIC—

Outputs (1)

NameTypeDescription
diagnosticCMK_DIAGNOSTIC—