Port wan-animate-2 to IterativePipelineBlocks with nested streaming
- WanAnimate2SegmentLoopWrapper is an IterativePipelineBlocks (loop variable
`k`); the per-segment steps become ModularLoopPipelineBlocks operating on
the shared PipelineState
- the hand-rolled timestep loop in WanAnimate2SegmentDenoiseInner becomes a
nested loop: WanAnimate2LoopDenoiser + WanAnimate2LoopAfterDenoiser under
WanAnimate2DenoiseLoopWrapper (loop variables `i`, `t`)
- loop-carried state made explicit: `out_frames` is a declared input on the
prev-frames step but filtered from the wrapper's aggregated inputs;
`segment_frames` accumulation moves from the decode step into the segment
loop's own logic
- both loops implement `stream`: events per denoise step and per segment,
so test_stream_matches_call now runs for wan-animate-2 (stream == call)
- regenerate stale flux2 modular_blocks docstrings; doc-builder reflow in
modular_pipeline.py
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>