H3 Manual Hold Map (ranges to holds, gate) [alpha]
Tired of the oracle being overzealous? Type the ranges yourself
- hold_map
- segments
- report
The H3 Jerk Oracle is smart, but it's not you. Sometimes it flags a whole clip when you know the problem is exactly the three seconds around frame 45, and sometimes you want to hold a burst the oracle under-reads. H3 Manual Hold Map is the "I know exactly where the problem is" node - it turns typed time ranges into the same hold-map JSON the oracle emits, so everything downstream (H3 Time Smear, H3 Exact Recover, H3 Audio Recover) works unmodified.
It's alpha, added in the 2026-08-09 batch, but it's the most approachable way to drive the de-rope pipeline by hand. And because cost scales with the held spans, targeting one burst in a long clip is also the biggest speed lever this pack has.
The ranges syntax
36-60, 88-102:3
1.5s-2.4s:4
Comma-separated start-end pairs, frames or seconds, ends inclusive, with an optional per-range hold count after a colon. Frames it if you think in frames, seconds if you think in seconds - both work. One catch: ranges snap outward to the model's token grid (one token spans roughly 4 frames), so what actually gets held may be slightly wider than what you typed. The segments output echoes what really happened, so trust that over your typed numbers.
Gate mode
This is the mode worth knowing about first. Wire the oracle's hold_map into oracle_hold_map and the oracle's holds survive only inside your ranges - it becomes a gate, not a replacement. The oracle still proposes (queue once, watch the saved oraclemap video to see where the heat pools), you type the ranges that matter, and queue again. The report output prices the pass before you commit: world length in, effective regeneration length out, plus a minutes estimate if you set s_per_step from a baseline render of your clip on your card.
Leave oracle_hold_map unwired and you're authoring holds directly at the hold count (default 4) for every range. The other knobs - ramp (keep on, hard steps jitter) and bridge (8, fills valleys between adjacent peak spans) - are the same rules the oracle uses.
Inputs worth knowing
length- the world-clock frame count of the clip.ranges- the multiline field above.hold- hold count for any range without an explicit:hold.s_per_step,est_steps,overhead_s- the cost-estimate trio;s_per_stepis the one that actually calibrates the minutes figure.
Install
Same as every node in this pack:
cd ComfyUI/custom_nodes
git clone https://github.com/matlowai/ComfyUI-MAINodes
or search ComfyUI-MAINodes in ComfyUI Manager and restart. No Python dependencies ship with the pack; only the example graphs want ComfyUI-KJNodes. The node lives under latent/minimax/motion in the menu.
Common gotchas
Ranges that snap wider than you expected are normal - the token grid won't let a token be half-held. If a held span still shows mid-burst artifacts, that's the same plateau-dip issue the oracle's bridge exists for; the node carries the same default 8. And don't forget the report output exists: it's a text wire, so route it to a preview or text node if you want to read it before the expensive pass runs.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| length | INT | 1245–3600 | world-clock frame count of the clip |
| fps | INT | 241–120 | — |
| ranges | STRING | start-end[:hold], comma-separated; frames or seconds ('1.5s'), ends inclusive | |
| hold | INT | 42–8 | hold count for ranges without an explicit :hold |
| ramp | BOOLEAN | true | C1 ramp shoulders, same as the oracle — keep ON |
| bridge | INT | 80–20 | fill short valleys between peak spans, same rule as the oracle |
| oracle_hold_mapopt | STRING | wire H3 Jerk Oracle's hold_map to gate it by your ranges | |
| s_per_stepopt | FLOAT | 0.000–120 | seconds per step from a baseline render of this clip; 0 skips the minutes estimate |
| est_stepsopt | INT | 181–100 | steps the regen pass will actually run (total_steps x inject) |
| overhead_sopt | FLOAT | 6.70–600 | fixed non-sampling seconds per render (setup, VAE encode/decode). 40 measured at 1.5 MP on a warm instance; take it from the gap between your own 1-step and 2-step wall times |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| hold_map | STRING | — |
| segments | STRING | — |
| report | STRING | — |