artokun/debug-render
Debug a WRONG or imperfect render (not a hard error) by inspecting inputs and intermediate steps with run-to-node — render one branch up to an output, preview-tap latents/masks/preprocessor maps, localize the first bad stage, then fix. Use when a final image/video comes out wrong — artifacts, wrong subject/pose/composition/color, blur, a ControlNet/IPAdapter/mask/LoRA not taking, a two-stage refiner or upscale degrading the result — rather than the run failing with an error (for errors/OOM/missing nodes use the troubleshooting skill).
npx skills add https://github.com/artokun/comfyui-mcp --skill debug-render
When a final asset looks wrong (not when it errors), don't re-roll the whole
graph and hope. Localize the fault: render only as far as one stage and LOOK
at what that stage actually produces. The wrong-looking output is downstream of a
*first* bad step — find that step, fix it there, and everything after it follows.
The tool for this is panel_run with to_node_id ("run to node"), which uses
ComfyUI's native partial execution: only the target output node plus
everything upstream of it renders; every other branch is skipped. That makes each
probe fast and cheap, and the output is delivered to you automatically (same
as any run — don't poll).
color, soft/blurry, melted hands, wrong style.
LoRA — and you can't tell if the *input* to it is wrong or the *node* is wrong.
degrades: you need to see which stage introduces the problem.
the others.
If instead the run fails (red error, OOM, missing node, black image from a
crash) → use the troubleshooting skill; this skill is for outputs that
*complete* but look wrong.
to_node_id must be an OUTPUT nodeComfyUI can only run *to* an output node — SaveImage, PreviewImage, SaveVideo,
SaveAudio, etc. (these show is_output: true in panel_query_graph detail rows). A bare
KSampler / VAEDecode / preprocessor is not an output node, so you can't target
it directly. To inspect a point that isn't already an output, **add a preview
tap** there:
| You want to see… | Wire type | Tap to add | Wiring |
|---|---|---|---|
| An intermediate image (post-process, refiner stage, composite) | IMAGE | PreviewImage | image → PreviewImage.images |
| A latent (after a sampler, before/after upscale) | LATENT | VAEDecode → PreviewImage | latent → VAEDecode.samples; reuse the graph's VAE → VAEDecode.vae; then → PreviewImage |
| A mask (inpaint, segmentation, attention) | MASK | MaskToImage → PreviewImage | mask → MaskToImage.mask → PreviewImage |
| A ControlNet/preprocessor map (depth/pose/canny) | usually IMAGE already | PreviewImage | the preprocessor's IMAGE output → PreviewImage.images |
| The actual prompt/conditioning | CONDITIONING | (can't preview as an image) | inspect widget values / the text node feeding it instead |
Build a tap with panel_add_node + panel_connect, run to it, inspect, then
panel_remove_node the tap when you're done (unless the user wants to keep it).
panel_graph_outline (then panel_query_graph for specifics) — note node ids, the output nodes(is_output: true), and every node's mode. A node in bypass/mute on
the path is OFF and is a top cause of wrong renders — fix modes first with
panel_set_node_mode before you blame anything else.
(table above).
panel_run(to_node_id = that output node). Only that branch renders.its inputs/widgets) is what to fix — panel_set_widget, panel_set_node_mode,
a rewire, a different model — then run-to-node there again to confirm the fix
before running the full graph.
panel_remove_node) and do a final fullpanel_run to produce the real saved asset.
text/prompt node, the sampler's positive input via a decode of its latent).
(the depth/pose/canny IMAGE going into the ControlNet). A blank or wrong map =
the problem is the preprocessor or its input, not the sampler.
resize/crop the IPAdapter chain applies.
MaskToImage-preview the mask actually reachingthe sampler (mask misalignment is the usual culprit).
*before* the refiner vs after: if the base is good and the result is bad, the
refiner/upscale stage is at fault.
post) — probe near the end first.
a message saying so — add a preview tap instead.
renders. Check modes in step 1.
executed event and theimage is delivered to you inline — including PreviewImage taps, which arrive
labeled as a *preview* (temporary, not a saved file). Don't poll; just end the
turn and read the delivered image. A preview tap with no SaveImage means "no
saved output ran" — that's expected for a probe.
probes — run one, read it, then the next.
probe at the root graph (add the tap outside the subgraph, fed by an exposed
output rail).
Take artokun/debug-render from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.