Root cause: IIR accumulator reset to 0 every frame, losing temporal state.
Fix: static thread_local accumulator persists across frames.
Results (dual_b1q_0.5, reaper render):
cut@500 = -10.32 dB (EXACT match, was -14.35)
cut@2000 = -11.82 dB (EXACT match, was -6.58)
Both the ×1.805 (OLA normalization) and ×2.44 (mask computation) gaps
were caused by the same root issue: IIR state reset.