H3 Manual Second Pass · Separate Stage Setup (T8 EXP)
Two passes you wire yourself, exactly like the old runner did
- model
- av_latent
- model
- sampler
- sigmas
- stage_context
- report_json
What it is
The pack's long-video runners have always had a "manual second pass" inside them: a full first pass, then a second descent on a hand-written video sigma schedule. This node opens that box. Two instances, one per stage, each preparing a MODEL, a SAMPLER, a SIGMAS tensor and an immutable stage_context - and neither of them sampling anything.
You use it when you want the second pass to be a real second pass with its own model, its own LoRA, its own prompt and its own noise, instead of whatever the monolithic runner decided. That's a meaningful difference for music-video and look-development work: pass one establishes structure, pass two restyles it or pushes detail.
Inputs
model,av_latent- the stage's model and the AV latent it will sample. For the second stage, that latent is the first stage'soutput.stage-manual_firstormanual_second.first_steps- default20. Used by the first stage; the second stage takes its step count from the sigma string instead.manual_sigmas- default"0.5,0.412,0.35,0". That's the video sigma schedule for the manual second descent, and the terminal0is doing real work: it's what makes it a complete pass.shift_video/shift_audio-12/3. The AV clock shifts; they must be positive finite numbers and they're bound into the stage context, so they can't quietly drift between the setup and the sampler.sampler_name- defaultdual_clock_euler, from the pack's Core sampler options.scheduler- defaultnative_flow.
Outputs: model, sampler, sigmas, stage_context, report_json.
The wiring rule people get wrong
First stage's output goes to the second stage's latent_image. Not denoised_output. Not a learned-upscale handoff. This route deliberately has no upscaler pasted in the middle - the node description says it in as many words, because every other two-pass route in this pack does use denoised_output plus an upscaler, and muscle memory will betray you.
Also: each stage gets its own fresh NOISE. The second pass is not continuing a trajectory; it's a new descent from 0.5. To reproduce what the old runner did, keep the same seed, batch index, native mask and FreeNoise segment_index on both stages.
The certification caveat
dual_clock_euler and euler are the two samplers with completion and cross-process resume adapted. Other Core samplers still run - the pack won't stop you - but they don't get certified completion or portable stage reuse, because their multi-evaluation internals aren't covered. If you plan to freeze the first pass and re-run only the second in a fresh process, stay on those two.
The stage_context output is a descriptor, not a tensor receipt and not a checkpoint. Ordinary ComfyUI caching still decides what re-runs in-session.
FreeNoise, if you're using it
The bundled graphs come in native-noise and FreeNoise flavours (examples/workflows/43-manual-second-pass). For FreeNoise you need MiniMaxH3StageNoiseEXPT8 explicitly in the graph with from_model_plan selected - a plan sitting on the MODEL is not consumed by a plain RandomNoise. Same segment_index on both stages, or the two halves won't line up.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8.git minimax-h3-audio-T8
ComfyUI Manager: search MiniMax H3 Audio T8, install, then fully quit and restart ComfyUI, then refresh the browser. Manager's registry and the GitHub releases move independently - clone if Manager looks behind.
Models: H3 transformer in models/diffusion_models, Qwen3-VL text encoder in models/text_encoders, video and audio VAEs in models/vae, LoRAs in models/loras - and use the workflow's named LoRA, because this pack's acceleration LoRAs are not interchangeable. The repo installs no packages at all; requirements.txt is intentionally empty of them so a fresh install can't replace ComfyUI's torch/CUDA stack.
Common issues
Second pass looks like a whole different clip. You probably fed denoised_output instead of output, or changed the seed between stages. Both are one-wire fixes.
Audio is noisy or oddly quiet after pass two. In this pack that's almost always sampler/scheduler/steps or the video/audio shifts, or a swapped LoRA - not the setup node. Check shift_video/shift_audio match what you intended, and don't drop a generic EMA or turbo LoRA in to compensate.
Save/restore of the first pass doesn't resume. That needs a sampler the pack certifies (dual_clock_euler or euler), plus the frozen first stage's output slot and real path/SHA values. You also have to keep the conditioning geometry identical when you resume.
Red nodes. Update ComfyUI core, frontend and Manager together and restart fully.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| av_latent | LATENT | — | |
| stage | COMBO | manual_first | 2 options: manual_first, manual_second |
| first_steps | INT | 201–10000 | — |
| manual_sigmas | STRING | 0.5,0.412,0.35,0 | — |
| shift_video | FLOAT | 12.00.01–100 | — |
| shift_audio | FLOAT | 3.00.01–100 | — |
| sampler_name | COMBO | dual_clock_euler | 45 options: dual_clock_euler, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| scheduler | COMBO | native_flow | 11 options: native_flow, beta57, simple, sgm_uniform, karras, exponential, +5 |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| sampler | SAMPLER | — |
| sigmas | SIGMAS | — |
| stage_context | T8_STAGE_CONTEXT | — |
| report_json | STRING | — |