MCSDF — AsyncPatch sampler fix

Memory-Conditioned Scene Diffusion-Forcing · per-token noise level = knownness map · Wan2.1-I2V-14B

TL;DR. MCSDF's per-token Diffusion-Forcing sampler was under-integrating: it applied the global step Δu to every active token and skipped the final x0-projection. Fixing it to a per-token local Δt (min(τ,uk+1)−min(τ,uk), the full jump at activation) plus a direct x0-projection (x̂₀ = x − t·v, v points at x0) buys +13–22% sharpness, largest in the deep-extrapolation frames — no retraining. And 24 steps with the fix beats 50 without: it's integrator correctness, not compute. Shipped as the default sampler.

What MCSDF is (and its relation to AsyncPatch)

MCSDF is AsyncPatch Diffusion (arXiv 2606.07079) applied to posed video: a spatial timestep field replaces the global scalar t, and one joint denoiser reads the whole latent so clean tokens condition noisy ones. MCSDF adds three things AsyncPatch doesn't have — the timestep field is a 3D-geometry-derived knownness map τ (not arbitrary patches); an imperfect point-cloud memory zmem injected as SDEdit content and corrected via an anchor-DF objective (hence τ floored at 0.45, unlike AsyncPatch's known=0); and a video / pretrained-DiT retrofit rather than a from-scratch UNet. The recent --train_modulation + --async_patch work was literally adopting AsyncPatch's two load-bearing ingredients.

A/B — OLD vs FIXED integrator (checkpoint step 2500)

OLD = current sampler (global-Δu, no x0-projection) · FIXED = per-token Δt + x0-projection · columns = frames 0/20/40/60/80 · green % = sharpness gain (Laplacian variance).
Deep frame 40 (pier), 3× zoom — OLD left is smeared/mushy, FIXED right has crisper edges and articulated stone texture.

Sharpness gain (Laplacian variance, vs OLD)

vs current (A)f0 nearf20f40f60 deepf80 return
pier — B: fix, 24 steps+7.5%+21.8%+17.6%+15.3%+14.8%
pier — C: fix, 50 steps+7.5%+15.9%+14.1%+12.6%+13.2%
plaza — B: fix, 24 steps+7.3%+17.9%+13.3%+16.8%+13.2%

The largest gains are in the deep-extrapolation frames (f20–f60) — exactly the region that looked soft. C (50 steps) ≤ B (24 steps): more steps of the correct update don't add, confirming this is integrator correctness, not step count.

What the fix does NOT fix — and the training in progress

The fix sharpens what's there but can't invent correct geometry: the deep frames are still structurally rough in both rows. That residual is undertraining / capacity, addressed by extending training to ~12k steps (in progress; currently ~step 4000). Below is the live training viz, now rendered through the fixed sampler — near + return frames crisp and consistent, deep middle sharpening as it trains.
pier · step ~3800
plaza · step ~3800
Next unused lever (inference-only, no retrain): AsyncPatch input guidance — extrapolate two scores at different context-noise levels to enforce stricter fidelity to the remembered content.