h4 : Debug-a-Tron-3000 Router (v2.1.0)
The Debug-a-Tron Router
- model_in_a
- clip_in_a
- clip_vision_in_a
- vae_in_a
- conditioning_in_a
- conditioning_positive_in_a
- conditioning_negative_in_a
- latent_in_a
- image_in_a
- mask_in_a
- model_in_b
- clip_in_b
- clip_vision_in_b
- vae_in_b
- conditioning_in_b
- conditioning_positive_in_b
- conditioning_negative_in_b
- latent_in_b
- image_in_b
- mask_in_b
- Branch A · Model
- Branch A · CLIP
- Branch A · CLIP_Vision
- Branch A · VAE
- Branch A · Conditioning
- Branch A · Positive
- Branch A · Negative
- Branch A · Latent
- Branch A · Image
- Branch A · Mask
- Branch B · Model
- Branch B · CLIP
- Branch B · CLIP_Vision
- Branch B · VAE
- Branch B · Conditioning
- Branch B · Positive
- Branch B · Negative
- Branch B · Latent
- Branch B · Image
- Branch B · Mask
Once you graduate to two-pass workflows - a base diffuser and a refiner, or an image track and a text track running side by side - debugging gets awkward. Do you drop two Debug-a-Trons in and compare logs manually? The Router is the pack's answer: it's the Debug-a-Tron feature set with every slot duplicated for Branch A and Branch B, so both lanes pass through one node and one log stream, with per-branch reporting built in.
Given the README's framing around "dual-branch graphs (diffuser vs. refiner)" this is squarely aimed at people doing high-res fix or refinement splits - exactly the workflows where comparing branch state matters. It shares the h4 ToolKit's profile: small, shelved, zero community footprint, but well-documented by its author.
How it works
Every slot the base Debug-a-Tron has, the Router has twice, suffixed _a and _b: model_in_a/model_in_b, conditioning_positive_in_a/_b, latent_in_a/_b, and so on through the whole ten-slot catalogue. The outputs mirror that - ten Branch A sockets and ten Branch B sockets.
The genuinely useful part is the branch intelligence:
- Per-branch summaries - the console report aggregates connection counts per branch and tells you what's missing, e.g. "Branch A: 8/10 connected; missing → Branch A · CLIP."
- Targeted VAE fallback - each branch's VAE inlet falls back to its own branch's model, not the other lane's.
- Passthrough by default -
modedefaults topassthrough(notmonitor), so both branches keep flowing during live runs without extra configuration. Branch-parity is the assumed state. - Branch-aware diagnostics - latent snapshots, preview filenames, anomaly messages, and conditioning warnings all carry the branch label, so a "NaN at step 12" message tells you which lane it happened in.
All the GO PLUS ULTRA controls from the base node are here too: snapshots, anomaly checks, JSON logs, model fingerprinting, watch expressions. They apply per branch, and the artifact filenames tag the branch.
Using it
- Insert it where two lanes should be evaluated in parallel.
- Leave
modeonpassthroughfor live mirroring; switch tomonitorif you only want telemetry and don't want to touch the outputs. - Flip GO PLUS ULTRA for branch-tagged snapshots and JSON logs.
The console report gives you branch health at a glance - missing feeds are called out instantly, which beats squinting at two separate debuggers. It's the right tool when the question is "which branch is lying to me," rather than "what's in this one wire."
Install
Same pack-wide story - Manager search "h4 ToolKit", or:
cd ComfyUI/custom_nodes
git clone https://github.com/m3rr/h4_ToolKit
Restart. Deps are colorama and numpy, auto-installed at startup; no model downloads.
Troubleshooting
- Outputs don't match what I wired - remember every output belongs to a branch;
Branch A · Latentcomes fromlatent_in_a, notlatent_in_b. It's a lot of sockets and easy to cross. - Missing-branch warnings - those are the feature; check which branch is unconnected in the summary line rather than digging through the log.
- Artifacts - branch-tagged JSON/previews land under
ComfyUI/temp/h4_debugatron_ultra/, gated bygo_ultraandultra_cache_artifacts.
Inputs (33)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | COMBO | passthrough | 2 options: monitor, passthrough |
| model_in_aopt | MODEL | Connect any diffusion model blob to inspect or forward downstream. (Branch A) | |
| clip_in_aopt | CLIP | Attach a CLIP text encoder payload for logging and pass-through. (Branch A) | |
| clip_vision_in_aopt | CLIP_VISION | Optional CLIP vision encoder payload. (Branch A) | |
| vae_in_aopt | VAE | Supply a VAE instance for inspection or passthrough. (Branch A) | |
| conditioning_in_aopt | CONDITIONING | Generic conditioning list or bundle. (Branch A) | |
| conditioning_positive_in_aopt | CONDITIONING | Positive conditioning branch when separated upstream. (Branch A) | |
| conditioning_negative_in_aopt | CONDITIONING | Negative conditioning branch when separated upstream. (Branch A) | |
| latent_in_aopt | LATENT | Latent dictionary (samples / noise etc.). (Branch A) | |
| image_in_aopt | IMAGE | Images or batches headed into the debugger. (Branch A) | |
| mask_in_aopt | MASK | Mask tensor payloads to monitor or route. (Branch A) | |
| model_in_bopt | MODEL | Connect any diffusion model blob to inspect or forward downstream. (Branch B) | |
| clip_in_bopt | CLIP | Attach a CLIP text encoder payload for logging and pass-through. (Branch B) | |
| clip_vision_in_bopt | CLIP_VISION | Optional CLIP vision encoder payload. (Branch B) | |
| vae_in_bopt | VAE | Supply a VAE instance for inspection or passthrough. (Branch B) | |
| conditioning_in_bopt | CONDITIONING | Generic conditioning list or bundle. (Branch B) | |
| conditioning_positive_in_bopt | CONDITIONING | Positive conditioning branch when separated upstream. (Branch B) | |
| conditioning_negative_in_bopt | CONDITIONING | Negative conditioning branch when separated upstream. (Branch B) | |
| latent_in_bopt | LATENT | Latent dictionary (samples / noise etc.). (Branch B) | |
| image_in_bopt | IMAGE | Images or batches headed into the debugger. (Branch B) | |
| mask_in_bopt | MASK | Mask tensor payloads to monitor or route. (Branch B) | |
| go_ultraopt | BOOLEAN | false | Flip the switch marked GO PLUS ULTRA?! to open deep-dive logging, previews, and artefact capture. |
| ultra_capture_first_stepopt | BOOLEAN | true | Capture analytics for the earliest latent frame observed (or current latent when history is unavailable). |
| ultra_capture_mid_stepopt | BOOLEAN | false | When latent history is provided, also analyse the midpoint frame for drift checks. |
| ultra_capture_last_stepopt | BOOLEAN | true | Capture analytics for the most recent latent frame to spot end-of-run anomalies. |
| ultra_preview_imagesopt | BOOLEAN | true | Attempt to decode the analysed latent into a quick preview image when a VAE is connected. |
| ultra_json_logopt | BOOLEAN | true | Serialise the captured diagnostics to a JSON file under ComfyUI's temp directory for later comparison. |
| ultra_highlight_missing_conditioningopt | BOOLEAN | true | Warn when positive/negative or auxiliary conditioning branches are absent to prevent silent misconfigurations. |
| ultra_token_previewopt | BOOLEAN | false | Attempt to echo prompt fragments and key embedding stats for the first few conditioning entries. |
| ultra_latent_anomaly_checksopt | BOOLEAN | true | Scan tensors for NaN/Inf values and suspicious variance spikes to surface stability issues early. |
| ultra_model_diff_trackingopt | BOOLEAN | false | Hash model and LoRA parameter signatures so you can verify which weights were active this run. |
| ultra_watch_expressionopt | STRING | Evaluate a Python expression against the inbound payloads (available globals: torch, np, slot names). Leave blank to disable. | |
| ultra_cache_artifactsopt | BOOLEAN | true | Keep generated preview images and JSON logs on disk instead of treating them as temporary diagnostics. |
Outputs (20)
| Name | Type | Description |
|---|---|---|
| Branch A · Model | MODEL | — |
| Branch A · CLIP | CLIP | — |
| Branch A · CLIP_Vision | CLIP_VISION | — |
| Branch A · VAE | VAE | — |
| Branch A · Conditioning | CONDITIONING | — |
| Branch A · Positive | CONDITIONING | — |
| Branch A · Negative | CONDITIONING | — |
| Branch A · Latent | LATENT | — |
| Branch A · Image | IMAGE | — |
| Branch A · Mask | MASK | — |
| Branch B · Model | MODEL | — |
| Branch B · CLIP | CLIP | — |
| Branch B · CLIP_Vision | CLIP_VISION | — |
| Branch B · VAE | VAE | — |
| Branch B · Conditioning | CONDITIONING | — |
| Branch B · Positive | CONDITIONING | — |
| Branch B · Negative | CONDITIONING | — |
| Branch B · Latent | LATENT | — |
| Branch B · Image | IMAGE | — |
| Branch B · Mask | MASK | — |