FastH3 V2 · Save Attested Frozen LOW Recipe (T8 EXP)
Freeze the LOW half so tomorrow's HIGH pass has nothing to guess
- current_recipe
- low_stage_result
- low_attestation
- low_condition_receipt
- bundle_path
- bundle_sha256
- report_json
What it is
FastH3 V2 splits a clip into a LOW pass and a HIGH pass. That split is what makes cheap iteration possible - but only if the later run can prove it's continuing the earlier one. This node writes the proof.
MiniMaxH3FastH3V2FrozenLOWBundleSaveEXPT8 attaches the verified current recipe, the executed LOW stage result, its stage attestation and its actual condition receipt to an exact completed Stage Save manifest, and writes a bundle you can load later. What you get is a frozen, self-describing LOW that a HIGH-only resume graph can trust without re-running anything at LOW resolution.
One boundary worth reading twice, because it's in the node's own description: it does not change the generic stage artifact, and it does not freeze newly edited LOW settings. If you edit the LOW config after running, the bundle describes what ran, not what's in your widgets now. That's the right way round, and it's why the load side can be strict.
How it works
The node takes six inputs: current_recipe, low_stage_result, low_attestation, low_condition_receipt, plus artifact_path and artifact_sha256 pointing at the completed Stage Save manifest you want to hang this off.
Internally it assembles a witness set from those four typed objects, compresses it into a bundle blob alongside the manifest, and hashes the result. Outputs are bundle_path, bundle_sha256 and report_json. Because it's a terminal node, it also executes - you'll see it in the run list, and the report will show you the path it wrote.
The reason there are four separate provenance objects rather than one "settings" dump is that they answer different questions. The recipe says what you intended. The stage result says a sampler actually produced this. The attestation says the sampler ran with the model, sigmas and source the recipe described. The condition receipt says which conditioning call produced its starting latent. Drop any one and the load side is guessing.
Why freezing matters more than it sounds
An 8-step distilled student is cheap enough to re-run, which tempts you to just re-run LOW whenever you're unsure. That temptation is exactly what the pack is guarding against, because a re-run LOW is a different LOW: same settings, but you're now re-deriving everything downstream from a new sample. If the point of your resume was "keep the half I already like," re-running quietly voids that.
Freezing also makes the expensive half honest. The HIGH pass is where the resolution - and the time - goes. A HIGH-only resume is a real workflow, and it's only safe if the LOW it starts from is pinned by content, not by vibes.
Install
ComfyUI Manager → MiniMax H3 Audio T8, or:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8.git minimax-h3-audio-T8
Quit ComfyUI completely, restart, refresh the browser - new nodes register at import, so a hot reload won't show them. The pack's requirements.txt is deliberately empty: base nodes use only what ComfyUI already provides, and the optional EXP features check dependencies only when they're used, so nothing here can replace your Torch/CUDA stack. You'll need a recent ComfyUI with native H3 support, H3 in models/diffusion_models, Qwen in models/text_encoders, video and audio VAEs in models/vae, and the FastH3 V2 ConvRot INT8 checkpoint.
Where it goes wrong
artifact_path and artifact_sha256 must point at a completed Stage Save manifest. If the stage was never saved, or the SHA doesn't match the file, the bundle refuses - correctly, since a bundle over an unverifiable artifact isn't worth the disk space.
Then there's the ordering trap. Because it's a save node it's tempting to drop it in beside the LOW sampler and queue the whole thing, but it needs the attestation and the condition receipt, and those want the condition call to have actually executed. Wire it after the stage, not next to it.
And a habit worth forming: keep the bundle path and SHA somewhere you'll find them. The load side needs both, and a bundle you can't identify is a bundle you can't use.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| current_recipe | T8_FAST_H3_V2_CURRENT_RECIPE | — | |
| low_stage_result | T8_STAGE_RESULT | — | |
| low_attestation | T8_FAST_H3_V2_CURRENT_STAGE_ATTESTATION | — | |
| low_condition_receipt | T8_FAST_H3_V2_CONDITION_RECEIPT | — | |
| artifact_path | STRING | — | |
| artifact_sha256 | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| bundle_path | STRING | — |
| bundle_sha256 | STRING | — |
| report_json | STRING | — |