MoveAhead Enforcer (3-tier motion lock) ??
When MoveAhead still drifts, lock the motion skeleton
- model
- model
IAMCCS_MoveAhead fixes most long-WAN drift. The stubborn cases - direction slowly rotating, subject wandering off over 120 frames - are what the Enforcer exists for. It's the same FreeLong spectral-blend idea, but with a "3-tier motion lock": part of the spectrum is hard-locked to the global stream, early transformer blocks run global-only attention to establish direction, and everything above a frequency cutoff stays fully local for detail. Stricter by design.
The pack's own description is the best summary: "Stricter FreeLong variant with locked motion skeleton. Use when standard MoveAhead still shows direction drift." It's not the first node you reach for - it's the one you graduate to when the soft version isn't enough. From the IAMCCS-nodes WAN section, the successor to the author's WanFreeLongEnforcer.
How it works
Where MoveAhead has one blend ratio, the Enforcer splits the frequency spectrum into three tiers. motion_lock_ratio (0.15) is the fraction 100% locked to the global stream - those frequencies are never allowed to follow the local window, so the broad motion direction can't wander. low_freq_ratio (0.5) is the upper bound of the blended mid-tier: frequencies below it are either locked or blended, frequencies above it are fully local (detail). The constraint the tooltip warns about: low_freq_ratio must be greater than motion_lock_ratio, or the tiers overlap nonsensically.
The second lock is motion_lock_blocks (5): the first N transformer blocks run global-only attention, no local stream at all. That's the "establish the motion direction early" move - by the time later blocks get local detail, the trajectory is already set. blend_strength (0.8), blend_curve, auto_window/manual_window_frames, and vram_preset all work like the basic MoveAhead.
Inputs and outputs
model(MODEL),enabled(BOOLEAN, true).motion_lock_ratio(0.15),blend_strength(0.8),low_freq_ratio(0.5, must be > motion_lock_ratio),auto_window(true),manual_window_frames,blend_curve(flat),motion_lock_blocks(5),vram_preset(normal).
Output: model (MODEL).
How to install
Part of IAMCCS-nodes. ComfyUI Manager search "IAMCCS", or:
cd ComfyUI/custom_nodes
git clone https://github.com/IAMCCS/IAMCCS-nodes.git
Restart. No model downloads. Pack floors: ComfyUI ≥ 0.3.0, Python ≥ 3.12, Torch ≥ 2.8.
Gotchas
The lock is a trade, not a gift. motion_lock_ratio up toward 0.3–0.5 and motion_lock_blocks up toward 10+ will pin the motion down hard - and also pin down dynamism, so clips start to look like a locked-off camera with the subject pasted on. The defaults (0.15 / 5) are where "locked enough but still alive" actually lives. If the model refuses to respect your prompt's motion at higher lock values, that's the mechanism working as intended; back the ratio off. And honestly, if the Enforcer is still drifting, stop tuning and change approach - switch to segmented generation with motion bridges or VACE, which is where the community ended up for anything past ~10 seconds of continuous action.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| enabled | BOOLEAN | true | Enable / disable the Enforcer. |
| motion_lock_ratio | FLOAT | 0.150–0.5 | Fraction of the spectrum that is 100 %% locked to the global stream. Higher = stronger motion lock but may reduce dynamism. 0.15 is a good starting point. |
| blend_strength | FLOAT | 0.80–1 | Overall blend strength. 0 = passthrough, 1 = full enforced blend. |
| low_freq_ratio | FLOAT | 0.500–1 | Upper bound of the blended mid-frequency tier. Frequencies above this are fully local (detail). Must be > motion_lock_ratio. |
| auto_window | BOOLEAN | true | AUTO window mode (recommended). |
| manual_window_frames | STRING | Manual window size in VIDEO frames (example: 33 for 81-frame videos). Used only if AUTO window is OFF. | |
| blend_curve | COMBO | flat | flat = constant blend_strength. sigmoid = ramps from near-zero in early blocks to full strength later. Combines well with motion_lock_blocks. |
| motion_lock_blocks | INT | 50–20 | First N transformer blocks run global-only attention (no local stream). Establishes motion direction early. 5 is a good default. 0 = disable this feature. |
| vram_preset | COMBO | normal | VRAM preset for the FFT blending implementation. low = smallest chunks (slowest, safest), normal = balanced, high = larger chunks (faster). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |