MiniMax H3 Pixel Continuity • Boundary Experiment
The tiny switch whose off state is the whole point
- options
- recipe_json
Three widgets, two outputs, and a default of off. MiniMax H3 Pixel Continuity • Boundary Experiment is the control node for the join-refinement experiment in the deferred pixel upscale - it produces the options object that Keep Boundary Sources and Experimental Boundary Export both consume, and it's the node that decides whether either of them does anything.
Off is the important state. With enabled off, the tail-protection recipe is byte-for-byte the one you already had, Capture performs no I/O, and Export passes the assembled path straight through. That's deliberate: the existing tail-protection workflow is the validated path, and this is an opt-in beside it, not a replacement for it.
The knobs
enabled false - the switch
frames_per_side 17 (17/34/51) - editable frames each side of the join
denoise 0.20 - refinement strength in the center
steps 3 - sampling steps for the center
canvas_directory "" - blank = ComfyUI temp; use a local SSD
base_recipe_json {} - JSON, gets the boundary contract stamped in
frames_per_side steps in 17s because it has to land on H3's temporal grid. Hand it a 20 and it raises rather than rounding, which is the right call - a silently rounded window would break the correspondence with the cached frames.
denoise and steps describe the small re-sample applied to the middle frames only. The pack's own comparison test used 0.20 and 3 steps, and only the default 17-frame window has real GPU validation.
canvas_directory is where the refinement samples its window. Blank means ComfyUI's temp directory; a fast local SSD is the recommended setting, because the export streams frames and the per-join work is disk-bound.
What recipe_json is actually for
This is the part that trips people, and it's worth understanding rather than copying.
When enabled is on, the node writes a boundary_refinement contract - version, frames_per_side, denoise, steps - into the JSON it received in base_recipe_json, and hands the merged JSON out of recipe_json. You wire that into the Upscale Adapter, which records it in the upscale profile's config. Capture and Export both re-check the recorded contract against the options object they were given and refuse to run if they disagree.
The upshot: change the switch or any of its three sampling settings and you have a different recipe, so the saved profile is no longer compatible. Use a new profile, or reprocess. And because the check is a ValueError, the failure is loud - Connect Boundary Experiment recipe_json to the Upscale Adapter - rather than a quiet mismatch between cached samples and a different recipe.
base_recipe_json has to be valid JSON; it's parsed, so a stray trailing comma gets you an exception at queue time.
Wiring, in one line each
options goes to Keep Boundary Sources (which runs pre-USDU) and Experimental Boundary Export (which runs after assembly). recipe_json goes to the Upscale Adapter so the profile records what you asked for. Nothing else in the graph should need to reference it.
Install
Manager search for MiniMax H3 Contex Loop, or:
cd ComfyUI/custom_nodes
git clone https://github.com/seitanism/ComfyUI-H3-Motion-Context-MultiRef.git
git clone --branch main https://github.com/ethanfel/ComfyUI-MiniMaxH3-Context-Loop.git
Restart fully - the pack patches H3 guide and mask paths, and stale patch ownership after a partial update is its own class of confusing bug. No pip requirements ship with it, but the pixel-continuity chain assumes the H3 model files, ffmpeg on PATH, and the ComfyUI-DLSS5-Enhancer, ComfyUI_UltimateSDUpscaleGuider_H3 and ComfyUI-ContextAnchoredTile-videopath packs.
Should you turn it on
Probably not yet, unless fixing a specific join is worth the risk of two new boundaries. The node's own description names the tradeoff - "Experimental: may improve the join but introduce artifacts at the replacement edges" - and the measured result on the pack's test footage was a ~6% better join against ~6–7% worse replacement edges.
Where it is worth the trouble: a genuinely continuous shot split across two scenes at a hard-to-hide point, where the join is more visible than the boundaries would be. Enable it, upscale into a fresh profile, export with the boundary node, then watch the join and the thirty frames either side of it before deciding which file you keep.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| enabled | BOOLEAN | false | — |
| frames_per_side | INT | 1717–51 | — |
| denoise | FLOAT | 0.200.01–1 | — |
| steps | INT | 31–100 | — |
| canvas_directory | STRING | — | |
| base_recipe_json | STRING | {} | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| options | H3_PIXEL_BOUNDARY_OPTIONS | — |
| recipe_json | STRING | — |